index.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import {
  2. forwardRef,
  3. memo,
  4. useCallback,
  5. useImperativeHandle,
  6. useMemo,
  7. } from 'react'
  8. import {
  9. useConfigFromDebugContext,
  10. useFormattingChangedSubscription,
  11. } from '../hooks'
  12. import Chat from '@/app/components/base/chat/chat'
  13. import { useChat } from '@/app/components/base/chat/chat/hooks'
  14. import { useDebugConfigurationContext } from '@/context/debug-configuration'
  15. import type { OnSend } from '@/app/components/base/chat/types'
  16. import { useProviderContext } from '@/context/provider-context'
  17. import {
  18. fetchConversationMessages,
  19. fetchSuggestedQuestions,
  20. stopChatMessageResponding,
  21. } from '@/service/debug'
  22. import Avatar from '@/app/components/base/avatar'
  23. import { useAppContext } from '@/context/app-context'
  24. import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  25. type DebugWithSingleModelProps = {
  26. checkCanSend?: () => boolean
  27. }
  28. export type DebugWithSingleModelRefType = {
  29. handleRestart: () => void
  30. }
  31. const DebugWithSingleModel = forwardRef<DebugWithSingleModelRefType, DebugWithSingleModelProps>(({
  32. checkCanSend,
  33. }, ref) => {
  34. const { userProfile } = useAppContext()
  35. const {
  36. modelConfig,
  37. appId,
  38. inputs,
  39. visionConfig,
  40. collectionList,
  41. completionParams,
  42. } = useDebugConfigurationContext()
  43. const { textGenerationModelList } = useProviderContext()
  44. const config = useConfigFromDebugContext()
  45. const {
  46. chatList,
  47. isResponding,
  48. handleSend,
  49. suggestedQuestions,
  50. handleStop,
  51. handleRestart,
  52. handleAnnotationAdded,
  53. handleAnnotationEdited,
  54. handleAnnotationRemoved,
  55. } = useChat(
  56. config,
  57. {
  58. inputs,
  59. promptVariables: modelConfig.configs.prompt_variables,
  60. },
  61. [],
  62. taskId => stopChatMessageResponding(appId, taskId),
  63. )
  64. useFormattingChangedSubscription(chatList)
  65. const doSend: OnSend = useCallback((message, files) => {
  66. if (checkCanSend && !checkCanSend())
  67. return
  68. const currentProvider = textGenerationModelList.find(item => item.provider === modelConfig.provider)
  69. const currentModel = currentProvider?.models.find(model => model.model === modelConfig.model_id)
  70. const supportVision = currentModel?.features?.includes(ModelFeatureEnum.vision)
  71. const configData = {
  72. ...config,
  73. model: {
  74. provider: modelConfig.provider,
  75. name: modelConfig.model_id,
  76. mode: modelConfig.mode,
  77. completion_params: completionParams,
  78. },
  79. }
  80. const data: any = {
  81. query: message,
  82. inputs,
  83. model_config: configData,
  84. }
  85. if (visionConfig.enabled && files?.length && supportVision)
  86. data.files = files
  87. handleSend(
  88. `apps/${appId}/chat-messages`,
  89. data,
  90. {
  91. onGetConversationMessages: (conversationId, getAbortController) => fetchConversationMessages(appId, conversationId, getAbortController),
  92. onGetSuggestedQuestions: (responseItemId, getAbortController) => fetchSuggestedQuestions(appId, responseItemId, getAbortController),
  93. },
  94. )
  95. }, [appId, checkCanSend, completionParams, config, handleSend, inputs, modelConfig, textGenerationModelList, visionConfig.enabled])
  96. const allToolIcons = useMemo(() => {
  97. const icons: Record<string, any> = {}
  98. modelConfig.agentConfig.tools?.forEach((item: any) => {
  99. icons[item.tool_name] = collectionList.find((collection: any) => collection.id === item.provider_id)?.icon
  100. })
  101. return icons
  102. }, [collectionList, modelConfig.agentConfig.tools])
  103. useImperativeHandle(ref, () => {
  104. return {
  105. handleRestart,
  106. }
  107. }, [handleRestart])
  108. return (
  109. <Chat
  110. config={config}
  111. chatList={chatList}
  112. isResponding={isResponding}
  113. chatContainerClassName='p-6'
  114. chatFooterClassName='px-6 pt-10 pb-4'
  115. suggestedQuestions={suggestedQuestions}
  116. onSend={doSend}
  117. onStopResponding={handleStop}
  118. showPromptLog
  119. questionIcon={<Avatar name={userProfile.name} size={40} />}
  120. allToolIcons={allToolIcons}
  121. onAnnotationEdited={handleAnnotationEdited}
  122. onAnnotationAdded={handleAnnotationAdded}
  123. onAnnotationRemoved={handleAnnotationRemoved}
  124. noSpacing
  125. />
  126. )
  127. })
  128. DebugWithSingleModel.displayName = 'DebugWithSingleModel'
  129. export default memo(DebugWithSingleModel)