config-prompt-item.tsx 4.4 KB

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