index.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import request from '@/config/axios'
  2. import { fetchEventSource } from '@microsoft/fetch-event-source'
  3. import { getAccessToken } from '@/utils/auth'
  4. import { config } from '@/config/axios/config'
  5. // 聊天VO
  6. export interface ChatMessageVO {
  7. id: number // 编号
  8. conversationId: number // 对话编号
  9. type: string // 消息类型
  10. userId: string // 用户编号
  11. roleId: string // 角色编号
  12. model: number // 模型标志
  13. modelId: number // 模型编号
  14. content: string // 聊天内容
  15. reasoningContent?: string // 推理内容
  16. attachmentUrls?: string[] // 附件 URL 数组
  17. tokens: number // 消耗 Token 数量
  18. segmentIds?: number[] // 段落编号
  19. segments?: {
  20. id: number // 段落编号
  21. content: string // 段落内容
  22. documentId: number // 文档编号
  23. documentName: string // 文档名称
  24. }[]
  25. webSearchPages?: {
  26. name: string // 名称
  27. icon: string // 图标
  28. title: string // 标题
  29. url: string // URL
  30. snippet: string // 内容的简短描述
  31. summary: string // 内容的文本摘要
  32. }[]
  33. createTime: Date // 创建时间
  34. roleAvatar: string // 角色头像
  35. userAvatar: string // 用户头像
  36. }
  37. // AI chat 聊天
  38. export const ChatMessageApi = {
  39. // 消息列表
  40. getChatMessageListByConversationId: async (conversationId: number | null) => {
  41. return await request.get({
  42. url: `/ai/chat/message/list-by-conversation-id?conversationId=${conversationId}`
  43. })
  44. },
  45. // 发送 Stream 消息
  46. // 为什么不用 axios 呢?因为它不支持 SSE 调用
  47. sendChatMessageStream: async (
  48. conversationId: number,
  49. content: string,
  50. ctrl,
  51. enableContext: boolean,
  52. enableWebSearch: boolean,
  53. onMessage,
  54. onError,
  55. onClose,
  56. attachmentUrls?: string[]
  57. ) => {
  58. const token = getAccessToken()
  59. return fetchEventSource(`${config.base_url}/ai/chat/message/send-stream`, {
  60. method: 'post',
  61. headers: {
  62. 'Content-Type': 'application/json',
  63. Authorization: `Bearer ${token}`
  64. },
  65. openWhenHidden: true,
  66. body: JSON.stringify({
  67. conversationId,
  68. content,
  69. useContext: enableContext,
  70. useSearch: enableWebSearch,
  71. attachmentUrls: attachmentUrls || []
  72. }),
  73. onmessage: onMessage,
  74. onerror: onError,
  75. onclose: onClose,
  76. signal: ctrl.signal
  77. })
  78. },
  79. // 删除消息
  80. deleteChatMessage: async (id: string) => {
  81. return await request.delete({ url: `/ai/chat/message/delete?id=${id}` })
  82. },
  83. // 删除指定对话的消息
  84. deleteByConversationId: async (conversationId: number) => {
  85. return await request.delete({
  86. url: `/ai/chat/message/delete-by-conversation-id?conversationId=${conversationId}`
  87. })
  88. },
  89. // 获得消息分页
  90. getChatMessagePage: async (params: any) => {
  91. return await request.get({ url: '/ai/chat/message/page', params })
  92. },
  93. // 管理员删除消息
  94. deleteChatMessageByAdmin: async (id: number) => {
  95. return await request.delete({ url: `/ai/chat/message/delete-by-admin?id=${id}` })
  96. }
  97. }