pcm-agents 0.3.2 → 0.3.4

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 (107) hide show
  1. package/LICENSE +21 -21
  2. package/dist/cjs/{index-BFPEnLbS.js → index-RmBfqEV7.js} +4 -3
  3. package/dist/cjs/index-RmBfqEV7.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +1 -1
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/my-component.cjs.entry.js +2 -2
  7. package/dist/cjs/my-component.cjs.entry.js.map +1 -1
  8. package/dist/cjs/my-component.entry.cjs.js.map +1 -1
  9. package/dist/cjs/pcm-agents.cjs.js +1 -1
  10. package/dist/cjs/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpp-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.cjs.js.map +1 -0
  11. package/dist/cjs/pcm-app-chat-modal_7.cjs.entry.js +68 -61
  12. package/dist/cjs/pcm-app-chat-modal_7.cjs.entry.js.map +1 -1
  13. package/dist/cjs/pcm-chat-modal.cjs.entry.js +1 -1
  14. package/dist/collection/collection-manifest.json +1 -1
  15. package/dist/collection/components/my-component/my-component.css +3 -3
  16. package/dist/collection/components/my-component/my-component.js +1 -1
  17. package/dist/collection/components/my-component/my-component.js.map +1 -1
  18. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js +5 -6
  19. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js.map +1 -1
  20. package/dist/collection/components/pcm-chat-message/pcm-chat-message.js +26 -2
  21. package/dist/collection/components/pcm-chat-message/pcm-chat-message.js.map +1 -1
  22. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js +4 -4
  23. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js.map +1 -1
  24. package/dist/collection/components/{pcm-jlpx-modal/pcm-jlpx-modal.js → pcm-jlpp-modal/pcm-jlpp-modal.js} +21 -21
  25. package/dist/collection/components/pcm-jlpp-modal/pcm-jlpp-modal.js.map +1 -0
  26. package/dist/collection/components/pcm-mnms-modal/pcm-mnms-modal.js +16 -16
  27. package/dist/collection/components/pcm-mnms-modal/pcm-mnms-modal.js.map +1 -1
  28. package/dist/collection/components/pcm-video-chat-modal/pcm-video-chat-modal.js +4 -4
  29. package/dist/collection/components/pcm-video-chat-modal/pcm-video-chat-modal.js.map +1 -1
  30. package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.js +22 -18
  31. package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.js.map +1 -1
  32. package/dist/collection/global/global.css +31 -0
  33. package/dist/collection/index.js.map +1 -1
  34. package/dist/collection/utils/utils.js +2 -1
  35. package/dist/collection/utils/utils.js.map +1 -1
  36. package/dist/components/index.js +2 -1
  37. package/dist/components/index.js.map +1 -1
  38. package/dist/components/my-component.js +1 -1
  39. package/dist/components/my-component.js.map +1 -1
  40. package/dist/components/{p-LkDC0SN2.js → p-CBMLAbWp.js} +10 -5
  41. package/dist/components/p-CBMLAbWp.js.map +1 -0
  42. package/dist/components/{p-BctfuDvG.js → p-VU0niiMk.js} +7 -8
  43. package/dist/components/p-VU0niiMk.js.map +1 -0
  44. package/dist/components/pcm-app-chat-modal.js +1 -1
  45. package/dist/components/pcm-chat-message.js +1 -1
  46. package/dist/components/pcm-chat-modal.js +1 -1
  47. package/dist/components/pcm-hr-chat-modal.js +4 -4
  48. package/dist/components/pcm-hr-chat-modal.js.map +1 -1
  49. package/dist/components/{pcm-jlpx-modal.d.ts → pcm-jlpp-modal.d.ts} +4 -4
  50. package/dist/components/{pcm-jlpx-modal.js → pcm-jlpp-modal.js} +27 -27
  51. package/dist/components/pcm-jlpp-modal.js.map +1 -0
  52. package/dist/components/pcm-mnms-modal.js +16 -16
  53. package/dist/components/pcm-mnms-modal.js.map +1 -1
  54. package/dist/components/pcm-video-chat-modal.js +4 -4
  55. package/dist/components/pcm-video-chat-modal.js.map +1 -1
  56. package/dist/components/pcm-zygh-modal.js +20 -16
  57. package/dist/components/pcm-zygh-modal.js.map +1 -1
  58. package/dist/esm/{index-nVjZGfA8.js → index-CDtyzi83.js} +4 -3
  59. package/dist/esm/index-CDtyzi83.js.map +1 -0
  60. package/dist/esm/index.js +1 -1
  61. package/dist/esm/loader.js +1 -1
  62. package/dist/esm/my-component.entry.js +2 -2
  63. package/dist/esm/my-component.entry.js.map +1 -1
  64. package/dist/esm/pcm-agents.js +1 -1
  65. package/dist/esm/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpp-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.js.map +1 -0
  66. package/dist/esm/pcm-app-chat-modal_7.entry.js +68 -61
  67. package/dist/esm/pcm-app-chat-modal_7.entry.js.map +1 -1
  68. package/dist/esm/pcm-chat-modal.entry.js +1 -1
  69. package/dist/pcm-agents/index.esm.js +1 -1
  70. package/dist/pcm-agents/my-component.entry.esm.js.map +1 -1
  71. package/dist/pcm-agents/p-11c829b3.entry.js +2 -0
  72. package/dist/pcm-agents/p-11c829b3.entry.js.map +1 -0
  73. package/dist/pcm-agents/{p-f3ca99b4.entry.js → p-430f9a9f.entry.js} +2 -2
  74. package/dist/pcm-agents/p-CDtyzi83.js +2 -0
  75. package/dist/pcm-agents/p-CDtyzi83.js.map +1 -0
  76. package/dist/pcm-agents/p-a0826602.entry.js +2 -0
  77. package/dist/pcm-agents/p-a0826602.entry.js.map +1 -0
  78. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  79. package/dist/pcm-agents/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpp-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.esm.js.map +1 -0
  80. package/dist/types/components/pcm-app-chat-modal/pcm-app-chat-modal.d.ts +1 -1
  81. package/dist/types/components/pcm-chat-message/pcm-chat-message.d.ts +4 -0
  82. package/dist/types/components/pcm-hr-chat-modal/pcm-hr-chat-modal.d.ts +1 -1
  83. package/dist/types/components/{pcm-jlpx-modal/pcm-jlpx-modal.d.ts → pcm-jlpp-modal/pcm-jlpp-modal.d.ts} +4 -4
  84. package/dist/types/components/pcm-mnms-modal/pcm-mnms-modal.d.ts +3 -3
  85. package/dist/types/components/pcm-video-chat-modal/pcm-video-chat-modal.d.ts +1 -1
  86. package/dist/types/components/pcm-zygh-modal/pcm-zygh-modal.d.ts +8 -4
  87. package/dist/types/components.d.ts +56 -48
  88. package/dist/types/utils/utils.d.ts +1 -1
  89. package/package.json +62 -61
  90. package/readme.md +307 -307
  91. package/dist/cjs/index-BFPEnLbS.js.map +0 -1
  92. package/dist/cjs/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpx-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.cjs.js.map +0 -1
  93. package/dist/collection/components/pcm-jlpx-modal/pcm-jlpx-modal.js.map +0 -1
  94. package/dist/components/p-BctfuDvG.js.map +0 -1
  95. package/dist/components/p-LkDC0SN2.js.map +0 -1
  96. package/dist/components/pcm-jlpx-modal.js.map +0 -1
  97. package/dist/esm/index-nVjZGfA8.js.map +0 -1
  98. package/dist/esm/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpx-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.js.map +0 -1
  99. package/dist/pcm-agents/p-55417392.entry.js +0 -2
  100. package/dist/pcm-agents/p-55417392.entry.js.map +0 -1
  101. package/dist/pcm-agents/p-a698b59f.entry.js +0 -2
  102. package/dist/pcm-agents/p-a698b59f.entry.js.map +0 -1
  103. package/dist/pcm-agents/p-nVjZGfA8.js +0 -2
  104. package/dist/pcm-agents/p-nVjZGfA8.js.map +0 -1
  105. package/dist/pcm-agents/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpx-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.esm.js.map +0 -1
  106. /package/dist/collection/components/{pcm-jlpx-modal/pcm-jlpx-modal.css → pcm-jlpp-modal/pcm-jlpp-modal.css} +0 -0
  107. /package/dist/pcm-agents/{p-f3ca99b4.entry.js.map → p-430f9a9f.entry.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-SU3eqPPs.js');
4
- var index$1 = require('./index-BFPEnLbS.js');
4
+ var index$1 = require('./index-RmBfqEV7.js');
5
5
 
6
6
  const pcmChatModalCss = ":host{display:block}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0, 0, 0, 0.5);display:flex;justify-content:center;align-items:center;overflow-y:auto;padding:20px;z-index:1000}.fullscreen-overlay{padding:0}.modal-container{background:white;border-radius:8px;width:100%;max-width:800px;height:80vh;min-height:600px;display:flex;flex-direction:column;position:relative;margin:auto}.modal-container.fullscreen{width:100vw;max-width:none;height:100vh;min-height:100vh;border-radius:0;margin:0}@media screen and (max-width: 768px){.modal-overlay{padding:0}.modal-container{width:95%;height:70vh;min-height:400px}.chat-history{min-height:200px;max-height:50vh}.modal-container.fullscreen{height:-webkit-fill-available;max-height:-webkit-fill-available;padding:env(safe-area-inset-top) 0 env(safe-area-inset-bottom)}.modal-container.fullscreen .chat-history{max-height:unset}.modal-container.fullscreen .modal-header{padding:0px 16px;padding-top:max(30px, env(safe-area-inset-top))}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;height:50px;border-bottom:1px solid #e8e8e8}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:24px;height:24px}.close-button{background:transparent;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:4px}.close-button:hover{background-color:rgba(0, 0, 0, 0.04)}.close-button span{font-size:24px;line-height:1;color:#999}.close-button:hover span{color:#666}.chat-history{position:relative;flex:1;overflow-y:auto;padding:16px;scroll-behavior:smooth;min-height:400px;}@media screen and (max-width: 480px){.chat-history{min-height:200px;max-height:50vh}}.message-input{padding:16px;border-top:1px solid #eee;display:flex;gap:8px;align-items:center}.message-input input{flex:1;padding:8px 12px;border:1px solid #ddd;border-radius:4px;outline:none;transition:border-color 0.2s ease}.message-input input:focus{border-color:#bbb}.message{margin-bottom:16px;opacity:1;transition:opacity 0.3s ease}.message-content{max-width:70%;padding:8px 12px;border-radius:8px;word-break:break-word}.message-content p{margin:0;word-break:break-word}.user-message{display:flex;justify-content:flex-end}.agent-message{display:flex;justify-content:flex-start}.user-message .message-content{background-color:#007bff;color:white}.agent-message .message-content{background-color:#f1f1f1}.message-time{font-size:12px;color:#999;margin-top:4px;display:block}.send-button{background-color:#1890ff;color:white;border:none;border-radius:4px;padding:8px 16px;cursor:pointer;font-weight:500}.send-button:disabled{background-color:#ccc;cursor:not-allowed}.empty-state{display:flex;justify-content:center;align-items:center;height:100%;color:#999;text-align:center}.loading-container{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:rgba(255, 255, 255, 0.98);z-index:1;opacity:1;transition:opacity 0.3s ease}.loading-container p{margin-top:16px;color:#666;font-size:14px}.loading-spinner{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #1890ff;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.messages-wrapper{width:100%;min-height:100%;display:flex;flex-direction:column;justify-content:flex-end}.messages-wrapper.has-overflow{justify-content:flex-start}.suggested-questions{display:flex;flex-direction:column;gap:8px;padding:16px}.suggested-question{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f3f4f6;border-radius:4px;cursor:pointer;font-size:14px;color:#374151;transition:background-color 0.2s}.suggested-question:hover{background-color:#e5e7eb}.arrow-right{margin-left:8px}.loading-suggestions{display:flex;justify-content:center;padding:16px}.loading-spinner-small{width:20px;height:20px;border:2px solid #e5e7eb;border-top-color:#6b7280;border-radius:50%;animation:spin 1s linear infinite}.upload-button{background:transparent;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;color:#666;border-radius:4px;transition:background-color 0.2s}.upload-button:hover{background-color:rgba(0, 0, 0, 0.04)}.upload-button svg{width:20px;height:20px}.file-input{display:none}.selected-file{font-size:12px;color:#666;margin-left:8px;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.input-wrapper{flex:1;display:flex;align-items:center;border:1px solid #ddd;border-radius:4px;padding:0 4px;background:white}.input-wrapper input{border:none;flex:1;padding:8px;outline:none}.input-wrapper:focus-within{border-color:#bbb}.file-preview{padding:8px 16px;border-top:1px solid #eee;background-color:#f9f9f9}.file-info{display:flex;align-items:center;justify-content:space-between;padding:8px;background:white;border:1px solid #e8e8e8;border-radius:4px}.file-name{font-size:13px;color:#333;margin-right:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:calc(100% - 30px)}.remove-file{background:transparent;border:none;color:#999;cursor:pointer;padding:4px 8px;font-size:16px;line-height:1;border-radius:4px;transition:all 0.2s}.remove-file:hover{background-color:#f0f0f0;color:#666}";
7
7
 
@@ -6,7 +6,7 @@
6
6
  "components/pcm-chat-message/pcm-chat-message.js",
7
7
  "components/pcm-chat-modal/pcm-chat-modal.js",
8
8
  "components/pcm-hr-chat-modal/pcm-hr-chat-modal.js",
9
- "components/pcm-jlpx-modal/pcm-jlpx-modal.js",
9
+ "components/pcm-jlpp-modal/pcm-jlpp-modal.js",
10
10
  "components/pcm-mnms-modal/pcm-mnms-modal.js",
11
11
  "components/pcm-video-chat-modal/pcm-video-chat-modal.js"
12
12
  ],
@@ -1,3 +1,3 @@
1
- :host {
2
- display: block;
3
- }
1
+ :host {
2
+ display: block;
3
+ }
@@ -17,7 +17,7 @@ export class MyComponent {
17
17
  return format(this.first, this.middle, this.last);
18
18
  }
19
19
  render() {
20
- return h("div", { key: '4cf44ed05360697e1aa7fbb8a80f14e1e129e13c' }, "Hello, World! I'm ", this.getText());
20
+ return h("div", { key: '70654fc83039b5f659efe99cc990e9b86d20dbe0' }, "Hello, World! I'm ", this.getText());
21
21
  }
22
22
  static get is() { return "my-component"; }
23
23
  static get encapsulation() { return "shadow"; }
@@ -1 +1 @@
1
- {"version":3,"file":"my-component.js","sourceRoot":"","sources":["../../../src/components/my-component/my-component.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAO3C,MAAM,OAAO,WAAW;IACtB;;OAEG;IACK,KAAK,CAAS;IAEtB;;OAEG;IACK,MAAM,CAAS;IAEvB;;OAEG;IACK,IAAI,CAAS;IAEb,OAAO;QACb,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,MAAM;QACJ,OAAO;;YAAwB,IAAI,CAAC,OAAO,EAAE,CAAO,CAAC;IACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Prop, h } from '@stencil/core';\r\nimport { format } from '../../utils/utils';\r\n\r\n@Component({\r\n tag: 'my-component',\r\n styleUrl: 'my-component.css',\r\n shadow: true,\r\n})\r\nexport class MyComponent {\r\n /**\r\n * The first name\r\n */\r\n @Prop() first: string;\r\n\r\n /**\r\n * The middle name\r\n */\r\n @Prop() middle: string;\r\n\r\n /**\r\n * The last name\r\n */\r\n @Prop() last: string;\r\n\r\n private getText(): string {\r\n return format(this.first, this.middle, this.last);\r\n }\r\n\r\n render() {\r\n return <div>Hello, World! I'm {this.getText()}</div>;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"my-component.js","sourceRoot":"","sources":["../../../src/components/my-component/my-component.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAO3C,MAAM,OAAO,WAAW;IACtB;;OAEG;IACK,KAAK,CAAS;IAEtB;;OAEG;IACK,MAAM,CAAS;IAEvB;;OAEG;IACK,IAAI,CAAS;IAEb,OAAO;QACb,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,MAAM;QACJ,OAAO;;YAAwB,IAAI,CAAC,OAAO,EAAE,CAAO,CAAC;IACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Prop, h } from '@stencil/core';\nimport { format } from '../../utils/utils';\n\n@Component({\n tag: 'my-component',\n styleUrl: 'my-component.css',\n shadow: true,\n})\nexport class MyComponent {\n /**\n * The first name\n */\n @Prop() first: string;\n\n /**\n * The middle name\n */\n @Prop() middle: string;\n\n /**\n * The last name\n */\n @Prop() last: string;\n\n private getText(): string {\n return format(this.first, this.middle, this.last);\n }\n\n render() {\n return <div>Hello, World! I'm {this.getText()}</div>;\n }\n}\n"]}
@@ -6,7 +6,7 @@ export class ChatAPPModal {
6
6
  */
7
7
  modalTitle = '在线客服';
8
8
  /**
9
- * API鉴权密钥
9
+ * SDK鉴权密钥
10
10
  */
11
11
  token = '';
12
12
  /**
@@ -231,7 +231,7 @@ export class ChatAPPModal {
231
231
  },
232
232
  data: requestData,
233
233
  onMessage: (data) => {
234
- console.log('收到Stream数据:', data);
234
+ // console.log('收到Stream数据:', data);
235
235
  if (data.conversation_id && !this.conversationId) {
236
236
  this.conversationId = data.conversation_id;
237
237
  this.conversationStart.emit({
@@ -244,7 +244,6 @@ export class ChatAPPModal {
244
244
  // 检查是否有 node_finished 事件和 LLMText
245
245
  if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {
246
246
  llmText = data.data.inputs.LLMText;
247
- console.log('获取到 LLMText:', llmText);
248
247
  }
249
248
  if (data.event === 'message') {
250
249
  const inputMessage = { message: message };
@@ -962,10 +961,10 @@ export class ChatAPPModal {
962
961
  'submit-text-button': true,
963
962
  'disabled': !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio
964
963
  }, disabled: !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio, onClick: this.submitTextAnswer }, this.isSubmittingText ? '发送中...' : '发送'))));
965
- return (h("div", { class: overlayClass, style: modalStyle }, h("div", { class: containerClass }, this.isShowHeader && (h("div", { class: "modal-header" }, h("div", { class: "header-left" }, this.icon && h("img", { src: this.icon, class: "header-icon", alt: "\u5E94\u7528\u56FE\u6807" }), h("div", null, this.modalTitle)), this.isNeedClose && (h("button", { class: "close-button", onClick: this.handleClose }, h("span", null, "\u00D7"))))), h("div", { style: { height: '100%' } }, h("div", { class: "chat-history", onScroll: this.handleScroll }, this.isLoadingHistory ? (h("div", { class: "loading-container" }, h("div", { class: "loading-spinner" }), h("p", null, "\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u4E2D..."))) : (h("div", null, this.messages.map((message) => (h("div", { id: `message_${message.id}`, key: message.id }, h("pcm-chat-message", { message: message, onMessageChange: (event) => {
964
+ return (h("div", { class: overlayClass, style: modalStyle }, h("div", { class: containerClass }, this.isShowHeader && (h("div", { class: "modal-header" }, h("div", { class: "header-left" }, this.icon && h("img", { src: this.icon, class: "header-icon", alt: "\u5E94\u7528\u56FE\u6807" }), h("div", null, this.modalTitle)), this.isNeedClose && (h("button", { class: "close-button", onClick: this.handleClose }, h("span", null, "\u00D7"))))), h("div", { style: { height: '100%' } }, h("div", { class: "chat-history", onScroll: this.handleScroll }, this.isLoadingHistory ? (h("div", { class: "loading-container" }, h("div", { class: "loading-spinner" }), h("p", null, "\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u4E2D..."))) : (h("div", null, this.messages.map((message) => (h("div", { id: `message_${message.id}`, key: message.id }, h("pcm-chat-message", { message: message, token: this.token, onMessageChange: (event) => {
966
965
  const updatedMessages = this.messages.map(msg => msg.id === message.id ? { ...msg, ...event.detail } : msg);
967
966
  this.messages = updatedMessages;
968
- } })))), this.currentStreamingMessage && (h("div", { id: `message_${this.currentStreamingMessage.id}` }, h("pcm-chat-message", { message: this.currentStreamingMessage }))), this.messages.length === 0 && !this.currentStreamingMessage && (h("div", { class: "empty-state" }, h("p", null, "\u6B63\u5728\u51C6\u5907\u9762\u8BD5...")))))), h("div", { class: "recording-section" }, h("div", { class: "recording-container" }, this.interviewMode === 'text' && (renderTextInputArea()), this.interviewMode === 'video' && (h("div", { style: { width: '100%', display: 'flex', flexWrap: 'wrap', justifyContent: 'center' } }, h("div", { class: "video-area" }, this.showRecordingUI ? (renderVideoPreview()) : (h("div", { class: "video-preview placeholder" }, renderPlaceholderStatus())), h("div", { class: "progress-container" }, h("div", { class: "progress-bar-container" }, h("div", { class: "progress-bar", style: {
967
+ } })))), this.currentStreamingMessage && (h("div", { id: `message_${this.currentStreamingMessage.id}` }, h("pcm-chat-message", { token: this.token, message: this.currentStreamingMessage }))), this.messages.length === 0 && !this.currentStreamingMessage && (h("div", { class: "empty-state" }, h("p", null, "\u6B63\u5728\u51C6\u5907\u9762\u8BD5...")))))), h("div", { class: "recording-section" }, h("div", { class: "recording-container" }, this.interviewMode === 'text' && (renderTextInputArea()), this.interviewMode === 'video' && (h("div", { style: { width: '100%', display: 'flex', flexWrap: 'wrap', justifyContent: 'center' } }, h("div", { class: "video-area" }, this.showRecordingUI ? (renderVideoPreview()) : (h("div", { class: "video-preview placeholder" }, renderPlaceholderStatus())), h("div", { class: "progress-container" }, h("div", { class: "progress-bar-container" }, h("div", { class: "progress-bar", style: {
969
968
  width: `${Math.max(0, this.currentQuestionNumber - 1) / this.totalQuestions * 100}%`
970
969
  } })), h("div", { class: "progress-text" }, "\u5DF2\u5B8C\u6210", Math.max(0, this.currentQuestionNumber - 1), "/", this.totalQuestions))), h("div", { class: "recording-controls" }, this.showRecordingUI ? (h("button", { class: "stop-recording-button", onClick: () => this.stopRecording() }, "\u5B8C\u6210\u672C\u9898\u56DE\u7B54")) : (h("div", { class: "waiting-message" }, (() => {
971
970
  // 显示播放按钮(当不自动播放且有音频URL时)
@@ -1022,7 +1021,7 @@ export class ChatAPPModal {
1022
1021
  "optional": false,
1023
1022
  "docs": {
1024
1023
  "tags": [],
1025
- "text": "API\u9274\u6743\u5BC6\u94A5"
1024
+ "text": "SDK\u9274\u6743\u5BC6\u94A5"
1026
1025
  },
1027
1026
  "getter": false,
1028
1027
  "setter": false,
@@ -1 +1 @@
1
- {"version":3,"file":"pcm-app-chat-modal.js","sourceRoot":"","sources":["../../../src/components/pcm-app-chat-modal/pcm-app-chat-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element } from '@stencil/core';\r\nimport { convertWorkflowStreamNodeToMessageRound, UserInputMessageType, sendSSERequest, sendHttpRequest, uploadFileToBackend, API_DOMAIN } from '../../utils/utils';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n\r\n@Component({\r\n tag: 'pcm-app-chat-modal',\r\n styleUrl: 'pcm-app-chat-modal.css',\r\n shadow: true,\r\n})\r\nexport class ChatAPPModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '在线客服';\r\n\r\n /**\r\n * API鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token: string = '';\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 聊天消息历史\r\n */\r\n @State() messages: ChatMessage[] = [];\r\n\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n\r\n /**\r\n * 会话ID,传入继续对话,否则创建新会话\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 当前助手回复的消息\r\n */\r\n @State() currentAssistantMessage: string = '';\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n // 添加新的状态控制\r\n @State() shouldAutoScroll: boolean = true;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n @State() selectedFile: File | null = null;\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: { cos_key: string, filename: string, ext: string, presigned_url: string }[] = [];\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '';\r\n\r\n // 添加新的状态\r\n @State() showInitialUpload: boolean = false;\r\n\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() recordingMaxTime: number = 120; // 最大录制时间(秒)\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n @State() waitingTimeLeft: number = 10; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n /**\r\n * 控制对话轮数\r\n */\r\n @Prop() totalQuestions: number = 2;\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<{\r\n conversation_id: string;\r\n total_questions: number;\r\n }>;\r\n\r\n private readonly SCROLL_THRESHOLD = 30;\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n // 添加新的状态和属性\r\n @State() isPlayingAudio: boolean = false;\r\n @State() audioUrl: string | null = null;\r\n private audioElement: HTMLAudioElement | null = null;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<{\r\n type: string;\r\n message: string;\r\n details?: any;\r\n }>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<{\r\n status: 'started' | 'stopped' | 'paused' | 'resumed' | 'failed';\r\n details?: any;\r\n }>;\r\n\r\n /**\r\n * 是否启用语音播报功能\r\n * true: 启用语音合成\r\n * false: 禁用语音合成\r\n */\r\n @Prop() enableTTS: boolean = false;\r\n\r\n /**\r\n * 是否自动播放语音问题\r\n */\r\n @Prop() enableVoice: boolean = false;\r\n\r\n /**\r\n * 是否显示题干内容\r\n * 1: 显示题干内容\r\n * 0: 不显示题干内容\r\n */\r\n @Prop() displayContentStatus: string = \"1\";\r\n\r\n\r\n /**\r\n * 面试模式\r\n * video: 视频面试模式\r\n * text: 文字面试模式\r\n */\r\n @Prop() interviewMode: 'video' | 'text' = 'video';\r\n\r\n // 添加文字输入相关状态\r\n @State() textAnswer: string = '';\r\n @State() isSubmittingText: boolean = false;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 机器人ID\r\n */\r\n @Prop() botId?: string;\r\n\r\n\r\n\r\n private handleClose = () => {\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = ''; // 添加变量存储 LLMText\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || '请开始';\r\n\r\n // 检查是否是最后一题\r\n const isLastQuestion = this.currentQuestionNumber >= this.totalQuestions;\r\n\r\n // 创建新的消息对象\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 消息唯一标识\r\n time: time, // 消息时间\r\n query: queryText, // 用户输入的消息内容\r\n answer: '',\r\n isStreaming: true, // 是否正在流式输出\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: this.customInputs, // 输入参数\r\n status: \"normal\", // 消息状态\r\n error: null // 错误信息\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n this.shouldAutoScroll = true;\r\n // 滚动到底部\r\n this.scrollToBottom();\r\n\r\n // 如果是最后一题,直接显示结束消息并完成面试\r\n if (isLastQuestion) {\r\n this.messages = [...this.messages, newMessage];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n await this.completeInterview();\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n total_questions: this.totalQuestions\r\n });\r\n return;\r\n }\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n bot_id: this.botId // 添加 botId 到请求数据中\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs\r\n };\r\n\r\n // 如果有视频URL,添加到inputs中\r\n if (videoUrl) {\r\n requestData.inputs.video_url = videoUrl;\r\n }\r\n\r\n await sendSSERequest({\r\n url: `/sdk/v1/chat/chat-messages`,\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: requestData,\r\n onMessage: (data) => {\r\n console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n console.log('获取到 LLMText:', llmText);\r\n }\r\n\r\n if (data.event === 'message') {\r\n const inputMessage: UserInputMessageType = { message: message };\r\n convertWorkflowStreamNodeToMessageRound('message', inputMessage, data);\r\n\r\n if (data.event === 'agent_message' || data.event === 'message') {\r\n if (data.answer) {\r\n answer += data.answer;\r\n const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n isStreaming: true\r\n };\r\n this.currentStreamingMessage = updatedMessage;\r\n this.scrollToBottom();\r\n }\r\n }\r\n }\r\n if (data.event === \"message_end\") {\r\n this.streamComplete.emit({\r\n conversation_id: data.conversation_id || '',\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n },\r\n onError: (error) => {\r\n console.error('发生错误:', error);\r\n alert(error instanceof Error ? error.message : '消息发送失败,请稍后再试');\r\n this.messages = [...this.messages, {\r\n ...newMessage,\r\n answer: '抱歉,发生了错误,请稍后再试。',\r\n error: error,\r\n isStreaming: false\r\n }];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n\r\n // 获取最新的AI回复内容\r\n const latestAIMessage = this.currentStreamingMessage;\r\n\r\n // 更新消息列表\r\n this.messages = [...this.messages, this.currentStreamingMessage];\r\n this.currentStreamingMessage = null;\r\n\r\n // 如果是初始消息或\"下一题\"消息,增加题目计数\r\n if (message === \"下一题\" || this.currentQuestionNumber === 0) {\r\n this.currentQuestionNumber++;\r\n }\r\n\r\n if (latestAIMessage && latestAIMessage.answer) {\r\n // 优先使用 LLMText,如果没有则使用 answer\r\n const textForSynthesis = llmText || latestAIMessage.answer;\r\n\r\n if (textForSynthesis && this.enableTTS) {\r\n // 合成语音\r\n const audioUrl = await this.synthesizeAudio(textForSynthesis);\r\n\r\n if (this.enableVoice) {\r\n // 自动播放语音\r\n await this.playAudio(audioUrl);\r\n // 自动播放模式下,只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n } else {\r\n // 只保存音频URL,不自动播放\r\n this.audioUrl = audioUrl;\r\n }\r\n } else {\r\n // 如果禁用了语音合成,只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n // 监听滚动事件,用于控制聊天历史记录的自动滚动行为。\r\n private handleScroll = () => {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (!chatHistory) return;\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = chatHistory;\r\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\r\n\r\n // 更新是否应该自动滚动的状态\r\n this.shouldAutoScroll = distanceFromBottom <= this.SCROLL_THRESHOLD;\r\n };\r\n\r\n private scrollToBottom() {\r\n if (!this.shouldAutoScroll) return;\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory && this.isOpen) {\r\n // 强制浏览器重新计算布局\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n\r\n // 添加 componentDidRender 生命周期方法,用于在组件渲染后滚动到底部\r\n componentDidRender() {\r\n if (this.isLoadingHistory || (this.shouldAutoScroll && this.isOpen)) {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n }\r\n\r\n\r\n // 修改 loadHistoryMessages 方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n\r\n try {\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/messages',\r\n method: 'GET',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n limit: 20\r\n }\r\n });\r\n\r\n if (result.success && result.data) {\r\n const historyData = result.data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(msg.created_at * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建新的消息对象,不包含 inputs 字段\r\n const { inputs, ...msgWithoutInputs } = msg;\r\n\r\n return {\r\n ...msgWithoutInputs,\r\n time: timeStr,\r\n isStreaming: false,\r\n status: msg.status === 'error' ? 'error' : 'normal' as const\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n \r\n requestAnimationFrame(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n });\r\n }\r\n } catch (error) {\r\n console.error('加载历史消息失败:', error);\r\n alert(error instanceof Error ? error.message : '加载历史消息失败,请刷新重试');\r\n } finally {\r\n this.isLoadingHistory = false;\r\n }\r\n }\r\n\r\n // 修改 componentDidLoad 生命周期方法\r\n componentDidLoad() {\r\n\r\n // 添加滚动事件监听器\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.addEventListener('scroll', this.handleScroll);\r\n }\r\n }\r\n\r\n // 添加 componentWillLoad 生命周期方法\r\n componentWillLoad() {\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.sendMessageToAPI(this.defaultQuery), 0);\r\n }\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 如果不是视频模式,直接返回\r\n if (this.interviewMode !== 'video') {\r\n return;\r\n }\r\n\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = 10;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n }\r\n });\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = this.getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (recorderError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: recorderError\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = (event) => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: '录制过程中发生错误',\r\n details: event\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: '录制的视频为空'\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type\r\n }\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: '处理录制视频时出错',\r\n details: error\r\n });\r\n this.showRecordingUI = false;\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType\r\n }\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n // 通知父组件无法访问媒体设备\r\n this.recordingError.emit({\r\n type: 'media_access_failed',\r\n message: '无法访问摄像头或麦克风,请确保已授予权限',\r\n details: error\r\n });\r\n this.showRecordingUI = false;\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('video') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 添加一个新方法来检测浏览器支持的MIME类型\r\n private getSupportedMimeType(): string {\r\n // 按优先级排列的MIME类型列表\r\n const mimeTypes = [\r\n 'video/webm;codecs=vp8,opus',\r\n 'video/webm;codecs=vp9,opus',\r\n 'video/webm',\r\n 'video/mp4',\r\n 'video/mp4;codecs=h264,aac',\r\n '' // 空字符串表示使用浏览器默认值\r\n ];\r\n\r\n // 检查MediaRecorder是否可用\r\n if (!window.MediaRecorder) {\r\n console.warn('MediaRecorder API不可用');\r\n return '';\r\n }\r\n\r\n // 检查每种MIME类型是否受支持\r\n for (const type of mimeTypes) {\r\n if (!type) return ''; // 如果是空字符串,直接返回\r\n\r\n try {\r\n if (MediaRecorder.isTypeSupported(type)) {\r\n return type;\r\n }\r\n } catch (e) {\r\n console.warn(`检查MIME类型支持时出错 ${type}:`, e);\r\n }\r\n }\r\n\r\n // 如果没有找到支持的类型,返回空字符串\r\n console.warn('没有找到支持的MIME类型,将使用浏览器默认值');\r\n return '';\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n }\r\n\r\n // 修改音频转文字方法\r\n private async convertAudioToText(cosKey: string): Promise<string | null> {\r\n try {\r\n const result = await sendHttpRequest<{ text: string }>({\r\n url: '/sdk/v1/tts/audio_to_text',\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: {\r\n cos_key: cosKey\r\n }\r\n });\r\n \r\n if (result.success && result.data && result.data.text) {\r\n return result.data.text;\r\n } else {\r\n console.warn('音频转文字返回结果格式不正确');\r\n return null;\r\n }\r\n } catch (error) {\r\n console.error('音频转文字错误:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n // 创建File对象\r\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\r\n \r\n // 使用uploadFileToBackend上传文件\r\n const fileInfo = await uploadFileToBackend(file, {\r\n 'authorization': 'Bearer ' + this.token\r\n });\r\n \r\n // 调用音频转文字API\r\n const transcriptionText = await this.convertAudioToText(fileInfo.cos_key);\r\n\r\n // 发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || \"下一题\");\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n // 通知父组件视频上传失败\r\n this.recordingError.emit({\r\n type: 'upload_failed',\r\n message: '视频上传或处理失败',\r\n details: error\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 发送面试完成请求\r\n */\r\n private async completeInterview() {\r\n if (!this.conversationId) return;\r\n\r\n try {\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: \"面试完成\",\r\n inputs: {\r\n // 合并自定义输入参数\r\n ...this.customInputs\r\n }\r\n };\r\n\r\n // 使用sendHttpRequest发送请求\r\n sendHttpRequest({\r\n url: '/sdk/v1/chat/chat-messages',\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: requestData\r\n }).catch(error => {\r\n console.error('发送面试完成请求失败:', error);\r\n });\r\n\r\n } catch (error) {\r\n console.error('发送面试完成请求失败:', error);\r\n }\r\n }\r\n\r\n // 添加TTS合成音频的方法\r\n private async synthesizeAudio(text: string): Promise<string> {\r\n try {\r\n const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n body: JSON.stringify({ text })\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n // 播放音频的方法\r\n private playAudio(audioUrl: string): Promise<void> {\r\n return new Promise((resolve) => {\r\n this.isPlayingAudio = true;\r\n this.audioUrl = audioUrl;\r\n\r\n // 创建音频元素\r\n if (!this.audioElement) {\r\n this.audioElement = new Audio();\r\n }\r\n\r\n this.audioElement.src = audioUrl;\r\n this.audioElement.onended = () => {\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n };\r\n\r\n this.audioElement.onerror = () => {\r\n console.error('音频播放错误');\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n };\r\n\r\n this.audioElement.play().catch(error => {\r\n console.error('音频播放失败:', error);\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n // 修改 componentDidLoad 生命周期方法,确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n // 移除滚动事件监听器\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.removeEventListener('scroll', this.handleScroll);\r\n }\r\n\r\n // 释放音频资源\r\n if (this.audioElement) {\r\n this.audioElement.pause();\r\n this.audioElement.src = '';\r\n this.audioElement = null;\r\n }\r\n\r\n // 释放 Blob URL\r\n if (this.audioUrl) {\r\n URL.revokeObjectURL(this.audioUrl);\r\n this.audioUrl = null;\r\n }\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n }\r\n\r\n // 修改手动播放音频的方法\r\n private handlePlayAudio = async () => {\r\n if (this.audioUrl) {\r\n await this.playAudio(this.audioUrl);\r\n // 手动播放完成后只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n };\r\n\r\n // 处理文本输入变化\r\n private handleTextInputChange = (event: Event) => {\r\n const input = event.target as HTMLTextAreaElement;\r\n this.textAnswer = input.value;\r\n };\r\n\r\n // 添加处理键盘事件的方法\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n // 如果按下的是回车键\r\n if (event.key === 'Enter') {\r\n // 如果同时按下了Ctrl键,允许换行\r\n if (event.ctrlKey) {\r\n return; // 不阻止默认行为,允许插入换行符\r\n } else {\r\n // 阻止默认的换行行为\r\n event.preventDefault();\r\n // 如果文本框不为空且不处于禁用状态,则发送消息\r\n if (this.textAnswer.trim() && !this.isSubmittingText && !this.isLoading &&\r\n !this.currentStreamingMessage && !this.waitingToRecord && !this.isPlayingAudio) {\r\n this.submitTextAnswer();\r\n }\r\n }\r\n }\r\n };\r\n\r\n // 修改提交文本回答的方法\r\n private submitTextAnswer = async () => {\r\n if (!this.textAnswer.trim() || this.isSubmittingText) {\r\n return;\r\n }\r\n\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n // 保存当前输入内容\r\n const textToSend = this.textAnswer;\r\n \r\n // 立即清空文本输入\r\n this.textAnswer = '';\r\n \r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(textToSend);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n alert('提交回答失败,请重试');\r\n } finally {\r\n this.isSubmittingText = false;\r\n }\r\n };\r\n\r\n render() {\r\n if (!this.isOpen) return null;\r\n\r\n const modalStyle = {\r\n zIndex: String(this.zIndex)\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen\r\n };\r\n\r\n const renderVideoPreview = () => (\r\n <div class=\"video-preview\">\r\n <video\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={(el) => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n // 不在这里设置srcObject,而是使用setupVideoPreview方法\r\n }\r\n }}\r\n ></video>\r\n <div class={{\r\n 'recording-status': true,\r\n 'warning': this.showCountdownWarning\r\n }}>\r\n <span class=\"recording-dot\"></span>\r\n <span>\r\n 录制中 {Math.floor(this.recordingTimeLeft / 60)}:{(this.recordingTimeLeft % 60).toString().padStart(2, '0')}\r\n {this.showCountdownWarning && ` (即将自动完成)`}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 渲染占位符状态信息\r\n const renderPlaceholderStatus = () => {\r\n // 正在播放音频\r\n if (this.isPlayingAudio) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在播放问题,请听完后准备回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在上传视频\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在上传视频,请稍候...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在加载或等待AI回复\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请等待题目...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待开始录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请准备好,{this.waitingTimeLeft}秒后将开始录制您的回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 添加默认状态\r\n return (\r\n <div class=\"placeholder-status default-status\">\r\n <p>准备中...</p>\r\n </div>\r\n );\r\n };\r\n\r\n // 修改文本输入区域渲染函数\r\n const renderTextInputArea = () => (\r\n <div class=\"text-input-area\">\r\n <textarea\r\n class=\"text-answer-input\"\r\n placeholder=\"请输入...(按回车发送,Ctrl+回车换行)\"\r\n value={this.textAnswer}\r\n onInput={this.handleTextInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\r\n ></textarea>\r\n <div class=\"input-toolbar\">\r\n <div class=\"toolbar-actions\">\r\n {/* <button class=\"toolbar-button\" title=\"表情\" disabled>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-5-6c.78 2.34 2.72 4 5 4s4.22-1.66 5-4H7zm1.5-5a1.5 1.5 0 100 3 1.5 1.5 0 000-3zm7 0a1.5 1.5 0 100 3 1.5 1.5 0 000-3z\" />\r\n </svg>\r\n </button>\r\n <button class=\"toolbar-button\" title=\"图片\" disabled>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\r\n </svg>\r\n </button> */}\r\n </div>\r\n <button\r\n class={{\r\n 'submit-text-button': true,\r\n 'disabled': !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio\r\n }}\r\n disabled={!this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\r\n onClick={this.submitTextAnswer}\r\n >\r\n {this.isSubmittingText ? '发送中...' : '发送'}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div style={{ height: '100%' }}>\r\n <div class=\"chat-history\" onScroll={this.handleScroll}>\r\n {this.isLoadingHistory ? (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p>加载历史消息中...</p>\r\n </div>\r\n ) : (\r\n <div>\r\n {this.messages.map((message) => (\r\n <div id={`message_${message.id}`} key={message.id}>\r\n <pcm-chat-message\r\n message={message}\r\n onMessageChange={(event) => {\r\n const updatedMessages = this.messages.map(msg =>\r\n msg.id === message.id ? { ...msg, ...event.detail } : msg\r\n );\r\n this.messages = updatedMessages;\r\n }}\r\n ></pcm-chat-message>\r\n </div>\r\n ))}\r\n {this.currentStreamingMessage && (\r\n <div id={`message_${this.currentStreamingMessage.id}`}>\r\n <pcm-chat-message\r\n message={this.currentStreamingMessage}\r\n ></pcm-chat-message>\r\n </div>\r\n )}\r\n {this.messages.length === 0 && !this.currentStreamingMessage && (\r\n <div class=\"empty-state\">\r\n <p>正在准备面试...</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div class=\"recording-section\">\r\n <div class=\"recording-container\">\r\n {\r\n this.interviewMode === 'text' && (\r\n renderTextInputArea()\r\n )\r\n }\r\n {this.interviewMode === 'video' && (\r\n <div style={{ width: '100%', display: 'flex', flexWrap: 'wrap', justifyContent: 'center' }}>\r\n <div class=\"video-area\">\r\n {this.showRecordingUI ? (\r\n renderVideoPreview()\r\n ) : (\r\n <div class=\"video-preview placeholder\">\r\n {renderPlaceholderStatus()}\r\n </div>\r\n )}\r\n <div class=\"progress-container\">\r\n <div class=\"progress-bar-container\">\r\n <div\r\n class=\"progress-bar\"\r\n style={{\r\n width: `${Math.max(0, this.currentQuestionNumber - 1) / this.totalQuestions * 100}%`\r\n }}\r\n ></div>\r\n </div>\r\n <div class=\"progress-text\">\r\n 已完成{Math.max(0, this.currentQuestionNumber - 1)}/{this.totalQuestions}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"recording-controls\">\r\n {this.showRecordingUI ? (\r\n <button\r\n class=\"stop-recording-button\"\r\n onClick={() => this.stopRecording()}\r\n >\r\n 完成本题回答\r\n </button>\r\n ) : (\r\n <div class=\"waiting-message\">\r\n {(() => {\r\n // 显示播放按钮(当不自动播放且有音频URL时)\r\n if (!this.enableVoice && this.audioUrl && !this.isPlayingAudio) {\r\n return (\r\n <div class=\"play-audio-container\" onClick={this.handlePlayAudio}>\r\n <p>\r\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"currentColor\" style={{ verticalAlign: 'middle', marginRight: '8px' }}>\r\n <path d=\"M8 5v14l11-7z\" />\r\n </svg>\r\n <span style={{ verticalAlign: 'middle' }}>播放题目</span>\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // 其他状态下显示禁用的\"完成回答\"按钮\r\n return (\r\n <button class=\"stop-recording-button disabled\" disabled>\r\n 完成回答\r\n </button>\r\n );\r\n })()}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}"]}
1
+ {"version":3,"file":"pcm-app-chat-modal.js","sourceRoot":"","sources":["../../../src/components/pcm-app-chat-modal/pcm-app-chat-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element } from '@stencil/core';\r\nimport { convertWorkflowStreamNodeToMessageRound, UserInputMessageType, sendSSERequest, sendHttpRequest, uploadFileToBackend, API_DOMAIN } from '../../utils/utils';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n\r\n@Component({\r\n tag: 'pcm-app-chat-modal',\r\n styleUrl: 'pcm-app-chat-modal.css',\r\n shadow: true,\r\n})\r\nexport class ChatAPPModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '在线客服';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token: string = '';\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 聊天消息历史\r\n */\r\n @State() messages: ChatMessage[] = [];\r\n\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n\r\n /**\r\n * 会话ID,传入继续对话,否则创建新会话\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 当前助手回复的消息\r\n */\r\n @State() currentAssistantMessage: string = '';\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n // 添加新的状态控制\r\n @State() shouldAutoScroll: boolean = true;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n @State() selectedFile: File | null = null;\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: { cos_key: string, filename: string, ext: string, presigned_url: string }[] = [];\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '';\r\n\r\n // 添加新的状态\r\n @State() showInitialUpload: boolean = false;\r\n\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() recordingMaxTime: number = 120; // 最大录制时间(秒)\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n @State() waitingTimeLeft: number = 10; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n /**\r\n * 控制对话轮数\r\n */\r\n @Prop() totalQuestions: number = 2;\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<{\r\n conversation_id: string;\r\n total_questions: number;\r\n }>;\r\n\r\n private readonly SCROLL_THRESHOLD = 30;\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n // 添加新的状态和属性\r\n @State() isPlayingAudio: boolean = false;\r\n @State() audioUrl: string | null = null;\r\n private audioElement: HTMLAudioElement | null = null;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<{\r\n type: string;\r\n message: string;\r\n details?: any;\r\n }>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<{\r\n status: 'started' | 'stopped' | 'paused' | 'resumed' | 'failed';\r\n details?: any;\r\n }>;\r\n\r\n /**\r\n * 是否启用语音播报功能\r\n * true: 启用语音合成\r\n * false: 禁用语音合成\r\n */\r\n @Prop() enableTTS: boolean = false;\r\n\r\n /**\r\n * 是否自动播放语音问题\r\n */\r\n @Prop() enableVoice: boolean = false;\r\n\r\n /**\r\n * 是否显示题干内容\r\n * 1: 显示题干内容\r\n * 0: 不显示题干内容\r\n */\r\n @Prop() displayContentStatus: string = \"1\";\r\n\r\n\r\n /**\r\n * 面试模式\r\n * video: 视频面试模式\r\n * text: 文字面试模式\r\n */\r\n @Prop() interviewMode: 'video' | 'text' = 'video';\r\n\r\n // 添加文字输入相关状态\r\n @State() textAnswer: string = '';\r\n @State() isSubmittingText: boolean = false;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 机器人ID\r\n */\r\n @Prop() botId?: string;\r\n\r\n\r\n\r\n private handleClose = () => {\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = ''; // 添加变量存储 LLMText\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || '请开始';\r\n\r\n // 检查是否是最后一题\r\n const isLastQuestion = this.currentQuestionNumber >= this.totalQuestions;\r\n\r\n // 创建新的消息对象\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 消息唯一标识\r\n time: time, // 消息时间\r\n query: queryText, // 用户输入的消息内容\r\n answer: '',\r\n isStreaming: true, // 是否正在流式输出\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: this.customInputs, // 输入参数\r\n status: \"normal\", // 消息状态\r\n error: null // 错误信息\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n this.shouldAutoScroll = true;\r\n // 滚动到底部\r\n this.scrollToBottom();\r\n\r\n // 如果是最后一题,直接显示结束消息并完成面试\r\n if (isLastQuestion) {\r\n this.messages = [...this.messages, newMessage];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n await this.completeInterview();\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n total_questions: this.totalQuestions\r\n });\r\n return;\r\n }\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n bot_id: this.botId // 添加 botId 到请求数据中\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs\r\n };\r\n\r\n // 如果有视频URL,添加到inputs中\r\n if (videoUrl) {\r\n requestData.inputs.video_url = videoUrl;\r\n }\r\n\r\n await sendSSERequest({\r\n url: `/sdk/v1/chat/chat-messages`,\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: requestData,\r\n onMessage: (data) => {\r\n // console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n }\r\n\r\n if (data.event === 'message') {\r\n const inputMessage: UserInputMessageType = { message: message };\r\n convertWorkflowStreamNodeToMessageRound('message', inputMessage, data);\r\n\r\n if (data.event === 'agent_message' || data.event === 'message') {\r\n if (data.answer) {\r\n answer += data.answer;\r\n const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n isStreaming: true\r\n };\r\n this.currentStreamingMessage = updatedMessage;\r\n this.scrollToBottom();\r\n }\r\n }\r\n }\r\n if (data.event === \"message_end\") {\r\n this.streamComplete.emit({\r\n conversation_id: data.conversation_id || '',\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n },\r\n onError: (error) => {\r\n console.error('发生错误:', error);\r\n alert(error instanceof Error ? error.message : '消息发送失败,请稍后再试');\r\n this.messages = [...this.messages, {\r\n ...newMessage,\r\n answer: '抱歉,发生了错误,请稍后再试。',\r\n error: error,\r\n isStreaming: false\r\n }];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n\r\n // 获取最新的AI回复内容\r\n const latestAIMessage = this.currentStreamingMessage;\r\n\r\n // 更新消息列表\r\n this.messages = [...this.messages, this.currentStreamingMessage];\r\n this.currentStreamingMessage = null;\r\n\r\n // 如果是初始消息或\"下一题\"消息,增加题目计数\r\n if (message === \"下一题\" || this.currentQuestionNumber === 0) {\r\n this.currentQuestionNumber++;\r\n }\r\n\r\n if (latestAIMessage && latestAIMessage.answer) {\r\n // 优先使用 LLMText,如果没有则使用 answer\r\n const textForSynthesis = llmText || latestAIMessage.answer;\r\n\r\n if (textForSynthesis && this.enableTTS) {\r\n // 合成语音\r\n const audioUrl = await this.synthesizeAudio(textForSynthesis);\r\n\r\n if (this.enableVoice) {\r\n // 自动播放语音\r\n await this.playAudio(audioUrl);\r\n // 自动播放模式下,只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n } else {\r\n // 只保存音频URL,不自动播放\r\n this.audioUrl = audioUrl;\r\n }\r\n } else {\r\n // 如果禁用了语音合成,只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n // 监听滚动事件,用于控制聊天历史记录的自动滚动行为。\r\n private handleScroll = () => {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (!chatHistory) return;\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = chatHistory;\r\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\r\n\r\n // 更新是否应该自动滚动的状态\r\n this.shouldAutoScroll = distanceFromBottom <= this.SCROLL_THRESHOLD;\r\n };\r\n\r\n private scrollToBottom() {\r\n if (!this.shouldAutoScroll) return;\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory && this.isOpen) {\r\n // 强制浏览器重新计算布局\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n\r\n // 添加 componentDidRender 生命周期方法,用于在组件渲染后滚动到底部\r\n componentDidRender() {\r\n if (this.isLoadingHistory || (this.shouldAutoScroll && this.isOpen)) {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n }\r\n\r\n\r\n // 修改 loadHistoryMessages 方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n\r\n try {\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/messages',\r\n method: 'GET',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n limit: 20\r\n }\r\n });\r\n\r\n if (result.success && result.data) {\r\n const historyData = result.data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(msg.created_at * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建新的消息对象,不包含 inputs 字段\r\n const { inputs, ...msgWithoutInputs } = msg;\r\n\r\n return {\r\n ...msgWithoutInputs,\r\n time: timeStr,\r\n isStreaming: false,\r\n status: msg.status === 'error' ? 'error' : 'normal' as const\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n \r\n requestAnimationFrame(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n });\r\n }\r\n } catch (error) {\r\n console.error('加载历史消息失败:', error);\r\n alert(error instanceof Error ? error.message : '加载历史消息失败,请刷新重试');\r\n } finally {\r\n this.isLoadingHistory = false;\r\n }\r\n }\r\n\r\n // 修改 componentDidLoad 生命周期方法\r\n componentDidLoad() {\r\n\r\n // 添加滚动事件监听器\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.addEventListener('scroll', this.handleScroll);\r\n }\r\n }\r\n\r\n // 添加 componentWillLoad 生命周期方法\r\n componentWillLoad() {\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.sendMessageToAPI(this.defaultQuery), 0);\r\n }\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 如果不是视频模式,直接返回\r\n if (this.interviewMode !== 'video') {\r\n return;\r\n }\r\n\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = 10;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n }\r\n });\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = this.getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (recorderError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: recorderError\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = (event) => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: '录制过程中发生错误',\r\n details: event\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: '录制的视频为空'\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type\r\n }\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: '处理录制视频时出错',\r\n details: error\r\n });\r\n this.showRecordingUI = false;\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType\r\n }\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n // 通知父组件无法访问媒体设备\r\n this.recordingError.emit({\r\n type: 'media_access_failed',\r\n message: '无法访问摄像头或麦克风,请确保已授予权限',\r\n details: error\r\n });\r\n this.showRecordingUI = false;\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('video') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 添加一个新方法来检测浏览器支持的MIME类型\r\n private getSupportedMimeType(): string {\r\n // 按优先级排列的MIME类型列表\r\n const mimeTypes = [\r\n 'video/webm;codecs=vp8,opus',\r\n 'video/webm;codecs=vp9,opus',\r\n 'video/webm',\r\n 'video/mp4',\r\n 'video/mp4;codecs=h264,aac',\r\n '' // 空字符串表示使用浏览器默认值\r\n ];\r\n\r\n // 检查MediaRecorder是否可用\r\n if (!window.MediaRecorder) {\r\n console.warn('MediaRecorder API不可用');\r\n return '';\r\n }\r\n\r\n // 检查每种MIME类型是否受支持\r\n for (const type of mimeTypes) {\r\n if (!type) return ''; // 如果是空字符串,直接返回\r\n\r\n try {\r\n if (MediaRecorder.isTypeSupported(type)) {\r\n return type;\r\n }\r\n } catch (e) {\r\n console.warn(`检查MIME类型支持时出错 ${type}:`, e);\r\n }\r\n }\r\n\r\n // 如果没有找到支持的类型,返回空字符串\r\n console.warn('没有找到支持的MIME类型,将使用浏览器默认值');\r\n return '';\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n }\r\n\r\n // 修改音频转文字方法\r\n private async convertAudioToText(cosKey: string): Promise<string | null> {\r\n try {\r\n const result = await sendHttpRequest<{ text: string }>({\r\n url: '/sdk/v1/tts/audio_to_text',\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: {\r\n cos_key: cosKey\r\n }\r\n });\r\n \r\n if (result.success && result.data && result.data.text) {\r\n return result.data.text;\r\n } else {\r\n console.warn('音频转文字返回结果格式不正确');\r\n return null;\r\n }\r\n } catch (error) {\r\n console.error('音频转文字错误:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n // 创建File对象\r\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\r\n \r\n // 使用uploadFileToBackend上传文件\r\n const fileInfo = await uploadFileToBackend(file, {\r\n 'authorization': 'Bearer ' + this.token\r\n });\r\n \r\n // 调用音频转文字API\r\n const transcriptionText = await this.convertAudioToText(fileInfo.cos_key);\r\n\r\n // 发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || \"下一题\");\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n // 通知父组件视频上传失败\r\n this.recordingError.emit({\r\n type: 'upload_failed',\r\n message: '视频上传或处理失败',\r\n details: error\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 发送面试完成请求\r\n */\r\n private async completeInterview() {\r\n if (!this.conversationId) return;\r\n\r\n try {\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: \"面试完成\",\r\n inputs: {\r\n // 合并自定义输入参数\r\n ...this.customInputs\r\n }\r\n };\r\n\r\n // 使用sendHttpRequest发送请求\r\n sendHttpRequest({\r\n url: '/sdk/v1/chat/chat-messages',\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n data: requestData\r\n }).catch(error => {\r\n console.error('发送面试完成请求失败:', error);\r\n });\r\n\r\n } catch (error) {\r\n console.error('发送面试完成请求失败:', error);\r\n }\r\n }\r\n\r\n // 添加TTS合成音频的方法\r\n private async synthesizeAudio(text: string): Promise<string> {\r\n try {\r\n const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + this.token\r\n },\r\n body: JSON.stringify({ text })\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n // 播放音频的方法\r\n private playAudio(audioUrl: string): Promise<void> {\r\n return new Promise((resolve) => {\r\n this.isPlayingAudio = true;\r\n this.audioUrl = audioUrl;\r\n\r\n // 创建音频元素\r\n if (!this.audioElement) {\r\n this.audioElement = new Audio();\r\n }\r\n\r\n this.audioElement.src = audioUrl;\r\n this.audioElement.onended = () => {\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n };\r\n\r\n this.audioElement.onerror = () => {\r\n console.error('音频播放错误');\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n };\r\n\r\n this.audioElement.play().catch(error => {\r\n console.error('音频播放失败:', error);\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n // 修改 componentDidLoad 生命周期方法,确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n // 移除滚动事件监听器\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.removeEventListener('scroll', this.handleScroll);\r\n }\r\n\r\n // 释放音频资源\r\n if (this.audioElement) {\r\n this.audioElement.pause();\r\n this.audioElement.src = '';\r\n this.audioElement = null;\r\n }\r\n\r\n // 释放 Blob URL\r\n if (this.audioUrl) {\r\n URL.revokeObjectURL(this.audioUrl);\r\n this.audioUrl = null;\r\n }\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n }\r\n\r\n // 修改手动播放音频的方法\r\n private handlePlayAudio = async () => {\r\n if (this.audioUrl) {\r\n await this.playAudio(this.audioUrl);\r\n // 手动播放完成后只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n };\r\n\r\n // 处理文本输入变化\r\n private handleTextInputChange = (event: Event) => {\r\n const input = event.target as HTMLTextAreaElement;\r\n this.textAnswer = input.value;\r\n };\r\n\r\n // 添加处理键盘事件的方法\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n // 如果按下的是回车键\r\n if (event.key === 'Enter') {\r\n // 如果同时按下了Ctrl键,允许换行\r\n if (event.ctrlKey) {\r\n return; // 不阻止默认行为,允许插入换行符\r\n } else {\r\n // 阻止默认的换行行为\r\n event.preventDefault();\r\n // 如果文本框不为空且不处于禁用状态,则发送消息\r\n if (this.textAnswer.trim() && !this.isSubmittingText && !this.isLoading &&\r\n !this.currentStreamingMessage && !this.waitingToRecord && !this.isPlayingAudio) {\r\n this.submitTextAnswer();\r\n }\r\n }\r\n }\r\n };\r\n\r\n // 修改提交文本回答的方法\r\n private submitTextAnswer = async () => {\r\n if (!this.textAnswer.trim() || this.isSubmittingText) {\r\n return;\r\n }\r\n\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n // 保存当前输入内容\r\n const textToSend = this.textAnswer;\r\n \r\n // 立即清空文本输入\r\n this.textAnswer = '';\r\n \r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(textToSend);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n alert('提交回答失败,请重试');\r\n } finally {\r\n this.isSubmittingText = false;\r\n }\r\n };\r\n\r\n render() {\r\n if (!this.isOpen) return null;\r\n\r\n const modalStyle = {\r\n zIndex: String(this.zIndex)\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen\r\n };\r\n\r\n const renderVideoPreview = () => (\r\n <div class=\"video-preview\">\r\n <video\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={(el) => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n // 不在这里设置srcObject,而是使用setupVideoPreview方法\r\n }\r\n }}\r\n ></video>\r\n <div class={{\r\n 'recording-status': true,\r\n 'warning': this.showCountdownWarning\r\n }}>\r\n <span class=\"recording-dot\"></span>\r\n <span>\r\n 录制中 {Math.floor(this.recordingTimeLeft / 60)}:{(this.recordingTimeLeft % 60).toString().padStart(2, '0')}\r\n {this.showCountdownWarning && ` (即将自动完成)`}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 渲染占位符状态信息\r\n const renderPlaceholderStatus = () => {\r\n // 正在播放音频\r\n if (this.isPlayingAudio) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在播放问题,请听完后准备回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在上传视频\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在上传视频,请稍候...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在加载或等待AI回复\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请等待题目...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待开始录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请准备好,{this.waitingTimeLeft}秒后将开始录制您的回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 添加默认状态\r\n return (\r\n <div class=\"placeholder-status default-status\">\r\n <p>准备中...</p>\r\n </div>\r\n );\r\n };\r\n\r\n // 修改文本输入区域渲染函数\r\n const renderTextInputArea = () => (\r\n <div class=\"text-input-area\">\r\n <textarea\r\n class=\"text-answer-input\"\r\n placeholder=\"请输入...(按回车发送,Ctrl+回车换行)\"\r\n value={this.textAnswer}\r\n onInput={this.handleTextInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\r\n ></textarea>\r\n <div class=\"input-toolbar\">\r\n <div class=\"toolbar-actions\">\r\n {/* <button class=\"toolbar-button\" title=\"表情\" disabled>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-5-6c.78 2.34 2.72 4 5 4s4.22-1.66 5-4H7zm1.5-5a1.5 1.5 0 100 3 1.5 1.5 0 000-3zm7 0a1.5 1.5 0 100 3 1.5 1.5 0 000-3z\" />\r\n </svg>\r\n </button>\r\n <button class=\"toolbar-button\" title=\"图片\" disabled>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\r\n </svg>\r\n </button> */}\r\n </div>\r\n <button\r\n class={{\r\n 'submit-text-button': true,\r\n 'disabled': !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio\r\n }}\r\n disabled={!this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\r\n onClick={this.submitTextAnswer}\r\n >\r\n {this.isSubmittingText ? '发送中...' : '发送'}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div style={{ height: '100%' }}>\r\n <div class=\"chat-history\" onScroll={this.handleScroll}>\r\n {this.isLoadingHistory ? (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p>加载历史消息中...</p>\r\n </div>\r\n ) : (\r\n <div>\r\n {this.messages.map((message) => (\r\n <div id={`message_${message.id}`} key={message.id}>\r\n <pcm-chat-message\r\n message={message}\r\n token={this.token}\r\n onMessageChange={(event) => {\r\n const updatedMessages = this.messages.map(msg =>\r\n msg.id === message.id ? { ...msg, ...event.detail } : msg\r\n );\r\n this.messages = updatedMessages;\r\n }}\r\n ></pcm-chat-message>\r\n </div>\r\n ))}\r\n {this.currentStreamingMessage && (\r\n <div id={`message_${this.currentStreamingMessage.id}`}>\r\n <pcm-chat-message\r\n token={this.token}\r\n message={this.currentStreamingMessage}\r\n ></pcm-chat-message>\r\n </div>\r\n )}\r\n {this.messages.length === 0 && !this.currentStreamingMessage && (\r\n <div class=\"empty-state\">\r\n <p>正在准备面试...</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div class=\"recording-section\">\r\n <div class=\"recording-container\">\r\n {\r\n this.interviewMode === 'text' && (\r\n renderTextInputArea()\r\n )\r\n }\r\n {this.interviewMode === 'video' && (\r\n <div style={{ width: '100%', display: 'flex', flexWrap: 'wrap', justifyContent: 'center' }}>\r\n <div class=\"video-area\">\r\n {this.showRecordingUI ? (\r\n renderVideoPreview()\r\n ) : (\r\n <div class=\"video-preview placeholder\">\r\n {renderPlaceholderStatus()}\r\n </div>\r\n )}\r\n <div class=\"progress-container\">\r\n <div class=\"progress-bar-container\">\r\n <div\r\n class=\"progress-bar\"\r\n style={{\r\n width: `${Math.max(0, this.currentQuestionNumber - 1) / this.totalQuestions * 100}%`\r\n }}\r\n ></div>\r\n </div>\r\n <div class=\"progress-text\">\r\n 已完成{Math.max(0, this.currentQuestionNumber - 1)}/{this.totalQuestions}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"recording-controls\">\r\n {this.showRecordingUI ? (\r\n <button\r\n class=\"stop-recording-button\"\r\n onClick={() => this.stopRecording()}\r\n >\r\n 完成本题回答\r\n </button>\r\n ) : (\r\n <div class=\"waiting-message\">\r\n {(() => {\r\n // 显示播放按钮(当不自动播放且有音频URL时)\r\n if (!this.enableVoice && this.audioUrl && !this.isPlayingAudio) {\r\n return (\r\n <div class=\"play-audio-container\" onClick={this.handlePlayAudio}>\r\n <p>\r\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"currentColor\" style={{ verticalAlign: 'middle', marginRight: '8px' }}>\r\n <path d=\"M8 5v14l11-7z\" />\r\n </svg>\r\n <span style={{ verticalAlign: 'middle' }}>播放题目</span>\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // 其他状态下显示禁用的\"完成回答\"按钮\r\n return (\r\n <button class=\"stop-recording-button disabled\" disabled>\r\n 完成回答\r\n </button>\r\n );\r\n })()}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}"]}
@@ -8,6 +8,10 @@ export class ChatMessageComponent {
8
8
  */
9
9
  message;
10
10
  /**
11
+ * SDK鉴权密钥
12
+ */
13
+ token = '';
14
+ /**
11
15
  * 消息变更事件
12
16
  */
13
17
  messageChange;
@@ -107,7 +111,7 @@ export class ChatMessageComponent {
107
111
  url: '/sdk/v1/files/presigned-url',
108
112
  method: 'GET',
109
113
  headers: {
110
- 'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuaWNrbmFtZSI6Ilx1NTMzYlx1ODA1OFx1NzMyYjgxMDMiLCJ1aWQiOjcsImNoYXRfdXNlciI6bnVsbCwiYm90X2lkIjoiMSIsInNlY3JldF9pZCI6Mzg5OTk1ODAyNTUxOTEwNDAsImV4cCI6MTc0NTA0OTAxM30.56OoTrp16avgl48YfWBKOHywAKHJ5qPGypqRCGCyVt0'
114
+ 'authorization': `Bearer ${this.token}`
111
115
  },
112
116
  params: {
113
117
  cos_key: cosKey
@@ -169,7 +173,7 @@ export class ChatMessageComponent {
169
173
  })));
170
174
  }
171
175
  render() {
172
- return (h("div", { key: '3d9014ffaf4a18e08e6cea97abce67d918512720', class: "message-round" }, this.renderUserMessage(), this.renderAssistantMessage()));
176
+ return (h("div", { key: 'fd26d8b6c4f13847c987badee00a8add00486f84', class: "message-round" }, this.renderUserMessage(), this.renderAssistantMessage()));
173
177
  }
174
178
  static get is() { return "pcm-chat-message"; }
175
179
  static get encapsulation() { return "shadow"; }
@@ -207,6 +211,26 @@ export class ChatMessageComponent {
207
211
  },
208
212
  "getter": false,
209
213
  "setter": false
214
+ },
215
+ "token": {
216
+ "type": "string",
217
+ "mutable": false,
218
+ "complexType": {
219
+ "original": "string",
220
+ "resolved": "string",
221
+ "references": {}
222
+ },
223
+ "required": false,
224
+ "optional": false,
225
+ "docs": {
226
+ "tags": [],
227
+ "text": "SDK\u9274\u6743\u5BC6\u94A5"
228
+ },
229
+ "getter": false,
230
+ "setter": false,
231
+ "attribute": "token",
232
+ "reflect": false,
233
+ "defaultValue": "''"
210
234
  }
211
235
  };
212
236
  }