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