wwf
昨天 a430284aa21e3ae1f0d5654e55b2ad2852519cc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
'use client'
import type { FC } from 'react'
import React, { useCallback, useEffect, useState } from 'react'
import { uniqueId } from 'lodash-es'
import { useTranslation } from 'react-i18next'
import type { ModelConfig, PromptItem, Variable } from '../../../types'
import { EditionType } from '../../../types'
import { useWorkflowStore } from '../../../store'
import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector'
import Tooltip from '@/app/components/base/tooltip'
import { PromptRole } from '@/models/debug'
 
const i18nPrefix = 'workflow.nodes.llm'
 
type Props = {
  className?: string
  headerClassName?: string
  canNotChooseSystemRole?: boolean
  readOnly: boolean
  id: string
  canRemove: boolean
  isChatModel: boolean
  isChatApp: boolean
  payload: PromptItem
  handleChatModeMessageRoleChange: (role: PromptRole) => void
  onPromptChange: (p: string) => void
  onEditionTypeChange: (editionType: EditionType) => void
  onRemove: () => void
  isShowContext: boolean
  hasSetBlockStatus: {
    context: boolean
    history: boolean
    query: boolean
  }
  availableVars: any
  availableNodes: any
  varList: Variable[]
  handleAddVariable: (payload: any) => void
  modelConfig?: ModelConfig
}
 
const roleOptions = [
  {
    label: 'system',
    value: PromptRole.system,
  },
  {
    label: 'user',
    value: PromptRole.user,
  },
  {
    label: 'assistant',
    value: PromptRole.assistant,
  },
]
 
const roleOptionsWithoutSystemRole = roleOptions.filter(item => item.value !== PromptRole.system)
 
const ConfigPromptItem: FC<Props> = ({
  className,
  headerClassName,
  canNotChooseSystemRole,
  readOnly,
  id,
  canRemove,
  handleChatModeMessageRoleChange,
  isChatModel,
  isChatApp,
  payload,
  onPromptChange,
  onEditionTypeChange,
  onRemove,
  isShowContext,
  hasSetBlockStatus,
  availableVars,
  availableNodes,
  varList,
  handleAddVariable,
  modelConfig,
}) => {
  const { t } = useTranslation()
  const workflowStore = useWorkflowStore()
  const {
    setControlPromptEditorRerenderKey,
  } = workflowStore.getState()
  const [instanceId, setInstanceId] = useState(uniqueId())
  useEffect(() => {
    setInstanceId(`${id}-${uniqueId()}`)
  }, [id])
 
  const handleGenerated = useCallback((prompt: string) => {
    onPromptChange(prompt)
    setTimeout(() => setControlPromptEditorRerenderKey(Date.now()))
  }, [onPromptChange, setControlPromptEditorRerenderKey])
 
  return (
    <Editor
      className={className}
      headerClassName={headerClassName}
      instanceId={instanceId}
      key={instanceId}
      title={
        <div className='relative left-1 flex items-center'>
          {payload.role === PromptRole.system
            ? (<div className='relative left-[-4px] text-xs font-semibold text-gray-700 uppercase'>
              SYSTEM
            </div>)
            : (
              <TypeSelector
                value={payload.role as string}
                allOptions={roleOptions}
                options={canNotChooseSystemRole ? roleOptionsWithoutSystemRole : roleOptions}
                onChange={handleChatModeMessageRoleChange}
                triggerClassName='text-xs font-semibold text-gray-700 uppercase'
                itemClassName='text-[13px] font-medium text-gray-700'
              />
            )}
 
          <Tooltip
            popupContent={
              <div className='max-w-[180px]'>{t(`${i18nPrefix}.roleDescription.${payload.role}`)}</div>
            }
            triggerClassName='w-4 h-4'
          />
        </div>
      }
      value={payload.edition_type === EditionType.jinja2 ? (payload.jinja2_text || '') : payload.text}
      onChange={onPromptChange}
      readOnly={readOnly}
      showRemove={canRemove}
      onRemove={onRemove}
      isChatModel={isChatModel}
      isChatApp={isChatApp}
      isShowContext={isShowContext}
      hasSetBlockStatus={hasSetBlockStatus}
      nodesOutputVars={availableVars}
      availableNodes={availableNodes}
      isSupportPromptGenerator={payload.role === PromptRole.system}
      onGenerated={handleGenerated}
      modelConfig={modelConfig}
      isSupportJinja
      editionType={payload.edition_type}
      onEditionTypeChange={onEditionTypeChange}
      varList={varList}
      handleAddVariable={handleAddVariable}
      isSupportFileVar
    />
  )
}
export default React.memo(ConfigPromptItem)