panel.tsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import type { FC } from 'react'
  2. import React from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import MemoryConfig from '../_base/components/memory-config'
  5. import VarReferencePicker from '../_base/components/variable/var-reference-picker'
  6. import Editor from '../_base/components/prompt/editor'
  7. import ResultPanel from '../../run/result-panel'
  8. import useConfig from './use-config'
  9. import type { ParameterExtractorNodeType } from './types'
  10. import ExtractParameter from './components/extract-parameter/list'
  11. import ImportFromTool from './components/extract-parameter/import-from-tool'
  12. import AddExtractParameter from './components/extract-parameter/update'
  13. import ReasoningModePicker from './components/reasoning-mode-picker'
  14. import Field from '@/app/components/workflow/nodes/_base/components/field'
  15. import Split from '@/app/components/workflow/nodes/_base/components/split'
  16. import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
  17. import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
  18. import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
  19. import Tooltip from '@/app/components/base/tooltip'
  20. import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
  21. import { VarType } from '@/app/components/workflow/types'
  22. const i18nPrefix = 'workflow.nodes.parameterExtractor'
  23. const i18nCommonPrefix = 'workflow.common'
  24. const Panel: FC<NodePanelProps<ParameterExtractorNodeType>> = ({
  25. id,
  26. data,
  27. }) => {
  28. const { t } = useTranslation()
  29. const {
  30. readOnly,
  31. inputs,
  32. handleInputVarChange,
  33. filterVar,
  34. isChatModel,
  35. isChatMode,
  36. isCompletionModel,
  37. handleModelChanged,
  38. handleImportFromTool,
  39. handleCompletionParamsChange,
  40. addExtractParameter,
  41. handleExactParamsChange,
  42. handleInstructionChange,
  43. hasSetBlockStatus,
  44. handleMemoryChange,
  45. isSupportFunctionCall,
  46. handleReasoningModeChange,
  47. availableVars,
  48. availableNodesWithParent,
  49. inputVarValues,
  50. varInputs,
  51. isShowSingleRun,
  52. hideSingleRun,
  53. runningStatus,
  54. handleRun,
  55. handleStop,
  56. runResult,
  57. setInputVarValues,
  58. } = useConfig(id, data)
  59. const model = inputs.model
  60. return (
  61. <div className='mt-2'>
  62. <div className='px-4 pb-4 space-y-4'>
  63. <Field
  64. title={t(`${i18nPrefix}.inputVar`)}
  65. >
  66. <>
  67. <VarReferencePicker
  68. readonly={readOnly}
  69. nodeId={id}
  70. isShowNodeName
  71. value={inputs.query || []}
  72. onChange={handleInputVarChange}
  73. filterVar={filterVar}
  74. />
  75. </>
  76. </Field>
  77. <Field
  78. title={t(`${i18nCommonPrefix}.model`)}
  79. >
  80. <ModelParameterModal
  81. popupClassName='!w-[387px]'
  82. isInWorkflow
  83. isAdvancedMode={true}
  84. mode={model?.mode}
  85. provider={model?.provider}
  86. completionParams={model?.completion_params}
  87. modelId={model?.name}
  88. setModel={handleModelChanged}
  89. onCompletionParamsChange={handleCompletionParamsChange}
  90. hideDebugWithMultipleModel
  91. debugWithMultipleModel={false}
  92. readonly={readOnly}
  93. />
  94. </Field>
  95. <Field
  96. title={t(`${i18nPrefix}.extractParameters`)}
  97. operations={
  98. !readOnly
  99. ? (
  100. <div className='flex items-center space-x-1'>
  101. {!readOnly && (
  102. <ImportFromTool onImport={handleImportFromTool} />
  103. )}
  104. {!readOnly && (<div className='w-px h-3 bg-gray-200'></div>)}
  105. <AddExtractParameter type='add' onSave={addExtractParameter} />
  106. </div>
  107. )
  108. : undefined
  109. }
  110. >
  111. <ExtractParameter
  112. readonly={readOnly}
  113. list={inputs.parameters || []}
  114. onChange={handleExactParamsChange}
  115. />
  116. </Field>
  117. <Editor
  118. title={
  119. <div className='flex items-center space-x-1'>
  120. <span className='uppercase'>{t(`${i18nPrefix}.instruction`)}</span>
  121. <Tooltip
  122. popupContent={
  123. <div className='w-[120px]'>
  124. {t(`${i18nPrefix}.instructionTip`)}
  125. </div>
  126. }
  127. triggerClassName='w-3.5 h-3.5 ml-0.5'
  128. />
  129. </div>
  130. }
  131. value={inputs.instruction}
  132. onChange={handleInstructionChange}
  133. readOnly={readOnly}
  134. isChatModel={isChatModel}
  135. isChatApp={isChatMode}
  136. isShowContext={false}
  137. hasSetBlockStatus={hasSetBlockStatus}
  138. nodesOutputVars={availableVars}
  139. availableNodes={availableNodesWithParent}
  140. />
  141. <Field
  142. title={t(`${i18nPrefix}.advancedSetting`)}
  143. supportFold
  144. >
  145. <>
  146. {/* Memory */}
  147. {isChatMode && (
  148. <div className='mt-4'>
  149. <MemoryConfig
  150. readonly={readOnly}
  151. config={{ data: inputs.memory }}
  152. onChange={handleMemoryChange}
  153. canSetRoleName={isCompletionModel}
  154. />
  155. </div>
  156. )}
  157. {isSupportFunctionCall && (
  158. <div className='mt-2'>
  159. <ReasoningModePicker
  160. type={inputs.reasoning_mode}
  161. onChange={handleReasoningModeChange}
  162. />
  163. </div>
  164. )}
  165. </>
  166. </Field>
  167. </div>
  168. {inputs.parameters?.length > 0 && (<>
  169. <Split />
  170. <div className='px-4 pt-4 pb-2'>
  171. <OutputVars>
  172. <>
  173. {inputs.parameters.map((param, index) => (
  174. <VarItem
  175. key={index}
  176. name={param.name}
  177. type={param.type}
  178. description={param.description}
  179. />
  180. ))}
  181. <VarItem
  182. name='__is_success'
  183. type={VarType.number}
  184. description={t(`${i18nPrefix}.isSuccess`)}
  185. />
  186. <VarItem
  187. name='__reason'
  188. type={VarType.string}
  189. description={t(`${i18nPrefix}.errorReason`)}
  190. />
  191. </>
  192. </OutputVars>
  193. </div>
  194. </>)}
  195. {isShowSingleRun && (
  196. <BeforeRunForm
  197. nodeName={inputs.title}
  198. onHide={hideSingleRun}
  199. forms={[
  200. {
  201. inputs: [{
  202. label: t(`${i18nPrefix}.inputVar`)!,
  203. variable: 'query',
  204. type: InputVarType.paragraph,
  205. required: true,
  206. }, ...varInputs],
  207. values: inputVarValues,
  208. onChange: setInputVarValues,
  209. },
  210. ]}
  211. runningStatus={runningStatus}
  212. onRun={handleRun}
  213. onStop={handleStop}
  214. result={<ResultPanel {...runResult} showSteps={false} />}
  215. />
  216. )}
  217. </div>
  218. )
  219. }
  220. export default React.memo(Panel)