@touchvue/chat 1.0.0-beta.45 → 1.0.0-beta.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +70 -70
  2. package/es/package.json.css +1 -1
  3. package/es/package.json.mjs +1 -1
  4. package/es/packages/components/resolver.mjs.map +1 -1
  5. package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
  6. package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
  7. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +8 -8
  8. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
  9. package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
  10. package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
  11. package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
  12. package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
  13. package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
  14. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
  15. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
  16. package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
  17. package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
  18. package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
  19. package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
  20. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
  21. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
  22. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +2 -2
  23. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
  24. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +8 -8
  25. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
  26. package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs.map +1 -1
  27. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
  28. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
  29. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
  30. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
  31. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +35 -26
  32. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
  33. package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -1
  34. package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -1
  35. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  36. package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -1
  37. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -1
  38. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
  39. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +5 -5
  40. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  41. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
  42. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  43. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
  44. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  45. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
  46. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
  47. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
  48. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  49. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  50. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
  51. package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
  52. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +21 -19
  53. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
  54. package/es/packages/components/touchchat/src/index.vue2.mjs +5 -3
  55. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  56. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  57. package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
  58. package/lib/package.json.css +1 -1
  59. package/lib/package.json.js +1 -1
  60. package/lib/packages/components/resolver.js.map +1 -1
  61. package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
  62. package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
  63. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +8 -8
  64. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  65. package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
  66. package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
  67. package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
  68. package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
  69. package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
  70. package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
  71. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  72. package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
  73. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  74. package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
  75. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  76. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
  77. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  78. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +2 -2
  79. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  80. package/lib/packages/components/touchchat/component/PDFFile.vue2.js +8 -8
  81. package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
  82. package/lib/packages/components/touchchat/component/QuoteContent.vue2.js.map +1 -1
  83. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
  84. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
  85. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
  86. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
  87. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +35 -26
  88. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
  89. package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -1
  90. package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -1
  91. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  92. package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -1
  93. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -1
  94. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
  95. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +5 -5
  96. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  97. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
  98. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  99. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
  100. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  101. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
  102. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
  103. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
  104. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  105. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  106. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
  107. package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
  108. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +20 -18
  109. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
  110. package/lib/packages/components/touchchat/src/index.vue2.js +5 -3
  111. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  112. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  113. package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
  114. package/package.json +83 -83
@@ -1 +1 @@
1
- {"version":3,"file":"useCopy.js","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useCopy.ts"],"sourcesContent":["import { showToast } from '../../../utils/tools'\n\n/**\n * 复制功能 composable\n * 提供统一的复制到剪贴板功能,支持现代浏览器和降级方案\n */\nexport function useCopy() {\n\t/**\n\t * 复制文本到剪贴板\n\t * @param text - 要复制的文本内容\n\t * @param successMsg - 成功时的提示消息,默认 '复制成功'\n\t * @param errorMsg - 失败时的提示消息,默认 '复制失败'\n\t */\n\tconst copyToClipboard = (text: string, successMsg: string = '复制成功', errorMsg: string = '复制失败'): void => {\n\t\tif (!text) {\n\t\t\tshowToast('复制内容为空', 'warning')\n\t\t\treturn\n\t\t}\n\n\t\t// 优先使用 Clipboard API\n\t\tif (navigator.clipboard && window.isSecureContext) {\n\t\t\tnavigator.clipboard\n\t\t\t\t.writeText(text)\n\t\t\t\t.then(() => {\n\t\t\t\t\tshowToast(successMsg, 'info')\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('复制失败:', err)\n\t\t\t\t\tfallbackCopy(text, successMsg, errorMsg)\n\t\t\t\t})\n\t\t} else {\n\t\t\t// 降级方案:使用传统的复制方法\n\t\t\tfallbackCopy(text, successMsg, errorMsg)\n\t\t}\n\t}\n\n\t/**\n\t * 降级复制方案 (使用 textarea)\n\t */\n\tconst fallbackCopy = (text: string, successMsg: string, errorMsg: string): void => {\n\t\tconst textArea = document.createElement('textarea')\n\t\ttextArea.value = text\n\t\ttextArea.style.position = 'fixed'\n\t\ttextArea.style.left = '-999999px'\n\t\ttextArea.style.top = '-999999px'\n\t\tdocument.body.appendChild(textArea)\n\t\ttextArea.focus()\n\t\ttextArea.select()\n\n\t\ttry {\n\t\t\tconst successful = document.execCommand('copy')\n\t\t\tshowToast(successful ? successMsg : errorMsg, successful ? 'info' : 'error')\n\t\t} catch (err) {\n\t\t\tconsole.error('复制失败:', err)\n\t\t\tshowToast(errorMsg, 'error')\n\t\t} finally {\n\t\t\tdocument.body.removeChild(textArea)\n\t\t}\n\t}\n\n\t/**\n\t * 带按钮反馈的复制功能(用于代码块复制按钮)\n\t * @param text - 要复制的文本\n\t * @param button - 复制按钮元素,用于显示\"已复制\"状态\n\t * @param originalText - 按钮原始文本\n\t * @param copiedText - 复制成功后的文本,默认 '已复制'\n\t * @param duration - 显示成功文本的时长(ms),默认 2000\n\t */\n\tconst copyWithFeedback = (text: string, button: HTMLElement, originalText: string = '', copiedText: string = '已复制', duration: number = 2000): void => {\n\t\tif (!text) return\n\n\t\tcopyToClipboard(text, '', '')\n\n\t\t// 显示反馈\n\t\tbutton.textContent = copiedText\n\t\tsetTimeout(() => {\n\t\t\tbutton.textContent = originalText\n\t\t}, duration)\n\t}\n\n\treturn {\n\t\tcopyToClipboard,\n\t\tcopyWithFeedback\n\t}\n}\n"],"names":["showToast"],"mappings":";;;;AAMO,SAAS,OAAU,GAAA;AAOzB,EAAA,MAAM,kBAAkB,CAAC,IAAA,EAAc,UAAqB,GAAA,0BAAA,EAAQ,WAAmB,0BAAiB,KAAA;AACvG,IAAA,IAAI,CAAC,IAAM,EAAA;AACV,MAAAA,eAAA,CAAU,wCAAU,SAAS,CAAA,CAAA;AAC7B,MAAA,OAAA;AAAA,KACD;AAGA,IAAI,IAAA,SAAA,CAAU,SAAa,IAAA,MAAA,CAAO,eAAiB,EAAA;AAClD,MAAA,SAAA,CAAU,SACR,CAAA,SAAA,CAAU,IAAI,CAAA,CACd,KAAK,MAAM;AACX,QAAAA,eAAA,CAAU,YAAY,MAAM,CAAA,CAAA;AAAA,OAC5B,CACA,CAAA,KAAA,CAAM,CAAO,GAAA,KAAA;AACb,QAAQ,OAAA,CAAA,KAAA,CAAM,6BAAS,GAAG,CAAA,CAAA;AAC1B,QAAa,YAAA,CAAA,IAAA,EAAM,YAAY,QAAQ,CAAA,CAAA;AAAA,OACvC,CAAA,CAAA;AAAA,KACI,MAAA;AAEN,MAAa,YAAA,CAAA,IAAA,EAAM,YAAY,QAAQ,CAAA,CAAA;AAAA,KACxC;AAAA,GACD,CAAA;AAKA,EAAA,MAAM,YAAe,GAAA,CAAC,IAAc,EAAA,UAAA,EAAoB,QAA2B,KAAA;AAClF,IAAM,MAAA,QAAA,GAAW,QAAS,CAAA,aAAA,CAAc,UAAU,CAAA,CAAA;AAClD,IAAA,QAAA,CAAS,KAAQ,GAAA,IAAA,CAAA;AACjB,IAAA,QAAA,CAAS,MAAM,QAAW,GAAA,OAAA,CAAA;AAC1B,IAAA,QAAA,CAAS,MAAM,IAAO,GAAA,WAAA,CAAA;AACtB,IAAA,QAAA,CAAS,MAAM,GAAM,GAAA,WAAA,CAAA;AACrB,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAClC,IAAA,QAAA,CAAS,KAAM,EAAA,CAAA;AACf,IAAA,QAAA,CAAS,MAAO,EAAA,CAAA;AAEhB,IAAI,IAAA;AACH,MAAM,MAAA,UAAA,GAAa,QAAS,CAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAC9C,MAAAA,eAAA,CAAU,UAAa,GAAA,UAAA,GAAa,QAAU,EAAA,UAAA,GAAa,SAAS,OAAO,CAAA,CAAA;AAAA,aACnE,GAAP,EAAA;AACD,MAAQ,OAAA,CAAA,KAAA,CAAM,6BAAS,GAAG,CAAA,CAAA;AAC1B,MAAAA,eAAA,CAAU,UAAU,OAAO,CAAA,CAAA;AAAA,KAC1B,SAAA;AACD,MAAS,QAAA,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAAA,KACnC;AAAA,GACD,CAAA;AAUA,EAAM,MAAA,gBAAA,GAAmB,CAAC,IAAc,EAAA,MAAA,EAAqB,eAAuB,EAAI,EAAA,UAAA,GAAqB,oBAAO,EAAA,QAAA,GAAmB,GAAe,KAAA;AACrJ,IAAA,IAAI,CAAC,IAAA;AAAM,MAAA,OAAA;AAEX,IAAgB,eAAA,CAAA,IAAA,EAAM,IAAI,EAAE,CAAA,CAAA;AAG5B,IAAA,MAAA,CAAO,WAAc,GAAA,UAAA,CAAA;AACrB,IAAA,UAAA,CAAW,MAAM;AAChB,MAAA,MAAA,CAAO,WAAc,GAAA,YAAA,CAAA;AAAA,OACnB,QAAQ,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAO,OAAA;AAAA,IACN,eAAA;AAAA,IACA,gBAAA;AAAA,GACD,CAAA;AACD;;;;"}
1
+ {"version":3,"file":"useCopy.js","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useCopy.ts"],"sourcesContent":["import { showToast } from '../../../utils/tools'\r\n\r\n/**\r\n * 复制功能 composable\r\n * 提供统一的复制到剪贴板功能,支持现代浏览器和降级方案\r\n */\r\nexport function useCopy() {\r\n\t/**\r\n\t * 复制文本到剪贴板\r\n\t * @param text - 要复制的文本内容\r\n\t * @param successMsg - 成功时的提示消息,默认 '复制成功'\r\n\t * @param errorMsg - 失败时的提示消息,默认 '复制失败'\r\n\t */\r\n\tconst copyToClipboard = (text: string, successMsg: string = '复制成功', errorMsg: string = '复制失败'): void => {\r\n\t\tif (!text) {\r\n\t\t\tshowToast('复制内容为空', 'warning')\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// 优先使用 Clipboard API\r\n\t\tif (navigator.clipboard && window.isSecureContext) {\r\n\t\t\tnavigator.clipboard\r\n\t\t\t\t.writeText(text)\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tshowToast(successMsg, 'info')\r\n\t\t\t\t})\r\n\t\t\t\t.catch(err => {\r\n\t\t\t\t\tconsole.error('复制失败:', err)\r\n\t\t\t\t\tfallbackCopy(text, successMsg, errorMsg)\r\n\t\t\t\t})\r\n\t\t} else {\r\n\t\t\t// 降级方案:使用传统的复制方法\r\n\t\t\tfallbackCopy(text, successMsg, errorMsg)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 降级复制方案 (使用 textarea)\r\n\t */\r\n\tconst fallbackCopy = (text: string, successMsg: string, errorMsg: string): void => {\r\n\t\tconst textArea = document.createElement('textarea')\r\n\t\ttextArea.value = text\r\n\t\ttextArea.style.position = 'fixed'\r\n\t\ttextArea.style.left = '-999999px'\r\n\t\ttextArea.style.top = '-999999px'\r\n\t\tdocument.body.appendChild(textArea)\r\n\t\ttextArea.focus()\r\n\t\ttextArea.select()\r\n\r\n\t\ttry {\r\n\t\t\tconst successful = document.execCommand('copy')\r\n\t\t\tshowToast(successful ? successMsg : errorMsg, successful ? 'info' : 'error')\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error('复制失败:', err)\r\n\t\t\tshowToast(errorMsg, 'error')\r\n\t\t} finally {\r\n\t\t\tdocument.body.removeChild(textArea)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 带按钮反馈的复制功能(用于代码块复制按钮)\r\n\t * @param text - 要复制的文本\r\n\t * @param button - 复制按钮元素,用于显示\"已复制\"状态\r\n\t * @param originalText - 按钮原始文本\r\n\t * @param copiedText - 复制成功后的文本,默认 '已复制'\r\n\t * @param duration - 显示成功文本的时长(ms),默认 2000\r\n\t */\r\n\tconst copyWithFeedback = (text: string, button: HTMLElement, originalText: string = '', copiedText: string = '已复制', duration: number = 2000): void => {\r\n\t\tif (!text) return\r\n\r\n\t\tcopyToClipboard(text, '', '')\r\n\r\n\t\t// 显示反馈\r\n\t\tbutton.textContent = copiedText\r\n\t\tsetTimeout(() => {\r\n\t\t\tbutton.textContent = originalText\r\n\t\t}, duration)\r\n\t}\r\n\r\n\treturn {\r\n\t\tcopyToClipboard,\r\n\t\tcopyWithFeedback\r\n\t}\r\n}\r\n"],"names":["showToast"],"mappings":";;;;AAMO,SAAS,OAAU,GAAA;AAOzB,EAAA,MAAM,kBAAkB,CAAC,IAAA,EAAc,UAAqB,GAAA,0BAAA,EAAQ,WAAmB,0BAAiB,KAAA;AACvG,IAAA,IAAI,CAAC,IAAM,EAAA;AACV,MAAAA,eAAA,CAAU,wCAAU,SAAS,CAAA,CAAA;AAC7B,MAAA,OAAA;AAAA,KACD;AAGA,IAAI,IAAA,SAAA,CAAU,SAAa,IAAA,MAAA,CAAO,eAAiB,EAAA;AAClD,MAAA,SAAA,CAAU,SACR,CAAA,SAAA,CAAU,IAAI,CAAA,CACd,KAAK,MAAM;AACX,QAAAA,eAAA,CAAU,YAAY,MAAM,CAAA,CAAA;AAAA,OAC5B,CACA,CAAA,KAAA,CAAM,CAAO,GAAA,KAAA;AACb,QAAQ,OAAA,CAAA,KAAA,CAAM,6BAAS,GAAG,CAAA,CAAA;AAC1B,QAAa,YAAA,CAAA,IAAA,EAAM,YAAY,QAAQ,CAAA,CAAA;AAAA,OACvC,CAAA,CAAA;AAAA,KACI,MAAA;AAEN,MAAa,YAAA,CAAA,IAAA,EAAM,YAAY,QAAQ,CAAA,CAAA;AAAA,KACxC;AAAA,GACD,CAAA;AAKA,EAAA,MAAM,YAAe,GAAA,CAAC,IAAc,EAAA,UAAA,EAAoB,QAA2B,KAAA;AAClF,IAAM,MAAA,QAAA,GAAW,QAAS,CAAA,aAAA,CAAc,UAAU,CAAA,CAAA;AAClD,IAAA,QAAA,CAAS,KAAQ,GAAA,IAAA,CAAA;AACjB,IAAA,QAAA,CAAS,MAAM,QAAW,GAAA,OAAA,CAAA;AAC1B,IAAA,QAAA,CAAS,MAAM,IAAO,GAAA,WAAA,CAAA;AACtB,IAAA,QAAA,CAAS,MAAM,GAAM,GAAA,WAAA,CAAA;AACrB,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAClC,IAAA,QAAA,CAAS,KAAM,EAAA,CAAA;AACf,IAAA,QAAA,CAAS,MAAO,EAAA,CAAA;AAEhB,IAAI,IAAA;AACH,MAAM,MAAA,UAAA,GAAa,QAAS,CAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAC9C,MAAAA,eAAA,CAAU,UAAa,GAAA,UAAA,GAAa,QAAU,EAAA,UAAA,GAAa,SAAS,OAAO,CAAA,CAAA;AAAA,aACnE,GAAP,EAAA;AACD,MAAQ,OAAA,CAAA,KAAA,CAAM,6BAAS,GAAG,CAAA,CAAA;AAC1B,MAAAA,eAAA,CAAU,UAAU,OAAO,CAAA,CAAA;AAAA,KAC1B,SAAA;AACD,MAAS,QAAA,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAAA,KACnC;AAAA,GACD,CAAA;AAUA,EAAM,MAAA,gBAAA,GAAmB,CAAC,IAAc,EAAA,MAAA,EAAqB,eAAuB,EAAI,EAAA,UAAA,GAAqB,oBAAO,EAAA,QAAA,GAAmB,GAAe,KAAA;AACrJ,IAAA,IAAI,CAAC,IAAA;AAAM,MAAA,OAAA;AAEX,IAAgB,eAAA,CAAA,IAAA,EAAM,IAAI,EAAE,CAAA,CAAA;AAG5B,IAAA,MAAA,CAAO,WAAc,GAAA,UAAA,CAAA;AACrB,IAAA,UAAA,CAAW,MAAM;AAChB,MAAA,MAAA,CAAO,WAAc,GAAA,YAAA,CAAA;AAAA,OACnB,QAAQ,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAO,OAAA;AAAA,IACN,eAAA;AAAA,IACA,gBAAA;AAAA,GACD,CAAA;AACD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMessageRender.js","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useMessageRender.ts"],"sourcesContent":["/**\n * 消息渲染相关逻辑 Composable\n */\n\nimport { ref, type Ref, nextTick } from 'vue'\nimport type { ChatMessage, RenderData } from './types'\nimport markdown from '../../../utils/markdown.ts'\nimport DOMPurify from 'dompurify'\nimport { useCopy } from './useCopy'\n\nexport interface UseMessageRenderOptions {\n\tchatList: Ref<ChatMessage[]>\n\tcurrIndex: Ref<number>\n\tisMounted: Ref<boolean>\n\tisUnmounting: Ref<boolean>\n}\n\nexport function useMessageRender({ chatList, currIndex, isMounted, isUnmounting }: UseMessageRenderOptions) {\n\tconst htmlContentRef = ref<(HTMLElement | null)[]>([])\n\tconst thinkingContentRef = ref<(HTMLElement | null)[]>([])\n\tconst reasoningContentRef = ref<(HTMLElement | null)[]>([])\n\tconst renderQueue = ref<RenderData[]>([])\n\tconst isRendering = ref(false)\n\n\t// 复制功能 composable\n\tconst { copyWithFeedback } = useCopy()\n\n\t// Markdown转HTML\n\tconst markdownToHtml = (markdownContent: string): string => {\n\t\treturn markdown?.render(markdownContent, { isReasoning: false }) || ''\n\t}\n\n\t// 附加复制按钮\n\tconst attachCopyButtons = (container: HTMLElement): void => {\n\t\tconst codeBlocks = container.querySelectorAll('pre code')\n\t\tcodeBlocks.forEach(codeBlock => {\n\t\t\tconst pre = codeBlock.parentElement\n\t\t\tif (pre) {\n\t\t\t\tconst copyBtn = document.createElement('button')\n\t\t\t\tcopyBtn.className = 'touchchat-code-copy'\n\t\t\t\tcopyBtn.addEventListener('click', () => {\n\t\t\t\t\tconst code = codeBlock.textContent || ''\n\t\t\t\t\tcopyWithFeedback(code, copyBtn, '', '已复制', 2000)\n\t\t\t\t})\n\n\t\t\t\tpre.style.position = 'relative'\n\t\t\t\tpre.appendChild(copyBtn)\n\t\t\t}\n\t\t})\n\t}\n\n\t// 渲染内容\n\tconst renderContent = (content: string, type: 'main' | 'thinking' | 'reasoning', index?: number): void => {\n\t\tconst renderIndex = index ?? currIndex.value\n\t\tif (renderIndex < 0 || renderIndex >= chatList.value.length) return\n\n\t\tconst refArrays = {\n\t\t\tmain: htmlContentRef,\n\t\t\tthinking: thinkingContentRef,\n\t\t\treasoning: reasoningContentRef\n\t\t}\n\t\tconst processors = {\n\t\t\tmain: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\n\t\t\tthinking: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\n\t\t\treasoning: (content: string) => markdown?.render(content, { isReasoning: true }) || ''\n\t\t}\n\n\t\tconst container = refArrays[type].value[renderIndex]\n\t\tif (!container) return\n\n\t\tconst rawHtml = processors[type](content || '')\n\t\t// 使用 DOMPurify 进行 XSS 防护\n\t\tconst sanitizedContent = DOMPurify.sanitize(rawHtml)\n\t\t// 使用 DOMParser 安全地解析 HTML\n\t\tconst parser = new DOMParser()\n\t\tconst doc = parser.parseFromString(sanitizedContent, 'text/html')\n\t\tconst fragment = doc.createRange().createContextualFragment(sanitizedContent)\n\t\t// 安全地设置内容\n\t\tcontainer.textContent = ''\n\t\tcontainer.appendChild(fragment)\n\t\tattachCopyButtons(container)\n\t}\n\n\t// 渲染队列\n\tconst enqueueRender = (data: RenderData): void => {\n\t\tif (isUnmounting.value || !isMounted.value) return\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\n\t\trenderQueue.value.push(data)\n\t\tif (!isRendering.value) {\n\t\t\tisRendering.value = true\n\t\t\tprocessRenderQueue()\n\t\t}\n\t}\n\n\tconst processRenderQueue = (): void => {\n\t\tif (isUnmounting.value || !isMounted.value) {\n\t\t\trenderQueue.value = []\n\t\t\tisRendering.value = false\n\t\t\treturn\n\t\t}\n\n\t\tif (renderQueue.value.length === 0) {\n\t\t\tisRendering.value = false\n\t\t\treturn\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\tconst data = renderQueue.value.shift()\n\t\t\tif (data) {\n\t\t\t\tformatMarkdown(data)\n\t\t\t}\n\t\t\tprocessRenderQueue()\n\t\t})\n\t}\n\n\t// 格式化Markdown内容\n\tconst formatMarkdown = (data: RenderData): void => {\n\t\tif (!isMounted.value) return\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\n\n\t\tconst currentItem = chatList.value[currIndex.value]\n\t\t// 如果是错误消息,不更新content\n\t\tif (!currentItem.isError) {\n\t\t\tcurrentItem.thinkContent = data.thinkContent\n\t\t\tcurrentItem.content = data.mainContent\n\t\t\tcurrentItem.reasoningContent = data.reasoningContent\n\t\t}\n\n\t\tnextTick(() => {\n\t\t\tconst thinkingContainer = thinkingContentRef.value[currIndex.value]\n\t\t\tif (thinkingContainer) {\n\t\t\t\tif (data.thinkContent && !currentItem.isError) {\n\t\t\t\t\trenderContent(data.thinkContent, 'thinking')\n\t\t\t\t\tthinkingContainer.style.display = 'block'\n\t\t\t\t\tthinkingContainer.style.visibility = 'visible'\n\t\t\t\t} else {\n\t\t\t\t\tthinkingContainer.style.display = 'none'\n\t\t\t\t\tthinkingContainer.style.visibility = 'hidden'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst reasoningContainer = reasoningContentRef.value[currIndex.value]\n\t\t\tif (reasoningContainer) {\n\t\t\t\tif (data.reasoningContent && !currentItem.isError) {\n\t\t\t\t\trenderContent(data.reasoningContent, 'reasoning')\n\t\t\t\t\treasoningContainer.style.display = 'block'\n\t\t\t\t\treasoningContainer.style.visibility = 'visible'\n\t\t\t\t} else {\n\t\t\t\t\treasoningContainer.style.display = 'none'\n\t\t\t\t\treasoningContainer.style.visibility = 'hidden'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 如果是错误消息,使用currentItem.content,否则使用data.mainContent\n\t\t\trenderContent(currentItem.isError ? currentItem.content : data.mainContent, 'main')\n\t\t})\n\t}\n\n\t// 清理渲染相关引用\n\tconst cleanupRenderRefs = () => {\n\t\trenderQueue.value = []\n\t\thtmlContentRef.value = []\n\t\tthinkingContentRef.value = []\n\t\treasoningContentRef.value = []\n\t}\n\n\treturn {\n\t\thtmlContentRef,\n\t\tthinkingContentRef,\n\t\treasoningContentRef,\n\t\trenderQueue,\n\t\tisRendering,\n\t\tmarkdownToHtml,\n\t\trenderContent,\n\t\tenqueueRender,\n\t\tformatMarkdown,\n\t\tcleanupRenderRefs\n\t}\n}\n"],"names":["ref","useCopy","content","markdown","DOMPurify","nextTick"],"mappings":"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"}
1
+ {"version":3,"file":"useMessageRender.js","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useMessageRender.ts"],"sourcesContent":["/**\r\n * 消息渲染相关逻辑 Composable\r\n */\r\n\r\nimport { ref, type Ref, nextTick } from 'vue'\r\nimport type { ChatMessage, RenderData } from './types'\r\nimport markdown from '../../../utils/markdown.ts'\r\nimport DOMPurify from 'dompurify'\r\nimport { useCopy } from './useCopy'\r\n\r\nexport interface UseMessageRenderOptions {\r\n\tchatList: Ref<ChatMessage[]>\r\n\tcurrIndex: Ref<number>\r\n\tisMounted: Ref<boolean>\r\n\tisUnmounting: Ref<boolean>\r\n}\r\n\r\nexport function useMessageRender({ chatList, currIndex, isMounted, isUnmounting }: UseMessageRenderOptions) {\r\n\tconst htmlContentRef = ref<(HTMLElement | null)[]>([])\r\n\tconst thinkingContentRef = ref<(HTMLElement | null)[]>([])\r\n\tconst reasoningContentRef = ref<(HTMLElement | null)[]>([])\r\n\tconst renderQueue = ref<RenderData[]>([])\r\n\tconst isRendering = ref(false)\r\n\r\n\t// 复制功能 composable\r\n\tconst { copyWithFeedback } = useCopy()\r\n\r\n\t// Markdown转HTML\r\n\tconst markdownToHtml = (markdownContent: string): string => {\r\n\t\treturn markdown?.render(markdownContent, { isReasoning: false }) || ''\r\n\t}\r\n\r\n\t// 附加复制按钮\r\n\tconst attachCopyButtons = (container: HTMLElement): void => {\r\n\t\tconst codeBlocks = container.querySelectorAll('pre code')\r\n\t\tcodeBlocks.forEach(codeBlock => {\r\n\t\t\tconst pre = codeBlock.parentElement\r\n\t\t\tif (pre) {\r\n\t\t\t\tconst copyBtn = document.createElement('button')\r\n\t\t\t\tcopyBtn.className = 'touchchat-code-copy'\r\n\t\t\t\tcopyBtn.addEventListener('click', () => {\r\n\t\t\t\t\tconst code = codeBlock.textContent || ''\r\n\t\t\t\t\tcopyWithFeedback(code, copyBtn, '', '已复制', 2000)\r\n\t\t\t\t})\r\n\r\n\t\t\t\tpre.style.position = 'relative'\r\n\t\t\t\tpre.appendChild(copyBtn)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t// 渲染内容\r\n\tconst renderContent = (content: string, type: 'main' | 'thinking' | 'reasoning', index?: number): void => {\r\n\t\tconst renderIndex = index ?? currIndex.value\r\n\t\tif (renderIndex < 0 || renderIndex >= chatList.value.length) return\r\n\r\n\t\tconst refArrays = {\r\n\t\t\tmain: htmlContentRef,\r\n\t\t\tthinking: thinkingContentRef,\r\n\t\t\treasoning: reasoningContentRef\r\n\t\t}\r\n\t\tconst processors = {\r\n\t\t\tmain: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\r\n\t\t\tthinking: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\r\n\t\t\treasoning: (content: string) => markdown?.render(content, { isReasoning: true }) || ''\r\n\t\t}\r\n\r\n\t\tconst container = refArrays[type].value[renderIndex]\r\n\t\tif (!container) return\r\n\r\n\t\tconst rawHtml = processors[type](content || '')\r\n\t\t// 使用 DOMPurify 进行 XSS 防护\r\n\t\tconst sanitizedContent = DOMPurify.sanitize(rawHtml)\r\n\t\t// 使用 DOMParser 安全地解析 HTML\r\n\t\tconst parser = new DOMParser()\r\n\t\tconst doc = parser.parseFromString(sanitizedContent, 'text/html')\r\n\t\tconst fragment = doc.createRange().createContextualFragment(sanitizedContent)\r\n\t\t// 安全地设置内容\r\n\t\tcontainer.textContent = ''\r\n\t\tcontainer.appendChild(fragment)\r\n\t\tattachCopyButtons(container)\r\n\t}\r\n\r\n\t// 渲染队列\r\n\tconst enqueueRender = (data: RenderData): void => {\r\n\t\tif (isUnmounting.value || !isMounted.value) return\r\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\r\n\t\trenderQueue.value.push(data)\r\n\t\tif (!isRendering.value) {\r\n\t\t\tisRendering.value = true\r\n\t\t\tprocessRenderQueue()\r\n\t\t}\r\n\t}\r\n\r\n\tconst processRenderQueue = (): void => {\r\n\t\tif (isUnmounting.value || !isMounted.value) {\r\n\t\t\trenderQueue.value = []\r\n\t\t\tisRendering.value = false\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (renderQueue.value.length === 0) {\r\n\t\t\tisRendering.value = false\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\trequestAnimationFrame(() => {\r\n\t\t\tconst data = renderQueue.value.shift()\r\n\t\t\tif (data) {\r\n\t\t\t\tformatMarkdown(data)\r\n\t\t\t}\r\n\t\t\tprocessRenderQueue()\r\n\t\t})\r\n\t}\r\n\r\n\t// 格式化Markdown内容\r\n\tconst formatMarkdown = (data: RenderData): void => {\r\n\t\tif (!isMounted.value) return\r\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\r\n\r\n\t\tconst currentItem = chatList.value[currIndex.value]\r\n\t\t// 如果是错误消息,不更新content\r\n\t\tif (!currentItem.isError) {\r\n\t\t\tcurrentItem.thinkContent = data.thinkContent\r\n\t\t\tcurrentItem.content = data.mainContent\r\n\t\t\tcurrentItem.reasoningContent = data.reasoningContent\r\n\t\t}\r\n\r\n\t\tnextTick(() => {\r\n\t\t\tconst thinkingContainer = thinkingContentRef.value[currIndex.value]\r\n\t\t\tif (thinkingContainer) {\r\n\t\t\t\tif (data.thinkContent && !currentItem.isError) {\r\n\t\t\t\t\trenderContent(data.thinkContent, 'thinking')\r\n\t\t\t\t\tthinkingContainer.style.display = 'block'\r\n\t\t\t\t\tthinkingContainer.style.visibility = 'visible'\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthinkingContainer.style.display = 'none'\r\n\t\t\t\t\tthinkingContainer.style.visibility = 'hidden'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst reasoningContainer = reasoningContentRef.value[currIndex.value]\r\n\t\t\tif (reasoningContainer) {\r\n\t\t\t\tif (data.reasoningContent && !currentItem.isError) {\r\n\t\t\t\t\trenderContent(data.reasoningContent, 'reasoning')\r\n\t\t\t\t\treasoningContainer.style.display = 'block'\r\n\t\t\t\t\treasoningContainer.style.visibility = 'visible'\r\n\t\t\t\t} else {\r\n\t\t\t\t\treasoningContainer.style.display = 'none'\r\n\t\t\t\t\treasoningContainer.style.visibility = 'hidden'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// 如果是错误消息,使用currentItem.content,否则使用data.mainContent\r\n\t\t\trenderContent(currentItem.isError ? currentItem.content : data.mainContent, 'main')\r\n\t\t})\r\n\t}\r\n\r\n\t// 清理渲染相关引用\r\n\tconst cleanupRenderRefs = () => {\r\n\t\trenderQueue.value = []\r\n\t\thtmlContentRef.value = []\r\n\t\tthinkingContentRef.value = []\r\n\t\treasoningContentRef.value = []\r\n\t}\r\n\r\n\treturn {\r\n\t\thtmlContentRef,\r\n\t\tthinkingContentRef,\r\n\t\treasoningContentRef,\r\n\t\trenderQueue,\r\n\t\tisRendering,\r\n\t\tmarkdownToHtml,\r\n\t\trenderContent,\r\n\t\tenqueueRender,\r\n\t\tformatMarkdown,\r\n\t\tcleanupRenderRefs\r\n\t}\r\n}\r\n"],"names":["ref","useCopy","content","markdown","DOMPurify","nextTick"],"mappings":";;;;;;;AAiBO,SAAS,iBAAiB,EAAE,QAAA,EAAU,SAAW,EAAA,SAAA,EAAW,cAAyC,EAAA;AAC3G,EAAM,MAAA,cAAA,GAAiBA,OAA4B,CAAA,EAAE,CAAA,CAAA;AACrD,EAAM,MAAA,kBAAA,GAAqBA,OAA4B,CAAA,EAAE,CAAA,CAAA;AACzD,EAAM,MAAA,mBAAA,GAAsBA,OAA4B,CAAA,EAAE,CAAA,CAAA;AAC1D,EAAM,MAAA,WAAA,GAAcA,OAAkB,CAAA,EAAE,CAAA,CAAA;AACxC,EAAM,MAAA,WAAA,GAAcA,QAAI,KAAK,CAAA,CAAA;AAG7B,EAAM,MAAA,EAAE,gBAAiB,EAAA,GAAIC,eAAQ,EAAA,CAAA;AAGrC,EAAM,MAAA,cAAA,GAAiB,CAAC,eAAoC,KAAA;AA5B7D,IAAA,IAAA,EAAA,CAAA;AA6BE,IAAA,OAAA,CAAA,CAAO,6CAAU,MAAO,CAAA,eAAA,EAAiB,EAAE,WAAA,EAAa,OAAY,CAAA,KAAA,EAAA,CAAA;AAAA,GACrE,CAAA;AAGA,EAAM,MAAA,iBAAA,GAAoB,CAAC,SAAiC,KAAA;AAC3D,IAAM,MAAA,UAAA,GAAa,SAAU,CAAA,gBAAA,CAAiB,UAAU,CAAA,CAAA;AACxD,IAAA,UAAA,CAAW,QAAQ,CAAa,SAAA,KAAA;AAC/B,MAAA,MAAM,MAAM,SAAU,CAAA,aAAA,CAAA;AACtB,MAAA,IAAI,GAAK,EAAA;AACR,QAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAC/C,QAAA,OAAA,CAAQ,SAAY,GAAA,qBAAA,CAAA;AACpB,QAAQ,OAAA,CAAA,gBAAA,CAAiB,SAAS,MAAM;AACvC,UAAM,MAAA,IAAA,GAAO,UAAU,WAAe,IAAA,EAAA,CAAA;AACtC,UAAA,gBAAA,CAAiB,IAAM,EAAA,OAAA,EAAS,EAAI,EAAA,oBAAA,EAAO,GAAI,CAAA,CAAA;AAAA,SAC/C,CAAA,CAAA;AAED,QAAA,GAAA,CAAI,MAAM,QAAW,GAAA,UAAA,CAAA;AACrB,QAAA,GAAA,CAAI,YAAY,OAAO,CAAA,CAAA;AAAA,OACxB;AAAA,KACA,CAAA,CAAA;AAAA,GACF,CAAA;AAGA,EAAA,MAAM,aAAgB,GAAA,CAAC,OAAiB,EAAA,IAAA,EAAyC,KAAyB,KAAA;AACzG,IAAM,MAAA,WAAA,GAAc,wBAAS,SAAU,CAAA,KAAA,CAAA;AACvC,IAAA,IAAI,WAAc,GAAA,CAAA,IAAK,WAAe,IAAA,QAAA,CAAS,KAAM,CAAA,MAAA;AAAQ,MAAA,OAAA;AAE7D,IAAA,MAAM,SAAY,GAAA;AAAA,MACjB,IAAM,EAAA,cAAA;AAAA,MACN,QAAU,EAAA,kBAAA;AAAA,MACV,SAAW,EAAA,mBAAA;AAAA,KACZ,CAAA;AACA,IAAA,MAAM,UAAa,GAAA;AAAA,MAClB,IAAA,EAAM,CAACC,QAAiB,KAAA;AA9D3B,QAAA,IAAA,EAAA,CAAA;AA8D8B,QAAA,OAAA,CAAA,CAAA,EAAA,GAAAC,gBAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,MAAOD,CAAAA,QAAAA,EAAS,EAAE,WAAA,EAAa,OAAY,CAAA,KAAA,EAAA,CAAA;AAAA,OAAA;AAAA,MAChF,QAAA,EAAU,CAACA,QAAiB,KAAA;AA/D/B,QAAA,IAAA,EAAA,CAAA;AA+DkC,QAAA,OAAA,CAAA,CAAA,EAAA,GAAAC,gBAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,MAAOD,CAAAA,QAAAA,EAAS,EAAE,WAAA,EAAa,OAAY,CAAA,KAAA,EAAA,CAAA;AAAA,OAAA;AAAA,MACpF,SAAA,EAAW,CAACA,QAAiB,KAAA;AAhEhC,QAAA,IAAA,EAAA,CAAA;AAgEmC,QAAA,OAAA,CAAA,CAAA,EAAA,GAAAC,gBAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,MAAOD,CAAAA,QAAAA,EAAS,EAAE,WAAA,EAAa,MAAW,CAAA,KAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KACrF,CAAA;AAEA,IAAA,MAAM,SAAY,GAAA,SAAA,CAAU,IAAI,CAAA,CAAE,MAAM,WAAW,CAAA,CAAA;AACnD,IAAA,IAAI,CAAC,SAAA;AAAW,MAAA,OAAA;AAEhB,IAAA,MAAM,OAAU,GAAA,UAAA,CAAW,IAAI,CAAA,CAAE,WAAW,EAAE,CAAA,CAAA;AAE9C,IAAM,MAAA,gBAAA,GAAmBE,iBAAU,CAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAEnD,IAAM,MAAA,MAAA,GAAS,IAAI,SAAU,EAAA,CAAA;AAC7B,IAAA,MAAM,GAAM,GAAA,MAAA,CAAO,eAAgB,CAAA,gBAAA,EAAkB,WAAW,CAAA,CAAA;AAChE,IAAA,MAAM,QAAW,GAAA,GAAA,CAAI,WAAY,EAAA,CAAE,yBAAyB,gBAAgB,CAAA,CAAA;AAE5E,IAAA,SAAA,CAAU,WAAc,GAAA,EAAA,CAAA;AACxB,IAAA,SAAA,CAAU,YAAY,QAAQ,CAAA,CAAA;AAC9B,IAAA,iBAAA,CAAkB,SAAS,CAAA,CAAA;AAAA,GAC5B,CAAA;AAGA,EAAM,MAAA,aAAA,GAAgB,CAAC,IAA2B,KAAA;AACjD,IAAI,IAAA,YAAA,CAAa,KAAS,IAAA,CAAC,SAAU,CAAA,KAAA;AAAO,MAAA,OAAA;AAC5C,IAAA,IAAI,UAAU,KAAQ,GAAA,CAAA,IAAK,SAAU,CAAA,KAAA,IAAS,SAAS,KAAM,CAAA,MAAA;AAAQ,MAAA,OAAA;AACrE,IAAY,WAAA,CAAA,KAAA,CAAM,KAAK,IAAI,CAAA,CAAA;AAC3B,IAAI,IAAA,CAAC,YAAY,KAAO,EAAA;AACvB,MAAA,WAAA,CAAY,KAAQ,GAAA,IAAA,CAAA;AACpB,MAAmB,kBAAA,EAAA,CAAA;AAAA,KACpB;AAAA,GACD,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAY;AACtC,IAAA,IAAI,YAAa,CAAA,KAAA,IAAS,CAAC,SAAA,CAAU,KAAO,EAAA;AAC3C,MAAA,WAAA,CAAY,QAAQ,EAAC,CAAA;AACrB,MAAA,WAAA,CAAY,KAAQ,GAAA,KAAA,CAAA;AACpB,MAAA,OAAA;AAAA,KACD;AAEA,IAAI,IAAA,WAAA,CAAY,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AACnC,MAAA,WAAA,CAAY,KAAQ,GAAA,KAAA,CAAA;AACpB,MAAA,OAAA;AAAA,KACD;AAEA,IAAA,qBAAA,CAAsB,MAAM;AAC3B,MAAM,MAAA,IAAA,GAAO,WAAY,CAAA,KAAA,CAAM,KAAM,EAAA,CAAA;AACrC,MAAA,IAAI,IAAM,EAAA;AACT,QAAA,cAAA,CAAe,IAAI,CAAA,CAAA;AAAA,OACpB;AACA,MAAmB,kBAAA,EAAA,CAAA;AAAA,KACnB,CAAA,CAAA;AAAA,GACF,CAAA;AAGA,EAAM,MAAA,cAAA,GAAiB,CAAC,IAA2B,KAAA;AAClD,IAAA,IAAI,CAAC,SAAU,CAAA,KAAA;AAAO,MAAA,OAAA;AACtB,IAAA,IAAI,UAAU,KAAQ,GAAA,CAAA,IAAK,SAAU,CAAA,KAAA,IAAS,SAAS,KAAM,CAAA,MAAA;AAAQ,MAAA,OAAA;AAErE,IAAA,MAAM,WAAc,GAAA,QAAA,CAAS,KAAM,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAElD,IAAI,IAAA,CAAC,YAAY,OAAS,EAAA;AACzB,MAAA,WAAA,CAAY,eAAe,IAAK,CAAA,YAAA,CAAA;AAChC,MAAA,WAAA,CAAY,UAAU,IAAK,CAAA,WAAA,CAAA;AAC3B,MAAA,WAAA,CAAY,mBAAmB,IAAK,CAAA,gBAAA,CAAA;AAAA,KACrC;AAEA,IAAAC,YAAA,CAAS,MAAM;AACd,MAAA,MAAM,iBAAoB,GAAA,kBAAA,CAAmB,KAAM,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAClE,MAAA,IAAI,iBAAmB,EAAA;AACtB,QAAA,IAAI,IAAK,CAAA,YAAA,IAAgB,CAAC,WAAA,CAAY,OAAS,EAAA;AAC9C,UAAc,aAAA,CAAA,IAAA,CAAK,cAAc,UAAU,CAAA,CAAA;AAC3C,UAAA,iBAAA,CAAkB,MAAM,OAAU,GAAA,OAAA,CAAA;AAClC,UAAA,iBAAA,CAAkB,MAAM,UAAa,GAAA,SAAA,CAAA;AAAA,SAC/B,MAAA;AACN,UAAA,iBAAA,CAAkB,MAAM,OAAU,GAAA,MAAA,CAAA;AAClC,UAAA,iBAAA,CAAkB,MAAM,UAAa,GAAA,QAAA,CAAA;AAAA,SACtC;AAAA,OACD;AAEA,MAAA,MAAM,kBAAqB,GAAA,mBAAA,CAAoB,KAAM,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AACpE,MAAA,IAAI,kBAAoB,EAAA;AACvB,QAAA,IAAI,IAAK,CAAA,gBAAA,IAAoB,CAAC,WAAA,CAAY,OAAS,EAAA;AAClD,UAAc,aAAA,CAAA,IAAA,CAAK,kBAAkB,WAAW,CAAA,CAAA;AAChD,UAAA,kBAAA,CAAmB,MAAM,OAAU,GAAA,OAAA,CAAA;AACnC,UAAA,kBAAA,CAAmB,MAAM,UAAa,GAAA,SAAA,CAAA;AAAA,SAChC,MAAA;AACN,UAAA,kBAAA,CAAmB,MAAM,OAAU,GAAA,MAAA,CAAA;AACnC,UAAA,kBAAA,CAAmB,MAAM,UAAa,GAAA,QAAA,CAAA;AAAA,SACvC;AAAA,OACD;AAGA,MAAA,aAAA,CAAc,YAAY,OAAU,GAAA,WAAA,CAAY,OAAU,GAAA,IAAA,CAAK,aAAa,MAAM,CAAA,CAAA;AAAA,KAClF,CAAA,CAAA;AAAA,GACF,CAAA;AAGA,EAAA,MAAM,oBAAoB,MAAM;AAC/B,IAAA,WAAA,CAAY,QAAQ,EAAC,CAAA;AACrB,IAAA,cAAA,CAAe,QAAQ,EAAC,CAAA;AACxB,IAAA,kBAAA,CAAmB,QAAQ,EAAC,CAAA;AAC5B,IAAA,mBAAA,CAAoB,QAAQ,EAAC,CAAA;AAAA,GAC9B,CAAA;AAEA,EAAO,OAAA;AAAA,IACN,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,GACD,CAAA;AACD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSSE.js","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useSSE.ts"],"sourcesContent":["/**\n * SSE 流式请求逻辑 Composable\n */\n\nimport { ref, type Ref, nextTick } from 'vue'\nimport { FetchStream } from '../../../utils/fetchStream.ts'\nimport { showToast } from '../../../utils/tools.ts'\nimport { ThinkStatus, type ChatMessage, type ModuleItem, type ResultItem, type RenderData, type RespoKeyConfig, ChatMsgList } from './types'\n\nexport interface UseSSEOptions {\n\tchatList: Ref<ChatMessage[]>\n\tcurrIndex: Ref<number>\n\tisChating: Ref<boolean>\n\tisMounted: Ref<boolean>\n\tisUnmounting: Ref<boolean>\n\tinputValue: Ref<string>\n\tenableDeepThinking: Ref<boolean>\n\tcurrentComponentName: Ref<string>\n\ttypeFlag: Ref<string>\n\tmoduleInfo: Ref<ModuleItem>\n\temit: (event: string, ...args: any[]) => void\n\tafterSend: (result: object) => void\n\tenqueueRender: (data: RenderData) => void\n\trenderContent: (content: string, type: 'main' | 'thinking' | 'reasoning', index?: number) => void\n\tmarkdownToHtml: (content: string) => string\n\tscrollToBottom: () => void\n\tstop: (item: ChatMessage, index: number) => void\n}\n\nexport function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enableDeepThinking, currentComponentName, typeFlag, moduleInfo, emit, afterSend, enqueueRender, renderContent, markdownToHtml, scrollToBottom, stop }: UseSSEOptions) {\n\tconst fetchStream = ref<InstanceType<typeof FetchStream> | null>(null)\n\tconst resultItem = ref<ResultItem | null>(null)\n\t// 生成聊天ID\n\tconst generateChatId = (prefix: string = 'ai_'): string => {\n\t\treturn prefix + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10)\n\t}\n\n\t// SSE 连接\n\tconst openSSE = (userContent: string, insertIndex?: number, type?: number): void => {\n\t\ttry {\n\t\t\tif (isUnmounting.value) return\n\t\t\tisChating.value = true\n\n\t\t\tconst currentAiMessage = chatList.value.find((item: any) => item.isChating)\n\t\t\tif (currentAiMessage) {\n\t\t\t\tcurrentAiMessage.isShowLike = true\n\t\t\t\tcurrentAiMessage.isShowCopy = true\n\t\t\t\tcurrentAiMessage.componentName = currentComponentName.value\n\t\t\t}\n\n\t\t\tconst chatId = currentAiMessage?.chatId || generateChatId()\n\t\t\tlet aiContent = currentAiMessage?.content || ''\n\t\t\tconst aiContentList: any[] = currentAiMessage?.msgList || []\n\t\t\tlet reasoningContent = currentAiMessage?.reasoningContent || ''\n\t\t\tlet allAiContent = ''\n\n\t\t\tif (!currentAiMessage) {\n\t\t\t\tconst chatItem: ChatMessage & ChatMsgList = {\n\t\t\t\t\tchatId: chatId,\n\t\t\t\t\tuser: 'ai',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tisChating: true,\n\t\t\t\t\tcontent: '',\n\t\t\t\t\tthinkContent: '',\n\t\t\t\t\treasoningContent: '',\n\t\t\t\t\tthinkStatus: ThinkStatus.THINKING,\n\t\t\t\t\tthinkStartTime: Date.now(),\n\t\t\t\t\tisShowLike: true,\n\t\t\t\t\tisShowCopy: true,\n\t\t\t\t\tcomponentName: currentComponentName.value,\n\t\t\t\t\ttypeFlag: typeFlag.value,\n\t\t\t\t\tmsgList: [],\n\t\t\t\t\tisRead: true\n\t\t\t\t}\n\t\t\t\tif (insertIndex !== undefined && insertIndex <= chatList.value.length) {\n\t\t\t\t\tchatList.value.splice(insertIndex, 0, chatItem)\n\t\t\t\t} else {\n\t\t\t\t\tchatList.value.push(chatItem)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrIndex.value = insertIndex ?? chatList.value.length - 1\n\n\t\t\t// 构建请求配置\n\t\t\tconst BodyConfig = moduleInfo.value?.config?.body?.()\n\t\t\tconst requestBody = BodyConfig?.messages?.length\n\t\t\t\t? { ...BodyConfig, messages: [...BodyConfig.messages], model: enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3' }\n\t\t\t\t: {\n\t\t\t\t\t\tmodel: enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3',\n\t\t\t\t\t\tmessages: [{ role: 'user', content: userContent }],\n\t\t\t\t\t\tstream: true\n\t\t\t\t\t}\n\n\t\t\t// 更新消息内容\n\t\t\tif (BodyConfig?.messages?.length) {\n\t\t\t\tBodyConfig.messages[0].content = userContent\n\t\t\t}\n\t\t\tconst apiUrl = typeof moduleInfo.value?.config?.action === 'function' ? moduleInfo.value.config.action() : moduleInfo.value?.config?.action || 'https://api.apiyi.com/v1/chat/completions'\n\n\t\t\tfetchStream.value = new FetchStream({\n\t\t\t\turl: apiUrl,\n\t\t\t\trequestInit: {\n\t\t\t\t\theaders: moduleInfo.value?.config?.headers\n\t\t\t\t\t\t? new Headers(moduleInfo.value.config.headers() as Record<string, string>)\n\t\t\t\t\t\t: new Headers({\n\t\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t\t\tAuthorization: 'Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd'\n\t\t\t\t\t\t\t} as Record<string, string>),\n\t\t\t\t\tbody: JSON.stringify(requestBody)\n\t\t\t\t},\n\t\t\t\tonmessage: (line: string) => {\n\t\t\t\t\tif (isUnmounting.value) return\n\t\t\t\t\tlet dataString = ''\n\t\t\t\t\tif (line.length) {\n\t\t\t\t\t\tif (line.includes('data:')) {\n\t\t\t\t\t\t\tconst match = line.match(/\\{[\\s\\S]*\\}/)\n\t\t\t\t\t\t\tdataString = match ? match[0] : ''\n\t\t\t\t\t\t} else if (line.startsWith('{') && line.endsWith('}')) {\n\t\t\t\t\t\t\tdataString = line\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tdataString = dataString.trim()\n\t\t\t\t\tconst respoKeyConfig = moduleInfo.value?.config?.respoKey\n\t\t\t\t\tconst respoKey: RespoKeyConfig | undefined = typeof respoKeyConfig === 'function' ? respoKeyConfig() : respoKeyConfig\n\t\t\t\t\tconst deepseekFlag = moduleInfo.value?.name === 'deepseek-v3'\n\n\t\t\t\t\t// saveEdit 场景下 type === 1,直接渲染\n\t\t\t\t\tif (type === 1 && dataString) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = JSON.parse(dataString)\n\t\t\t\t\t\t\tconst newAiMessage = chatList.value[currIndex.value]\n\n\t\t\t\t\t\t\tif (deepseekFlag || !moduleInfo.value) {\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.content) {\n\t\t\t\t\t\t\t\t\taiContent += result.choices[0].delta.content\n\t\t\t\t\t\t\t\t\tif (newAiMessage?.thinkStatus === ThinkStatus.THINKING) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.COMPLETED\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now())\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.reasoning_content) {\n\t\t\t\t\t\t\t\t\treasoningContent += result.choices[0].delta.reasoning_content\n\t\t\t\t\t\t\t\t\tif (!newAiMessage?.thinkStatus) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.THINKING\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStartTime = Date.now()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (respoKey) {\n\t\t\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t\t\tif (result.type === 'markdown') {\n\t\t\t\t\t\t\t\t\t\tconst mapKey = `markdown_${result.order}`\n\t\t\t\t\t\t\t\t\t\tconst hasKey = aiContentList.findIndex(con => con.mapKey === mapKey)\n\t\t\t\t\t\t\t\t\t\tif (hasKey !== -1) {\n\t\t\t\t\t\t\t\t\t\t\taiContentList[hasKey].content += result.content\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\taiContentList.push({ mapKey, ...result })\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else if (result.type === 'a2ui') {\n\t\t\t\t\t\t\t\t\t\tconst mapKey = result.surfaceId\n\t\t\t\t\t\t\t\t\t\tconst hasKey = aiContentList.findIndex(con => con.surfaceId === mapKey)\n\t\t\t\t\t\t\t\t\t\tif (hasKey !== -1) {\n\t\t\t\t\t\t\t\t\t\t\tconst updatedMsgs = [...aiContentList[hasKey].msgs, ...result.msgs]\n\n\t\t\t\t\t\t\t\t\t\t\taiContentList[hasKey] = {\n\t\t\t\t\t\t\t\t\t\t\t\t...aiContentList[hasKey],\n\t\t\t\t\t\t\t\t\t\t\t\tmsgs: updatedMsgs\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\taiContentList.push({\n\t\t\t\t\t\t\t\t\t\t\t\t...result,\n\t\t\t\t\t\t\t\t\t\t\t\tmsgs: result.msgs ? [...result.msgs] : []\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst mapKey = `${result.type}_${result.order}`\n\t\t\t\t\t\t\t\t\t\taiContentList.push({ mapKey, ...result })\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (result && result[respoKey.content]) {\n\t\t\t\t\t\t\t\t\taiContent += result[respoKey.content]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// 更新消息内容到chatList\n\t\t\t\t\t\t\tif (newAiMessage) {\n\t\t\t\t\t\t\t\tnewAiMessage.content = aiContent\n\t\t\t\t\t\t\t\tnewAiMessage.msgList = [...aiContentList]\n\t\t\t\t\t\t\t\tnewAiMessage.reasoningContent = reasoningContent\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (chatList.value.some((ele: any) => ele.chatId === chatId)) {\n\t\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\t\t// 显式传递索引,确保渲染到正确位置\n\t\t\t\t\t\t\t\t\tconst renderWithRetry = (retryCount = 0) => {\n\t\t\t\t\t\t\t\t\t\tif (retryCount > 10) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.error('renderContent失败:无法找到DOM元素,currIndex:', currIndex.value)\n\t\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// 显式传递索引,确保渲染到正确位置\n\t\t\t\t\t\t\t\t\t\trenderContent(aiContent, 'main', currIndex.value)\n\t\t\t\t\t\t\t\t\t\trenderContent(reasoningContent, 'reasoning', currIndex.value)\n\n\t\t\t\t\t\t\t\t\t\t// 检查是否渲染成功(通过检查内容是否被设置)\n\t\t\t\t\t\t\t\t\t\tconst currentMsg = chatList.value[currIndex.value]\n\t\t\t\t\t\t\t\t\t\tif (currentMsg && (currentMsg.content !== aiContent || currentMsg.reasoningContent !== reasoningContent)) {\n\t\t\t\t\t\t\t\t\t\t\t// 如果没有成功,稍后重试\n\t\t\t\t\t\t\t\t\t\t\tsetTimeout(() => renderWithRetry(retryCount + 1), 50)\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\trenderWithRetry()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error('解析SSE消息失败:', e)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (dataString && ((dataString.startsWith('{') && dataString.endsWith('}')) || !respoKey?.content)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = !respoKey?.content && moduleInfo.value ? dataString : JSON.parse(dataString)\n\t\t\t\t\t\t\tconst newAiMessage = chatList.value[currIndex.value]\n\n\t\t\t\t\t\t\t// deepseek\n\t\t\t\t\t\t\tif (deepseekFlag || !moduleInfo.value) {\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.content) {\n\t\t\t\t\t\t\t\t\taiContent += result.choices[0].delta.content\n\t\t\t\t\t\t\t\t\tif (newAiMessage?.thinkStatus === ThinkStatus.THINKING) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.COMPLETED\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now())\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.reasoning_content) {\n\t\t\t\t\t\t\t\t\treasoningContent += result.choices[0].delta.reasoning_content\n\t\t\t\t\t\t\t\t\tif (!newAiMessage?.thinkStatus) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.THINKING\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStartTime = Date.now()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tallAiContent = reasoningContent + aiContent\n\t\t\t\t\t\t\t} else if (respoKey) {\n\t\t\t\t\t\t\t\tif (result && result[respoKey.content] && (result[respoKey.category] === respoKey.contentCategory || !result[respoKey.category])) {\n\t\t\t\t\t\t\t\t\taiContent += result[respoKey.content]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 匹配不规则的结束\n\t\t\t\t\t\t\t\tif (result && result[respoKey.category] === 'done') {\n\t\t\t\t\t\t\t\t\tresultItem.value = result\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 匹配不规则的错误提示\n\t\t\t\t\t\t\t\tif (result && result[respoKey.category] === 'error') {\n\t\t\t\t\t\t\t\t\tconst errorMessage = respoKey.all && result[respoKey.all] ? result[respoKey.all] : '当前网络异常'\n\t\t\t\t\t\t\t\t\tconst currentAiMessage = chatList.value[currIndex.value]\n\t\t\t\t\t\t\t\t\tif (currentAiMessage.chatId) {\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\n\t\t\t\t\t\t\t\t\t\t</svg>${errorMessage}</div>`\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isChating = false\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.componentName = ''\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isShowLike = false\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isShowCopy = false\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isError = true\n\n\t\t\t\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\t\tafterSend(result)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 后端无allAiContent完整信息 前端手动拼接\n\t\t\t\t\t\t\t\tif (aiContent || reasoningContent) {\n\t\t\t\t\t\t\t\t\tallAiContent = aiContent + reasoningContent\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (respoKey && respoKey.all && result && result[respoKey.all] && result[respoKey.category] === respoKey.allCategory) {\n\t\t\t\t\t\t\t\t\tallAiContent = result[respoKey.all]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 后端返回匹配不规则的流式输出\n\t\t\t\t\t\t\t\tif (respoKey && result && typeof result === 'string' && result !== '[DONE]') {\n\t\t\t\t\t\t\t\t\taiContent += result\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 后端返回匹配不规则的流式输出 结束\n\t\t\t\t\t\t\t\tif (respoKey && result && typeof result === 'string' && result === '[DONE]') {\n\t\t\t\t\t\t\t\t\tconst index = chatList.value.findIndex((ele: any) => ele.chatId === chatId)\n\t\t\t\t\t\t\t\t\tif (index !== -1 && chatList.value[index]) {\n\t\t\t\t\t\t\t\t\t\tisChating.value = false\n\t\t\t\t\t\t\t\t\t\tchatList.value[index].isChating = false\n\t\t\t\t\t\t\t\t\t\temit('sendMessage', JSON.parse(JSON.stringify(chatList.value)))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (chatList.value.some((ele: any) => ele.chatId === chatId)) {\n\t\t\t\t\t\t\t\tenqueueRender({\n\t\t\t\t\t\t\t\t\tmainContent: aiContent,\n\t\t\t\t\t\t\t\t\tthinkContent: '',\n\t\t\t\t\t\t\t\t\treasoningContent: reasoningContent\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// type === 1 的情况已经在上面单独处理,这里不再重复渲染\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('解析SSE消息失败:', error)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tondone: () => {\n\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\tisChating.value = false\n\t\t\t\t\t\tif (isUnmounting.value || !isMounted.value) return\n\t\t\t\t\t\tconst index = chatList.value.findIndex((ele: any) => ele.chatId === chatId)\n\t\t\t\t\t\tif (index !== -1 && chatList.value[index]) {\n\t\t\t\t\t\t\tchatList.value[index].isChating = false\n\t\t\t\t\t\t\tchatList.value[index].componentName = currentComponentName.value\n\t\t\t\t\t\t\tchatList.value[index].html = markdownToHtml(allAiContent)\n\t\t\t\t\t\t\tif (allAiContent) {\n\t\t\t\t\t\t\t\tif (resultItem.value) {\n\t\t\t\t\t\t\t\t\tresultItem.value.allAiContent = allAiContent\n\t\t\t\t\t\t\t\t\tafterSend(resultItem.value)\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tafterSend({ allAiContent })\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst waitForRenderComplete = () => {\n\t\t\t\t\t\t\t\t// 这里假设需要检查渲染队列,通过回调检查\n\t\t\t\t\t\t\t\tif (chatList.value.length > 0) {\n\t\t\t\t\t\t\t\t\temit('sendMessage', JSON.parse(JSON.stringify(chatList.value)))\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twaitForRenderComplete()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tonabort: () => {\n\t\t\t\t\thandleAbort()\n\t\t\t\t},\n\t\t\t\tonerror: (response: Error | Response) => {\n\t\t\t\t\thandleError(response)\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tconsole.error('OpenSSE错误:', error)\n\t\t\tisChating.value = false\n\t\t\tchatList.value[currIndex.value].content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\n\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\n\t\t</svg>${'请求失败'}</div>`\n\t\t\tchatList.value[currIndex.value].isChating = false\n\t\t\tchatList.value[currIndex.value].isShowCopy = false\n\t\t\tchatList.value[currIndex.value].isShowLike = false\n\t\t\tshowToast('请求失败,请重试', 'error', 3000)\n\t\t}\n\t}\n\n\t// 处理请求中止\n\tconst handleAbort = (): void => {\n\t\tisChating.value = false\n\t\tif (isUnmounting.value) return\n\n\t\tconst currentAiMessage = chatList.value[currIndex.value]\n\t\tstop(chatList.value[currIndex.value], currIndex.value)\n\t\tconst hasContent = currentAiMessage && (currentAiMessage.content || currentAiMessage.thinkContent || currentAiMessage.reasoningContent)\n\n\t\tif (currentAiMessage) {\n\t\t\tif (currentAiMessage.thinkStatus === ThinkStatus.THINKING) {\n\t\t\t\tcurrentAiMessage.thinkStatus = ThinkStatus.STOPPED\n\t\t\t\tcurrentAiMessage.thinkTime = Date.now() - (currentAiMessage.thinkStartTime || Date.now())\n\t\t\t}\n\t\t\tif (!hasContent) {\n\t\t\t\tconst userMessageIndex = currIndex.value - 1\n\t\t\t\tif (userMessageIndex >= 0 && chatList.value[userMessageIndex].user === 'u') {\n\t\t\t\t\tchatList.value.splice(currIndex.value, 1)\n\t\t\t\t\tchatList.value.splice(userMessageIndex, 1)\n\t\t\t\t} else {\n\t\t\t\t\tchatList.value.splice(currIndex.value, 1)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst updatedAiMessage = {\n\t\t\t\t\t...currentAiMessage,\n\t\t\t\t\tisChating: false,\n\t\t\t\t\tcontent: currentAiMessage.content ? currentAiMessage.content + '...' : '',\n\t\t\t\t\tthinkContent: currentAiMessage.thinkContent ? currentAiMessage.thinkContent + '...' : undefined,\n\t\t\t\t\treasoningContent: currentAiMessage.reasoningContent ? currentAiMessage.reasoningContent + '...' : undefined,\n\t\t\t\t\tthinkStatus: currentAiMessage.thinkStatus as ThinkStatus,\n\t\t\t\t\tstop: true\n\t\t\t\t}\n\n\t\t\t\tchatList.value.splice(currIndex.value, 1, updatedAiMessage)\n\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trenderContent(updatedAiMessage.thinkContent || '', 'thinking')\n\t\t\t\t\trenderContent(updatedAiMessage.reasoningContent || '', 'reasoning')\n\t\t\t\t\trenderContent(updatedAiMessage.content || '', 'main')\n\t\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (chatList.value.length > 0) {\n\t\t\temit('sendMessage', [...chatList.value])\n\t\t}\n\t}\n\n\t// 处理请求错误\n\tconst handleError = (response: Error | Response): void => {\n\t\tif (isUnmounting.value) return\n\t\tisChating.value = false\n\n\t\tlet errorMessage = '未知错误'\n\t\tif (response instanceof Error) {\n\t\t\tconsole.error('API请求错误:', response)\n\t\t\terrorMessage = response.message\n\t\t} else if (response instanceof Response) {\n\t\t\tconsole.error('API请求错误, 响应状态:', response.status, response.statusText)\n\t\t\terrorMessage = `请求失败: ${response.status} ${response.statusText}`\n\t\t}\n\n\t\tconst currentAiMessage = chatList.value[currIndex.value]\n\t\tif (currentAiMessage) {\n\t\t\tcurrentAiMessage.content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\n</svg>${errorMessage}</div>`\n\t\t\tcurrentAiMessage.isChating = false\n\t\t\tcurrentAiMessage.componentName = ''\n\t\t\tcurrentAiMessage.isShowLike = false\n\t\t\tcurrentAiMessage.isShowCopy = false\n\t\t\tcurrentAiMessage.isError = true\n\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(currentAiMessage.content || '', 'main')\n\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t})\n\t\t} else {\n\t\t\tshowToast(errorMessage, 'error', 3000)\n\t\t\temit('sendMessage', [...chatList.value])\n\t\t}\n\t}\n\n\t// 清理 SSE 连接\n\tconst cleanupSSE = () => {\n\t\tif (fetchStream.value) {\n\t\t\tfetchStream.value.abort()\n\t\t\tfetchStream.value = null\n\t\t}\n\t}\n\n\treturn {\n\t\tfetchStream,\n\t\tresultItem,\n\t\topenSSE,\n\t\thandleAbort,\n\t\thandleError,\n\t\tcleanupSSE\n\t}\n}\n"],"names":["fetchStream","ref","ThinkStatus","FetchStream","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","nextTick","currentAiMessage","showToast"],"mappings":"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"}
1
+ {"version":3,"file":"useSSE.js","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useSSE.ts"],"sourcesContent":["/**\r\n * SSE 流式请求逻辑 Composable\r\n */\r\n\r\nimport { ref, type Ref, nextTick } from 'vue'\r\nimport { FetchStream } from '../../../utils/fetchStream.ts'\r\nimport { showToast } from '../../../utils/tools.ts'\r\nimport { ThinkStatus, type ChatMessage, type ModuleItem, type ResultItem, type RenderData, type RespoKeyConfig, ChatMsgList } from './types'\r\n\r\nexport interface UseSSEOptions {\r\n\tchatList: Ref<ChatMessage[]>\r\n\tcurrIndex: Ref<number>\r\n\tisChating: Ref<boolean>\r\n\tisMounted: Ref<boolean>\r\n\tisUnmounting: Ref<boolean>\r\n\tinputValue: Ref<string>\r\n\tenableDeepThinking: Ref<boolean>\r\n\tcurrentComponentName: Ref<string>\r\n\ttypeFlag: Ref<string>\r\n\tmoduleInfo: Ref<ModuleItem>\r\n\temit: (event: string, ...args: any[]) => void\r\n\tafterSend: (result: object) => void\r\n\tenqueueRender: (data: RenderData) => void\r\n\trenderContent: (content: string, type: 'main' | 'thinking' | 'reasoning', index?: number) => void\r\n\tmarkdownToHtml: (content: string) => string\r\n\tscrollToBottom: () => void\r\n\tstop: (item: ChatMessage, index: number) => void\r\n}\r\n\r\nexport function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enableDeepThinking, currentComponentName, typeFlag, moduleInfo, emit, afterSend, enqueueRender, renderContent, markdownToHtml, scrollToBottom, stop }: UseSSEOptions) {\r\n\tconst fetchStream = ref<InstanceType<typeof FetchStream> | null>(null)\r\n\tconst resultItem = ref<ResultItem | null>(null)\r\n\t// 生成聊天ID\r\n\tconst generateChatId = (prefix: string = 'ai_'): string => {\r\n\t\treturn prefix + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10)\r\n\t}\r\n\r\n\t// SSE 连接\r\n\tconst openSSE = (userContent: string, insertIndex?: number, type?: number): void => {\r\n\t\ttry {\r\n\t\t\tif (isUnmounting.value) return\r\n\t\t\tisChating.value = true\r\n\r\n\t\t\tconst currentAiMessage = chatList.value.find((item: any) => item.isChating)\r\n\t\t\tif (currentAiMessage) {\r\n\t\t\t\tcurrentAiMessage.isShowLike = true\r\n\t\t\t\tcurrentAiMessage.isShowCopy = true\r\n\t\t\t\tcurrentAiMessage.componentName = currentComponentName.value\r\n\t\t\t}\r\n\r\n\t\t\tconst chatId = currentAiMessage?.chatId || generateChatId()\r\n\t\t\tlet aiContent = currentAiMessage?.content || ''\r\n\t\t\tconst aiContentList: any[] = currentAiMessage?.msgList || []\r\n\t\t\tlet reasoningContent = currentAiMessage?.reasoningContent || ''\r\n\t\t\tlet allAiContent = ''\r\n\r\n\t\t\tif (!currentAiMessage) {\r\n\t\t\t\tconst chatItem: ChatMessage & ChatMsgList = {\r\n\t\t\t\t\tchatId: chatId,\r\n\t\t\t\t\tuser: 'ai',\r\n\t\t\t\t\ttype: 'text',\r\n\t\t\t\t\tisChating: true,\r\n\t\t\t\t\tcontent: '',\r\n\t\t\t\t\tthinkContent: '',\r\n\t\t\t\t\treasoningContent: '',\r\n\t\t\t\t\tthinkStatus: ThinkStatus.THINKING,\r\n\t\t\t\t\tthinkStartTime: Date.now(),\r\n\t\t\t\t\tisShowLike: true,\r\n\t\t\t\t\tisShowCopy: true,\r\n\t\t\t\t\tcomponentName: currentComponentName.value,\r\n\t\t\t\t\ttypeFlag: typeFlag.value,\r\n\t\t\t\t\tmsgList: [],\r\n\t\t\t\t\tisRead: true\r\n\t\t\t\t}\r\n\t\t\t\tif (insertIndex !== undefined && insertIndex <= chatList.value.length) {\r\n\t\t\t\t\tchatList.value.splice(insertIndex, 0, chatItem)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tchatList.value.push(chatItem)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcurrIndex.value = insertIndex ?? chatList.value.length - 1\r\n\r\n\t\t\t// 构建请求配置\r\n\t\t\tconst BodyConfig = moduleInfo.value?.config?.body?.()\r\n\t\t\tconst requestBody = BodyConfig?.messages?.length\r\n\t\t\t\t? { ...BodyConfig, messages: [...BodyConfig.messages], model: enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3' }\r\n\t\t\t\t: {\r\n\t\t\t\t\t\tmodel: enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3',\r\n\t\t\t\t\t\tmessages: [{ role: 'user', content: userContent }],\r\n\t\t\t\t\t\tstream: true\r\n\t\t\t\t\t}\r\n\r\n\t\t\t// 更新消息内容\r\n\t\t\tif (BodyConfig?.messages?.length) {\r\n\t\t\t\tBodyConfig.messages[0].content = userContent\r\n\t\t\t}\r\n\t\t\tconst apiUrl = typeof moduleInfo.value?.config?.action === 'function' ? moduleInfo.value.config.action() : moduleInfo.value?.config?.action || 'https://api.apiyi.com/v1/chat/completions'\r\n\r\n\t\t\tfetchStream.value = new FetchStream({\r\n\t\t\t\turl: apiUrl,\r\n\t\t\t\trequestInit: {\r\n\t\t\t\t\theaders: moduleInfo.value?.config?.headers\r\n\t\t\t\t\t\t? new Headers(moduleInfo.value.config.headers() as Record<string, string>)\r\n\t\t\t\t\t\t: new Headers({\r\n\t\t\t\t\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t\t\t\t\tAuthorization: 'Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd'\r\n\t\t\t\t\t\t\t} as Record<string, string>),\r\n\t\t\t\t\tbody: JSON.stringify(requestBody)\r\n\t\t\t\t},\r\n\t\t\t\tonmessage: (line: string) => {\r\n\t\t\t\t\tif (isUnmounting.value) return\r\n\t\t\t\t\tlet dataString = ''\r\n\t\t\t\t\tif (line.length) {\r\n\t\t\t\t\t\tif (line.includes('data:')) {\r\n\t\t\t\t\t\t\tconst match = line.match(/\\{[\\s\\S]*\\}/)\r\n\t\t\t\t\t\t\tdataString = match ? match[0] : ''\r\n\t\t\t\t\t\t} else if (line.startsWith('{') && line.endsWith('}')) {\r\n\t\t\t\t\t\t\tdataString = line\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdataString = dataString.trim()\r\n\t\t\t\t\tconst respoKeyConfig = moduleInfo.value?.config?.respoKey\r\n\t\t\t\t\tconst respoKey: RespoKeyConfig | undefined = typeof respoKeyConfig === 'function' ? respoKeyConfig() : respoKeyConfig\r\n\t\t\t\t\tconst deepseekFlag = moduleInfo.value?.name === 'deepseek-v3'\r\n\r\n\t\t\t\t\t// saveEdit 场景下 type === 1,直接渲染\r\n\t\t\t\t\tif (type === 1 && dataString) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tconst result = JSON.parse(dataString)\r\n\t\t\t\t\t\t\tconst newAiMessage = chatList.value[currIndex.value]\r\n\r\n\t\t\t\t\t\t\tif (deepseekFlag || !moduleInfo.value) {\r\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.content) {\r\n\t\t\t\t\t\t\t\t\taiContent += result.choices[0].delta.content\r\n\t\t\t\t\t\t\t\t\tif (newAiMessage?.thinkStatus === ThinkStatus.THINKING) {\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.COMPLETED\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now())\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.reasoning_content) {\r\n\t\t\t\t\t\t\t\t\treasoningContent += result.choices[0].delta.reasoning_content\r\n\t\t\t\t\t\t\t\t\tif (!newAiMessage?.thinkStatus) {\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.THINKING\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStartTime = Date.now()\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else if (respoKey) {\r\n\t\t\t\t\t\t\t\tif (result) {\r\n\t\t\t\t\t\t\t\t\tif (result.type === 'markdown') {\r\n\t\t\t\t\t\t\t\t\t\tconst mapKey = `markdown_${result.order}`\r\n\t\t\t\t\t\t\t\t\t\tconst hasKey = aiContentList.findIndex(con => con.mapKey === mapKey)\r\n\t\t\t\t\t\t\t\t\t\tif (hasKey !== -1) {\r\n\t\t\t\t\t\t\t\t\t\t\taiContentList[hasKey].content += result.content\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\taiContentList.push({ mapKey, ...result })\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t} else if (result.type === 'a2ui') {\r\n\t\t\t\t\t\t\t\t\t\tconst mapKey = result.surfaceId\r\n\t\t\t\t\t\t\t\t\t\tconst hasKey = aiContentList.findIndex(con => con.surfaceId === mapKey)\r\n\t\t\t\t\t\t\t\t\t\tif (hasKey !== -1) {\r\n\t\t\t\t\t\t\t\t\t\t\tconst updatedMsgs = [...aiContentList[hasKey].msgs, ...result.msgs]\r\n\r\n\t\t\t\t\t\t\t\t\t\t\taiContentList[hasKey] = {\r\n\t\t\t\t\t\t\t\t\t\t\t\t...aiContentList[hasKey],\r\n\t\t\t\t\t\t\t\t\t\t\t\tmsgs: updatedMsgs\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\taiContentList.push({\r\n\t\t\t\t\t\t\t\t\t\t\t\t...result,\r\n\t\t\t\t\t\t\t\t\t\t\t\tmsgs: result.msgs ? [...result.msgs] : []\r\n\t\t\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tconst mapKey = `${result.type}_${result.order}`\r\n\t\t\t\t\t\t\t\t\t\taiContentList.push({ mapKey, ...result })\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (result && result[respoKey.content]) {\r\n\t\t\t\t\t\t\t\t\taiContent += result[respoKey.content]\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// 更新消息内容到chatList\r\n\t\t\t\t\t\t\tif (newAiMessage) {\r\n\t\t\t\t\t\t\t\tnewAiMessage.content = aiContent\r\n\t\t\t\t\t\t\t\tnewAiMessage.msgList = [...aiContentList]\r\n\t\t\t\t\t\t\t\tnewAiMessage.reasoningContent = reasoningContent\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (chatList.value.some((ele: any) => ele.chatId === chatId)) {\r\n\t\t\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\t\t\t// 显式传递索引,确保渲染到正确位置\r\n\t\t\t\t\t\t\t\t\tconst renderWithRetry = (retryCount = 0) => {\r\n\t\t\t\t\t\t\t\t\t\tif (retryCount > 10) {\r\n\t\t\t\t\t\t\t\t\t\t\tconsole.error('renderContent失败:无法找到DOM元素,currIndex:', currIndex.value)\r\n\t\t\t\t\t\t\t\t\t\t\treturn\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t// 显式传递索引,确保渲染到正确位置\r\n\t\t\t\t\t\t\t\t\t\trenderContent(aiContent, 'main', currIndex.value)\r\n\t\t\t\t\t\t\t\t\t\trenderContent(reasoningContent, 'reasoning', currIndex.value)\r\n\r\n\t\t\t\t\t\t\t\t\t\t// 检查是否渲染成功(通过检查内容是否被设置)\r\n\t\t\t\t\t\t\t\t\t\tconst currentMsg = chatList.value[currIndex.value]\r\n\t\t\t\t\t\t\t\t\t\tif (currentMsg && (currentMsg.content !== aiContent || currentMsg.reasoningContent !== reasoningContent)) {\r\n\t\t\t\t\t\t\t\t\t\t\t// 如果没有成功,稍后重试\r\n\t\t\t\t\t\t\t\t\t\t\tsetTimeout(() => renderWithRetry(retryCount + 1), 50)\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\trenderWithRetry()\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tconsole.error('解析SSE消息失败:', e)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (dataString && ((dataString.startsWith('{') && dataString.endsWith('}')) || !respoKey?.content)) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tconst result = !respoKey?.content && moduleInfo.value ? dataString : JSON.parse(dataString)\r\n\t\t\t\t\t\t\tconst newAiMessage = chatList.value[currIndex.value]\r\n\r\n\t\t\t\t\t\t\t// deepseek\r\n\t\t\t\t\t\t\tif (deepseekFlag || !moduleInfo.value) {\r\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.content) {\r\n\t\t\t\t\t\t\t\t\taiContent += result.choices[0].delta.content\r\n\t\t\t\t\t\t\t\t\tif (newAiMessage?.thinkStatus === ThinkStatus.THINKING) {\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.COMPLETED\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now())\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.reasoning_content) {\r\n\t\t\t\t\t\t\t\t\treasoningContent += result.choices[0].delta.reasoning_content\r\n\t\t\t\t\t\t\t\t\tif (!newAiMessage?.thinkStatus) {\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.THINKING\r\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStartTime = Date.now()\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tallAiContent = reasoningContent + aiContent\r\n\t\t\t\t\t\t\t} else if (respoKey) {\r\n\t\t\t\t\t\t\t\tif (result && result[respoKey.content] && (result[respoKey.category] === respoKey.contentCategory || !result[respoKey.category])) {\r\n\t\t\t\t\t\t\t\t\taiContent += result[respoKey.content]\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// 匹配不规则的结束\r\n\t\t\t\t\t\t\t\tif (result && result[respoKey.category] === 'done') {\r\n\t\t\t\t\t\t\t\t\tresultItem.value = result\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// 匹配不规则的错误提示\r\n\t\t\t\t\t\t\t\tif (result && result[respoKey.category] === 'error') {\r\n\t\t\t\t\t\t\t\t\tconst errorMessage = respoKey.all && result[respoKey.all] ? result[respoKey.all] : '当前网络异常'\r\n\t\t\t\t\t\t\t\t\tconst currentAiMessage = chatList.value[currIndex.value]\r\n\t\t\t\t\t\t\t\t\tif (currentAiMessage.chatId) {\r\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n\t\t\t\t\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\r\n\t\t\t\t\t\t\t\t\t\t</svg>${errorMessage}</div>`\r\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isChating = false\r\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.componentName = ''\r\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isShowLike = false\r\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isShowCopy = false\r\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isError = true\r\n\r\n\t\t\t\t\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\t\t\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t\t\t\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\t\t\t\t\tafterSend(result)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// 后端无allAiContent完整信息 前端手动拼接\r\n\t\t\t\t\t\t\t\tif (aiContent || reasoningContent) {\r\n\t\t\t\t\t\t\t\t\tallAiContent = aiContent + reasoningContent\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (respoKey && respoKey.all && result && result[respoKey.all] && result[respoKey.category] === respoKey.allCategory) {\r\n\t\t\t\t\t\t\t\t\tallAiContent = result[respoKey.all]\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// 后端返回匹配不规则的流式输出\r\n\t\t\t\t\t\t\t\tif (respoKey && result && typeof result === 'string' && result !== '[DONE]') {\r\n\t\t\t\t\t\t\t\t\taiContent += result\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// 后端返回匹配不规则的流式输出 结束\r\n\t\t\t\t\t\t\t\tif (respoKey && result && typeof result === 'string' && result === '[DONE]') {\r\n\t\t\t\t\t\t\t\t\tconst index = chatList.value.findIndex((ele: any) => ele.chatId === chatId)\r\n\t\t\t\t\t\t\t\t\tif (index !== -1 && chatList.value[index]) {\r\n\t\t\t\t\t\t\t\t\t\tisChating.value = false\r\n\t\t\t\t\t\t\t\t\t\tchatList.value[index].isChating = false\r\n\t\t\t\t\t\t\t\t\t\temit('sendMessage', JSON.parse(JSON.stringify(chatList.value)))\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (chatList.value.some((ele: any) => ele.chatId === chatId)) {\r\n\t\t\t\t\t\t\t\tenqueueRender({\r\n\t\t\t\t\t\t\t\t\tmainContent: aiContent,\r\n\t\t\t\t\t\t\t\t\tthinkContent: '',\r\n\t\t\t\t\t\t\t\t\treasoningContent: reasoningContent\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// type === 1 的情况已经在上面单独处理,这里不再重复渲染\r\n\t\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\t\tconsole.error('解析SSE消息失败:', error)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tondone: () => {\r\n\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\tisChating.value = false\r\n\t\t\t\t\t\tif (isUnmounting.value || !isMounted.value) return\r\n\t\t\t\t\t\tconst index = chatList.value.findIndex((ele: any) => ele.chatId === chatId)\r\n\t\t\t\t\t\tif (index !== -1 && chatList.value[index]) {\r\n\t\t\t\t\t\t\tchatList.value[index].isChating = false\r\n\t\t\t\t\t\t\tchatList.value[index].componentName = currentComponentName.value\r\n\t\t\t\t\t\t\tchatList.value[index].html = markdownToHtml(allAiContent)\r\n\t\t\t\t\t\t\tif (allAiContent) {\r\n\t\t\t\t\t\t\t\tif (resultItem.value) {\r\n\t\t\t\t\t\t\t\t\tresultItem.value.allAiContent = allAiContent\r\n\t\t\t\t\t\t\t\t\tafterSend(resultItem.value)\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tafterSend({ allAiContent })\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tconst waitForRenderComplete = () => {\r\n\t\t\t\t\t\t\t\t// 这里假设需要检查渲染队列,通过回调检查\r\n\t\t\t\t\t\t\t\tif (chatList.value.length > 0) {\r\n\t\t\t\t\t\t\t\t\temit('sendMessage', JSON.parse(JSON.stringify(chatList.value)))\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\twaitForRenderComplete()\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t},\r\n\t\t\t\tonabort: () => {\r\n\t\t\t\t\thandleAbort()\r\n\t\t\t\t},\r\n\t\t\t\tonerror: (response: Error | Response) => {\r\n\t\t\t\t\thandleError(response)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error('OpenSSE错误:', error)\r\n\t\t\tisChating.value = false\r\n\t\t\tchatList.value[currIndex.value].content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\r\n\t\t</svg>${'请求失败'}</div>`\r\n\t\t\tchatList.value[currIndex.value].isChating = false\r\n\t\t\tchatList.value[currIndex.value].isShowCopy = false\r\n\t\t\tchatList.value[currIndex.value].isShowLike = false\r\n\t\t\tshowToast('请求失败,请重试', 'error', 3000)\r\n\t\t}\r\n\t}\r\n\r\n\t// 处理请求中止\r\n\tconst handleAbort = (): void => {\r\n\t\tisChating.value = false\r\n\t\tif (isUnmounting.value) return\r\n\r\n\t\tconst currentAiMessage = chatList.value[currIndex.value]\r\n\t\tstop(chatList.value[currIndex.value], currIndex.value)\r\n\t\tconst hasContent = currentAiMessage && (currentAiMessage.content || currentAiMessage.thinkContent || currentAiMessage.reasoningContent)\r\n\r\n\t\tif (currentAiMessage) {\r\n\t\t\tif (currentAiMessage.thinkStatus === ThinkStatus.THINKING) {\r\n\t\t\t\tcurrentAiMessage.thinkStatus = ThinkStatus.STOPPED\r\n\t\t\t\tcurrentAiMessage.thinkTime = Date.now() - (currentAiMessage.thinkStartTime || Date.now())\r\n\t\t\t}\r\n\t\t\tif (!hasContent) {\r\n\t\t\t\tconst userMessageIndex = currIndex.value - 1\r\n\t\t\t\tif (userMessageIndex >= 0 && chatList.value[userMessageIndex].user === 'u') {\r\n\t\t\t\t\tchatList.value.splice(currIndex.value, 1)\r\n\t\t\t\t\tchatList.value.splice(userMessageIndex, 1)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tchatList.value.splice(currIndex.value, 1)\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconst updatedAiMessage = {\r\n\t\t\t\t\t...currentAiMessage,\r\n\t\t\t\t\tisChating: false,\r\n\t\t\t\t\tcontent: currentAiMessage.content ? currentAiMessage.content + '...' : '',\r\n\t\t\t\t\tthinkContent: currentAiMessage.thinkContent ? currentAiMessage.thinkContent + '...' : undefined,\r\n\t\t\t\t\treasoningContent: currentAiMessage.reasoningContent ? currentAiMessage.reasoningContent + '...' : undefined,\r\n\t\t\t\t\tthinkStatus: currentAiMessage.thinkStatus as ThinkStatus,\r\n\t\t\t\t\tstop: true\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchatList.value.splice(currIndex.value, 1, updatedAiMessage)\r\n\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\trenderContent(updatedAiMessage.thinkContent || '', 'thinking')\r\n\t\t\t\t\trenderContent(updatedAiMessage.reasoningContent || '', 'reasoning')\r\n\t\t\t\t\trenderContent(updatedAiMessage.content || '', 'main')\r\n\t\t\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t\t\t})\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (chatList.value.length > 0) {\r\n\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t}\r\n\t}\r\n\r\n\t// 处理请求错误\r\n\tconst handleError = (response: Error | Response): void => {\r\n\t\tif (isUnmounting.value) return\r\n\t\tisChating.value = false\r\n\r\n\t\tlet errorMessage = '未知错误'\r\n\t\tif (response instanceof Error) {\r\n\t\t\tconsole.error('API请求错误:', response)\r\n\t\t\terrorMessage = response.message\r\n\t\t} else if (response instanceof Response) {\r\n\t\t\tconsole.error('API请求错误, 响应状态:', response.status, response.statusText)\r\n\t\t\terrorMessage = `请求失败: ${response.status} ${response.statusText}`\r\n\t\t}\r\n\r\n\t\tconst currentAiMessage = chatList.value[currIndex.value]\r\n\t\tif (currentAiMessage) {\r\n\t\t\tcurrentAiMessage.content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\r\n</svg>${errorMessage}</div>`\r\n\t\t\tcurrentAiMessage.isChating = false\r\n\t\t\tcurrentAiMessage.componentName = ''\r\n\t\t\tcurrentAiMessage.isShowLike = false\r\n\t\t\tcurrentAiMessage.isShowCopy = false\r\n\t\t\tcurrentAiMessage.isError = true\r\n\r\n\t\t\tnextTick(() => {\r\n\t\t\t\trenderContent(currentAiMessage.content || '', 'main')\r\n\t\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\tshowToast(errorMessage, 'error', 3000)\r\n\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t}\r\n\t}\r\n\r\n\t// 清理 SSE 连接\r\n\tconst cleanupSSE = () => {\r\n\t\tif (fetchStream.value) {\r\n\t\t\tfetchStream.value.abort()\r\n\t\t\tfetchStream.value = null\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tfetchStream,\r\n\t\tresultItem,\r\n\t\topenSSE,\r\n\t\thandleAbort,\r\n\t\thandleError,\r\n\t\tcleanupSSE\r\n\t}\r\n}\r\n"],"names":["fetchStream","ref","ThinkStatus","FetchStream","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","nextTick","currentAiMessage","showToast"],"mappings":"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"}
@@ -350,7 +350,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
350
350
  vue.createElementVNode("div", { class: "touchchat-edit-input" }, [
351
351
  vue.createCommentVNode(" @keydown.enter.prevent "),
352
352
  vue.createElementVNode("textarea", {
353
- value: _ctx.inputValue,
353
+ value: __props.inputValue,
354
354
  placeholder: (_a = vue.unref(placeholder)) != null ? _a : "\u8BF7\u8F93\u5165...",
355
355
  onPaste: handlePaste,
356
356
  onInput: handleInputChange,
@@ -378,7 +378,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
378
378
  "button",
379
379
  {
380
380
  key: 0,
381
- class: vue.normalizeClass(["touchchat-edit-attach touchchat-edit-button", { "is-dis": _ctx.isChating }])
381
+ class: vue.normalizeClass(["touchchat-edit-attach touchchat-edit-button", { "is-dis": __props.isChating }])
382
382
  },
383
383
  [
384
384
  vue.createElementVNode("div", { class: "touchchat-edit-attach-icon" }),
@@ -420,7 +420,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
420
420
  "button",
421
421
  {
422
422
  key: 3,
423
- class: vue.normalizeClass(["touchchat-edit-think", { "is-on": _ctx.enableDeepThinking, "is-dis": _ctx.isChating }]),
423
+ class: vue.normalizeClass(["touchchat-edit-think", { "is-on": __props.enableDeepThinking, "is-dis": __props.isChating }]),
424
424
  onClick: handleDeepThinkingClick
425
425
  },
426
426
  [
@@ -460,10 +460,10 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
460
460
  vue.renderSlot(_ctx.$slots, "editFn"),
461
461
  vue.renderSlot(_ctx.$slots, "editSubmitRight"),
462
462
  vue.createCommentVNode(" \u53D1\u9001\u6309\u94AE "),
463
- !_ctx.isChating ? (vue.openBlock(), vue.createElementBlock("button", {
463
+ !__props.isChating ? (vue.openBlock(), vue.createElementBlock("button", {
464
464
  key: 3,
465
465
  class: "touchchat-edit-send",
466
- disabled: !_ctx.inputValue.trim() && !fileList.value.length,
466
+ disabled: !__props.inputValue.trim() && !fileList.value.length,
467
467
  onClick: handleSend
468
468
  }, [
469
469
  vue.createElementVNode("div", { class: "touchchat-edit-send-icon" })
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInput.vue2.js","sources":["../../../../../../../packages/components/touchchat/src/AiChat/ChatInput.vue"],"sourcesContent":["<template>\n\t<div class=\"touchchat-edit\">\n\t\t<slot name=\"editTop\"></slot>\n\t\t<!-- :file-progress=\"fileProgress\" -->\n\t\t<FileContent v-if=\"fileList.length > 0\" :file-list=\"fileList\" :has-colse=\"true\" type=\"ChatInput\" @colse=\"handleColse\" />\n\t\t<QuoteContent v-if=\"quoteObj && (quoteObj.content || quoteObj.msgList)\" :quote-obj=\"quoteObj\" @close=\"close\" />\n\t\t<div class=\"touchchat-edit-input\">\n\t\t\t<!-- @keydown.enter.prevent -->\n\t\t\t<textarea :value=\"inputValue\" :placeholder=\"placeholder ?? '请输入...'\" @paste=\"handlePaste\" @input=\"handleInputChange\" @keydown.enter=\"handleSend\"> </textarea>\n\t\t</div>\n\n\t\t<!-- 按钮与开关容器 -->\n\t\t<div :class=\"thinkAble ? 'touchchat-edit-submit is-thinkable' : 'touchchat-edit-submit'\">\n\t\t\t<div class=\"touchchat-edit-submit-left\">\n\t\t\t\t<!-- 附件 @click=\"showMarkLaryer = true\" @progress-fn=\"progressFn\" -->\n\t\t\t\t<upload-view v-if=\"uploadAble\" ref=\"uploadViewRef\" :file-list=\"fileList\" @upload-file=\"uploadFile\">\n\t\t\t\t\t<button v-if=\"uploadAble\" class=\"touchchat-edit-attach touchchat-edit-button\" :class=\"{ 'is-dis': isChating }\">\n\t\t\t\t\t\t<div class=\"touchchat-edit-attach-icon\"></div>\n\t\t\t\t\t\t<div class=\"touchchat-edit-tooltip align-left\">\n\t\t\t\t\t\t\t<p>文件数量:最多10个</p>\n\t\t\t\t\t\t\t<p>文件类型:{{ allowedTypes.join('、') || 'pdf,txt,csv,docx,xlsx,xls,pptx,ppt,md,mobi,epub,png,jpeg,jpg' }}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t</upload-view>\n\n\t\t\t\t<button v-if=\"clearAble\" class=\"touchchat-edit-delete touchchat-edit-button\" @click=\"handleClearClick\">\n\t\t\t\t\t<div class=\"touchchat-edit-delete-icon\"></div>\n\t\t\t\t\t<div class=\"touchchat-edit-tooltip\">清空文本</div>\n\t\t\t\t</button>\n\t\t\t\t<!-- {{ finallyModules.length }} -->\n\t\t\t\t<ModuleSelect v-if=\"finallyModules.length > 1\" v-model=\"selectVal\" :modules=\"finallyModules\" />\n\n\t\t\t\t<!-- 深度思考开关 - 修改为按钮样式 -->\n\t\t\t\t<button v-if=\"thinkAble\" class=\"touchchat-edit-think\" :class=\"{ 'is-on': enableDeepThinking, 'is-dis': isChating }\" @click=\"handleDeepThinkingClick\">\n\t\t\t\t\t<div class=\"touchchat-edit-think-icon\"></div>\n\t\t\t\t\t<div class=\"touchchat-edit-think-text\">深度思考</div>\n\t\t\t\t</button>\n\t\t\t\t<slot name=\"editSubmitLeft\"></slot>\n\t\t\t</div>\n\t\t\t<div class=\"touchchat-edit-submit-right\">\n\t\t\t\t<!-- 截图 -->\n\t\t\t\t<screenshot v-if=\"screenAble\" @up-file-list=\"upFileList\"></screenshot>\n\t\t\t\t<!-- 实时语音 -->\n\t\t\t\t<realtime-voice v-if=\"realtimeVoiceAble\" @start-realtime-voice=\"startRealtimeVoice\" @transcription=\"transcription\"></realtime-voice>\n\t\t\t\t<!-- 语音 -->\n\t\t\t\t<voice v-if=\"voiceAble\" ref=\"voiceRef\" @up-file-list=\"upFileList\"></voice>\n\t\t\t\t<slot name=\"editFn\"></slot>\n\t\t\t\t<slot name=\"editSubmitRight\"></slot>\n\t\t\t\t<!-- 发送按钮 -->\n\t\t\t\t<button v-if=\"!isChating\" class=\"touchchat-edit-send\" :disabled=\"!inputValue.trim() && !fileList.length\" @click=\"handleSend\">\n\t\t\t\t\t<div class=\"touchchat-edit-send-icon\"></div>\n\t\t\t\t</button>\n\n\t\t\t\t<!-- 停止按钮 -->\n\t\t\t\t<button v-else class=\"touchchat-edit-stop\" @click=\"handleStop\">\n\t\t\t\t\t<div class=\"touchchat-edit-stop-icon\"></div>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<MarkLayer :show-mark-laryer=\"showMarkLaryer\" @colse-mark-layer=\"showMarkLaryer = false\" />\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\n// todo 要实现默认选中第一个模块\nimport { ref, inject, provide, nextTick, computed, watch, onMounted } from 'vue'\nimport MarkLayer from '../../component/MarkLayer.vue'\nimport FileContent from '../../component/FileContent.vue'\nimport QuoteContent from '../../component/QuoteContent.vue'\nimport UploadView from '../../component/UploadView.vue'\nimport Screenshot from '../../component/Screenshot.vue'\nimport Voice from '../../component/VoiceView.vue'\nimport RealtimeVoice from '../../component/RealtimeVoice.vue'\nimport ModuleSelect from '../../component/ModuleSelect.vue'\nimport { showToast } from '../../utils/tools'\nimport type { ChatMsgList, FileItem } from './Chat/types'\n\n// 定义 body 返回值的类型\ninterface BodyConfig {\n\tmodel: string\n\tmessages: Array<{\n\t\trole: string\n\t\tcontent: string\n\t}>\n\tstream: boolean\n}\n\n// 定义 respoKey 返回值的类型\ninterface RespoKeyConfig {\n\tcategory: string\n\tcontentCategory: string\n\tcontent: string\n\tall: string\n\tallCategory: string\n}\n\ninterface ModuleItem {\n\tname: string\n\tconfig: {\n\t\taction: string\n\t\theaders: () => object\n\t\tbody: () => BodyConfig // 修改为具体类型\n\t\trespoKey: () => RespoKeyConfig // 修改为具体类型\n\t}\n}\n\nconst props = defineProps<{\n\tinputValue: string\n\tisChating: boolean\n\tenableDeepThinking?: boolean\n}>()\n\nconst placeholder = inject('placeholder', '请输入...')\nconst layout = inject<string>('layout', 'side, think, upload, chain, screen,realtime')\nconst modules = inject<(string | ModuleItem)[]>('modules', [])\nconst iModules = ref(modules)\nwatch(\n\t() => modules,\n\tnewVal => {\n\t\tiModules.value = newVal\n\t\tconsole.log('modules === ChatInput.vue === 128', newVal)\n\t}\n\t// { immediate: true }\n)\n\nconst allowedTypes = inject<string[]>('allowedTypes', [])\nprovide('uploadFile', (index: number, type?: string) => {\n\tif (uploadViewRef.value) {\n\t\tuploadViewRef.value.uploadFile(index, type)\n\t}\n})\nconst thinkAble = layout.includes('think')\nconst clearAble = layout.includes('clear')\nconst uploadAble = layout.includes('upload')\nconst screenAble = layout.includes('screen')\nconst voiceAble = layout.includes('voice')\nconst realtimeVoiceAble = layout.includes('realtime')\nconst showMarkLaryer = ref<boolean>(false)\nconst fileList = ref<FileItem[]>([])\n// const fileData = ref<FileItem[]>([])\nconst optionalModules = ref<ModuleItem[]>([\n\t{\n\t\tname: 'deepseek-v3',\n\t\tconfig: {\n\t\t\taction: 'https://api.apiyi.com/v1/chat/completions',\n\t\t\theaders: () => ({\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: 'Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd'\n\t\t\t}),\n\t\t\tbody: () => ({\n\t\t\t\tmodel: 'deepseek-v3',\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\trole: 'user',\n\t\t\t\t\t\t// content: props.inputValue // 使用传入的用户内容参数\n\t\t\t\t\t\tcontent: ''\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tstream: true\n\t\t\t}),\n\t\t\trespoKey: () => ({\n\t\t\t\tcategory: 'category',\n\t\t\t\tcontentCategory: 'task_stream_content',\n\t\t\t\tcontent: 'content',\n\t\t\t\tall: 'message',\n\t\t\t\tallCategory: 'answer'\n\t\t\t})\n\t\t}\n\t}\n])\nconst uploadViewRef = ref<InstanceType<typeof UploadView>>()\nconst selectVal = ref('')\nconst selectInfo = ref<ModuleItem>({} as ModuleItem)\nconst voiceRef = ref<InstanceType<typeof Voice>>()\n// const scripts = inject<any[]>('scripts', [])\n\nconst modelChange = inject<(item: ModuleItem, index: number) => void>('modelChange', () => {\n\tconsole.warn('未提供modelChange函数')\n})\n\nconst emits = defineEmits<{\n\t(e: 'send', val: string, list: FileItem[]): void\n\t(e: 'stop'): void\n\t(e: 'update:enableDeepThinking', value: boolean): void\n\t(e: 'update:inputValue', value: string): void // 添加inputValue更新事件\n\t(e: 'moduleInfo', info: ModuleItem): void\n}>()\n\nwatch(\n\t() => selectVal.value,\n\t() => {\n\t\tconsole.log('selectVal.value === ChatInput.vue === 198', selectVal.value)\n\t\tif (finallyModules.value.length > 0) {\n\t\t\tselectInfo.value = finallyModules.value.find((item: any) => item.name === selectVal.value)\n\t\t\tif (selectInfo.value) {\n\t\t\t\temits('moduleInfo', selectInfo.value)\n\t\t\t\tmodelChange(selectInfo.value, finallyModules.value.indexOf(selectInfo.value))\n\t\t\t}\n\t\t}\n\t},\n\t{ deep: true }\n)\n\nwatch(\n\t() => props.enableDeepThinking,\n\t() => {\n\t\tupdateSelectInfo()\n\t},\n\t{ deep: true }\n)\n\nwatch(\n\t() => props.inputValue,\n\t() => {\n\t\tupdateSelectInfo()\n\t},\n\t{ deep: true }\n)\n\nconst finallyModules = computed(() => {\n\t// console.log('modules === ChatInput.vue === 226', modules, iModules.value)\n\tif (!iModules.value.length) {\n\t\treturn optionalModules.value\n\t}\n\treturn iModules.value.flatMap((module: any) => {\n\t\tif (typeof module === 'string') {\n\t\t\t// 若 module 是字符串,在 optionalModules 中查找 name 匹配的项\n\t\t\tconst matchedModule = optionalModules.value.find((optModule: any) => optModule.name === module)\n\t\t\tif (matchedModule) {\n\t\t\t\t// 对匹配到的模块也更新 content 值\n\t\t\t\tconst updatedModule = { ...matchedModule }\n\t\t\t\tconst body = updatedModule.config.body()\n\t\t\t\tif (thinkAble) {\n\t\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\n\t\t\t\t}\n\t\t\t\tupdatedModule.config.body = () => body\n\t\t\t\treturn [updatedModule]\n\t\t\t}\n\t\t\treturn []\n\t\t} else {\n\t\t\tconst body = module.config.body()\n\t\t\tif (thinkAble) {\n\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\n\t\t\t}\n\t\t\t// 重新定义 body 方法,返回更新后的 body\n\t\t\tmodule.config.body = () => body\n\t\t\treturn [module]\n\t\t}\n\t})\n})\n\nconst updateSelectInfo = () => {\n\tif (!selectInfo.value.name) {\n\t\tselectInfo.value = finallyModules.value[0]\n\t\tselectVal.value = selectInfo.value.name\n\t}\n\tconst body = (selectInfo.value as ModuleItem).config.body()\n\tif (body.messages && body.messages.length > 0 && body.messages[0].content) {\n\t\tbody.messages[0].content = props.inputValue\n\t} else {\n\t\tbody.messages = [{ role: 'user', content: props.inputValue }]\n\t}\n\t;(selectInfo.value as ModuleItem).config.body = () => body\n\tif (finallyModules.value.length > 0 && selectInfo.value) {\n\t\tconst body = selectInfo.value.config.body()\n\t\tif (thinkAble && body.model) {\n\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\n\t\t}\n\t\tselectInfo.value.config.body = () => body\n\t}\n}\n\nconst upFileList = (list: FileItem[]) => {\n\tfileList.value.push(...list)\n\tnextTick(() => {\n\t\tif (uploadViewRef.value) {\n\t\t\t// 只对最新复制的图片进行加载\n\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t}\n\t})\n}\n\nconst handlePaste = (event: any, type?: string) => {\n\t// event.preventDefault();\n\tif (event.clipboardData) {\n\t\tconst clipboardData = event.clipboardData || window.Clipboard\n\t\tconst items = clipboardData.items\n\n\t\tlet isImage = false\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tif (items[i].type.indexOf('image/') !== -1) {\n\t\t\t\tisImage = true\n\t\t\t\t// 获取图片文件\n\t\t\t\tconst blob = items[i].getAsFile()\n\t\t\t\tif (blob) {\n\t\t\t\t\tconst reader = new FileReader()\n\t\t\t\t\treader.onload = e => {\n\t\t\t\t\t\tconst base64 = e.target?.result as string\n\t\t\t\t\t\t// 生成图片属性对象\n\t\t\t\t\t\tconst imageInfo: FileItem = {\n\t\t\t\t\t\t\tfile: blob,\n\t\t\t\t\t\t\tisUploading: false,\n\t\t\t\t\t\t\tuploadProgress: 0,\n\t\t\t\t\t\t\tuploadSuccess: false,\n\t\t\t\t\t\t\tuploadError: false,\n\t\t\t\t\t\t\tfileSize: blob.size,\n\t\t\t\t\t\t\tfileType: blob.type,\n\t\t\t\t\t\t\tname: `pasted_image_${Date.now()}`,\n\t\t\t\t\t\t\tid: Date.now().toString(),\n\t\t\t\t\t\t\tbase64,\n\t\t\t\t\t\t\tlastModified: Date.now()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfileList.value.push(imageInfo)\n\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\tif (uploadViewRef.value) {\n\t\t\t\t\t\t\t\t// 只对最新复制的图片进行加载\n\t\t\t\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treader.readAsDataURL(blob)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (isImage) {\n\t\t\tconsole.log('检测到粘贴的是图片')\n\t\t} else {\n\t\t\tconsole.log('粘贴的不是图片')\n\t\t}\n\t} else {\n\t\tif (type === 'copy') {\n\t\t\tfileList.value = event\n\t\t\tnextTick(() => {\n\t\t\t\tif (uploadViewRef.value) {\n\t\t\t\t\t// 只对最新复制的图片进行加载\n\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\tfileList.value.push(...event)\n\t\tnextTick(() => {\n\t\t\tif (uploadViewRef.value) {\n\t\t\t\t// 只对最新复制的图片进行加载\n\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t\t}\n\t\t})\n\t}\n}\n\nconst openMarkLayer = () => {\n\tshowMarkLaryer.value = true\n}\n\nconst colseMarkLayer = () => {\n\tshowMarkLaryer.value = false\n}\n\nconst handleColse = (id: string) => {\n\tconst index = fileList.value.findIndex((item: any) => item.id === id)\n\tif (index !== -1) {\n\t\tfileList.value.splice(index, 1)\n\t}\n}\n\nconst startRealtimeVoice = () => {\n\tif (voiceRef.value) {\n\t\tvoiceRef.value.toggleRecording(true)\n\t}\n}\n\nconst transcription = (text: string) => {\n\temits('update:inputValue', text)\n}\n\nconst handleClearClick = () => {\n\temits('update:inputValue', '')\n}\n\n// 处理输入框变化\nconst handleInputChange = (e: Event) => {\n\tconst value = (e.target as HTMLTextAreaElement).value\n\temits('update:inputValue', value)\n}\n\n// 处理深度思考按钮点击\nconst handleDeepThinkingClick = () => {\n\t// enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3'\n\temits('update:enableDeepThinking', !props.enableDeepThinking)\n}\n\nconst uploadFile = (file: FileItem[]) => {\n\tif (file.length > 0) {\n\t\tfileList.value = file\n\t}\n}\n\nconst handleSend = (e?: Event) => {\n\t// 检测是否为 Shift+Enter,如果是则不发送,执行默认换行行为\n\tif (e instanceof KeyboardEvent && e.shiftKey) {\n\t\treturn\n\t}\n\t// 普通 Enter 时阻止默认行为,执行发送逻辑\n\tif (e instanceof KeyboardEvent) {\n\t\te.preventDefault()\n\t}\n\t// if (!scripts.length && fileList.value.length > 0) {\n\t// \tshowToast('暂不支持文件发送')\n\t// \treturn\n\t// }\n\tif (!props.inputValue.trim() && !fileList.value.length) {\n\t\tshowToast('请输入内容')\n\t\treturn\n\t}\n\tlet uploadError = false\n\tif (fileList.value.length > 0) {\n\t\tfileList.value.forEach((item: any) => {\n\t\t\tif (item.uploadError) {\n\t\t\t\tuploadError = true\n\t\t\t}\n\t\t})\n\t}\n\tif (uploadError) {\n\t\tshowToast('上传失败,请重试')\n\t\treturn\n\t}\n\tif (fileList.value.length > 10) {\n\t\tshowToast('文件数量不能超过10个')\n\t\treturn\n\t}\n\temits('send', props.inputValue, fileList.value)\n\tnextTick(() => {\n\t\tfileList.value = []\n\t\tif (uploadViewRef.value) {\n\t\t\tuploadViewRef.value.resetFile()\n\t\t}\n\t\tif (voiceRef.value) {\n\t\t\tvoiceRef.value.resetFile()\n\t\t}\n\t})\n}\n\nconst itemUploadFile = (index: number, type: string) => {\n\tif (uploadViewRef.value) {\n\t\tuploadViewRef.value.uploadFile(index, type)\n\t}\n}\nconst handleStop = () => emits('stop')\nonMounted(() => {\n\tconsole.log('onMounted')\n\t// if (finallyModules.value.length > 0) {\n\t// \tselectVal.value = finallyModules.value[0].name\n\t// \tselectInfo.value = finallyModules.value[0]\n\t// \tif (selectInfo.value) {\n\t// \t\temits('moduleInfo', selectInfo.value)\n\t// \t}\n\t// }\n})\nconst quoteObj = ref<any>(null)\nconst idx = ref(0)\nconst updateQuoteData = (item: ChatMsgList, index: number) => {\n\tquoteObj.value = item\n\tidx.value = index\n}\nconst close = () => {\n\tquoteObj.value = {}\n}\ndefineExpose({\n\thandlePaste,\n\topenMarkLayer,\n\tcolseMarkLayer,\n\titemUploadFile,\n\tupdateQuoteData\n})\n</script>\n"],"names":["inject","ref","watch","provide","computed","body","nextTick","showToast","onMounted","_createElementBlock","_renderSlot","_createCommentVNode","_createBlock","FileContent","QuoteContent","_createElementVNode","inputValue","_unref","UploadView","_normalizeClass","isChating","_toDisplayString","ModuleSelect","enableDeepThinking","Screenshot","RealtimeVoice","Voice","_Fragment","_createVNode","MarkLayer"],"mappings":"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"}
1
+ {"version":3,"file":"ChatInput.vue2.js","sources":["../../../../../../../packages/components/touchchat/src/AiChat/ChatInput.vue"],"sourcesContent":["<template>\r\n\t<div class=\"touchchat-edit\">\r\n\t\t<slot name=\"editTop\"></slot>\r\n\t\t<!-- :file-progress=\"fileProgress\" -->\r\n\t\t<FileContent v-if=\"fileList.length > 0\" :file-list=\"fileList\" :has-colse=\"true\" type=\"ChatInput\" @colse=\"handleColse\" />\r\n\t\t<QuoteContent v-if=\"quoteObj && (quoteObj.content || quoteObj.msgList)\" :quote-obj=\"quoteObj\" @close=\"close\" />\r\n\t\t<div class=\"touchchat-edit-input\">\r\n\t\t\t<!-- @keydown.enter.prevent -->\r\n\t\t\t<textarea :value=\"inputValue\" :placeholder=\"placeholder ?? '请输入...'\" @paste=\"handlePaste\" @input=\"handleInputChange\" @keydown.enter=\"handleSend\"> </textarea>\r\n\t\t</div>\r\n\r\n\t\t<!-- 按钮与开关容器 -->\r\n\t\t<div :class=\"thinkAble ? 'touchchat-edit-submit is-thinkable' : 'touchchat-edit-submit'\">\r\n\t\t\t<div class=\"touchchat-edit-submit-left\">\r\n\t\t\t\t<!-- 附件 @click=\"showMarkLaryer = true\" @progress-fn=\"progressFn\" -->\r\n\t\t\t\t<upload-view v-if=\"uploadAble\" ref=\"uploadViewRef\" :file-list=\"fileList\" @upload-file=\"uploadFile\">\r\n\t\t\t\t\t<button v-if=\"uploadAble\" class=\"touchchat-edit-attach touchchat-edit-button\" :class=\"{ 'is-dis': isChating }\">\r\n\t\t\t\t\t\t<div class=\"touchchat-edit-attach-icon\"></div>\r\n\t\t\t\t\t\t<div class=\"touchchat-edit-tooltip align-left\">\r\n\t\t\t\t\t\t\t<p>文件数量:最多10个</p>\r\n\t\t\t\t\t\t\t<p>文件类型:{{ allowedTypes.join('、') || 'pdf,txt,csv,docx,xlsx,xls,pptx,ppt,md,mobi,epub,png,jpeg,jpg' }}</p>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</upload-view>\r\n\r\n\t\t\t\t<button v-if=\"clearAble\" class=\"touchchat-edit-delete touchchat-edit-button\" @click=\"handleClearClick\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-delete-icon\"></div>\r\n\t\t\t\t\t<div class=\"touchchat-edit-tooltip\">清空文本</div>\r\n\t\t\t\t</button>\r\n\t\t\t\t<!-- {{ finallyModules.length }} -->\r\n\t\t\t\t<ModuleSelect v-if=\"finallyModules.length > 1\" v-model=\"selectVal\" :modules=\"finallyModules\" />\r\n\r\n\t\t\t\t<!-- 深度思考开关 - 修改为按钮样式 -->\r\n\t\t\t\t<button v-if=\"thinkAble\" class=\"touchchat-edit-think\" :class=\"{ 'is-on': enableDeepThinking, 'is-dis': isChating }\" @click=\"handleDeepThinkingClick\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-think-icon\"></div>\r\n\t\t\t\t\t<div class=\"touchchat-edit-think-text\">深度思考</div>\r\n\t\t\t\t</button>\r\n\t\t\t\t<slot name=\"editSubmitLeft\"></slot>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"touchchat-edit-submit-right\">\r\n\t\t\t\t<!-- 截图 -->\r\n\t\t\t\t<screenshot v-if=\"screenAble\" @up-file-list=\"upFileList\"></screenshot>\r\n\t\t\t\t<!-- 实时语音 -->\r\n\t\t\t\t<realtime-voice v-if=\"realtimeVoiceAble\" @start-realtime-voice=\"startRealtimeVoice\" @transcription=\"transcription\"></realtime-voice>\r\n\t\t\t\t<!-- 语音 -->\r\n\t\t\t\t<voice v-if=\"voiceAble\" ref=\"voiceRef\" @up-file-list=\"upFileList\"></voice>\r\n\t\t\t\t<slot name=\"editFn\"></slot>\r\n\t\t\t\t<slot name=\"editSubmitRight\"></slot>\r\n\t\t\t\t<!-- 发送按钮 -->\r\n\t\t\t\t<button v-if=\"!isChating\" class=\"touchchat-edit-send\" :disabled=\"!inputValue.trim() && !fileList.length\" @click=\"handleSend\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-send-icon\"></div>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<!-- 停止按钮 -->\r\n\t\t\t\t<button v-else class=\"touchchat-edit-stop\" @click=\"handleStop\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-stop-icon\"></div>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<MarkLayer :show-mark-laryer=\"showMarkLaryer\" @colse-mark-layer=\"showMarkLaryer = false\" />\r\n\t</div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n// todo 要实现默认选中第一个模块\r\nimport { ref, inject, provide, nextTick, computed, watch, onMounted } from 'vue'\r\nimport MarkLayer from '../../component/MarkLayer.vue'\r\nimport FileContent from '../../component/FileContent.vue'\r\nimport QuoteContent from '../../component/QuoteContent.vue'\r\nimport UploadView from '../../component/UploadView.vue'\r\nimport Screenshot from '../../component/Screenshot.vue'\r\nimport Voice from '../../component/VoiceView.vue'\r\nimport RealtimeVoice from '../../component/RealtimeVoice.vue'\r\nimport ModuleSelect from '../../component/ModuleSelect.vue'\r\nimport { showToast } from '../../utils/tools'\r\nimport type { ChatMsgList, FileItem } from './Chat/types'\r\n\r\n// 定义 body 返回值的类型\r\ninterface BodyConfig {\r\n\tmodel: string\r\n\tmessages: Array<{\r\n\t\trole: string\r\n\t\tcontent: string\r\n\t}>\r\n\tstream: boolean\r\n}\r\n\r\n// 定义 respoKey 返回值的类型\r\ninterface RespoKeyConfig {\r\n\tcategory: string\r\n\tcontentCategory: string\r\n\tcontent: string\r\n\tall: string\r\n\tallCategory: string\r\n}\r\n\r\ninterface ModuleItem {\r\n\tname: string\r\n\tconfig: {\r\n\t\taction: string\r\n\t\theaders: () => object\r\n\t\tbody: () => BodyConfig // 修改为具体类型\r\n\t\trespoKey: () => RespoKeyConfig // 修改为具体类型\r\n\t}\r\n}\r\n\r\nconst props = defineProps<{\r\n\tinputValue: string\r\n\tisChating: boolean\r\n\tenableDeepThinking?: boolean\r\n}>()\r\n\r\nconst placeholder = inject('placeholder', '请输入...')\r\nconst layout = inject<string>('layout', 'side, think, upload, chain, screen,realtime')\r\nconst modules = inject<(string | ModuleItem)[]>('modules', [])\r\nconst iModules = ref(modules)\r\nwatch(\r\n\t() => modules,\r\n\tnewVal => {\r\n\t\tiModules.value = newVal\r\n\t\tconsole.log('modules === ChatInput.vue === 128', newVal)\r\n\t}\r\n\t// { immediate: true }\r\n)\r\n\r\nconst allowedTypes = inject<string[]>('allowedTypes', [])\r\nprovide('uploadFile', (index: number, type?: string) => {\r\n\tif (uploadViewRef.value) {\r\n\t\tuploadViewRef.value.uploadFile(index, type)\r\n\t}\r\n})\r\nconst thinkAble = layout.includes('think')\r\nconst clearAble = layout.includes('clear')\r\nconst uploadAble = layout.includes('upload')\r\nconst screenAble = layout.includes('screen')\r\nconst voiceAble = layout.includes('voice')\r\nconst realtimeVoiceAble = layout.includes('realtime')\r\nconst showMarkLaryer = ref<boolean>(false)\r\nconst fileList = ref<FileItem[]>([])\r\n// const fileData = ref<FileItem[]>([])\r\nconst optionalModules = ref<ModuleItem[]>([\r\n\t{\r\n\t\tname: 'deepseek-v3',\r\n\t\tconfig: {\r\n\t\t\taction: 'https://api.apiyi.com/v1/chat/completions',\r\n\t\t\theaders: () => ({\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\tAuthorization: 'Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd'\r\n\t\t\t}),\r\n\t\t\tbody: () => ({\r\n\t\t\t\tmodel: 'deepseek-v3',\r\n\t\t\t\tmessages: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\trole: 'user',\r\n\t\t\t\t\t\t// content: props.inputValue // 使用传入的用户内容参数\r\n\t\t\t\t\t\tcontent: ''\r\n\t\t\t\t\t}\r\n\t\t\t\t],\r\n\t\t\t\tstream: true\r\n\t\t\t}),\r\n\t\t\trespoKey: () => ({\r\n\t\t\t\tcategory: 'category',\r\n\t\t\t\tcontentCategory: 'task_stream_content',\r\n\t\t\t\tcontent: 'content',\r\n\t\t\t\tall: 'message',\r\n\t\t\t\tallCategory: 'answer'\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n])\r\nconst uploadViewRef = ref<InstanceType<typeof UploadView>>()\r\nconst selectVal = ref('')\r\nconst selectInfo = ref<ModuleItem>({} as ModuleItem)\r\nconst voiceRef = ref<InstanceType<typeof Voice>>()\r\n// const scripts = inject<any[]>('scripts', [])\r\n\r\nconst modelChange = inject<(item: ModuleItem, index: number) => void>('modelChange', () => {\r\n\tconsole.warn('未提供modelChange函数')\r\n})\r\n\r\nconst emits = defineEmits<{\r\n\t(e: 'send', val: string, list: FileItem[]): void\r\n\t(e: 'stop'): void\r\n\t(e: 'update:enableDeepThinking', value: boolean): void\r\n\t(e: 'update:inputValue', value: string): void // 添加inputValue更新事件\r\n\t(e: 'moduleInfo', info: ModuleItem): void\r\n}>()\r\n\r\nwatch(\r\n\t() => selectVal.value,\r\n\t() => {\r\n\t\tconsole.log('selectVal.value === ChatInput.vue === 198', selectVal.value)\r\n\t\tif (finallyModules.value.length > 0) {\r\n\t\t\tselectInfo.value = finallyModules.value.find((item: any) => item.name === selectVal.value)\r\n\t\t\tif (selectInfo.value) {\r\n\t\t\t\temits('moduleInfo', selectInfo.value)\r\n\t\t\t\tmodelChange(selectInfo.value, finallyModules.value.indexOf(selectInfo.value))\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t{ deep: true }\r\n)\r\n\r\nwatch(\r\n\t() => props.enableDeepThinking,\r\n\t() => {\r\n\t\tupdateSelectInfo()\r\n\t},\r\n\t{ deep: true }\r\n)\r\n\r\nwatch(\r\n\t() => props.inputValue,\r\n\t() => {\r\n\t\tupdateSelectInfo()\r\n\t},\r\n\t{ deep: true }\r\n)\r\n\r\nconst finallyModules = computed(() => {\r\n\t// console.log('modules === ChatInput.vue === 226', modules, iModules.value)\r\n\tif (!iModules.value.length) {\r\n\t\treturn optionalModules.value\r\n\t}\r\n\treturn iModules.value.flatMap((module: any) => {\r\n\t\tif (typeof module === 'string') {\r\n\t\t\t// 若 module 是字符串,在 optionalModules 中查找 name 匹配的项\r\n\t\t\tconst matchedModule = optionalModules.value.find((optModule: any) => optModule.name === module)\r\n\t\t\tif (matchedModule) {\r\n\t\t\t\t// 对匹配到的模块也更新 content 值\r\n\t\t\t\tconst updatedModule = { ...matchedModule }\r\n\t\t\t\tconst body = updatedModule.config.body()\r\n\t\t\t\tif (thinkAble) {\r\n\t\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\t\t\t\t}\r\n\t\t\t\tupdatedModule.config.body = () => body\r\n\t\t\t\treturn [updatedModule]\r\n\t\t\t}\r\n\t\t\treturn []\r\n\t\t} else {\r\n\t\t\tconst body = module.config.body()\r\n\t\t\tif (thinkAble) {\r\n\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\t\t\t}\r\n\t\t\t// 重新定义 body 方法,返回更新后的 body\r\n\t\t\tmodule.config.body = () => body\r\n\t\t\treturn [module]\r\n\t\t}\r\n\t})\r\n})\r\n\r\nconst updateSelectInfo = () => {\r\n\tif (!selectInfo.value.name) {\r\n\t\tselectInfo.value = finallyModules.value[0]\r\n\t\tselectVal.value = selectInfo.value.name\r\n\t}\r\n\tconst body = (selectInfo.value as ModuleItem).config.body()\r\n\tif (body.messages && body.messages.length > 0 && body.messages[0].content) {\r\n\t\tbody.messages[0].content = props.inputValue\r\n\t} else {\r\n\t\tbody.messages = [{ role: 'user', content: props.inputValue }]\r\n\t}\r\n\t;(selectInfo.value as ModuleItem).config.body = () => body\r\n\tif (finallyModules.value.length > 0 && selectInfo.value) {\r\n\t\tconst body = selectInfo.value.config.body()\r\n\t\tif (thinkAble && body.model) {\r\n\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\t\t}\r\n\t\tselectInfo.value.config.body = () => body\r\n\t}\r\n}\r\n\r\nconst upFileList = (list: FileItem[]) => {\r\n\tfileList.value.push(...list)\r\n\tnextTick(() => {\r\n\t\tif (uploadViewRef.value) {\r\n\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t}\r\n\t})\r\n}\r\n\r\nconst handlePaste = (event: any, type?: string) => {\r\n\t// event.preventDefault();\r\n\tif (event.clipboardData) {\r\n\t\tconst clipboardData = event.clipboardData || window.Clipboard\r\n\t\tconst items = clipboardData.items\r\n\r\n\t\tlet isImage = false\r\n\t\tfor (let i = 0; i < items.length; i++) {\r\n\t\t\tif (items[i].type.indexOf('image/') !== -1) {\r\n\t\t\t\tisImage = true\r\n\t\t\t\t// 获取图片文件\r\n\t\t\t\tconst blob = items[i].getAsFile()\r\n\t\t\t\tif (blob) {\r\n\t\t\t\t\tconst reader = new FileReader()\r\n\t\t\t\t\treader.onload = e => {\r\n\t\t\t\t\t\tconst base64 = e.target?.result as string\r\n\t\t\t\t\t\t// 生成图片属性对象\r\n\t\t\t\t\t\tconst imageInfo: FileItem = {\r\n\t\t\t\t\t\t\tfile: blob,\r\n\t\t\t\t\t\t\tisUploading: false,\r\n\t\t\t\t\t\t\tuploadProgress: 0,\r\n\t\t\t\t\t\t\tuploadSuccess: false,\r\n\t\t\t\t\t\t\tuploadError: false,\r\n\t\t\t\t\t\t\tfileSize: blob.size,\r\n\t\t\t\t\t\t\tfileType: blob.type,\r\n\t\t\t\t\t\t\tname: `pasted_image_${Date.now()}`,\r\n\t\t\t\t\t\t\tid: Date.now().toString(),\r\n\t\t\t\t\t\t\tbase64,\r\n\t\t\t\t\t\t\tlastModified: Date.now()\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfileList.value.push(imageInfo)\r\n\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\tif (uploadViewRef.value) {\r\n\t\t\t\t\t\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\t\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\treader.readAsDataURL(blob)\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isImage) {\r\n\t\t\tconsole.log('检测到粘贴的是图片')\r\n\t\t} else {\r\n\t\t\tconsole.log('粘贴的不是图片')\r\n\t\t}\r\n\t} else {\r\n\t\tif (type === 'copy') {\r\n\t\t\tfileList.value = event\r\n\t\t\tnextTick(() => {\r\n\t\t\t\tif (uploadViewRef.value) {\r\n\t\t\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\t\tfileList.value.push(...event)\r\n\t\tnextTick(() => {\r\n\t\t\tif (uploadViewRef.value) {\r\n\t\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n}\r\n\r\nconst openMarkLayer = () => {\r\n\tshowMarkLaryer.value = true\r\n}\r\n\r\nconst colseMarkLayer = () => {\r\n\tshowMarkLaryer.value = false\r\n}\r\n\r\nconst handleColse = (id: string) => {\r\n\tconst index = fileList.value.findIndex((item: any) => item.id === id)\r\n\tif (index !== -1) {\r\n\t\tfileList.value.splice(index, 1)\r\n\t}\r\n}\r\n\r\nconst startRealtimeVoice = () => {\r\n\tif (voiceRef.value) {\r\n\t\tvoiceRef.value.toggleRecording(true)\r\n\t}\r\n}\r\n\r\nconst transcription = (text: string) => {\r\n\temits('update:inputValue', text)\r\n}\r\n\r\nconst handleClearClick = () => {\r\n\temits('update:inputValue', '')\r\n}\r\n\r\n// 处理输入框变化\r\nconst handleInputChange = (e: Event) => {\r\n\tconst value = (e.target as HTMLTextAreaElement).value\r\n\temits('update:inputValue', value)\r\n}\r\n\r\n// 处理深度思考按钮点击\r\nconst handleDeepThinkingClick = () => {\r\n\t// enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\temits('update:enableDeepThinking', !props.enableDeepThinking)\r\n}\r\n\r\nconst uploadFile = (file: FileItem[]) => {\r\n\tif (file.length > 0) {\r\n\t\tfileList.value = file\r\n\t}\r\n}\r\n\r\nconst handleSend = (e?: Event) => {\r\n\t// 检测是否为 Shift+Enter,如果是则不发送,执行默认换行行为\r\n\tif (e instanceof KeyboardEvent && e.shiftKey) {\r\n\t\treturn\r\n\t}\r\n\t// 普通 Enter 时阻止默认行为,执行发送逻辑\r\n\tif (e instanceof KeyboardEvent) {\r\n\t\te.preventDefault()\r\n\t}\r\n\t// if (!scripts.length && fileList.value.length > 0) {\r\n\t// \tshowToast('暂不支持文件发送')\r\n\t// \treturn\r\n\t// }\r\n\tif (!props.inputValue.trim() && !fileList.value.length) {\r\n\t\tshowToast('请输入内容')\r\n\t\treturn\r\n\t}\r\n\tlet uploadError = false\r\n\tif (fileList.value.length > 0) {\r\n\t\tfileList.value.forEach((item: any) => {\r\n\t\t\tif (item.uploadError) {\r\n\t\t\t\tuploadError = true\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\tif (uploadError) {\r\n\t\tshowToast('上传失败,请重试')\r\n\t\treturn\r\n\t}\r\n\tif (fileList.value.length > 10) {\r\n\t\tshowToast('文件数量不能超过10个')\r\n\t\treturn\r\n\t}\r\n\temits('send', props.inputValue, fileList.value)\r\n\tnextTick(() => {\r\n\t\tfileList.value = []\r\n\t\tif (uploadViewRef.value) {\r\n\t\t\tuploadViewRef.value.resetFile()\r\n\t\t}\r\n\t\tif (voiceRef.value) {\r\n\t\t\tvoiceRef.value.resetFile()\r\n\t\t}\r\n\t})\r\n}\r\n\r\nconst itemUploadFile = (index: number, type: string) => {\r\n\tif (uploadViewRef.value) {\r\n\t\tuploadViewRef.value.uploadFile(index, type)\r\n\t}\r\n}\r\nconst handleStop = () => emits('stop')\r\nonMounted(() => {\r\n\tconsole.log('onMounted')\r\n\t// if (finallyModules.value.length > 0) {\r\n\t// \tselectVal.value = finallyModules.value[0].name\r\n\t// \tselectInfo.value = finallyModules.value[0]\r\n\t// \tif (selectInfo.value) {\r\n\t// \t\temits('moduleInfo', selectInfo.value)\r\n\t// \t}\r\n\t// }\r\n})\r\nconst quoteObj = ref<any>(null)\r\nconst idx = ref(0)\r\nconst updateQuoteData = (item: ChatMsgList, index: number) => {\r\n\tquoteObj.value = item\r\n\tidx.value = index\r\n}\r\nconst close = () => {\r\n\tquoteObj.value = {}\r\n}\r\ndefineExpose({\r\n\thandlePaste,\r\n\topenMarkLayer,\r\n\tcolseMarkLayer,\r\n\titemUploadFile,\r\n\tupdateQuoteData\r\n})\r\n</script>\r\n"],"names":["inject","ref","watch","provide","computed","body","nextTick","showToast","onMounted","_createElementBlock","_renderSlot","_createCommentVNode","_createBlock","FileContent","QuoteContent","_createElementVNode","_unref","UploadView","_normalizeClass","_toDisplayString","ModuleSelect","Screenshot","RealtimeVoice","Voice","_Fragment","_createVNode","MarkLayer"],"mappings":"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"}
@@ -310,7 +310,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
310
310
  key: item.id,
311
311
  ref_for: true,
312
312
  ref: (el) => setHistoryItemRef(item.id, el),
313
- class: vue.normalizeClass([item.id === _ctx.activeChat ? "is-on" : "", "touchchat-history-item"]),
313
+ class: vue.normalizeClass([item.id === __props.activeChat ? "is-on" : "", "touchchat-history-item"]),
314
314
  onClick: ($event) => handleSelectChat(item.id)
315
315
  }, [
316
316
  vue.createElementVNode(