text-generation-item.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import type { FC } from 'react'
  2. import { memo } from 'react'
  3. import type { ModelAndParameter } from '../types'
  4. import { APP_CHAT_WITH_MULTIPLE_MODEL } from '../types'
  5. import type {
  6. OnSend,
  7. TextGenerationConfig,
  8. } from '@/app/components/base/text-generation/types'
  9. import { useTextGeneration } from '@/app/components/base/text-generation/hooks'
  10. import TextGeneration from '@/app/components/app/text-generate/item'
  11. import { useDebugConfigurationContext } from '@/context/debug-configuration'
  12. import { promptVariablesToUserInputsForm } from '@/utils/model-config'
  13. import { TransferMethod } from '@/app/components/base/chat/types'
  14. import { useEventEmitterContextContext } from '@/context/event-emitter'
  15. import { useProviderContext } from '@/context/provider-context'
  16. type TextGenerationItemProps = {
  17. modelAndParameter: ModelAndParameter
  18. }
  19. const TextGenerationItem: FC<TextGenerationItemProps> = ({
  20. modelAndParameter,
  21. }) => {
  22. const {
  23. isAdvancedMode,
  24. modelConfig,
  25. appId,
  26. inputs,
  27. promptMode,
  28. speechToTextConfig,
  29. introduction,
  30. suggestedQuestionsAfterAnswerConfig,
  31. citationConfig,
  32. moderationConfig,
  33. externalDataToolsConfig,
  34. chatPromptConfig,
  35. completionPromptConfig,
  36. dataSets,
  37. datasetConfigs,
  38. visionConfig,
  39. moreLikeThisConfig,
  40. } = useDebugConfigurationContext()
  41. const { textGenerationModelList } = useProviderContext()
  42. const postDatasets = dataSets.map(({ id }) => ({
  43. dataset: {
  44. enabled: true,
  45. id,
  46. },
  47. }))
  48. const contextVar = modelConfig.configs.prompt_variables.find(item => item.is_context_var)?.key
  49. const config: TextGenerationConfig = {
  50. pre_prompt: !isAdvancedMode ? modelConfig.configs.prompt_template : '',
  51. prompt_type: promptMode,
  52. chat_prompt_config: isAdvancedMode ? chatPromptConfig : {},
  53. completion_prompt_config: isAdvancedMode ? completionPromptConfig : {},
  54. user_input_form: promptVariablesToUserInputsForm(modelConfig.configs.prompt_variables),
  55. dataset_query_variable: contextVar || '',
  56. opening_statement: introduction,
  57. suggested_questions_after_answer: suggestedQuestionsAfterAnswerConfig,
  58. speech_to_text: speechToTextConfig,
  59. retriever_resource: citationConfig,
  60. sensitive_word_avoidance: moderationConfig,
  61. external_data_tools: externalDataToolsConfig,
  62. more_like_this: moreLikeThisConfig,
  63. agent_mode: {
  64. enabled: false,
  65. tools: [],
  66. },
  67. dataset_configs: {
  68. ...datasetConfigs,
  69. datasets: {
  70. datasets: [...postDatasets],
  71. } as any,
  72. },
  73. file_upload: {
  74. image: visionConfig,
  75. },
  76. }
  77. const {
  78. completion,
  79. handleSend,
  80. isResponsing,
  81. messageId,
  82. } = useTextGeneration()
  83. const doSend: OnSend = (message, files) => {
  84. const currentProvider = textGenerationModelList.find(item => item.provider === modelAndParameter.provider)
  85. const currentModel = currentProvider?.models.find(model => model.model === modelAndParameter.model)
  86. const configData = {
  87. ...config,
  88. model: {
  89. provider: modelAndParameter.provider,
  90. name: modelAndParameter.model,
  91. mode: currentModel?.model_properties.mode,
  92. completion_params: modelAndParameter.parameters,
  93. },
  94. }
  95. const data: any = {
  96. inputs,
  97. model_config: configData,
  98. }
  99. if (visionConfig.enabled && files && files?.length > 0) {
  100. data.files = files.map((item) => {
  101. if (item.transfer_method === TransferMethod.local_file) {
  102. return {
  103. ...item,
  104. url: '',
  105. }
  106. }
  107. return item
  108. })
  109. }
  110. handleSend(
  111. `apps/${appId}/completion-messages`,
  112. data,
  113. )
  114. }
  115. const { eventEmitter } = useEventEmitterContextContext()
  116. eventEmitter?.useSubscription((v: any) => {
  117. if (v.type === APP_CHAT_WITH_MULTIPLE_MODEL)
  118. doSend(v.payload.message, v.payload.files)
  119. })
  120. const varList = modelConfig.configs.prompt_variables.map((item: any) => {
  121. return {
  122. label: item.key,
  123. value: inputs[item.key],
  124. }
  125. })
  126. return (
  127. <TextGeneration
  128. className='flex flex-col h-full overflow-y-auto border-none'
  129. innerClassName='grow flex flex-col'
  130. contentClassName='grow'
  131. content={completion}
  132. isLoading={!completion && isResponsing}
  133. isResponsing={isResponsing}
  134. isInstalledApp={false}
  135. messageId={messageId}
  136. isError={false}
  137. onRetry={() => { }}
  138. appId={appId}
  139. varList={varList}
  140. />
  141. )
  142. }
  143. export default memo(TextGenerationItem)