hooks.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import {
  2. useCallback,
  3. useRef,
  4. useState,
  5. } from 'react'
  6. import type {
  7. DebugWithSingleOrMultipleModelConfigs,
  8. ModelAndParameter,
  9. } from './types'
  10. import { ORCHESTRATE_CHANGED } from './types'
  11. import type {
  12. ChatConfig,
  13. ChatItem,
  14. } from '@/app/components/base/chat/types'
  15. import {
  16. AgentStrategy,
  17. } from '@/types/app'
  18. import { promptVariablesToUserInputsForm } from '@/utils/model-config'
  19. import { useDebugConfigurationContext } from '@/context/debug-configuration'
  20. import { useEventEmitterContextContext } from '@/context/event-emitter'
  21. export const useDebugWithSingleOrMultipleModel = (appId: string) => {
  22. const localeDebugWithSingleOrMultipleModelConfigs = localStorage.getItem('app-debug-with-single-or-multiple-models')
  23. const debugWithSingleOrMultipleModelConfigs = useRef<DebugWithSingleOrMultipleModelConfigs>({})
  24. if (localeDebugWithSingleOrMultipleModelConfigs) {
  25. try {
  26. debugWithSingleOrMultipleModelConfigs.current = JSON.parse(localeDebugWithSingleOrMultipleModelConfigs) || {}
  27. }
  28. catch (e) {
  29. console.error(e)
  30. }
  31. }
  32. const [
  33. debugWithMultipleModel,
  34. setDebugWithMultipleModel,
  35. ] = useState(debugWithSingleOrMultipleModelConfigs.current[appId]?.multiple || false)
  36. const [
  37. multipleModelConfigs,
  38. setMultipleModelConfigs,
  39. ] = useState(debugWithSingleOrMultipleModelConfigs.current[appId]?.configs || [])
  40. const handleMultipleModelConfigsChange = useCallback((
  41. multiple: boolean,
  42. modelConfigs: ModelAndParameter[],
  43. ) => {
  44. const value = {
  45. multiple,
  46. configs: modelConfigs,
  47. }
  48. debugWithSingleOrMultipleModelConfigs.current[appId] = value
  49. localStorage.setItem('app-debug-with-single-or-multiple-models', JSON.stringify(debugWithSingleOrMultipleModelConfigs.current))
  50. setDebugWithMultipleModel(value.multiple)
  51. setMultipleModelConfigs(value.configs)
  52. }, [appId])
  53. return {
  54. debugWithMultipleModel,
  55. multipleModelConfigs,
  56. handleMultipleModelConfigsChange,
  57. }
  58. }
  59. export const useConfigFromDebugContext = () => {
  60. const {
  61. isAdvancedMode,
  62. modelConfig,
  63. appId,
  64. promptMode,
  65. speechToTextConfig,
  66. introduction,
  67. suggestedQuestions: openingSuggestedQuestions,
  68. suggestedQuestionsAfterAnswerConfig,
  69. citationConfig,
  70. moderationConfig,
  71. chatPromptConfig,
  72. completionPromptConfig,
  73. dataSets,
  74. datasetConfigs,
  75. visionConfig,
  76. annotationConfig,
  77. textToSpeechConfig,
  78. isFunctionCall,
  79. } = useDebugConfigurationContext()
  80. const postDatasets = dataSets.map(({ id }) => ({
  81. dataset: {
  82. enabled: true,
  83. id,
  84. },
  85. }))
  86. const contextVar = modelConfig.configs.prompt_variables.find(item => item.is_context_var)?.key
  87. const config: ChatConfig = {
  88. pre_prompt: !isAdvancedMode ? modelConfig.configs.prompt_template : '',
  89. prompt_type: promptMode,
  90. chat_prompt_config: isAdvancedMode ? chatPromptConfig : {},
  91. completion_prompt_config: isAdvancedMode ? completionPromptConfig : {},
  92. user_input_form: promptVariablesToUserInputsForm(modelConfig.configs.prompt_variables),
  93. dataset_query_variable: contextVar || '',
  94. opening_statement: introduction,
  95. more_like_this: {
  96. enabled: false,
  97. },
  98. suggested_questions: openingSuggestedQuestions,
  99. suggested_questions_after_answer: suggestedQuestionsAfterAnswerConfig,
  100. text_to_speech: textToSpeechConfig,
  101. speech_to_text: speechToTextConfig,
  102. retriever_resource: citationConfig,
  103. sensitive_word_avoidance: moderationConfig,
  104. agent_mode: {
  105. ...modelConfig.agentConfig,
  106. strategy: isFunctionCall ? AgentStrategy.functionCall : AgentStrategy.react,
  107. },
  108. dataset_configs: {
  109. ...datasetConfigs,
  110. datasets: {
  111. datasets: [...postDatasets],
  112. } as any,
  113. },
  114. file_upload: {
  115. image: visionConfig,
  116. },
  117. annotation_reply: annotationConfig,
  118. supportAnnotation: true,
  119. appId,
  120. supportCitationHitInfo: true,
  121. }
  122. return config
  123. }
  124. export const useFormattingChangedDispatcher = () => {
  125. const { eventEmitter } = useEventEmitterContextContext()
  126. const dispatcher = useCallback(() => {
  127. eventEmitter?.emit({
  128. type: ORCHESTRATE_CHANGED,
  129. } as any)
  130. }, [eventEmitter])
  131. return dispatcher
  132. }
  133. export const useFormattingChangedSubscription = (chatList: ChatItem[]) => {
  134. const {
  135. formattingChanged,
  136. setFormattingChanged,
  137. } = useDebugConfigurationContext()
  138. const { eventEmitter } = useEventEmitterContextContext()
  139. eventEmitter?.useSubscription((v: any) => {
  140. if (v.type === ORCHESTRATE_CHANGED) {
  141. if (chatList.some(item => item.isAnswer) && !formattingChanged)
  142. setFormattingChanged(true)
  143. }
  144. })
  145. }