qqsl-agent 0.0.1 → 0.0.2
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.
- package/esm2020/chat/chat-input/chat-input.component.mjs +2 -2
- package/esm2020/chat/chat-messages/chat-messages.component.mjs +16 -3
- package/esm2020/chat/chat-sidebar/chat-sidebar.component.mjs +3 -3
- package/esm2020/chat/chat-sidebar/history-group/history-group.component.mjs +3 -3
- package/fesm2015/qqsl-agent-chat.mjs +20 -8
- package/fesm2015/qqsl-agent-chat.mjs.map +1 -1
- package/fesm2020/qqsl-agent-chat.mjs +20 -8
- package/fesm2020/qqsl-agent-chat.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qqsl-agent-chat.mjs","sources":["../../../projects/agent/chat/services/markdown-stream.service.ts","../../../projects/agent/chat/store/store.service.ts","../../../projects/agent/chat/services/http.service.ts","../../../projects/agent/chat/services/sse.service.ts","../../../projects/agent/chat/chat-input/chat-input.component.ts","../../../projects/agent/chat/chat-input/chat-input.component.html","../../../projects/agent/chat/components/pagination/pagination.component.ts","../../../projects/agent/chat/pipes/markdown.pipe.ts","../../../projects/agent/chat/chat-messages/chat-messages.component.ts","../../../projects/agent/chat/chat-messages/chat-messages.component.html","../../../projects/agent/chat/services/http2.service.ts","../../../projects/agent/chat/chat-sidebar/history-group/history-group.component.ts","../../../projects/agent/chat/chat-sidebar/chat-sidebar.component.ts","../../../projects/agent/chat/chat-sidebar/chat-sidebar.component.html","../../../projects/agent/chat/chat.component.ts","../../../projects/agent/chat/chat.component.html","../../../projects/agent/chat/chat.module.ts","../../../projects/agent/chat/qqsl-agent-chat.ts"],"sourcesContent":["// markdown-stream.service.ts\nimport { Injectable } from '@angular/core';\nimport { Marked } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\nimport hljs from 'highlight.js';\nimport * as katex from 'katex';\nimport DOMPurify from 'dompurify'; // 防 XSS\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownStreamService {\n private marked: Marked;\n\n constructor() {\n this.marked = new Marked(\n // 高亮代码\n markedHighlight({\n emptyLangClass: 'hljs',\n langPrefix: 'hljs language-',\n highlight(code, lang, info) {\n const language = hljs.getLanguage(lang) ? lang : 'plaintext';\n return hljs.highlight(code, { language }).value;\n },\n }),\n // {\n // gfm: true,\n // breaks: true,\n // // 自定义 renderer 支持 KaTeX\n // renderer: {\n // code(code: string, lang: string | undefined) {\n // if (lang === 'math' || lang === 'katex') {\n // return `<div class=\"math-block\">${katex.renderToString(code, { throwOnError: false, displayMode: true })}</div>`;\n // }\n // return false; // 交给 highlight 处理\n // },\n // inlineMath(math: string) {\n // return katex.renderToString(math, { throwOnError: false });\n // }\n // }\n // }\n );\n\n // 支持 $$...$$ 和 $...$ 数学公式\n // this.marked.use({\n // // 包含从 markdown 创建标记的函数的对象\n // tokenizer: {\n // inlineMath(src: string) {\n // const cap = /^\\$([^\\$]+)\\$/.exec(src);\n // if (cap) {\n // return { type: 'inlineMath', raw: cap[0], text: cap[1] };\n // }\n // },\n // codespan(src: string) {\n // const math = this.inlineMath(src);\n // if (math) return math;\n // return false;\n // }\n // }\n // });\n\n // marked 17+ 必须使用 extensions 方式注册\n this.marked.use({\n extensions: [\n {\n name: 'inlineMath',\n level: 'inline', // 必须是 inline\n start(src: string) {\n return src.indexOf('$'); // 告诉 marked 从哪里开始尝试匹配\n },\n tokenizer(src: string) {\n // 匹配 $...$,但不能包含换行,且不允许 $$ 开头(留给块级公式)\n const match = src.match(/^\\$(?!\\$)([^\\n$]+?)\\$/);\n if (match) {\n return {\n type: 'inlineMath',\n raw: match[0], // 原始文本:$xxx$\n text: match[1].trim(), // 公式内容\n };\n }\n return undefined;\n },\n renderer(token: any) {\n // 这里直接返回原始文本,后面你可以用 KaTeX / MathJax 渲染\n return `$${token.text}$`;\n // 或者如果你已经全局接管了渲染,可以 return false\n },\n },\n\n // 可选:同时支持 $$...$$ 块级公式\n {\n name: 'displayMath',\n level: 'block',\n start(src: string) {\n return src.indexOf('$$');\n },\n tokenizer(src: string) {\n const match = src.match(/^\\$\\$([\\s\\S]+?)\\$\\$/);\n if (match) {\n return {\n type: 'displayMath',\n raw: match[0],\n text: match[1].trim(),\n };\n }\n return undefined;\n },\n renderer(token: any) {\n return `$$${token.text}$$`;\n },\n },\n ],\n });\n }\n\n // 关键:增量渲染(流式专用!)\n renderIncremental(markdown: string): string {\n // 防止渲染一半的代码块崩溃\n const safeMarkdown = this.completeCodeBlocks(markdown);\n try {\n let html = this.marked.parse(safeMarkdown) as string;\n html = DOMPurify.sanitize(html); // 安全\n return html;\n } catch (e) {\n return this.escapeHtml(safeMarkdown);\n }\n }\n\n // 智能补全未闭合的代码块(流式必备!)\n private completeCodeBlocks(text: string): string {\n const lines = text.split('\\n');\n let inCode = false;\n let fence = '';\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim().match(/^```/)) {\n if (!inCode) {\n fence = line.trim();\n inCode = true;\n } else if (line.trim() === '```' || line.trim().startsWith('```')) {\n inCode = false;\n fence = '';\n }\n }\n }\n if (inCode) {\n text += '\\n```';\n }\n return text;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Conversation } from '../models/conversation.model';\n\n@Injectable({ providedIn: 'root' })\nexport class StoreService {\n private token = '';\n private baseUrl = '';\n private conversationICode?: string;\n\n private currentConversationSource = new BehaviorSubject<Conversation | null>(null);\n currentConversation$ = this.currentConversationSource.asObservable();\n\n setToken(token: string): void {\n this.token = token;\n }\n\n getToken(): string {\n return (\n this.token ||\n 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aWQiOiI2YjBjZjcwNC1hNmE5LTQxZDQtOWRkYy1kZmZmODlkYTZiNWMiLCJ1c2VyX3V1aWQiOjMxNTAsInVzZXJfbmFtZSI6IjEzMDg5MTI3MzcwIiwicmVnaW9uQ29kZSI6IjYzMDEwMDAwMDAwMCIsImF1dGhvcml0aWVzIjpbIldBVEVSX1NVUFBMWV9VU0VSIiwiTkVUV09SS19QUk9UT0NPTF9VU0VSIiwiUE9SVEFMX01BTkFHRV9BRE1JTiIsIkRJR0lUQUxfSVJSSUdBVElPTl9BRE1JTiIsIkVRVUlQTUVOVF9NT0RFTF9BRE1JTiIsIklOU1BFQ1RJT05fVVNFUiIsIkJJTV9CQU5LIiwiREFUQV9DQURBU1RSRV9BRE1JTiIsIklSUklHQVRJT05fR0FURV9VU0VSIiwiV0FURVJfUVVBTElUWV9VU0VSIiwiSVJSSUdBVElPTl9BRE1JTl9VU0VSIiwiQlVER0VUX01BVEVSX0FETUlOIiwiV0FURVJfTkVUV09SS19BRE1JTiIsIklOU1BFQ1RJT05fQURNSU5fVVNFUiIsIkRJR0lUQUxfSVJSSUdBVElPTl9KRyIsIlJPTEVfVVNFUiIsIkRBVEFfQ0VOVEVSX0lDT05fQURNSU4iLCJXQVJOSU5HX1VTRVIiLCJSRVNPVVJDRV9BRE1JTiIsIldBVEVSX1FVQUxJVFlfQURNSU4iLCJCVURHRVRfTUFURVJfVVNFUiIsIkJVSUxEX0NPTlNUUlVDVElPTl9BRE1JTiIsIkNBTENVTEFUSU9OX0RBVEFfQURNSU4iLCJURVhUVVJFX0FETUlOIiwiREFUQV9DRU5URVJfRklMRV9BRE1JTiIsIlNUQVRJQ19NT0RFTF9BRE1JTiIsIkJJT19QTEFOVF9BRE1JTiIsIkJJTV9ERVNJR04iLCJST0xFX1NVUEVSX0FETUlOIiwiTkVUV09SS19NT0RFTF9VU0VSIiwiV0FURVJfUVVPVEFfQURNSU4iLCJEQVRBX0NFTlRFUl9SSVZFUl9MQUtFIiwiREFNX1VTRVIiLCJTVVBQTFlfRFJBSU5BR0VfQURNSU4iLCJSRVNPVVJDRV9VU0VSIiwiQVJHVU1FTlRBVElPTl9VU0VSIiwiTE9HR0lOR19VU0VSIiwiREFUQV9URVJSQUlOX0FETUlOIiwiQlVER0VUX1FVT1RBX1VTRVIiLCJEQVRBX0NFTlRFUl9SRUdJT05fQURNSU4iLCJURVhUVVJFX1VTRVIiLCJEQVRBX0NFTlRFUl9VU0VSIiwiRVFVSVBNRU5UX01PREVMX1VTRVIiLCJEQVRBX0NFTlRFUl9QQU5PUkFNQSIsIkFSR1VNRU5UQVRJT05fQURNSU4iLCJEQVRBX0NFTlRFUl9XQVRFUl9SRVNPVVJDRSIsIkJJTV9QUk9DRURVUkUiLCJNQU5BR0VNRU5UX0FETUlOX1VTRVIiLCJEUklOR1dBVEVSX1VTRVIiLCJXQVRFUl9TVVBQTFlfQURNSU4iLCJMQU5EX1VTRV9BRE1JTiIsIkRBVEFfQ0VOVEVSX0ZJTEVfVVNFUiIsIkRBVEFfQ0VOVEVSX1dBVEVSX1BST0pFQ1QiLCJIWl9TTEFWRSIsIkRvY3VtZW50X1VTRVIiLCJCVURHRVRfUVVPVEFfQURNSU4iLCJJUlJJR0FUSU9OX1VTRVIiLCJORVRXT1JLX01PREVMX0FETUlOIiwiU1VQUExZX0RSQUlOQUdFX1VTRVIiLCJMT0dHSU5HX0FETUlOIiwiRFJJTkdXQVRFUl9BRE1JTl9VU0VSIiwiTkVUV09SS19VU0VSIiwiTU9ERUxfUEFSQU1fQURNSU4iLCJXQVRFUl9RVU9UQV9VU0VSIiwiU1RBVElDX01PREVMX0RFVkVMT1BFUiIsIkRFUEFSVE1FTlRfQURNSU4iLCJEQVRBX0NFTlRFUl9BTk5FWCIsIk5FVFdPUktfQURNSU4iLCJCSU1fRVFVSVBNRU5UIiwiRElHSVRBTF9JUlJJR0FUSU9OX1VTRVIiLCJNQU5BR0VNRU5UX1VTRVIiLCJCVUlMRF9DT05TVFJVQ1RJT05fVVNFUiIsIkRBVEFfQ0VOVEVSX0FETUlOIiwiUklWRVJfTEFLRV9FVkFMVVRJT05fVVNFUiIsIkJJTV9DT1NUIiwiRFJJTkdXQVRFUl9HQVRFX1VTRVIiLCJEQVRBX0NFTlRFUl9XQVRFUl9XQURJTkciLCJORVRXT1JLX1BST1RPQ09MX0FETUlOIiwiQklNX1VTRVIiLCJEQVRBX0NBREFTVFJFX1VTRVIiLCJTVEFUSUNfTU9ERUxfVVNFUiIsIlJPTEVfQURNSU4iLCJXQVRFUl9TVVBQTFlfR0FURV9VU0VSIiwiUklWRVJfTEFLRV9FVkFMVVRJT05fQURNSU4iLCJCSU1fQURNSU4iLCJCSU9fUExBTlRfVVNFUiJdLCJleHAiOjE3NjQwNjA0NzA1MTQsInJvbGVzIjpbIkhaX1NMQVZFIiwiUk9MRV9BRE1JTiIsIkJJT19QTEFOVF9BRE1JTiIsIlJPTEVfVVNFUiIsIkRBVEFfQ0VOVEVSX1VTRVIiLCJEQVRBX0NFTlRFUl9BRE1JTiIsIkRvY3VtZW50X1VTRVIiLCJEQVRBX0NFTlRFUl9BTk5FWCIsIkJJTV9FUVVJUE1FTlQiLCJMT0dHSU5HX0FETUlOIiwiU1VQUExZX0RSQUlOQUdFX1VTRVIiLCJSSVZFUl9MQUtFX0VWQUxVVElPTl9BRE1JTiIsIkRBVEFfQ0VOVEVSX0lDT05fQURNSU4iLCJXQVRFUl9RVUFMSVRZX1VTRVIiLCJXQVRFUl9RVU9UQV9VU0VSIiwiSVJSSUdBVElPTl9BRE1JTl9VU0VSIiwiQlVER0VUX1FVT1RBX0FETUlOIiwiREFUQV9DRU5URVJfRklMRV9VU0VSIiwiQklNX0RFU0lHTiIsIk1BTkFHRU1FTlRfVVNFUiIsIk5FVFdPUktfUFJPVE9DT0xfQURNSU4iLCJTVEFUSUNfTU9ERUxfREVWRUxPUEVSIiwiV0FSTklOR19VU0VSIiwiQklNX1VTRVIiLCJEQVRBX0NFTlRFUl9SSVZFUl9MQUtFIiwiRFJJTkdXQVRFUl9BRE1JTl9VU0VSIiwiQVJHVU1FTlRBVElPTl9VU0VSIiwiREFUQV9DRU5URVJfV0FURVJfUFJPSkVDVCIsIkRBVEFfQ0FEQVNUUkVfQURNSU4iLCJERVBBUlRNRU5UX0FETUlOIiwiTkVUV09SS19VU0VSIiwiU1RBVElDX01PREVMX0FETUlOIiwiQklNX0JBTksiLCJXQVRFUl9TVVBQTFlfQURNSU4iLCJCSU1fQURNSU4iLCJSRVNPVVJDRV9VU0VSIiwiREFUQV9URVJSQUlOX0FETUlOIiwiREFUQV9DRU5URVJfUkVHSU9OX0FETUlOIiwiV0FURVJfU1VQUExZX1VTRVIiLCJESUdJVEFMX0lSUklHQVRJT05fVVNFUiIsIldBVEVSX1FVQUxJVFlfQURNSU4iLCJORVRXT1JLX0FETUlOIiwiTE9HR0lOR19VU0VSIiwiSU5TUEVDVElPTl9BRE1JTl9VU0VSIiwiSVJSSUdBVElPTl9HQVRFX1VTRVIiLCJORVRXT1JLX1BST1RPQ09MX1VTRVIiLCJMQU5EX1VTRV9BRE1JTiIsIkJVSUxEX0NPTlNUUlVDVElPTl9BRE1JTiIsIkRBVEFfQ0VOVEVSX1BBTk9SQU1BIiwiREFUQV9DRU5URVJfV0FURVJfV0FESU5HIiwiQ0FMQ1VMQVRJT05fREFUQV9BRE1JTiIsIkRBVEFfQ0FEQVNUUkVfVVNFUiIsIkJJT19QTEFOVF9VU0VSIiwiTU9ERUxfUEFSQU1fQURNSU4iLCJTVVBQTFlfRFJBSU5BR0VfQURNSU4iLCJFUVVJUE1FTlRfTU9ERUxfQURNSU4iLCJURVhUVVJFX0FETUlOIiwiQlVER0VUX01BVEVSX1VTRVIiLCJXQVRFUl9RVU9UQV9BRE1JTiIsIkRJR0lUQUxfSVJSSUdBVElPTl9KRyIsIldBVEVSX05FVFdPUktfQURNSU4iLCJCSU1fUFJPQ0VEVVJFIiwiRFJJTkdXQVRFUl9VU0VSIiwiV0FURVJfU1VQUExZX0dBVEVfVVNFUiIsIkJVSUxEX0NPTlNUUlVDVElPTl9VU0VSIiwiRElHSVRBTF9JUlJJR0FUSU9OX0FETUlOIiwiSVJSSUdBVElPTl9VU0VSIiwiUk9MRV9TVVBFUl9BRE1JTiIsIkVRVUlQTUVOVF9NT0RFTF9VU0VSIiwiQklNX0NPU1QiLCJEUklOR1dBVEVSX0dBVEVfVVNFUiIsIklOU1BFQ1RJT05fVVNFUiIsIkFSR1VNRU5UQVRJT05fQURNSU4iLCJQT1JUQUxfTUFOQUdFX0FETUlOIiwiVEVYVFVSRV9VU0VSIiwiTUFOQUdFTUVOVF9BRE1JTl9VU0VSIiwiTkVUV09SS19NT0RFTF9BRE1JTiIsIkJVREdFVF9RVU9UQV9VU0VSIiwiQlVER0VUX01BVEVSX0FETUlOIiwiU1RBVElDX01PREVMX1VTRVIiLCJSSVZFUl9MQUtFX0VWQUxVVElPTl9VU0VSIiwiREFNX1VTRVIiLCJSRVNPVVJDRV9BRE1JTiIsIkRBVEFfQ0VOVEVSX1dBVEVSX1JFU09VUkNFIiwiREFUQV9DRU5URVJfRklMRV9BRE1JTiIsIk5FVFdPUktfTU9ERUxfVVNFUiJdLCJyZWFsX25hbWUiOiLnrqHnkIblkZgiLCJwbGF0Zm9ybUNvZGUiOiI2MzAxMDAwMDAwMDAiLCJwbGF0Zm9ybU5hbWUiOiLopb_lroHluIIiLCJ1c2VyTWFyayI6ZmFsc2UsInBob25lIjoiMTMwODkxMjczNzAiLCJlbnYiOiJyZWxlYXNlIiwidG9wUmVnaW9uQ29kZSI6IjYzMDEwMDAwMDAwMCJ9.Bzlz0LC5rbwItBgw6B-dhSKhXnAATXiaL-rR3EHD4wmJ-BpWWrDakYAjzUCtWL4ExkTqSxXIClCztc412o5pT3b9EN7R6WH5namjpxzwozCVXQyBYvjoCrS5UX1_iUkvVMr6WAqiUUzIanVSrmaRpszxyD8S_fLBge971-Cli44J1FQDBY8QN8TiH3v3c5aDWDBJVYPHqe3_zEAeL3dlERgl8pTLAydx54a2QqCVH2xfX_zSzFXJeK2iamIyI8H4cyP0pQrYl2rjSuR7LsjJSJz_QeSQKZlctG8odrBMV5OoHlWC2isNGqszqyp1POX2HyWb-U4qn8KuKKryjACrow'\n );\n }\n\n setBaseUrl(url: string): void {\n this.baseUrl = url;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n setCurrentConversation(conversation: Conversation | null): void {\n this.conversationICode = conversation?.iCode;\n this.currentConversationSource.next(conversation);\n }\n\n getConversationICode(): string | undefined {\n return this.conversationICode;\n }\n}\n","import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { filter, map, Observable } from 'rxjs';\nimport { StoreService } from '../store/store.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HttpService {\n constructor(\n private http: HttpClient,\n private storeService: StoreService,\n ) {}\n\n public get(url: string, paramObj?: any): Observable<any> {\n if (paramObj) {\n return this.http\n .get(url, {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n }),\n observe: 'response',\n params: paramObj,\n responseType: 'json',\n withCredentials: false,\n })\n .pipe(\n filter((r: any): r is HttpResponse<any> => r instanceof HttpResponse),\n map((r: HttpResponse<any>) => {\n return r.body;\n }),\n );\n }\n return this.http\n .get(url, {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n }),\n observe: 'response',\n responseType: 'json',\n withCredentials: false,\n })\n .pipe(\n filter((r: any): r is HttpResponse<any> => r instanceof HttpResponse),\n map((r: HttpResponse<any>) => {\n return r.body;\n }),\n );\n }\n\n public post(url: string, body: any, options?: any): Observable<any> {\n // 默认配置\n const defaultOptions = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n }),\n observe: 'response',\n responseType: 'json',\n withCredentials: false,\n };\n\n // 如果提供了自定义选项,则合并配置\n const httpOptions = options ? { ...defaultOptions, ...options } : defaultOptions;\n\n // 发送 POST 请求\n return this.http.post(url, body, httpOptions);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject } from 'rxjs';\nimport { ISendMessage } from '../models/send-message.model';\nimport { StoreService } from '../store/store.service';\n\nexport interface ConversationICodeObj {\n conversation: string;\n question: string;\n answer: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SseService {\n private storeService = inject(StoreService);\n private conversationICodeSource = new BehaviorSubject<ConversationICodeObj | null>(null);\n conversationICode$ = this.conversationICodeSource.asObservable();\n\n // 思考内容\n private thinkingSource = new BehaviorSubject<string>('');\n thinking$ = this.thinkingSource.asObservable();\n\n // 实时流式文本\n private messageSource = new BehaviorSubject<string>('');\n currentMessage$ = this.messageSource.asObservable();\n\n private deltaSource = new BehaviorSubject<string>('');\n delta$ = this.deltaSource.asObservable();\n\n loadingSource = new BehaviorSubject<boolean>(false);\n loading$ = this.loadingSource.asObservable();\n\n // 完整消息历史\n private fullThinking = '';\n private fullMessage = '';\n\n async streamChat(body: ISendMessage) {\n this.loadingSource.next(true);\n this.messageSource.next(''); // 清空\n this.fullMessage = '';\n\n try {\n const response = await fetch(`${this.storeService.getBaseUrl()}/api/ChatModel/generate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok || !response.body) {\n throw new Error('网络错误');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split('\\n\\n');\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n const jsonStr = line.replaceAll('data:', '');\n try {\n const data = JSON.parse(jsonStr);\n const delta = data.content || '';\n\n if (delta) {\n // 对话以及问答编码\n if (delta.conversation) {\n this.conversationICodeSource.next(delta);\n continue;\n }\n // 比如显示“AI 正在思考...”\n if (data.think) {\n this.fullThinking += delta;\n this.thinkingSource.next(this.fullThinking);\n continue;\n }\n this.fullMessage += delta;\n this.messageSource.next(this.fullMessage); // 实时推送完整内容\n this.deltaSource.next(delta); // 只推本次新增的文字\n }\n if (data.down) {\n // down: true 表示结束\n this.loadingSource.next(false);\n }\n } catch (e) {\n console.log('sse error', e);\n }\n }\n }\n }\n } catch (err: any) {\n if (err.name !== 'AbortError') {\n this.messageSource.next('请求失败:' + err.message);\n }\n } finally {\n this.loadingSource.next(false);\n }\n }\n\n // 支持取消(关键!)\n private controller = new AbortController();\n\n cancel() {\n this.controller.abort();\n this.controller = new AbortController();\n }\n}\n","// chat-input.component.ts\nimport { Component, Output, EventEmitter, ElementRef, ViewChild, inject, OnInit, Input } from '@angular/core';\nimport { HttpService } from '../services/http.service';\nimport { IModel, IModelList } from '../models/model-list.model';\nimport { StoreService } from '../store/store.service';\nimport { IKnowledgeList } from '../models/knowledge-list.model';\nimport { ISendMessage } from '../models/send-message.model';\nimport { Message } from '../models/message.model';\nimport { SseService } from '../services/sse.service';\n\n@Component({\n selector: 'ngx-chat-input',\n templateUrl: './chat-input.component.html',\n styleUrls: ['./chat-input.component.scss'],\n})\nexport class ChatInputComponent implements OnInit {\n @ViewChild('editorRef') editor!: ElementRef<HTMLDivElement>;\n @ViewChild('chatInputWrapper') chatInputWrapper!: ElementRef<HTMLDivElement>;\n @Input() messages: Message[] = [];\n @Output() sendMessage = new EventEmitter<{ message: ISendMessage; isRegenerate: boolean }>();\n @Output() messageChange = new EventEmitter<string>();\n @Output() enter = new EventEmitter<string>();\n @Output() paste = new EventEmitter<Event>();\n\n private httpService = inject(HttpService);\n private storeService = inject(StoreService);\n public sseService = inject(SseService);\n\n isEmpty = true;\n currentModel: IModel | null = null;\n currentKnowledge: string[] = [];\n modelList: IModelList = [];\n knowledgeList: IKnowledgeList = [];\n modelPopoverVisible = false;\n knowledgePopoverVisible = false;\n deepThink = true;\n\n ngOnInit(): void {\n this.getModelList();\n this.getKnowledgeList();\n }\n\n // 可供交互的模型\n getModelList(): void {\n this.httpService.get(`${this.storeService.getBaseUrl()}/api/ChatModel/models`).subscribe((res: IModelList) => {\n this.modelList = res;\n if (res.length) {\n this.currentModel = res[0];\n }\n });\n }\n\n // 模型可选的知识库\n getKnowledgeList(): void {\n this.httpService\n .get(`${this.storeService.getBaseUrl()}/api/ChatModel/knowledges`)\n .subscribe((res: IKnowledgeList) => {\n this.knowledgeList = res;\n });\n }\n\n modelVisibleChange(value: boolean): void {\n this.modelPopoverVisible = value;\n }\n\n knowledgeVisibleChange(value: boolean): void {\n this.knowledgePopoverVisible = value;\n }\n\n knowledgeSelectChange(value: string[]): void {\n this.currentKnowledge = value;\n }\n\n toggleDeepThink(): void {\n this.deepThink = !this.deepThink;\n }\n\n private updateEmptyState() {\n const el = this.editor.nativeElement;\n const text = el.textContent?.trim() || '';\n const hasOnlyBr = el.innerHTML === '<br>' || el.innerHTML === '';\n\n this.isEmpty = text === '' && hasOnlyBr;\n }\n\n handleInput(): void {\n this.updateEmptyState();\n const html = this.editor.nativeElement.innerHTML;\n const text = this.editor.nativeElement.textContent || '';\n // this.messageChange.emit(text);\n }\n\n handleEnter(event: Event): void {\n if (!(event as KeyboardEvent).shiftKey) {\n event.preventDefault();\n // this.enter.emit((event as any).target!.innerText!.replace(/\\s+/g, \" \").trim());\n this.send();\n }\n }\n\n handlePaste(event: ClipboardEvent): void {\n // this.paste.emit(event);\n setTimeout(() => this.updateEmptyState(), 0);\n }\n\n clearInput(): void {\n this.editor.nativeElement.innerHTML = '';\n this.handleInput();\n }\n\n regenerateSend(msg: Message): void {\n // 正在回答中\n if (this.sseService.loadingSource.value) {\n return;\n }\n const conversation = this.storeService.getConversationICode();\n const message: ISendMessage = {\n conversation,\n questionICode: msg.iCode,\n model: this.currentModel?.iCode ?? '',\n think: this.deepThink,\n question: msg.question,\n knowledge: !!this.currentKnowledge.length,\n knowledgeList: this.currentKnowledge,\n };\n this.sendMessage.emit({ message, isRegenerate: true });\n }\n\n send(): void {\n // 正在回答中\n if (this.sseService.loadingSource.value) {\n return;\n }\n const text = this.editor.nativeElement.textContent || '';\n const conversation = this.storeService.getConversationICode();\n const message: ISendMessage = {\n conversation,\n model: this.currentModel?.iCode ?? '',\n think: this.deepThink,\n question: text,\n knowledge: !!this.currentKnowledge.length,\n knowledgeList: this.currentKnowledge,\n };\n this.clearInput();\n this.sendMessage.emit({ message, isRegenerate: false });\n }\n}\n","<!-- 新聊天位于屏幕中间,发送消息之后位于底部 -->\n<div class=\"chat-input-wrapper\" #chatInputWrapper [class.center]=\"!messages.length\">\n <div class=\"new-chat-title\" *ngIf=\"!messages.length\">\n <img src=\"/assets/images/logo.png\" />\n <span>你好,有什么可以帮到你?开始对话吧</span>\n </div>\n <div class=\"chat-input\">\n <div\n #editorRef\n class=\"input-creative-editor\"\n contenteditable=\"true\"\n spellcheck=\"false\"\n data-placeholder=\"请输入并发送消息\"\n [attr.data-empty]=\"isEmpty\"\n (input)=\"handleInput()\"\n (keydown.enter)=\"handleEnter($event)\"\n (paste)=\"handlePaste($event)\"\n ></div>\n <div class=\"input-bottom\">\n <div class=\"input-tools\">\n <div class=\"select-tool\" [ngClass]=\"{ 'select-tool-active': deepThink }\" (click)=\"toggleDeepThink()\">\n <svg\n t=\"1764131026949\"\n style=\"width: 14px; height: 14px\"\n class=\"icon\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n p-id=\"5012\"\n width=\"64\"\n height=\"64\"\n >\n <path\n d=\"M903.36 512a795.52 795.52 0 0 1 65.536 136.704c48 132.16 39.616 230.528-25.024 295.168-64.64 64.64-163.008 72.96-295.168 24.96A795.52 795.52 0 0 1 512 903.424a795.52 795.52 0 0 1-136.704 65.536c-132.096 48-230.528 39.616-295.168-25.024-64.64-64.64-72.96-163.008-24.96-295.104 16.64-46.016 38.528-91.52 65.536-136.768A795.52 795.52 0 0 1 55.04 375.232C7.04 243.2 15.36 144.768 80 80.128 144.768 15.488 243.2 7.168 375.296 55.04c46.016 16.64 91.584 38.528 136.768 65.536A795.52 795.52 0 0 1 648.768 55.104c132.096-48 230.464-39.616 295.104 25.024 64.64 64.64 72.96 163.008 25.024 295.104A795.52 795.52 0 0 1 903.36 512z m-53.12-79.424c15.168-28.736 27.968-57.536 38.464-86.4 35.584-98.112 33.92-166.656-5.12-205.696-39.04-39.04-107.648-40.768-205.696-5.12a685.44 685.44 0 0 0-86.4 38.4 1240.96 1240.96 0 0 1 138.432 120.32 1240.832 1240.832 0 0 1 120.32 138.496zM432.576 173.824a685.44 685.44 0 0 0-86.4-38.528c-98.112-35.584-166.656-33.92-205.696 5.12-39.04 39.04-40.768 107.648-5.12 205.696 10.432 28.928 23.296 57.728 38.4 86.4a1240.896 1240.896 0 0 1 120.32-138.432 1240.832 1240.832 0 0 1 138.496-120.32zM173.824 591.488a685.44 685.44 0 0 0-38.464 86.4c-35.648 98.048-33.92 166.592 5.12 205.632 39.04 39.04 107.584 40.768 205.696 5.12a685.44 685.44 0 0 0 86.4-38.4 1240.768 1240.768 0 0 1-138.496-120.32 1240.96 1240.96 0 0 1-120.256-138.432z m495.744 78.08A1112.064 1112.064 0 0 0 802.048 512a1112.064 1112.064 0 0 0-132.48-157.568A1112.128 1112.128 0 0 0 512 221.952a1112.128 1112.128 0 0 0-157.504 132.48A1112.064 1112.064 0 0 0 222.016 512a1112.192 1112.192 0 0 0 132.416 157.568A1112.064 1112.064 0 0 0 512 802.048a1112.128 1112.128 0 0 0 157.568-132.48z m-78.08 180.608c28.672 15.168 57.472 28.032 86.4 38.464 98.048 35.648 166.592 33.92 205.632-5.12 39.04-39.04 40.768-107.584 5.12-205.696a685.504 685.504 0 0 0-38.4-86.4 1240.832 1240.832 0 0 1-120.32 138.496 1240.96 1240.96 0 0 1-138.432 120.32zM585.088 512a73.152 73.152 0 1 1-146.24 0 73.152 73.152 0 0 1 146.304 0z\"\n fill=\"currentColor\"\n p-id=\"5013\"\n ></path>\n </svg>\n 深度思考\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"modelListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"modelPopoverVisible\"\n (nzPopoverVisibleChange)=\"modelVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/toggle-model.png\" style=\"width: 12px; height: 12px\" />\n {{ currentModel ? currentModel?.name : '选择模型' }}\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"knowledgeListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"knowledgePopoverVisible\"\n (nzPopoverVisibleChange)=\"knowledgeVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/relate.png\" style=\"width: 14px; height: 8px\" />\n 关联知识库\n </div>\n </div>\n <img class=\"send\" src=\"/assets/images/input/send.png\" (click)=\"send()\" [hidden]=\"sseService.loading$ | async\" />\n <div class=\"send-loading\" *ngIf=\"sseService.loading$ | async\">\n <div class=\"send-loading-inner\">\n <svg viewBox=\"0 0 36 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" data-icon=\"spin\">\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"100%\" id=\"linearGradient-1\">\n <stop stop-color=\"currentColor\" stop-opacity=\"0\" offset=\"0%\"></stop>\n <stop stop-color=\"currentColor\" stop-opacity=\"0.50\" offset=\"39.9430698%\"></stop>\n <stop stop-color=\"currentColor\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect fill-opacity=\"0.01\" fill=\"none\" x=\"0\" y=\"0\" width=\"36\" height=\"36\"></rect>\n <path\n d=\"M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951\"\n stroke=\"url(#linearGradient-1)\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <!-- <img class=\"send\" src=\"/assets/images/input/send-gray.png\" /> -->\n </div>\n </div>\n <div class=\"chat-input-backdrop\"></div>\n</div>\n\n<ng-template #modelListContent>\n <div style=\"width: 200px\">\n <div class=\"select-title\">\n 切换模型\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"modelVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-radio-group [(ngModel)]=\"currentModel\">\n <label\n nz-radio\n [nzValue]=\"item\"\n [style.margin-top.px]=\"i === 0 ? 0 : 10\"\n *ngFor=\"let item of modelList; let i = index\"\n >\n {{ item.name }}\n </label>\n </nz-radio-group>\n </div>\n </div>\n</ng-template>\n\n<ng-template #knowledgeListContent>\n <div style=\"width: 150px\">\n <div class=\"select-title\">\n 关联知识库\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"knowledgeVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-checkbox-wrapper style=\"width: 100%\" (nzOnChange)=\"knowledgeSelectChange($event)\">\n <div *ngFor=\"let item of knowledgeList\">\n <label nz-checkbox [nzValue]=\"item.iCode\">{{ item.name }}</label>\n </div>\n </nz-checkbox-wrapper>\n </div>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'ngx-simple-pagination',\n template: `\n <div class=\"pagination-container\">\n <button\n class=\"nav-btn\"\n [disabled]=\"current === 1\"\n (click)=\"onPrev()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n </svg>\n </button>\n\n <span class=\"page-info\">\n <span class=\"current\">{{ current }}</span>\n <span class=\"separator\">/</span>\n <span class=\"total\">{{ total }}</span>\n </span>\n\n <button\n class=\"nav-btn\"\n [disabled]=\"current === total\"\n (click)=\"onNext()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n </button>\n </div>\n `,\n styles: [`\n :host {\n display: inline-block;\n }\n\n .pagination-container {\n display: flex;\n align-items: center;\n gap: 8px; /* 调整间距 */\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n user-select: none; /* 防止点击过快选中文字 */\n color: #606266;\n }\n\n /* 按钮样式 */\n .nav-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #909399; /* 默认灰色 */\n transition: color 0.2s, background-color 0.2s;\n border-radius: 4px;\n }\n\n .nav-btn:hover:not(:disabled) {\n color: #303133; /* 悬停变深色 */\n background-color: #f0f2f5;\n }\n\n .nav-btn:disabled {\n cursor: not-allowed;\n color: #dcdfe6; /* 禁用状态是非常浅的灰色 */\n opacity: 0.6;\n }\n\n /* 文字样式 */\n .page-info {\n font-size: 14px;\n font-weight: 500;\n letter-spacing: 1px;\n color: #606266;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .separator {\n color: #909399; /* 分隔符颜色稍淡 */\n }\n `]\n})\nexport class SimplePaginationComponent {\n /** 当前页码 */\n @Input() current: number = 1;\n\n /** 总页数 */\n @Input() total: number = 1;\n\n /** 当页码改变时触发 */\n @Output() pageChange = new EventEmitter<number>();\n\n onPrev() {\n if (this.current > 1) {\n this.pageChange.emit(this.current - 1);\n }\n }\n\n onNext() {\n if (this.current < this.total) {\n this.pageChange.emit(this.current + 1);\n }\n }\n}","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { MarkdownStreamService } from '../services/markdown-stream.service';\n\n@Pipe({\n name: 'markdown',\n standalone: true,\n})\nexport class MarkdownPipe implements PipeTransform {\n private md = inject(MarkdownStreamService);\n\n transform(value: any): any {\n if (value !== null && value !== undefined) {\n return this.md.renderIncremental(value);\n }\n return value;\n }\n}\n","// chat-messages.component.ts\nimport {\n Component,\n Input,\n ViewChild,\n ElementRef,\n AfterViewChecked,\n inject,\n AfterViewInit,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { Message } from '../models/message.model';\nimport { MarkdownStreamService } from '../services/markdown-stream.service';\nimport { SseService } from '../services/sse.service';\nimport { marked } from 'marked';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { NzMessageService } from 'ng-zorro-antd/message';\n\n@Component({\n selector: 'ngx-chat-messages',\n templateUrl: './chat-messages.component.html',\n styleUrls: ['./chat-messages.component.scss'],\n})\nexport class ChatMessagesComponent implements AfterViewChecked, AfterViewInit, OnChanges {\n @Input() messages: Message[] = [];\n @ViewChild('messagesContainer') messagesContainer!: ElementRef;\n /**\n * 重新生成回答\n */\n @Output() regenerateAnswer = new EventEmitter<Message>();\n\n private md = inject(MarkdownStreamService);\n private sseService = inject(SseService);\n private sanitizer = inject(DomSanitizer);\n private msg = inject(NzMessageService);\n\n isLoading = false;\n inputHeight = 180;\n renderedHtml: SafeHtml = '';\n private accumulatedMarkdown = '';\n\n ngAfterViewInit(): void {\n this.sseService.loading$.subscribe(status => {\n this.isLoading = status;\n });\n this.sseService.delta$.subscribe(delta => {\n if (!delta) return;\n\n this.accumulatedMarkdown += delta;\n this.renderedHtml = this.md.renderIncremental(this.accumulatedMarkdown);\n });\n }\n\n ngAfterViewChecked() {\n // 正在回答中\n if (this.isLoading) {\n this.scrollToBottom();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['messages']) {\n setTimeout(() => {\n this.scrollToBottom();\n }, 50);\n }\n }\n\n // 滚动到底部\n scrollToBottom(): void {\n if (!this.messagesContainer) {\n return;\n }\n this.messagesContainer.nativeElement.scrollTop = this.messagesContainer.nativeElement.scrollHeight;\n }\n\n copyContent(text: string): void {\n if (navigator.clipboard && window.isSecureContext) {\n // 使用现代 Clipboard API\n navigator.clipboard.writeText(text).then(() => {\n this.msg.success('复制成功');\n });\n }\n }\n\n onPageChange(num: number, msg: Message): void {\n msg.answerIndex = num - 1;\n }\n\n /**\n * 重新生成多个回答\n */\n regenerate(msg: Message): void {\n // const question = this.messages[index - 1].message;\n // 重新生成使用底部最新的配置,重新调用sendMessage\n this.regenerateAnswer.emit(msg);\n }\n\n // 把完整的 markdown 块渲染,剩下的留给打字区\n private renderCompleteBlocks(markdown: string): { rendered: string; remaining: string } {\n // 找到最后一个换行符之前的都渲染(足够丝滑)\n const lines = markdown.split('\\n');\n let breakPoint = lines.length;\n\n // 从后往前找,保留未完成的代码块/表格/列表\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line.trim() === '' || line.startsWith('```') || line.startsWith('|') || line.startsWith('- ')) {\n breakPoint = i;\n break;\n }\n }\n\n const completePart = lines.slice(0, breakPoint).join('\\n');\n const remainingPart = lines.slice(breakPoint).join('\\n');\n\n const html = this.md.renderIncremental(completePart);\n // const html = marked(completePart, { breaks: true, gfm: true });\n return { rendered: html as string, remaining: remainingPart };\n }\n}\n","<!-- chat-messages.component.html -->\n<script src=\"chat-messages.component.ts\"></script>\n<div class=\"messages-container\" #messagesContainer>\n <div class=\"message-list\" [style.--input-height.px]=\"inputHeight\">\n <div class=\"question message-wrapper\" *ngFor=\"let msg of messages; let i = index\">\n <!-- Q -->\n <div class=\"bubble-wrapper user-msg\">\n <div class=\"message-bubble\">\n <div class=\"message-content message-human\">\n {{ msg.question }}\n </div>\n </div>\n </div>\n <!-- A -->\n <div class=\"bubble-wrapper ai-msg\" *ngIf=\"msg.answers[msg.answerIndex]\">\n <div\n class=\"bubble-loading\"\n *ngIf=\"!msg.answers[msg.answerIndex].think && !msg.answers[msg.answerIndex].content\"\n >\n <div class=\"bubble-loading-dot\" *ngFor=\"let item of [1, 2, 3]\"></div>\n </div>\n <div class=\"message-bubble\">\n <!-- 思考 -->\n <div class=\"message-think\" *ngIf=\"msg.answers[msg.answerIndex].think\">\n <div\n class=\"message-think-header\"\n (click)=\"msg.answers[msg.answerIndex].thinkExpand = !msg.answers[msg.answerIndex].thinkExpand\"\n >\n <div class=\"message-think-header-title\">\n <img src=\"/assets/images/card/think-finish.png\" />\n {{ msg.answers[msg.answerIndex].content ? '已完成思考' : '正在思考中...' }}\n </div>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div\n class=\"message-content message-assistant message-markdown\"\n [innerHTML]=\"msg.answers[msg.answerIndex].think | markdown\"\n [hidden]=\"!msg.answers[msg.answerIndex].thinkExpand\"\n ></div>\n </div>\n <!-- 回答 -->\n <div\n class=\"message-content message-assistant message-markdown\"\n [innerHTML]=\"msg.answers[msg.answerIndex].content | markdown\"\n ></div>\n <!-- 回答工具栏 -->\n <div class=\"assistant-tools\" *ngIf=\"msg.answers[msg.answerIndex].content\">\n <ngx-simple-pagination\n [current]=\"msg.answerIndex + 1\"\n [total]=\"msg.answers.length\"\n (pageChange)=\"onPageChange($event, msg)\"\n *ngIf=\"msg.answers.length > 1\"\n ></ngx-simple-pagination>\n <img\n src=\"assets/images/card/copy.png\"\n alt=\"复制\"\n (click)=\"copyContent(msg.answers[msg.answerIndex].content)\"\n />\n <img\n src=\"assets/images/card/refresh.png\"\n alt=\"重新生成\"\n (click)=\"regenerate(msg)\"\n *ngIf=\"i === messages.length - 1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <!-- <div style=\"padding-bottom: 160px\"></div> -->\n </div>\n</div>\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { StoreService } from '../store/store.service';\n\nexport interface ApiResponse<T = any> {\n code: number;\n msg: string;\n data: T;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HttpService {\n private http = inject(HttpClient);\n private storeService = inject(StoreService);\n\n private readonly BASE_URL = '/api'; // 或者完整域名\n\n /**\n * 统一获取 Headers\n */\n private getHeaders(): HttpHeaders {\n return new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: `${this.storeService.getToken()}`,\n });\n }\n\n /**\n * GET 请求\n */\n public get<T>(url: string, params?: any): Observable<T> {\n return this.http.get<T>(this.formatUrl(url), {\n headers: this.getHeaders(),\n params: this.resolveParams(params),\n });\n }\n\n /**\n * POST 请求\n */\n public post<T>(url: string, body: any): Observable<T> {\n return this.http.post<T>(this.formatUrl(url), body, {\n headers: this.getHeaders(),\n });\n }\n\n /**\n * PUT 请求\n */\n public put<T>(url: string, body: any): Observable<T> {\n return this.http.put<T>(this.formatUrl(url), body, {\n headers: this.getHeaders(),\n });\n }\n\n /**\n * DELETE 请求\n * 兼容支持:既支持 URL 参数,也支持 Body\n */\n public delete<T>(url: string, params?: any, body?: any): Observable<T> {\n return this.http.request<T>('DELETE', this.formatUrl(url), {\n headers: this.getHeaders(),\n params: this.resolveParams(params),\n body: body, // HttpClient 的 delete() 方法默认不支持 body,需用 request() 通用方法\n });\n }\n\n // ================= 私有辅助方法 =================\n\n /**\n * 统一处理 URL\n * 比如自动拼接 BaseUrl,或者处理斜杠\n */\n private formatUrl(url: string): string {\n if (url.startsWith('http')) return url;\n // 确保拼接顺滑\n const baseUrl = this.storeService.getBaseUrl();\n const cleanBase = baseUrl.replace(/\\/$/, '');\n const cleanUrl = url.startsWith('/') ? url : `/${url}`;\n return `${cleanBase}${cleanUrl}`;\n }\n\n /**\n * 统一清洗参数\n * 过滤掉 null 和 undefined,防止传给后端 \"null\" 字符串\n */\n private resolveParams(params: any): HttpParams {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (value !== null && value !== undefined) {\n if (Array.isArray(value)) {\n // 支持数组参数 ids: [1, 2] => ids=1&ids=2\n value.forEach(val => (httpParams = httpParams.append(key, val)));\n } else {\n httpParams = httpParams.set(key, value);\n }\n }\n });\n }\n return httpParams;\n }\n}\n","import { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { ConversationGroup, Conversation } from '../../models/conversation.model';\nimport { StoreService } from '../../store/store.service';\nimport { NzModalService } from 'ng-zorro-antd/modal';\nimport { HttpService } from '../../services/http2.service';\nimport { NzMessageService } from 'ng-zorro-antd/message';\n\n@Component({\n selector: 'history-group',\n template: `\n <div class=\"group-container\">\n <div class=\"group-header\" (click)=\"toggleExpand()\">\n <div class=\"left\">\n <img src=\"assets/images/sidebar/time.png\" />\n <span class=\"date-text\">{{ group.dateLabel }}</span>\n </div>\n <div class=\"arrow-icon\" [class.rotated]=\"group.expanded\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n </div>\n\n <div class=\"group-content\" [@expandCollapse]=\"group.expanded ? 'expanded' : 'collapsed'\">\n <div\n *ngFor=\"let item of group.items\"\n class=\"history-item\"\n [class.active]=\"item.isActive\"\n (click)=\"selectConversation(item)\"\n >\n <span class=\"item-title\">{{ item.name }}</span>\n\n <img class=\"delete-img\" src=\"assets/images/sidebar/delete.png\" (click)=\"deleteConversation($event, item)\" />\n </div>\n </div>\n </div>\n `,\n styleUrls: ['./history-group.component.scss'],\n animations: [\n trigger('expandCollapse', [\n state('collapsed', style({ height: '0px', opacity: 0 })),\n state('expanded', style({ height: '*', opacity: 1 })),\n transition('expanded <=> collapsed', animate('300ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n ]),\n ],\n})\nexport class HistoryGroupComponent {\n @Input() group!: ConversationGroup;\n @Output() select = new EventEmitter<Conversation | null>();\n @Output() refresh = new EventEmitter<string>();\n currentSelected: Conversation | null = null;\n\n private storeService = inject(StoreService);\n private modalService = inject(NzModalService);\n private msg = inject(NzMessageService);\n private http = inject(HttpService);\n\n toggleExpand() {\n this.group.expanded = !this.group.expanded;\n }\n\n selectConversation(item: Conversation | null): void {\n if (item) {\n item.isActive = true;\n }\n this.currentSelected = item;\n this.select.emit(this.currentSelected);\n this.storeService.setCurrentConversation(this.currentSelected);\n }\n\n deleteConversation(e: Event, item: Conversation): void {\n e.stopPropagation();\n this.modalService.confirm({\n nzTitle: '删除对话',\n nzContent: `删除后无法恢复,是否确认删除“${item.name}”对话?`,\n nzOkText: '确定',\n nzCancelText: '取消',\n nzOnOk: () => {\n this.http.delete(`/api/ChatModel/conversation`, { iCode: item.iCode }).subscribe(res => {\n this.msg.success('删除成功');\n this.refresh.emit(item.iCode);\n });\n },\n });\n }\n}\n","// chat-sidebar.component.ts\nimport { Component, inject, OnInit, ViewChild } from '@angular/core';\nimport { Conversation, ConversationGroup } from '../models/conversation.model';\nimport { animate, style, transition, trigger } from '@angular/animations';\nimport { HttpService } from '../services/http.service';\nimport { StoreService } from '../store/store.service';\nimport { HistoryGroupComponent } from './history-group/history-group.component';\n\n@Component({\n selector: 'ngx-chat-sidebar',\n templateUrl: './chat-sidebar.component.html',\n styleUrls: ['./chat-sidebar.component.scss'],\n animations: [\n trigger('logoActionsAnimation', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateX(20px)' }),\n animate('600ms ease-out', style({ opacity: 1, transform: 'translateX(0)' })),\n ]),\n transition(':leave', [animate('0ms ease-in', style({ opacity: 0, transform: 'translateX(20px)' }))]),\n ]),\n ],\n})\nexport class ChatSidebarComponent implements OnInit {\n @ViewChild('historyGroupRef') historyGroupRef!: HistoryGroupComponent;\n private http = inject(HttpService);\n private storeService = inject(StoreService);\n\n isCollapsed = false;\n historyGroups: ConversationGroup[] = [];\n\n ngOnInit(): void {\n this.getHistory();\n }\n\n // 获取历史对话\n getHistory(needSelectFirst = false): void {\n this.http.get(`${this.storeService.getBaseUrl()}/api/ChatModel/conversation`).subscribe((res: Conversation[]) => {\n this.historyGroups = this.groupByFriendlyTime(res);\n // 选中第一个对话\n if (needSelectFirst) {\n if (this.historyGroups[0]?.items[0]) {\n this.historyGroupRef.selectConversation(this.historyGroups[0].items[0]);\n } else {\n this.historyGroupRef.selectConversation(null);\n }\n }\n });\n }\n\n // 删除后刷新,若删除当前选中会话\n refresh(conversationICode: string): void {\n const needSelectFirst = this.storeService.getConversationICode() === conversationICode;\n this.getHistory(needSelectFirst);\n }\n\n selectConversation(conversation: Conversation | null): void {\n // 取消勾选其他会话\n this.historyGroups.forEach(group => {\n group.items.forEach(item => {\n if (!conversation || conversation.iCode !== item.iCode) {\n item.isActive = false;\n }\n });\n });\n }\n\n toggleSidebar() {\n this.isCollapsed = !this.isCollapsed;\n }\n\n openNewChat(): void {\n this.historyGroupRef.selectConversation(null);\n }\n\n groupByFriendlyTime(dataList: Conversation[]): ConversationGroup[] {\n if (!dataList || dataList.length === 0) {\n return [];\n }\n\n const list: ConversationGroup[] = [];\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n dataList.forEach((item, index) => {\n const itemTime = new Date(item.time!);\n const itemDate = new Date(itemTime.getFullYear(), itemTime.getMonth(), itemTime.getDate());\n let dateLabel = '';\n item.isActive = false;\n\n if (itemDate.getTime() === today.getTime()) {\n dateLabel = '今天';\n } else if (itemDate.getTime() === yesterday.getTime()) {\n dateLabel = '昨天';\n } else {\n // 其他日期显示具体的年月日\n dateLabel = `${itemTime.getFullYear()}年${(itemTime.getMonth() + 1).toString().padStart(2, '0')}月${itemTime.getDate().toString().padStart(2, '0')}日`;\n }\n\n const find = list.find(item => item.dateLabel === dateLabel);\n if (find) {\n find.items.push(item);\n } else {\n const group: ConversationGroup = { dateLabel: '', expanded: index === 0, items: [] };\n group.dateLabel = dateLabel;\n group.items.push(item);\n list.push(group);\n }\n });\n\n return list;\n }\n}\n","<div class=\"sidebar\" [class.collapsed]=\"isCollapsed\">\n <div class=\"sidebar-inner\">\n <div class=\"sidebar-header\">\n <div class=\"logo-area\">\n <img src=\"assets/images/logo.png\" alt=\"Logo\" class=\"logo-img\" />\n <span class=\"app-name\">青清水利</span>\n </div>\n <button class=\"toggle-btn\" (click)=\"toggleSidebar()\">\n <img src=\"assets/images/sidebar/collapse.png\" />\n </button>\n </div>\n\n <div class=\"sidebar-content\">\n <button class=\"new-chat-btn\" (click)=\"openNewChat()\">\n <img src=\"assets/images/sidebar/new-chat.png\" />\n 开启新对话\n </button>\n\n <div class=\"divider\"></div>\n\n <div class=\"section-title\">\n <img src=\"assets/images/sidebar/history-chat.png\" />\n <span>历史对话</span>\n </div>\n\n <div class=\"history-list-scroll\" *ngIf=\"historyGroups.length\">\n <history-group\n #historyGroupRef\n *ngFor=\"let group of historyGroups\"\n [group]=\"group\"\n (select)=\"selectConversation($event)\"\n (refresh)=\"refresh($event)\"\n >\n </history-group>\n </div>\n\n <div class=\"history-empty\" *ngIf=\"!historyGroups.length\">暂无历史对话</div>\n </div>\n </div>\n</div>\n\n<div class=\"logo-actions\" [@logoActionsAnimation]=\"isCollapsed ? 'leave' : 'enter'\" *ngIf=\"isCollapsed\">\n <img src=\"assets/images/logo.png\" alt=\"Logo\" class=\"logo-img\" />\n <div class=\"left-top-bar\">\n <img src=\"assets/images/sidebar/expand.png\" (click)=\"toggleSidebar()\" />\n <img src=\"assets/images/sidebar/new-chat.png\" (click)=\"openNewChat()\" />\n </div>\n</div>\n","import { AfterViewInit, Component, inject, Input, NgZone, OnInit, ViewChild } from '@angular/core';\nimport { MarkdownStreamService } from './services/markdown-stream.service';\nimport { HttpService } from './services/http.service';\nimport { SseService } from './services/sse.service';\nimport { StoreService } from './store/store.service';\nimport { ISendMessage } from './models/send-message.model';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ChatMessagesComponent } from './chat-messages/chat-messages.component';\nimport { ChatSidebarComponent } from './chat-sidebar/chat-sidebar.component';\nimport { Message } from './models/message.model';\nimport { ChatInputComponent } from './chat-input/chat-input.component';\nimport { IKnowledgeList } from './models/knowledge-list.model';\n\n@Component({\n selector: 'ngx-agent-chat',\n templateUrl: 'chat.component.html',\n styleUrls: ['./chat.component.scss'],\n})\nexport class NgxAgentChatComponent implements OnInit, AfterViewInit {\n /**\n * 接口baseUrl配置\n */\n @Input() baseUrl = 'http://39.102.56.254:8082';\n @Input() token = '';\n @ViewChild('chatSidebarRef') chatSidebarRef!: ChatSidebarComponent;\n @ViewChild('chatMessagesRef') chatMessagesRef!: ChatMessagesComponent;\n @ViewChild('chatInputRef') chatInputRef!: ChatInputComponent;\n\n private md = inject(MarkdownStreamService);\n private httpService = inject(HttpService);\n private sseService = inject(SseService);\n private storeService = inject(StoreService);\n private sanitizer = inject(DomSanitizer);\n private ngZone = inject(NgZone);\n private resizeObserver!: ResizeObserver;\n\n messages: Message[] = []; // 消息数组\n\n ngOnInit(): void {\n this.storeService.setToken(this.token);\n this.storeService.setBaseUrl(this.baseUrl);\n this.sseService.conversationICode$.subscribe(iCodeObj => {\n if (iCodeObj) {\n const currentMsg = this.messages[this.messages.length - 1];\n currentMsg.iCode = iCodeObj.question;\n currentMsg.answers[currentMsg.answerIndex].iCode = iCodeObj.answer;\n }\n });\n this.sseService.thinking$.subscribe(text => {\n if (this.messages.length > 0) {\n const currentMsg = this.messages[this.messages.length - 1];\n currentMsg.answers[currentMsg.answerIndex].think = text;\n }\n });\n this.sseService.currentMessage$.subscribe(text => {\n if (this.messages.length > 0) {\n const currentMsg = this.messages[this.messages.length - 1];\n currentMsg.answers[currentMsg.answerIndex].content = text;\n }\n });\n\n this.storeService.currentConversation$.subscribe(conversation => {\n if (!conversation) {\n this.messages = [];\n return;\n }\n this.httpService\n .get(`${this.storeService.getBaseUrl()}/api/ChatModel/conversation/questions`, { iCode: conversation?.iCode })\n .subscribe((res: Message[]) => {\n this.messages = res.map(item => {\n item.answerIndex = 0;\n item.answers.forEach(answer => {\n answer.thinkExpand = true;\n });\n return item;\n });\n });\n });\n }\n\n ngAfterViewInit(): void {\n this.resizeObserver = new ResizeObserver(entries => {\n for (let entry of entries) {\n const newHeight = entry.contentRect.height;\n this.ngZone.run(() => {\n this.chatMessagesRef.inputHeight = newHeight + 60;\n });\n }\n });\n // 开始监听输入框元素\n this.resizeObserver.observe(this.chatInputRef.chatInputWrapper.nativeElement);\n }\n\n // 重新生成回答(仅最新的回答允许重新生成)\n regenerateAnswer(msg: Message): void {\n this.chatInputRef.regenerateSend(msg);\n }\n\n // 发起提问请求\n onSendMessage(event: { message: ISendMessage; isRegenerate: boolean }) {\n if (!event.isRegenerate) {\n // 推入一个新问答,iCode在流接收到补上\n const qa: Message = {\n iCode: '',\n question: event.message.question,\n answers: [\n {\n iCode: '',\n think: '',\n content: '',\n thinkExpand: true,\n },\n ],\n answerIndex: 0,\n };\n this.messages.push(qa);\n } else {\n const latestMessage = this.messages[this.messages.length - 1];\n latestMessage.answers.push({\n iCode: '',\n think: '',\n content: '',\n thinkExpand: true,\n });\n latestMessage.answerIndex = latestMessage.answers.length - 1;\n }\n this.sseService.streamChat(event.message).then(res => {\n // 开启新对话,刷新左侧历史对话\n if (!event.message.conversation) {\n this.chatSidebarRef.getHistory(true);\n }\n });\n }\n}\n","<div class=\"qq-agent\">\n <!-- 左侧边栏 -->\n <ngx-chat-sidebar #chatSidebarRef></ngx-chat-sidebar>\n\n <!-- 右侧主内容 -->\n <div class=\"agent-main\">\n <ngx-chat-messages #chatMessagesRef [messages]=\"messages\" (regenerateAnswer)=\"regenerateAnswer($event)\"></ngx-chat-messages>\n <ngx-chat-input #chatInputRef [messages]=\"messages\" (sendMessage)=\"onSendMessage($event)\"></ngx-chat-input>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgxAgentChatComponent } from './chat.component';\nimport { ChatInputComponent } from './chat-input/chat-input.component';\nimport { ChatMessagesComponent } from './chat-messages/chat-messages.component';\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\nimport { ChatSidebarComponent } from './chat-sidebar/chat-sidebar.component';\nimport { NzTagModule } from 'ng-zorro-antd/tag';\nimport { FormsModule } from '@angular/forms';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzListModule } from 'ng-zorro-antd/list';\nimport { NzSliderModule } from 'ng-zorro-antd/slider';\nimport { NzLayoutModule } from 'ng-zorro-antd/layout';\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { MarkdownPipe } from './pipes/markdown.pipe';\nimport { NzMessageService } from 'ng-zorro-antd/message';\nimport { NzPaginationModule } from 'ng-zorro-antd/pagination';\nimport { SimplePaginationComponent } from './components/pagination/pagination.component';\nimport { HistoryGroupComponent } from './chat-sidebar/history-group/history-group.component';\n\n@NgModule({\n declarations: [\n NgxAgentChatComponent,\n ChatInputComponent,\n ChatMessagesComponent,\n ChatSidebarComponent,\n SimplePaginationComponent,\n HistoryGroupComponent,\n ],\n imports: [\n CommonModule,\n NzAvatarModule,\n NzSpinModule,\n NzTagModule,\n NzInputModule,\n NzButtonModule,\n NzListModule,\n NzSliderModule,\n NzLayoutModule,\n NzPopoverModule,\n NzRadioModule,\n NzCheckboxModule,\n NzIconModule,\n NzPaginationModule,\n FormsModule,\n MarkdownPipe,\n ],\n providers: [NzMessageService],\n exports: [NgxAgentChatComponent],\n})\nexport class AgentChatModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["HttpService","i2.StoreService","i1","i2.SimplePaginationComponent","i3.MarkdownPipe","i2.HistoryGroupComponent","i1.ChatInputComponent","i2.ChatMessagesComponent","i3.ChatSidebarComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qqsl-agent-chat.mjs","sources":["../../../projects/agent/chat/services/markdown-stream.service.ts","../../../projects/agent/chat/store/store.service.ts","../../../projects/agent/chat/services/http.service.ts","../../../projects/agent/chat/services/sse.service.ts","../../../projects/agent/chat/chat-input/chat-input.component.ts","../../../projects/agent/chat/chat-input/chat-input.component.html","../../../projects/agent/chat/components/pagination/pagination.component.ts","../../../projects/agent/chat/pipes/markdown.pipe.ts","../../../projects/agent/chat/chat-messages/chat-messages.component.ts","../../../projects/agent/chat/chat-messages/chat-messages.component.html","../../../projects/agent/chat/services/http2.service.ts","../../../projects/agent/chat/chat-sidebar/history-group/history-group.component.ts","../../../projects/agent/chat/chat-sidebar/chat-sidebar.component.ts","../../../projects/agent/chat/chat-sidebar/chat-sidebar.component.html","../../../projects/agent/chat/chat.component.ts","../../../projects/agent/chat/chat.component.html","../../../projects/agent/chat/chat.module.ts","../../../projects/agent/chat/qqsl-agent-chat.ts"],"sourcesContent":["// markdown-stream.service.ts\nimport { Injectable } from '@angular/core';\nimport { Marked } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\nimport hljs from 'highlight.js';\nimport * as katex from 'katex';\nimport DOMPurify from 'dompurify'; // 防 XSS\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownStreamService {\n private marked: Marked;\n\n constructor() {\n this.marked = new Marked(\n // 高亮代码\n markedHighlight({\n emptyLangClass: 'hljs',\n langPrefix: 'hljs language-',\n highlight(code, lang, info) {\n const language = hljs.getLanguage(lang) ? lang : 'plaintext';\n return hljs.highlight(code, { language }).value;\n },\n }),\n // {\n // gfm: true,\n // breaks: true,\n // // 自定义 renderer 支持 KaTeX\n // renderer: {\n // code(code: string, lang: string | undefined) {\n // if (lang === 'math' || lang === 'katex') {\n // return `<div class=\"math-block\">${katex.renderToString(code, { throwOnError: false, displayMode: true })}</div>`;\n // }\n // return false; // 交给 highlight 处理\n // },\n // inlineMath(math: string) {\n // return katex.renderToString(math, { throwOnError: false });\n // }\n // }\n // }\n );\n\n // 支持 $$...$$ 和 $...$ 数学公式\n // this.marked.use({\n // // 包含从 markdown 创建标记的函数的对象\n // tokenizer: {\n // inlineMath(src: string) {\n // const cap = /^\\$([^\\$]+)\\$/.exec(src);\n // if (cap) {\n // return { type: 'inlineMath', raw: cap[0], text: cap[1] };\n // }\n // },\n // codespan(src: string) {\n // const math = this.inlineMath(src);\n // if (math) return math;\n // return false;\n // }\n // }\n // });\n\n // marked 17+ 必须使用 extensions 方式注册\n this.marked.use({\n extensions: [\n {\n name: 'inlineMath',\n level: 'inline', // 必须是 inline\n start(src: string) {\n return src.indexOf('$'); // 告诉 marked 从哪里开始尝试匹配\n },\n tokenizer(src: string) {\n // 匹配 $...$,但不能包含换行,且不允许 $$ 开头(留给块级公式)\n const match = src.match(/^\\$(?!\\$)([^\\n$]+?)\\$/);\n if (match) {\n return {\n type: 'inlineMath',\n raw: match[0], // 原始文本:$xxx$\n text: match[1].trim(), // 公式内容\n };\n }\n return undefined;\n },\n renderer(token: any) {\n // 这里直接返回原始文本,后面你可以用 KaTeX / MathJax 渲染\n return `$${token.text}$`;\n // 或者如果你已经全局接管了渲染,可以 return false\n },\n },\n\n // 可选:同时支持 $$...$$ 块级公式\n {\n name: 'displayMath',\n level: 'block',\n start(src: string) {\n return src.indexOf('$$');\n },\n tokenizer(src: string) {\n const match = src.match(/^\\$\\$([\\s\\S]+?)\\$\\$/);\n if (match) {\n return {\n type: 'displayMath',\n raw: match[0],\n text: match[1].trim(),\n };\n }\n return undefined;\n },\n renderer(token: any) {\n return `$$${token.text}$$`;\n },\n },\n ],\n });\n }\n\n // 关键:增量渲染(流式专用!)\n renderIncremental(markdown: string): string {\n // 防止渲染一半的代码块崩溃\n const safeMarkdown = this.completeCodeBlocks(markdown);\n try {\n let html = this.marked.parse(safeMarkdown) as string;\n html = DOMPurify.sanitize(html); // 安全\n return html;\n } catch (e) {\n return this.escapeHtml(safeMarkdown);\n }\n }\n\n // 智能补全未闭合的代码块(流式必备!)\n private completeCodeBlocks(text: string): string {\n const lines = text.split('\\n');\n let inCode = false;\n let fence = '';\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim().match(/^```/)) {\n if (!inCode) {\n fence = line.trim();\n inCode = true;\n } else if (line.trim() === '```' || line.trim().startsWith('```')) {\n inCode = false;\n fence = '';\n }\n }\n }\n if (inCode) {\n text += '\\n```';\n }\n return text;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Conversation } from '../models/conversation.model';\n\n@Injectable({ providedIn: 'root' })\nexport class StoreService {\n private token = '';\n private baseUrl = '';\n private conversationICode?: string;\n\n private currentConversationSource = new BehaviorSubject<Conversation | null>(null);\n currentConversation$ = this.currentConversationSource.asObservable();\n\n setToken(token: string): void {\n this.token = token;\n }\n\n getToken(): string {\n return (\n this.token ||\n 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aWQiOiI2YjBjZjcwNC1hNmE5LTQxZDQtOWRkYy1kZmZmODlkYTZiNWMiLCJ1c2VyX3V1aWQiOjMxNTAsInVzZXJfbmFtZSI6IjEzMDg5MTI3MzcwIiwicmVnaW9uQ29kZSI6IjYzMDEwMDAwMDAwMCIsImF1dGhvcml0aWVzIjpbIldBVEVSX1NVUFBMWV9VU0VSIiwiTkVUV09SS19QUk9UT0NPTF9VU0VSIiwiUE9SVEFMX01BTkFHRV9BRE1JTiIsIkRJR0lUQUxfSVJSSUdBVElPTl9BRE1JTiIsIkVRVUlQTUVOVF9NT0RFTF9BRE1JTiIsIklOU1BFQ1RJT05fVVNFUiIsIkJJTV9CQU5LIiwiREFUQV9DQURBU1RSRV9BRE1JTiIsIklSUklHQVRJT05fR0FURV9VU0VSIiwiV0FURVJfUVVBTElUWV9VU0VSIiwiSVJSSUdBVElPTl9BRE1JTl9VU0VSIiwiQlVER0VUX01BVEVSX0FETUlOIiwiV0FURVJfTkVUV09SS19BRE1JTiIsIklOU1BFQ1RJT05fQURNSU5fVVNFUiIsIkRJR0lUQUxfSVJSSUdBVElPTl9KRyIsIlJPTEVfVVNFUiIsIkRBVEFfQ0VOVEVSX0lDT05fQURNSU4iLCJXQVJOSU5HX1VTRVIiLCJSRVNPVVJDRV9BRE1JTiIsIldBVEVSX1FVQUxJVFlfQURNSU4iLCJCVURHRVRfTUFURVJfVVNFUiIsIkJVSUxEX0NPTlNUUlVDVElPTl9BRE1JTiIsIkNBTENVTEFUSU9OX0RBVEFfQURNSU4iLCJURVhUVVJFX0FETUlOIiwiREFUQV9DRU5URVJfRklMRV9BRE1JTiIsIlNUQVRJQ19NT0RFTF9BRE1JTiIsIkJJT19QTEFOVF9BRE1JTiIsIkJJTV9ERVNJR04iLCJST0xFX1NVUEVSX0FETUlOIiwiTkVUV09SS19NT0RFTF9VU0VSIiwiV0FURVJfUVVPVEFfQURNSU4iLCJEQVRBX0NFTlRFUl9SSVZFUl9MQUtFIiwiREFNX1VTRVIiLCJTVVBQTFlfRFJBSU5BR0VfQURNSU4iLCJSRVNPVVJDRV9VU0VSIiwiQVJHVU1FTlRBVElPTl9VU0VSIiwiTE9HR0lOR19VU0VSIiwiREFUQV9URVJSQUlOX0FETUlOIiwiQlVER0VUX1FVT1RBX1VTRVIiLCJEQVRBX0NFTlRFUl9SRUdJT05fQURNSU4iLCJURVhUVVJFX1VTRVIiLCJEQVRBX0NFTlRFUl9VU0VSIiwiRVFVSVBNRU5UX01PREVMX1VTRVIiLCJEQVRBX0NFTlRFUl9QQU5PUkFNQSIsIkFSR1VNRU5UQVRJT05fQURNSU4iLCJEQVRBX0NFTlRFUl9XQVRFUl9SRVNPVVJDRSIsIkJJTV9QUk9DRURVUkUiLCJNQU5BR0VNRU5UX0FETUlOX1VTRVIiLCJEUklOR1dBVEVSX1VTRVIiLCJXQVRFUl9TVVBQTFlfQURNSU4iLCJMQU5EX1VTRV9BRE1JTiIsIkRBVEFfQ0VOVEVSX0ZJTEVfVVNFUiIsIkRBVEFfQ0VOVEVSX1dBVEVSX1BST0pFQ1QiLCJIWl9TTEFWRSIsIkRvY3VtZW50X1VTRVIiLCJCVURHRVRfUVVPVEFfQURNSU4iLCJJUlJJR0FUSU9OX1VTRVIiLCJORVRXT1JLX01PREVMX0FETUlOIiwiU1VQUExZX0RSQUlOQUdFX1VTRVIiLCJMT0dHSU5HX0FETUlOIiwiRFJJTkdXQVRFUl9BRE1JTl9VU0VSIiwiTkVUV09SS19VU0VSIiwiTU9ERUxfUEFSQU1fQURNSU4iLCJXQVRFUl9RVU9UQV9VU0VSIiwiU1RBVElDX01PREVMX0RFVkVMT1BFUiIsIkRFUEFSVE1FTlRfQURNSU4iLCJEQVRBX0NFTlRFUl9BTk5FWCIsIk5FVFdPUktfQURNSU4iLCJCSU1fRVFVSVBNRU5UIiwiRElHSVRBTF9JUlJJR0FUSU9OX1VTRVIiLCJNQU5BR0VNRU5UX1VTRVIiLCJCVUlMRF9DT05TVFJVQ1RJT05fVVNFUiIsIkRBVEFfQ0VOVEVSX0FETUlOIiwiUklWRVJfTEFLRV9FVkFMVVRJT05fVVNFUiIsIkJJTV9DT1NUIiwiRFJJTkdXQVRFUl9HQVRFX1VTRVIiLCJEQVRBX0NFTlRFUl9XQVRFUl9XQURJTkciLCJORVRXT1JLX1BST1RPQ09MX0FETUlOIiwiQklNX1VTRVIiLCJEQVRBX0NBREFTVFJFX1VTRVIiLCJTVEFUSUNfTU9ERUxfVVNFUiIsIlJPTEVfQURNSU4iLCJXQVRFUl9TVVBQTFlfR0FURV9VU0VSIiwiUklWRVJfTEFLRV9FVkFMVVRJT05fQURNSU4iLCJCSU1fQURNSU4iLCJCSU9fUExBTlRfVVNFUiJdLCJleHAiOjE3NjQwNjA0NzA1MTQsInJvbGVzIjpbIkhaX1NMQVZFIiwiUk9MRV9BRE1JTiIsIkJJT19QTEFOVF9BRE1JTiIsIlJPTEVfVVNFUiIsIkRBVEFfQ0VOVEVSX1VTRVIiLCJEQVRBX0NFTlRFUl9BRE1JTiIsIkRvY3VtZW50X1VTRVIiLCJEQVRBX0NFTlRFUl9BTk5FWCIsIkJJTV9FUVVJUE1FTlQiLCJMT0dHSU5HX0FETUlOIiwiU1VQUExZX0RSQUlOQUdFX1VTRVIiLCJSSVZFUl9MQUtFX0VWQUxVVElPTl9BRE1JTiIsIkRBVEFfQ0VOVEVSX0lDT05fQURNSU4iLCJXQVRFUl9RVUFMSVRZX1VTRVIiLCJXQVRFUl9RVU9UQV9VU0VSIiwiSVJSSUdBVElPTl9BRE1JTl9VU0VSIiwiQlVER0VUX1FVT1RBX0FETUlOIiwiREFUQV9DRU5URVJfRklMRV9VU0VSIiwiQklNX0RFU0lHTiIsIk1BTkFHRU1FTlRfVVNFUiIsIk5FVFdPUktfUFJPVE9DT0xfQURNSU4iLCJTVEFUSUNfTU9ERUxfREVWRUxPUEVSIiwiV0FSTklOR19VU0VSIiwiQklNX1VTRVIiLCJEQVRBX0NFTlRFUl9SSVZFUl9MQUtFIiwiRFJJTkdXQVRFUl9BRE1JTl9VU0VSIiwiQVJHVU1FTlRBVElPTl9VU0VSIiwiREFUQV9DRU5URVJfV0FURVJfUFJPSkVDVCIsIkRBVEFfQ0FEQVNUUkVfQURNSU4iLCJERVBBUlRNRU5UX0FETUlOIiwiTkVUV09SS19VU0VSIiwiU1RBVElDX01PREVMX0FETUlOIiwiQklNX0JBTksiLCJXQVRFUl9TVVBQTFlfQURNSU4iLCJCSU1fQURNSU4iLCJSRVNPVVJDRV9VU0VSIiwiREFUQV9URVJSQUlOX0FETUlOIiwiREFUQV9DRU5URVJfUkVHSU9OX0FETUlOIiwiV0FURVJfU1VQUExZX1VTRVIiLCJESUdJVEFMX0lSUklHQVRJT05fVVNFUiIsIldBVEVSX1FVQUxJVFlfQURNSU4iLCJORVRXT1JLX0FETUlOIiwiTE9HR0lOR19VU0VSIiwiSU5TUEVDVElPTl9BRE1JTl9VU0VSIiwiSVJSSUdBVElPTl9HQVRFX1VTRVIiLCJORVRXT1JLX1BST1RPQ09MX1VTRVIiLCJMQU5EX1VTRV9BRE1JTiIsIkJVSUxEX0NPTlNUUlVDVElPTl9BRE1JTiIsIkRBVEFfQ0VOVEVSX1BBTk9SQU1BIiwiREFUQV9DRU5URVJfV0FURVJfV0FESU5HIiwiQ0FMQ1VMQVRJT05fREFUQV9BRE1JTiIsIkRBVEFfQ0FEQVNUUkVfVVNFUiIsIkJJT19QTEFOVF9VU0VSIiwiTU9ERUxfUEFSQU1fQURNSU4iLCJTVVBQTFlfRFJBSU5BR0VfQURNSU4iLCJFUVVJUE1FTlRfTU9ERUxfQURNSU4iLCJURVhUVVJFX0FETUlOIiwiQlVER0VUX01BVEVSX1VTRVIiLCJXQVRFUl9RVU9UQV9BRE1JTiIsIkRJR0lUQUxfSVJSSUdBVElPTl9KRyIsIldBVEVSX05FVFdPUktfQURNSU4iLCJCSU1fUFJPQ0VEVVJFIiwiRFJJTkdXQVRFUl9VU0VSIiwiV0FURVJfU1VQUExZX0dBVEVfVVNFUiIsIkJVSUxEX0NPTlNUUlVDVElPTl9VU0VSIiwiRElHSVRBTF9JUlJJR0FUSU9OX0FETUlOIiwiSVJSSUdBVElPTl9VU0VSIiwiUk9MRV9TVVBFUl9BRE1JTiIsIkVRVUlQTUVOVF9NT0RFTF9VU0VSIiwiQklNX0NPU1QiLCJEUklOR1dBVEVSX0dBVEVfVVNFUiIsIklOU1BFQ1RJT05fVVNFUiIsIkFSR1VNRU5UQVRJT05fQURNSU4iLCJQT1JUQUxfTUFOQUdFX0FETUlOIiwiVEVYVFVSRV9VU0VSIiwiTUFOQUdFTUVOVF9BRE1JTl9VU0VSIiwiTkVUV09SS19NT0RFTF9BRE1JTiIsIkJVREdFVF9RVU9UQV9VU0VSIiwiQlVER0VUX01BVEVSX0FETUlOIiwiU1RBVElDX01PREVMX1VTRVIiLCJSSVZFUl9MQUtFX0VWQUxVVElPTl9VU0VSIiwiREFNX1VTRVIiLCJSRVNPVVJDRV9BRE1JTiIsIkRBVEFfQ0VOVEVSX1dBVEVSX1JFU09VUkNFIiwiREFUQV9DRU5URVJfRklMRV9BRE1JTiIsIk5FVFdPUktfTU9ERUxfVVNFUiJdLCJyZWFsX25hbWUiOiLnrqHnkIblkZgiLCJwbGF0Zm9ybUNvZGUiOiI2MzAxMDAwMDAwMDAiLCJwbGF0Zm9ybU5hbWUiOiLopb_lroHluIIiLCJ1c2VyTWFyayI6ZmFsc2UsInBob25lIjoiMTMwODkxMjczNzAiLCJlbnYiOiJyZWxlYXNlIiwidG9wUmVnaW9uQ29kZSI6IjYzMDEwMDAwMDAwMCJ9.Bzlz0LC5rbwItBgw6B-dhSKhXnAATXiaL-rR3EHD4wmJ-BpWWrDakYAjzUCtWL4ExkTqSxXIClCztc412o5pT3b9EN7R6WH5namjpxzwozCVXQyBYvjoCrS5UX1_iUkvVMr6WAqiUUzIanVSrmaRpszxyD8S_fLBge971-Cli44J1FQDBY8QN8TiH3v3c5aDWDBJVYPHqe3_zEAeL3dlERgl8pTLAydx54a2QqCVH2xfX_zSzFXJeK2iamIyI8H4cyP0pQrYl2rjSuR7LsjJSJz_QeSQKZlctG8odrBMV5OoHlWC2isNGqszqyp1POX2HyWb-U4qn8KuKKryjACrow'\n );\n }\n\n setBaseUrl(url: string): void {\n this.baseUrl = url;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n setCurrentConversation(conversation: Conversation | null): void {\n this.conversationICode = conversation?.iCode;\n this.currentConversationSource.next(conversation);\n }\n\n getConversationICode(): string | undefined {\n return this.conversationICode;\n }\n}\n","import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { filter, map, Observable } from 'rxjs';\nimport { StoreService } from '../store/store.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HttpService {\n constructor(\n private http: HttpClient,\n private storeService: StoreService,\n ) {}\n\n public get(url: string, paramObj?: any): Observable<any> {\n if (paramObj) {\n return this.http\n .get(url, {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n }),\n observe: 'response',\n params: paramObj,\n responseType: 'json',\n withCredentials: false,\n })\n .pipe(\n filter((r: any): r is HttpResponse<any> => r instanceof HttpResponse),\n map((r: HttpResponse<any>) => {\n return r.body;\n }),\n );\n }\n return this.http\n .get(url, {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n }),\n observe: 'response',\n responseType: 'json',\n withCredentials: false,\n })\n .pipe(\n filter((r: any): r is HttpResponse<any> => r instanceof HttpResponse),\n map((r: HttpResponse<any>) => {\n return r.body;\n }),\n );\n }\n\n public post(url: string, body: any, options?: any): Observable<any> {\n // 默认配置\n const defaultOptions = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n }),\n observe: 'response',\n responseType: 'json',\n withCredentials: false,\n };\n\n // 如果提供了自定义选项,则合并配置\n const httpOptions = options ? { ...defaultOptions, ...options } : defaultOptions;\n\n // 发送 POST 请求\n return this.http.post(url, body, httpOptions);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject } from 'rxjs';\nimport { ISendMessage } from '../models/send-message.model';\nimport { StoreService } from '../store/store.service';\n\nexport interface ConversationICodeObj {\n conversation: string;\n question: string;\n answer: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SseService {\n private storeService = inject(StoreService);\n private conversationICodeSource = new BehaviorSubject<ConversationICodeObj | null>(null);\n conversationICode$ = this.conversationICodeSource.asObservable();\n\n // 思考内容\n private thinkingSource = new BehaviorSubject<string>('');\n thinking$ = this.thinkingSource.asObservable();\n\n // 实时流式文本\n private messageSource = new BehaviorSubject<string>('');\n currentMessage$ = this.messageSource.asObservable();\n\n private deltaSource = new BehaviorSubject<string>('');\n delta$ = this.deltaSource.asObservable();\n\n loadingSource = new BehaviorSubject<boolean>(false);\n loading$ = this.loadingSource.asObservable();\n\n // 完整消息历史\n private fullThinking = '';\n private fullMessage = '';\n\n async streamChat(body: ISendMessage) {\n this.loadingSource.next(true);\n this.messageSource.next(''); // 清空\n this.fullMessage = '';\n\n try {\n const response = await fetch(`${this.storeService.getBaseUrl()}/api/ChatModel/generate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.storeService.getToken(),\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok || !response.body) {\n throw new Error('网络错误');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split('\\n\\n');\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n const jsonStr = line.replaceAll('data:', '');\n try {\n const data = JSON.parse(jsonStr);\n const delta = data.content || '';\n\n if (delta) {\n // 对话以及问答编码\n if (delta.conversation) {\n this.conversationICodeSource.next(delta);\n continue;\n }\n // 比如显示“AI 正在思考...”\n if (data.think) {\n this.fullThinking += delta;\n this.thinkingSource.next(this.fullThinking);\n continue;\n }\n this.fullMessage += delta;\n this.messageSource.next(this.fullMessage); // 实时推送完整内容\n this.deltaSource.next(delta); // 只推本次新增的文字\n }\n if (data.down) {\n // down: true 表示结束\n this.loadingSource.next(false);\n }\n } catch (e) {\n console.log('sse error', e);\n }\n }\n }\n }\n } catch (err: any) {\n if (err.name !== 'AbortError') {\n this.messageSource.next('请求失败:' + err.message);\n }\n } finally {\n this.loadingSource.next(false);\n }\n }\n\n // 支持取消(关键!)\n private controller = new AbortController();\n\n cancel() {\n this.controller.abort();\n this.controller = new AbortController();\n }\n}\n","// chat-input.component.ts\nimport { Component, Output, EventEmitter, ElementRef, ViewChild, inject, OnInit, Input } from '@angular/core';\nimport { HttpService } from '../services/http.service';\nimport { IModel, IModelList } from '../models/model-list.model';\nimport { StoreService } from '../store/store.service';\nimport { IKnowledgeList } from '../models/knowledge-list.model';\nimport { ISendMessage } from '../models/send-message.model';\nimport { Message } from '../models/message.model';\nimport { SseService } from '../services/sse.service';\n\n@Component({\n selector: 'ngx-chat-input',\n templateUrl: './chat-input.component.html',\n styleUrls: ['./chat-input.component.scss'],\n})\nexport class ChatInputComponent implements OnInit {\n @ViewChild('editorRef') editor!: ElementRef<HTMLDivElement>;\n @ViewChild('chatInputWrapper') chatInputWrapper!: ElementRef<HTMLDivElement>;\n @Input() messages: Message[] = [];\n @Output() sendMessage = new EventEmitter<{ message: ISendMessage; isRegenerate: boolean }>();\n @Output() messageChange = new EventEmitter<string>();\n @Output() enter = new EventEmitter<string>();\n @Output() paste = new EventEmitter<Event>();\n\n private httpService = inject(HttpService);\n private storeService = inject(StoreService);\n public sseService = inject(SseService);\n\n isEmpty = true;\n currentModel: IModel | null = null;\n currentKnowledge: string[] = [];\n modelList: IModelList = [];\n knowledgeList: IKnowledgeList = [];\n modelPopoverVisible = false;\n knowledgePopoverVisible = false;\n deepThink = true;\n\n ngOnInit(): void {\n this.getModelList();\n this.getKnowledgeList();\n }\n\n // 可供交互的模型\n getModelList(): void {\n this.httpService.get(`${this.storeService.getBaseUrl()}/api/ChatModel/models`).subscribe((res: IModelList) => {\n this.modelList = res;\n if (res.length) {\n this.currentModel = res[0];\n }\n });\n }\n\n // 模型可选的知识库\n getKnowledgeList(): void {\n this.httpService\n .get(`${this.storeService.getBaseUrl()}/api/ChatModel/knowledges`)\n .subscribe((res: IKnowledgeList) => {\n this.knowledgeList = res;\n });\n }\n\n modelVisibleChange(value: boolean): void {\n this.modelPopoverVisible = value;\n }\n\n knowledgeVisibleChange(value: boolean): void {\n this.knowledgePopoverVisible = value;\n }\n\n knowledgeSelectChange(value: string[]): void {\n this.currentKnowledge = value;\n }\n\n toggleDeepThink(): void {\n this.deepThink = !this.deepThink;\n }\n\n private updateEmptyState() {\n const el = this.editor.nativeElement;\n const text = el.textContent?.trim() || '';\n const hasOnlyBr = el.innerHTML === '<br>' || el.innerHTML === '';\n\n this.isEmpty = text === '' && hasOnlyBr;\n }\n\n handleInput(): void {\n this.updateEmptyState();\n const html = this.editor.nativeElement.innerHTML;\n const text = this.editor.nativeElement.textContent || '';\n // this.messageChange.emit(text);\n }\n\n handleEnter(event: Event): void {\n if (!(event as KeyboardEvent).shiftKey) {\n event.preventDefault();\n // this.enter.emit((event as any).target!.innerText!.replace(/\\s+/g, \" \").trim());\n this.send();\n }\n }\n\n handlePaste(event: ClipboardEvent): void {\n // this.paste.emit(event);\n setTimeout(() => this.updateEmptyState(), 0);\n }\n\n clearInput(): void {\n this.editor.nativeElement.innerHTML = '';\n this.handleInput();\n }\n\n regenerateSend(msg: Message): void {\n // 正在回答中\n if (this.sseService.loadingSource.value) {\n return;\n }\n const conversation = this.storeService.getConversationICode();\n const message: ISendMessage = {\n conversation,\n questionICode: msg.iCode,\n model: this.currentModel?.iCode ?? '',\n think: this.deepThink,\n question: msg.question,\n knowledge: !!this.currentKnowledge.length,\n knowledgeList: this.currentKnowledge,\n };\n this.sendMessage.emit({ message, isRegenerate: true });\n }\n\n send(): void {\n // 正在回答中\n if (this.sseService.loadingSource.value) {\n return;\n }\n const text = this.editor.nativeElement.textContent || '';\n const conversation = this.storeService.getConversationICode();\n const message: ISendMessage = {\n conversation,\n model: this.currentModel?.iCode ?? '',\n think: this.deepThink,\n question: text,\n knowledge: !!this.currentKnowledge.length,\n knowledgeList: this.currentKnowledge,\n };\n this.clearInput();\n this.sendMessage.emit({ message, isRegenerate: false });\n }\n}\n","<!-- 新聊天位于屏幕中间,发送消息之后位于底部 -->\n<div class=\"chat-input-wrapper\" #chatInputWrapper [class.center]=\"!messages.length\">\n <div class=\"new-chat-title\" *ngIf=\"!messages.length\">\n <img src=\"/assets/images/logo.png\" />\n <span>你好,有什么可以帮到你?开始对话吧</span>\n </div>\n <div class=\"chat-input\">\n <div\n #editorRef\n class=\"input-creative-editor\"\n contenteditable=\"true\"\n spellcheck=\"false\"\n data-placeholder=\"请输入并发送消息\"\n [attr.data-empty]=\"isEmpty\"\n (input)=\"handleInput()\"\n (keydown.enter)=\"handleEnter($event)\"\n (paste)=\"handlePaste($event)\"\n ></div>\n <div class=\"input-bottom\">\n <div class=\"input-tools\">\n <div class=\"select-tool\" [ngClass]=\"{ 'select-tool-active': deepThink }\" (click)=\"toggleDeepThink()\">\n <svg\n t=\"1764131026949\"\n style=\"width: 14px; height: 14px\"\n class=\"icon\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n p-id=\"5012\"\n width=\"64\"\n height=\"64\"\n >\n <path\n d=\"M903.36 512a795.52 795.52 0 0 1 65.536 136.704c48 132.16 39.616 230.528-25.024 295.168-64.64 64.64-163.008 72.96-295.168 24.96A795.52 795.52 0 0 1 512 903.424a795.52 795.52 0 0 1-136.704 65.536c-132.096 48-230.528 39.616-295.168-25.024-64.64-64.64-72.96-163.008-24.96-295.104 16.64-46.016 38.528-91.52 65.536-136.768A795.52 795.52 0 0 1 55.04 375.232C7.04 243.2 15.36 144.768 80 80.128 144.768 15.488 243.2 7.168 375.296 55.04c46.016 16.64 91.584 38.528 136.768 65.536A795.52 795.52 0 0 1 648.768 55.104c132.096-48 230.464-39.616 295.104 25.024 64.64 64.64 72.96 163.008 25.024 295.104A795.52 795.52 0 0 1 903.36 512z m-53.12-79.424c15.168-28.736 27.968-57.536 38.464-86.4 35.584-98.112 33.92-166.656-5.12-205.696-39.04-39.04-107.648-40.768-205.696-5.12a685.44 685.44 0 0 0-86.4 38.4 1240.96 1240.96 0 0 1 138.432 120.32 1240.832 1240.832 0 0 1 120.32 138.496zM432.576 173.824a685.44 685.44 0 0 0-86.4-38.528c-98.112-35.584-166.656-33.92-205.696 5.12-39.04 39.04-40.768 107.648-5.12 205.696 10.432 28.928 23.296 57.728 38.4 86.4a1240.896 1240.896 0 0 1 120.32-138.432 1240.832 1240.832 0 0 1 138.496-120.32zM173.824 591.488a685.44 685.44 0 0 0-38.464 86.4c-35.648 98.048-33.92 166.592 5.12 205.632 39.04 39.04 107.584 40.768 205.696 5.12a685.44 685.44 0 0 0 86.4-38.4 1240.768 1240.768 0 0 1-138.496-120.32 1240.96 1240.96 0 0 1-120.256-138.432z m495.744 78.08A1112.064 1112.064 0 0 0 802.048 512a1112.064 1112.064 0 0 0-132.48-157.568A1112.128 1112.128 0 0 0 512 221.952a1112.128 1112.128 0 0 0-157.504 132.48A1112.064 1112.064 0 0 0 222.016 512a1112.192 1112.192 0 0 0 132.416 157.568A1112.064 1112.064 0 0 0 512 802.048a1112.128 1112.128 0 0 0 157.568-132.48z m-78.08 180.608c28.672 15.168 57.472 28.032 86.4 38.464 98.048 35.648 166.592 33.92 205.632-5.12 39.04-39.04 40.768-107.584 5.12-205.696a685.504 685.504 0 0 0-38.4-86.4 1240.832 1240.832 0 0 1-120.32 138.496 1240.96 1240.96 0 0 1-138.432 120.32zM585.088 512a73.152 73.152 0 1 1-146.24 0 73.152 73.152 0 0 1 146.304 0z\"\n fill=\"currentColor\"\n p-id=\"5013\"\n ></path>\n </svg>\n 深度思考\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"modelListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"modelPopoverVisible\"\n (nzPopoverVisibleChange)=\"modelVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/toggle-model.png\" style=\"width: 12px; height: 12px\" />\n {{ currentModel ? currentModel?.name : '选择模型' }}\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"knowledgeListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"knowledgePopoverVisible\"\n (nzPopoverVisibleChange)=\"knowledgeVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/relate.png\" style=\"width: 14px; height: 8px\" />\n 关联知识库\n </div>\n </div>\n <img class=\"send\" src=\"/assets/images/input/send.png\" (click)=\"send()\" [hidden]=\"sseService.loading$ | async\" />\n <div class=\"send-loading\" *ngIf=\"sseService.loading$ | async\">\n <div class=\"send-loading-inner\">\n <svg viewBox=\"0 0 36 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" data-icon=\"spin\">\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"100%\" id=\"linearGradient-1\">\n <stop stop-color=\"currentColor\" stop-opacity=\"0\" offset=\"0%\"></stop>\n <stop stop-color=\"currentColor\" stop-opacity=\"0.50\" offset=\"39.9430698%\"></stop>\n <stop stop-color=\"currentColor\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect fill-opacity=\"0.01\" fill=\"none\" x=\"0\" y=\"0\" width=\"36\" height=\"36\"></rect>\n <path\n d=\"M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951\"\n stroke=\"url(#linearGradient-1)\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <!-- <img class=\"send\" src=\"/assets/images/input/send-gray.png\" /> -->\n </div>\n </div>\n <div class=\"chat-input-backdrop\"></div>\n</div>\n\n<ng-template #modelListContent>\n <div style=\"width: 200px\">\n <div class=\"select-title\">\n 切换模型\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"modelVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-radio-group [(ngModel)]=\"currentModel\">\n <label\n nz-radio\n [nzValue]=\"item\"\n [style.margin-top.px]=\"i === 0 ? 0 : 10\"\n *ngFor=\"let item of modelList; let i = index\"\n >\n {{ item.name }}\n </label>\n </nz-radio-group>\n </div>\n </div>\n</ng-template>\n\n<ng-template #knowledgeListContent>\n <div style=\"width: 150px\">\n <div class=\"select-title\">\n 关联知识库\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"knowledgeVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-checkbox-wrapper style=\"width: 100%\" (nzOnChange)=\"knowledgeSelectChange($event)\">\n <div *ngFor=\"let item of knowledgeList\">\n <label nz-checkbox [nzValue]=\"item.iCode\">{{ item.name }}</label>\n </div>\n </nz-checkbox-wrapper>\n </div>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'ngx-simple-pagination',\n template: `\n <div class=\"pagination-container\">\n <button\n class=\"nav-btn\"\n [disabled]=\"current === 1\"\n (click)=\"onPrev()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n </svg>\n </button>\n\n <span class=\"page-info\">\n <span class=\"current\">{{ current }}</span>\n <span class=\"separator\">/</span>\n <span class=\"total\">{{ total }}</span>\n </span>\n\n <button\n class=\"nav-btn\"\n [disabled]=\"current === total\"\n (click)=\"onNext()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n </button>\n </div>\n `,\n styles: [`\n :host {\n display: inline-block;\n }\n\n .pagination-container {\n display: flex;\n align-items: center;\n gap: 8px; /* 调整间距 */\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n user-select: none; /* 防止点击过快选中文字 */\n color: #606266;\n }\n\n /* 按钮样式 */\n .nav-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #909399; /* 默认灰色 */\n transition: color 0.2s, background-color 0.2s;\n border-radius: 4px;\n }\n\n .nav-btn:hover:not(:disabled) {\n color: #303133; /* 悬停变深色 */\n background-color: #f0f2f5;\n }\n\n .nav-btn:disabled {\n cursor: not-allowed;\n color: #dcdfe6; /* 禁用状态是非常浅的灰色 */\n opacity: 0.6;\n }\n\n /* 文字样式 */\n .page-info {\n font-size: 14px;\n font-weight: 500;\n letter-spacing: 1px;\n color: #606266;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .separator {\n color: #909399; /* 分隔符颜色稍淡 */\n }\n `]\n})\nexport class SimplePaginationComponent {\n /** 当前页码 */\n @Input() current: number = 1;\n\n /** 总页数 */\n @Input() total: number = 1;\n\n /** 当页码改变时触发 */\n @Output() pageChange = new EventEmitter<number>();\n\n onPrev() {\n if (this.current > 1) {\n this.pageChange.emit(this.current - 1);\n }\n }\n\n onNext() {\n if (this.current < this.total) {\n this.pageChange.emit(this.current + 1);\n }\n }\n}","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { MarkdownStreamService } from '../services/markdown-stream.service';\n\n@Pipe({\n name: 'markdown',\n standalone: true,\n})\nexport class MarkdownPipe implements PipeTransform {\n private md = inject(MarkdownStreamService);\n\n transform(value: any): any {\n if (value !== null && value !== undefined) {\n return this.md.renderIncremental(value);\n }\n return value;\n }\n}\n","// chat-messages.component.ts\nimport {\n Component,\n Input,\n ViewChild,\n ElementRef,\n AfterViewChecked,\n inject,\n AfterViewInit,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { Message } from '../models/message.model';\nimport { MarkdownStreamService } from '../services/markdown-stream.service';\nimport { SseService } from '../services/sse.service';\nimport { marked } from 'marked';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { NzMessageService } from 'ng-zorro-antd/message';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\n\n@Component({\n selector: 'ngx-chat-messages',\n templateUrl: './chat-messages.component.html',\n styleUrls: ['./chat-messages.component.scss'],\n animations: [\n trigger('expandCollapse', [\n state('collapsed', style({ height: '0px', opacity: 0 })),\n state('expanded', style({ height: '*', opacity: 1 })),\n transition('expanded <=> collapsed', animate('300ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n ]),\n ],\n})\nexport class ChatMessagesComponent implements AfterViewChecked, AfterViewInit, OnChanges {\n @Input() messages: Message[] = [];\n @ViewChild('messagesContainer') messagesContainer!: ElementRef;\n /**\n * 重新生成回答\n */\n @Output() regenerateAnswer = new EventEmitter<Message>();\n\n private md = inject(MarkdownStreamService);\n private sseService = inject(SseService);\n private sanitizer = inject(DomSanitizer);\n private msg = inject(NzMessageService);\n\n isLoading = false;\n inputHeight = 180;\n renderedHtml: SafeHtml = '';\n private accumulatedMarkdown = '';\n\n ngAfterViewInit(): void {\n this.sseService.loading$.subscribe(status => {\n this.isLoading = status;\n });\n this.sseService.delta$.subscribe(delta => {\n if (!delta) return;\n\n this.accumulatedMarkdown += delta;\n this.renderedHtml = this.md.renderIncremental(this.accumulatedMarkdown);\n });\n }\n\n ngAfterViewChecked() {\n // 正在回答中\n if (this.isLoading) {\n this.scrollToBottom();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['messages']) {\n setTimeout(() => {\n this.scrollToBottom();\n }, 50);\n }\n }\n\n // 滚动到底部\n scrollToBottom(): void {\n if (!this.messagesContainer) {\n return;\n }\n this.messagesContainer.nativeElement.scrollTop = this.messagesContainer.nativeElement.scrollHeight;\n }\n\n copyContent(text: string): void {\n if (navigator.clipboard && window.isSecureContext) {\n // 使用现代 Clipboard API\n navigator.clipboard.writeText(text).then(() => {\n this.msg.success('复制成功');\n });\n }\n }\n\n onPageChange(num: number, msg: Message): void {\n msg.answerIndex = num - 1;\n }\n\n /**\n * 重新生成多个回答\n */\n regenerate(msg: Message): void {\n // const question = this.messages[index - 1].message;\n // 重新生成使用底部最新的配置,重新调用sendMessage\n this.regenerateAnswer.emit(msg);\n }\n\n // 把完整的 markdown 块渲染,剩下的留给打字区\n private renderCompleteBlocks(markdown: string): { rendered: string; remaining: string } {\n // 找到最后一个换行符之前的都渲染(足够丝滑)\n const lines = markdown.split('\\n');\n let breakPoint = lines.length;\n\n // 从后往前找,保留未完成的代码块/表格/列表\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line.trim() === '' || line.startsWith('```') || line.startsWith('|') || line.startsWith('- ')) {\n breakPoint = i;\n break;\n }\n }\n\n const completePart = lines.slice(0, breakPoint).join('\\n');\n const remainingPart = lines.slice(breakPoint).join('\\n');\n\n const html = this.md.renderIncremental(completePart);\n // const html = marked(completePart, { breaks: true, gfm: true });\n return { rendered: html as string, remaining: remainingPart };\n }\n}\n","<!-- chat-messages.component.html -->\n<script src=\"chat-messages.component.ts\"></script>\n<div class=\"messages-container\" #messagesContainer>\n <div class=\"message-list\" [style.--input-height.px]=\"inputHeight\">\n <div class=\"question message-wrapper\" *ngFor=\"let msg of messages; let i = index\">\n <!-- Q -->\n <div class=\"bubble-wrapper user-msg\">\n <div class=\"message-bubble\">\n <div class=\"message-content message-human\">\n {{ msg.question }}\n </div>\n </div>\n </div>\n <!-- A -->\n <div class=\"bubble-wrapper ai-msg\" *ngIf=\"msg.answers[msg.answerIndex]\">\n <div\n class=\"bubble-loading\"\n *ngIf=\"!msg.answers[msg.answerIndex].think && !msg.answers[msg.answerIndex].content\"\n >\n <div class=\"bubble-loading-dot\" *ngFor=\"let item of [1, 2, 3]\"></div>\n </div>\n <div class=\"message-bubble\">\n <!-- 思考 -->\n <div class=\"message-think\" *ngIf=\"msg.answers[msg.answerIndex].think\">\n <div\n class=\"message-think-header\"\n (click)=\"msg.answers[msg.answerIndex].thinkExpand = !msg.answers[msg.answerIndex].thinkExpand\"\n >\n <div class=\"message-think-header-title\">\n <img src=\"/assets/images/card/think-finish.png\" />\n {{ msg.answers[msg.answerIndex].content ? '已完成思考' : '正在思考中...' }}\n </div>\n <div class=\"arrow-icon\" [class.rotated]=\"msg.answers[msg.answerIndex].thinkExpand\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n </div>\n <div\n class=\"message-content message-assistant message-markdown\"\n [@expandCollapse]=\"msg.answers[msg.answerIndex].thinkExpand ? 'expanded' : 'collapsed'\"\n [innerHTML]=\"msg.answers[msg.answerIndex].think | markdown\"\n [hidden]=\"!msg.answers[msg.answerIndex].thinkExpand\"\n ></div>\n </div>\n <!-- 回答 -->\n <div\n class=\"message-content message-assistant message-markdown\"\n [innerHTML]=\"msg.answers[msg.answerIndex].content | markdown\"\n ></div>\n <!-- 回答工具栏 -->\n <div class=\"assistant-tools\" *ngIf=\"msg.answers[msg.answerIndex].content\">\n <ngx-simple-pagination\n [current]=\"msg.answerIndex + 1\"\n [total]=\"msg.answers.length\"\n (pageChange)=\"onPageChange($event, msg)\"\n *ngIf=\"msg.answers.length > 1\"\n ></ngx-simple-pagination>\n <img\n src=\"assets/images/card/copy.png\"\n alt=\"复制\"\n (click)=\"copyContent(msg.answers[msg.answerIndex].content)\"\n />\n <img\n src=\"assets/images/card/refresh.png\"\n alt=\"重新生成\"\n (click)=\"regenerate(msg)\"\n *ngIf=\"i === messages.length - 1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <!-- <div style=\"padding-bottom: 160px\"></div> -->\n </div>\n</div>\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { StoreService } from '../store/store.service';\n\nexport interface ApiResponse<T = any> {\n code: number;\n msg: string;\n data: T;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HttpService {\n private http = inject(HttpClient);\n private storeService = inject(StoreService);\n\n private readonly BASE_URL = '/api'; // 或者完整域名\n\n /**\n * 统一获取 Headers\n */\n private getHeaders(): HttpHeaders {\n return new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: `${this.storeService.getToken()}`,\n });\n }\n\n /**\n * GET 请求\n */\n public get<T>(url: string, params?: any): Observable<T> {\n return this.http.get<T>(this.formatUrl(url), {\n headers: this.getHeaders(),\n params: this.resolveParams(params),\n });\n }\n\n /**\n * POST 请求\n */\n public post<T>(url: string, body: any): Observable<T> {\n return this.http.post<T>(this.formatUrl(url), body, {\n headers: this.getHeaders(),\n });\n }\n\n /**\n * PUT 请求\n */\n public put<T>(url: string, body: any): Observable<T> {\n return this.http.put<T>(this.formatUrl(url), body, {\n headers: this.getHeaders(),\n });\n }\n\n /**\n * DELETE 请求\n * 兼容支持:既支持 URL 参数,也支持 Body\n */\n public delete<T>(url: string, params?: any, body?: any): Observable<T> {\n return this.http.request<T>('DELETE', this.formatUrl(url), {\n headers: this.getHeaders(),\n params: this.resolveParams(params),\n body: body, // HttpClient 的 delete() 方法默认不支持 body,需用 request() 通用方法\n });\n }\n\n // ================= 私有辅助方法 =================\n\n /**\n * 统一处理 URL\n * 比如自动拼接 BaseUrl,或者处理斜杠\n */\n private formatUrl(url: string): string {\n if (url.startsWith('http')) return url;\n // 确保拼接顺滑\n const baseUrl = this.storeService.getBaseUrl();\n const cleanBase = baseUrl.replace(/\\/$/, '');\n const cleanUrl = url.startsWith('/') ? url : `/${url}`;\n return `${cleanBase}${cleanUrl}`;\n }\n\n /**\n * 统一清洗参数\n * 过滤掉 null 和 undefined,防止传给后端 \"null\" 字符串\n */\n private resolveParams(params: any): HttpParams {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (value !== null && value !== undefined) {\n if (Array.isArray(value)) {\n // 支持数组参数 ids: [1, 2] => ids=1&ids=2\n value.forEach(val => (httpParams = httpParams.append(key, val)));\n } else {\n httpParams = httpParams.set(key, value);\n }\n }\n });\n }\n return httpParams;\n }\n}\n","import { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { ConversationGroup, Conversation } from '../../models/conversation.model';\nimport { StoreService } from '../../store/store.service';\nimport { NzModalService } from 'ng-zorro-antd/modal';\nimport { HttpService } from '../../services/http2.service';\nimport { NzMessageService } from 'ng-zorro-antd/message';\n\n@Component({\n selector: 'history-group',\n template: `\n <div class=\"group-container\">\n <div class=\"group-header\" (click)=\"toggleExpand()\">\n <div class=\"left\">\n <img src=\"assets/images/sidebar/time.png\" />\n <span class=\"date-text\">{{ group.dateLabel }}</span>\n </div>\n <div class=\"arrow-icon\" [class.rotated]=\"group.expanded\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n </div>\n\n <div class=\"group-content\" [@expandCollapse]=\"group.expanded ? 'expanded' : 'collapsed'\">\n <div\n *ngFor=\"let item of group.items\"\n class=\"history-item\"\n [class.active]=\"item.isActive\"\n (click)=\"selectConversation(item)\"\n >\n <span class=\"item-title\">{{ item.name }}</span>\n\n <img class=\"delete-img\" src=\"assets/images/sidebar/delete.png\" (click)=\"deleteConversation($event, item)\" />\n </div>\n </div>\n </div>\n `,\n styleUrls: ['./history-group.component.scss'],\n animations: [\n trigger('expandCollapse', [\n state('collapsed', style({ height: '0px', opacity: 0 })),\n state('expanded', style({ height: '*', opacity: 1 })),\n transition('expanded <=> collapsed', animate('300ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n ]),\n ],\n})\nexport class HistoryGroupComponent {\n @Input() group!: ConversationGroup;\n @Output() select = new EventEmitter<Conversation | null>();\n @Output() refresh = new EventEmitter<string>();\n currentSelected: Conversation | null = null;\n\n private storeService = inject(StoreService);\n private modalService = inject(NzModalService);\n private msg = inject(NzMessageService);\n private http = inject(HttpService);\n\n toggleExpand() {\n this.group.expanded = !this.group.expanded;\n }\n\n selectConversation(item: Conversation | null): void {\n if (item) {\n item.isActive = true;\n }\n this.currentSelected = item;\n this.select.emit(this.currentSelected);\n this.storeService.setCurrentConversation(this.currentSelected);\n }\n\n deleteConversation(e: Event, item: Conversation): void {\n e.stopPropagation();\n this.modalService.confirm({\n nzTitle: '删除对话',\n nzContent: `删除后无法恢复,是否确认删除“${item.name}”对话?`,\n nzOkText: '确定',\n nzCancelText: '取消',\n nzOnOk: () => {\n this.http.delete(`/api/ChatModel/conversation`, { iCode: item.iCode }).subscribe(res => {\n this.msg.success('删除成功');\n this.refresh.emit(item.iCode);\n });\n },\n });\n }\n}\n","// chat-sidebar.component.ts\nimport { Component, inject, OnInit, ViewChild } from '@angular/core';\nimport { Conversation, ConversationGroup } from '../models/conversation.model';\nimport { animate, style, transition, trigger } from '@angular/animations';\nimport { HttpService } from '../services/http.service';\nimport { StoreService } from '../store/store.service';\nimport { HistoryGroupComponent } from './history-group/history-group.component';\n\n@Component({\n selector: 'ngx-chat-sidebar',\n templateUrl: './chat-sidebar.component.html',\n styleUrls: ['./chat-sidebar.component.scss'],\n animations: [\n trigger('logoActionsAnimation', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateX(20px)' }),\n animate('600ms ease-out', style({ opacity: 1, transform: 'translateX(0)' })),\n ]),\n transition(':leave', [animate('0ms ease-in', style({ opacity: 0, transform: 'translateX(20px)' }))]),\n ]),\n ],\n})\nexport class ChatSidebarComponent implements OnInit {\n @ViewChild('historyGroupRef') historyGroupRef!: HistoryGroupComponent;\n private http = inject(HttpService);\n private storeService = inject(StoreService);\n\n isCollapsed = false;\n historyGroups: ConversationGroup[] = [];\n\n ngOnInit(): void {\n this.getHistory();\n }\n\n // 获取历史对话\n getHistory(needSelectFirst = false): void {\n this.http.get(`${this.storeService.getBaseUrl()}/api/ChatModel/conversation`).subscribe((res: Conversation[]) => {\n this.historyGroups = this.groupByFriendlyTime(res);\n // 选中第一个对话\n if (needSelectFirst) {\n if (this.historyGroups[0]?.items[0]) {\n this.historyGroupRef.selectConversation(this.historyGroups[0].items[0]);\n } else {\n this.historyGroupRef.selectConversation(null);\n }\n }\n });\n }\n\n // 删除后刷新,若删除当前选中会话\n refresh(conversationICode: string): void {\n const needSelectFirst = this.storeService.getConversationICode() === conversationICode;\n this.getHistory(needSelectFirst);\n }\n\n selectConversation(conversation: Conversation | null): void {\n // 取消勾选其他会话\n this.historyGroups.forEach(group => {\n group.items.forEach(item => {\n if (!conversation || conversation.iCode !== item.iCode) {\n item.isActive = false;\n }\n });\n });\n }\n\n toggleSidebar() {\n this.isCollapsed = !this.isCollapsed;\n }\n\n openNewChat(): void {\n this.historyGroupRef.selectConversation(null);\n }\n\n groupByFriendlyTime(dataList: Conversation[]): ConversationGroup[] {\n if (!dataList || dataList.length === 0) {\n return [];\n }\n\n const list: ConversationGroup[] = [];\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n dataList.forEach((item, index) => {\n const itemTime = new Date(item.time!);\n const itemDate = new Date(itemTime.getFullYear(), itemTime.getMonth(), itemTime.getDate());\n let dateLabel = '';\n item.isActive = false;\n\n if (itemDate.getTime() === today.getTime()) {\n dateLabel = '今天';\n } else if (itemDate.getTime() === yesterday.getTime()) {\n dateLabel = '昨天';\n } else {\n // 其他日期显示具体的年月日\n dateLabel = `${itemTime.getFullYear()}年${(itemTime.getMonth() + 1).toString().padStart(2, '0')}月${itemTime.getDate().toString().padStart(2, '0')}日`;\n }\n\n const find = list.find(item => item.dateLabel === dateLabel);\n if (find) {\n find.items.push(item);\n } else {\n const group: ConversationGroup = { dateLabel: '', expanded: index === 0, items: [] };\n group.dateLabel = dateLabel;\n group.items.push(item);\n list.push(group);\n }\n });\n\n return list;\n }\n}\n","<div class=\"sidebar\" [class.collapsed]=\"isCollapsed\">\n <div class=\"sidebar-inner\">\n <div class=\"sidebar-header\">\n <div class=\"logo-area\">\n <img src=\"assets/images/logo.png\" alt=\"Logo\" class=\"logo-img\" />\n <span class=\"app-name\">青清水利</span>\n </div>\n <button class=\"toggle-btn\" (click)=\"toggleSidebar()\">\n <img src=\"assets/images/sidebar/collapse.png\" />\n </button>\n </div>\n\n <div class=\"sidebar-content\">\n <button class=\"new-chat-btn\" (click)=\"openNewChat()\">\n <img src=\"assets/images/sidebar/new-chat.png\" />\n 开启新对话\n </button>\n\n <div class=\"divider\"></div>\n\n <div class=\"section-title\">\n <img src=\"assets/images/sidebar/history-chat.png\" />\n <span>历史对话</span>\n </div>\n\n <div class=\"history-list-scroll\" *ngIf=\"historyGroups.length\">\n <history-group\n #historyGroupRef\n *ngFor=\"let group of historyGroups\"\n [group]=\"group\"\n (select)=\"selectConversation($event)\"\n (refresh)=\"refresh($event)\"\n >\n </history-group>\n </div>\n\n <div class=\"history-empty\" *ngIf=\"!historyGroups.length\">暂无历史对话</div>\n </div>\n </div>\n</div>\n\n<div class=\"logo-actions\" [@logoActionsAnimation]=\"isCollapsed ? 'leave' : 'enter'\" *ngIf=\"isCollapsed\">\n <img src=\"assets/images/logo.png\" alt=\"Logo\" class=\"logo-img\" />\n <div class=\"left-top-bar\">\n <img src=\"assets/images/sidebar/expand.png\" (click)=\"toggleSidebar()\" />\n <img src=\"assets/images/sidebar/new-chat.png\" (click)=\"openNewChat()\" />\n </div>\n</div>\n","import { AfterViewInit, Component, inject, Input, NgZone, OnInit, ViewChild } from '@angular/core';\nimport { MarkdownStreamService } from './services/markdown-stream.service';\nimport { HttpService } from './services/http.service';\nimport { SseService } from './services/sse.service';\nimport { StoreService } from './store/store.service';\nimport { ISendMessage } from './models/send-message.model';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ChatMessagesComponent } from './chat-messages/chat-messages.component';\nimport { ChatSidebarComponent } from './chat-sidebar/chat-sidebar.component';\nimport { Message } from './models/message.model';\nimport { ChatInputComponent } from './chat-input/chat-input.component';\nimport { IKnowledgeList } from './models/knowledge-list.model';\n\n@Component({\n selector: 'ngx-agent-chat',\n templateUrl: 'chat.component.html',\n styleUrls: ['./chat.component.scss'],\n})\nexport class NgxAgentChatComponent implements OnInit, AfterViewInit {\n /**\n * 接口baseUrl配置\n */\n @Input() baseUrl = 'http://39.102.56.254:8082';\n @Input() token = '';\n @ViewChild('chatSidebarRef') chatSidebarRef!: ChatSidebarComponent;\n @ViewChild('chatMessagesRef') chatMessagesRef!: ChatMessagesComponent;\n @ViewChild('chatInputRef') chatInputRef!: ChatInputComponent;\n\n private md = inject(MarkdownStreamService);\n private httpService = inject(HttpService);\n private sseService = inject(SseService);\n private storeService = inject(StoreService);\n private sanitizer = inject(DomSanitizer);\n private ngZone = inject(NgZone);\n private resizeObserver!: ResizeObserver;\n\n messages: Message[] = []; // 消息数组\n\n ngOnInit(): void {\n this.storeService.setToken(this.token);\n this.storeService.setBaseUrl(this.baseUrl);\n this.sseService.conversationICode$.subscribe(iCodeObj => {\n if (iCodeObj) {\n const currentMsg = this.messages[this.messages.length - 1];\n currentMsg.iCode = iCodeObj.question;\n currentMsg.answers[currentMsg.answerIndex].iCode = iCodeObj.answer;\n }\n });\n this.sseService.thinking$.subscribe(text => {\n if (this.messages.length > 0) {\n const currentMsg = this.messages[this.messages.length - 1];\n currentMsg.answers[currentMsg.answerIndex].think = text;\n }\n });\n this.sseService.currentMessage$.subscribe(text => {\n if (this.messages.length > 0) {\n const currentMsg = this.messages[this.messages.length - 1];\n currentMsg.answers[currentMsg.answerIndex].content = text;\n }\n });\n\n this.storeService.currentConversation$.subscribe(conversation => {\n if (!conversation) {\n this.messages = [];\n return;\n }\n this.httpService\n .get(`${this.storeService.getBaseUrl()}/api/ChatModel/conversation/questions`, { iCode: conversation?.iCode })\n .subscribe((res: Message[]) => {\n this.messages = res.map(item => {\n item.answerIndex = 0;\n item.answers.forEach(answer => {\n answer.thinkExpand = true;\n });\n return item;\n });\n });\n });\n }\n\n ngAfterViewInit(): void {\n this.resizeObserver = new ResizeObserver(entries => {\n for (let entry of entries) {\n const newHeight = entry.contentRect.height;\n this.ngZone.run(() => {\n this.chatMessagesRef.inputHeight = newHeight + 60;\n });\n }\n });\n // 开始监听输入框元素\n this.resizeObserver.observe(this.chatInputRef.chatInputWrapper.nativeElement);\n }\n\n // 重新生成回答(仅最新的回答允许重新生成)\n regenerateAnswer(msg: Message): void {\n this.chatInputRef.regenerateSend(msg);\n }\n\n // 发起提问请求\n onSendMessage(event: { message: ISendMessage; isRegenerate: boolean }) {\n if (!event.isRegenerate) {\n // 推入一个新问答,iCode在流接收到补上\n const qa: Message = {\n iCode: '',\n question: event.message.question,\n answers: [\n {\n iCode: '',\n think: '',\n content: '',\n thinkExpand: true,\n },\n ],\n answerIndex: 0,\n };\n this.messages.push(qa);\n } else {\n const latestMessage = this.messages[this.messages.length - 1];\n latestMessage.answers.push({\n iCode: '',\n think: '',\n content: '',\n thinkExpand: true,\n });\n latestMessage.answerIndex = latestMessage.answers.length - 1;\n }\n this.sseService.streamChat(event.message).then(res => {\n // 开启新对话,刷新左侧历史对话\n if (!event.message.conversation) {\n this.chatSidebarRef.getHistory(true);\n }\n });\n }\n}\n","<div class=\"qq-agent\">\n <!-- 左侧边栏 -->\n <ngx-chat-sidebar #chatSidebarRef></ngx-chat-sidebar>\n\n <!-- 右侧主内容 -->\n <div class=\"agent-main\">\n <ngx-chat-messages #chatMessagesRef [messages]=\"messages\" (regenerateAnswer)=\"regenerateAnswer($event)\"></ngx-chat-messages>\n <ngx-chat-input #chatInputRef [messages]=\"messages\" (sendMessage)=\"onSendMessage($event)\"></ngx-chat-input>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgxAgentChatComponent } from './chat.component';\nimport { ChatInputComponent } from './chat-input/chat-input.component';\nimport { ChatMessagesComponent } from './chat-messages/chat-messages.component';\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\nimport { ChatSidebarComponent } from './chat-sidebar/chat-sidebar.component';\nimport { NzTagModule } from 'ng-zorro-antd/tag';\nimport { FormsModule } from '@angular/forms';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzListModule } from 'ng-zorro-antd/list';\nimport { NzSliderModule } from 'ng-zorro-antd/slider';\nimport { NzLayoutModule } from 'ng-zorro-antd/layout';\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { MarkdownPipe } from './pipes/markdown.pipe';\nimport { NzMessageService } from 'ng-zorro-antd/message';\nimport { NzPaginationModule } from 'ng-zorro-antd/pagination';\nimport { SimplePaginationComponent } from './components/pagination/pagination.component';\nimport { HistoryGroupComponent } from './chat-sidebar/history-group/history-group.component';\n\n@NgModule({\n declarations: [\n NgxAgentChatComponent,\n ChatInputComponent,\n ChatMessagesComponent,\n ChatSidebarComponent,\n SimplePaginationComponent,\n HistoryGroupComponent,\n ],\n imports: [\n CommonModule,\n NzAvatarModule,\n NzSpinModule,\n NzTagModule,\n NzInputModule,\n NzButtonModule,\n NzListModule,\n NzSliderModule,\n NzLayoutModule,\n NzPopoverModule,\n NzRadioModule,\n NzCheckboxModule,\n NzIconModule,\n NzPaginationModule,\n FormsModule,\n MarkdownPipe,\n ],\n providers: [NzMessageService],\n exports: [NgxAgentChatComponent],\n})\nexport class AgentChatModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["HttpService","i2.StoreService","i1","i2.SimplePaginationComponent","i3.MarkdownPipe","i2.HistoryGroupComponent","i1.ChatInputComponent","i2.ChatMessagesComponent","i3.ChatSidebarComponent"],"mappings":"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"}
|