use-advanced-prompt-config.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import { useState } from 'react'
  2. import { clone } from 'lodash-es'
  3. import produce from 'immer'
  4. import type { ChatPromptConfig, CompletionPromptConfig, ConversationHistoriesRole, PromptItem } from '@/models/debug'
  5. import { PromptMode } from '@/models/debug'
  6. import { ModelModeType } from '@/types/app'
  7. import { DEFAULT_CHAT_PROMPT_CONFIG, DEFAULT_COMPLETION_PROMPT_CONFIG } from '@/config'
  8. import { PRE_PROMPT_PLACEHOLDER_TEXT, checkHasContextBlock, checkHasHistoryBlock, checkHasQueryBlock } from '@/app/components/base/prompt-editor/constants'
  9. import { fetchPromptTemplate } from '@/service/debug'
  10. import type { FormValue } from '@/app/components/header/account-setting/model-provider-page/declarations'
  11. type Param = {
  12. appMode: string
  13. modelModeType: ModelModeType
  14. modelName: string
  15. promptMode: PromptMode
  16. prePrompt: string
  17. onUserChangedPrompt: () => void
  18. hasSetDataSet: boolean
  19. completionParams: FormValue
  20. setCompletionParams: (params: FormValue) => void
  21. setStop: (stop: string[]) => void
  22. }
  23. const useAdvancedPromptConfig = ({
  24. appMode,
  25. modelModeType,
  26. modelName,
  27. promptMode,
  28. prePrompt,
  29. onUserChangedPrompt,
  30. hasSetDataSet,
  31. completionParams,
  32. setCompletionParams,
  33. setStop,
  34. }: Param) => {
  35. const isAdvancedPrompt = promptMode === PromptMode.advanced
  36. const [chatPromptConfig, setChatPromptConfig] = useState<ChatPromptConfig>(clone(DEFAULT_CHAT_PROMPT_CONFIG))
  37. const [completionPromptConfig, setCompletionPromptConfig] = useState<CompletionPromptConfig>(clone(DEFAULT_COMPLETION_PROMPT_CONFIG))
  38. const currentAdvancedPrompt = (() => {
  39. if (!isAdvancedPrompt)
  40. return []
  41. return (modelModeType === ModelModeType.chat) ? chatPromptConfig.prompt : completionPromptConfig.prompt
  42. })()
  43. const setCurrentAdvancedPrompt = (prompt: PromptItem | PromptItem[], isUserChanged?: boolean) => {
  44. if (!isAdvancedPrompt)
  45. return
  46. if (modelModeType === ModelModeType.chat) {
  47. setChatPromptConfig({
  48. ...chatPromptConfig,
  49. prompt: prompt as PromptItem[],
  50. })
  51. }
  52. else {
  53. setCompletionPromptConfig({
  54. ...completionPromptConfig,
  55. prompt: prompt as PromptItem,
  56. })
  57. }
  58. if (isUserChanged)
  59. onUserChangedPrompt()
  60. }
  61. const setConversationHistoriesRole = (conversationHistoriesRole: ConversationHistoriesRole) => {
  62. setCompletionPromptConfig({
  63. ...completionPromptConfig,
  64. conversation_histories_role: conversationHistoriesRole,
  65. })
  66. }
  67. const hasSetBlockStatus = (() => {
  68. if (!isAdvancedPrompt) {
  69. return {
  70. context: checkHasContextBlock(prePrompt),
  71. history: false,
  72. query: false,
  73. }
  74. }
  75. if (modelModeType === ModelModeType.chat) {
  76. return {
  77. context: !!chatPromptConfig.prompt.find(p => checkHasContextBlock(p.text)),
  78. history: false,
  79. query: !!chatPromptConfig.prompt.find(p => checkHasQueryBlock(p.text)),
  80. }
  81. }
  82. else {
  83. const prompt = completionPromptConfig.prompt?.text
  84. return {
  85. context: checkHasContextBlock(prompt),
  86. history: checkHasHistoryBlock(prompt),
  87. query: checkHasQueryBlock(prompt),
  88. }
  89. }
  90. })()
  91. /* prompt: simple to advanced process, or chat model to completion model
  92. * 1. migrate prompt
  93. * 2. change promptMode to advanced
  94. */
  95. const migrateToDefaultPrompt = async (isMigrateToCompetition?: boolean, toModelModeType?: ModelModeType) => {
  96. const mode = modelModeType
  97. const toReplacePrePrompt = prePrompt || ''
  98. if (!isAdvancedPrompt) {
  99. const { chat_prompt_config, completion_prompt_config, stop } = await fetchPromptTemplate({
  100. appMode,
  101. mode,
  102. modelName,
  103. hasSetDataSet,
  104. })
  105. if (modelModeType === ModelModeType.chat) {
  106. const newPromptConfig = produce(chat_prompt_config, (draft) => {
  107. draft.prompt = draft.prompt.map((p) => {
  108. return {
  109. ...p,
  110. text: p.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt),
  111. }
  112. })
  113. })
  114. setChatPromptConfig(newPromptConfig)
  115. }
  116. else {
  117. const newPromptConfig = produce(completion_prompt_config, (draft) => {
  118. draft.prompt.text = draft.prompt.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt)
  119. })
  120. setCompletionPromptConfig(newPromptConfig)
  121. setCompletionParams({
  122. ...completionParams,
  123. stop,
  124. })
  125. }
  126. return
  127. }
  128. if (isMigrateToCompetition) {
  129. const { completion_prompt_config, chat_prompt_config, stop } = await fetchPromptTemplate({
  130. appMode,
  131. mode: toModelModeType as ModelModeType,
  132. modelName,
  133. hasSetDataSet,
  134. })
  135. if (toModelModeType === ModelModeType.completion) {
  136. const newPromptConfig = produce(completion_prompt_config, (draft) => {
  137. if (!completionPromptConfig.prompt?.text)
  138. draft.prompt.text = draft.prompt.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt)
  139. else
  140. draft.prompt.text = completionPromptConfig.prompt?.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt)
  141. if (['advanced-chat', 'agent-chat', 'chat'].includes(appMode) && completionPromptConfig.conversation_histories_role.assistant_prefix && completionPromptConfig.conversation_histories_role.user_prefix)
  142. draft.conversation_histories_role = completionPromptConfig.conversation_histories_role
  143. })
  144. setCompletionPromptConfig(newPromptConfig)
  145. if (!completionParams.stop || completionParams.stop.length === 0) {
  146. setCompletionParams({
  147. ...completionParams,
  148. stop,
  149. })
  150. }
  151. setStop(stop) // switch mode's params is async. It may override the stop value.
  152. }
  153. else {
  154. const newPromptConfig = produce(chat_prompt_config, (draft) => {
  155. draft.prompt = draft.prompt.map((p) => {
  156. return {
  157. ...p,
  158. text: p.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt),
  159. }
  160. })
  161. })
  162. setChatPromptConfig(newPromptConfig)
  163. }
  164. }
  165. }
  166. return {
  167. chatPromptConfig,
  168. setChatPromptConfig,
  169. completionPromptConfig,
  170. setCompletionPromptConfig,
  171. currentAdvancedPrompt,
  172. setCurrentAdvancedPrompt,
  173. hasSetBlockStatus,
  174. setConversationHistoriesRole,
  175. migrateToDefaultPrompt,
  176. }
  177. }
  178. export default useAdvancedPromptConfig