You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

panel.tsx 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 ConfigVision from '../_base/components/config-vision'
  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 type { NodePanelProps } from '@/app/components/workflow/types'
  19. import Tooltip from '@/app/components/base/tooltip'
  20. import { VarType } from '@/app/components/workflow/types'
  21. import { FieldCollapse } from '@/app/components/workflow/nodes/_base/components/collapse'
  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. isVisionModel,
  50. handleVisionResolutionChange,
  51. handleVisionResolutionEnabledChange,
  52. } = useConfig(id, data)
  53. const model = inputs.model
  54. return (
  55. <div className='pt-2'>
  56. <div className='space-y-4 px-4'>
  57. <Field
  58. title={t(`${i18nCommonPrefix}.model`)}
  59. required
  60. >
  61. <ModelParameterModal
  62. popupClassName='!w-[387px]'
  63. isInWorkflow
  64. isAdvancedMode={true}
  65. mode={model?.mode}
  66. provider={model?.provider}
  67. completionParams={model?.completion_params}
  68. modelId={model?.name}
  69. setModel={handleModelChanged}
  70. onCompletionParamsChange={handleCompletionParamsChange}
  71. hideDebugWithMultipleModel
  72. debugWithMultipleModel={false}
  73. readonly={readOnly}
  74. />
  75. </Field>
  76. <Field
  77. title={t(`${i18nPrefix}.inputVar`)}
  78. required
  79. >
  80. <>
  81. <VarReferencePicker
  82. readonly={readOnly}
  83. nodeId={id}
  84. isShowNodeName
  85. value={inputs.query || []}
  86. onChange={handleInputVarChange}
  87. filterVar={filterVar}
  88. />
  89. </>
  90. </Field>
  91. <Split />
  92. <ConfigVision
  93. nodeId={id}
  94. readOnly={readOnly}
  95. isVisionModel={isVisionModel}
  96. enabled={inputs.vision?.enabled}
  97. onEnabledChange={handleVisionResolutionEnabledChange}
  98. config={inputs.vision?.configs}
  99. onConfigChange={handleVisionResolutionChange}
  100. />
  101. <Field
  102. title={t(`${i18nPrefix}.extractParameters`)}
  103. required
  104. operations={
  105. !readOnly
  106. ? (
  107. <div className='flex items-center space-x-1'>
  108. {!readOnly && (
  109. <ImportFromTool onImport={handleImportFromTool} />
  110. )}
  111. {!readOnly && (<div className='h-3 w-px bg-divider-regular'></div>)}
  112. <AddExtractParameter type='add' onSave={addExtractParameter} />
  113. </div>
  114. )
  115. : undefined
  116. }
  117. >
  118. <ExtractParameter
  119. readonly={readOnly}
  120. list={inputs.parameters || []}
  121. onChange={handleExactParamsChange}
  122. />
  123. </Field>
  124. <Editor
  125. title={
  126. <div className='flex items-center space-x-1'>
  127. <span className='uppercase'>{t(`${i18nPrefix}.instruction`)}</span>
  128. <Tooltip
  129. popupContent={
  130. <div className='w-[120px]'>
  131. {t(`${i18nPrefix}.instructionTip`)}
  132. </div>
  133. }
  134. triggerClassName='w-3.5 h-3.5 ml-0.5'
  135. />
  136. </div>
  137. }
  138. value={inputs.instruction}
  139. onChange={handleInstructionChange}
  140. readOnly={readOnly}
  141. isChatModel={isChatModel}
  142. isChatApp={isChatMode}
  143. isShowContext={false}
  144. hasSetBlockStatus={hasSetBlockStatus}
  145. nodesOutputVars={availableVars}
  146. availableNodes={availableNodesWithParent}
  147. />
  148. </div>
  149. <FieldCollapse title={t(`${i18nPrefix}.advancedSetting`)}>
  150. <>
  151. {/* Memory */}
  152. {isChatMode && (
  153. <div className='mt-4'>
  154. <MemoryConfig
  155. readonly={readOnly}
  156. config={{ data: inputs.memory }}
  157. onChange={handleMemoryChange}
  158. canSetRoleName={isCompletionModel}
  159. />
  160. </div>
  161. )}
  162. {isSupportFunctionCall && (
  163. <div className='mt-2'>
  164. <ReasoningModePicker
  165. type={inputs.reasoning_mode}
  166. onChange={handleReasoningModeChange}
  167. />
  168. </div>
  169. )}
  170. </>
  171. </FieldCollapse>
  172. {inputs.parameters?.length > 0 && (<>
  173. <Split />
  174. <div>
  175. <OutputVars>
  176. <>
  177. {inputs.parameters.map((param, index) => (
  178. <VarItem
  179. key={index}
  180. name={param.name}
  181. type={param.type}
  182. description={param.description}
  183. />
  184. ))}
  185. <VarItem
  186. name='__is_success'
  187. type={VarType.number}
  188. description={t(`${i18nPrefix}.isSuccess`)}
  189. />
  190. <VarItem
  191. name='__reason'
  192. type={VarType.string}
  193. description={t(`${i18nPrefix}.errorReason`)}
  194. />
  195. </>
  196. </OutputVars>
  197. </div>
  198. </>)}
  199. </div>
  200. )
  201. }
  202. export default React.memo(Panel)