api.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * 对象关系分析 · AI 研判接口
  3. *
  4. * 会话 CRUD 走 aiHttp(裸响应,/insight/** 与 /chat/** 同为无 Result 包装);
  5. * 流式走 ai/api/sse 的通用 SSE 解析器(与 AI 数据分析页共用同一份实现,
  6. * 事件协议同构,只多一帧 insight)。
  7. */
  8. import { aiHttp } from '@/ai/api/http';
  9. import { streamSse } from '@/ai/api/sse';
  10. import { resolveApiUrl } from '@/ai/utils/constants';
  11. import type { SseHandlers } from '@/ai/api/types';
  12. import type {
  13. InsightClueVO,
  14. InsightCreateParams,
  15. InsightMessagePage,
  16. InsightMessageTraceVO,
  17. InsightSessionVO,
  18. InsightStreamParams,
  19. } from './types';
  20. /** 控制器前缀(aiHttp 会自动补 /js + /a) */
  21. const BASE = '/insight';
  22. /** 流式地址(fetch 不走 defHttp,需自己拼全路径) */
  23. const STREAM_URL = resolveApiUrl(`${BASE}/stream`);
  24. /** 创建研判会话:拼装动态系统提示词 + 固化上下文快照 */
  25. export function createInsightSession(params: InsightCreateParams): Promise<InsightSessionVO> {
  26. return aiHttp.postRaw<InsightSessionVO>(`${BASE}/sessions`, params as unknown as Record<string, any>);
  27. }
  28. /** 历史分析记录(抽屉「历史」下拉) */
  29. export function listInsightSessions(caseId: string | number, scope = 'BATCH'): Promise<InsightSessionVO[]> {
  30. return aiHttp.getRaw<InsightSessionVO[]>(`${BASE}/sessions`, { caseId, scope });
  31. }
  32. /** 会话详情(含上下文摘要) */
  33. export function getInsightSession(id: string | number, caseId: string | number): Promise<InsightSessionVO> {
  34. return aiHttp.getRaw<InsightSessionVO>(`${BASE}/sessions/${id}`, { caseId });
  35. }
  36. /** 消息分页:page 从 1 开始(第 1 页 = 最新的 N 条),排序由服务端写死为 seq DESC */
  37. export function listInsightMessages(
  38. id: string | number,
  39. caseId: string | number,
  40. page = 1,
  41. limit = 20,
  42. ): Promise<InsightMessagePage> {
  43. return aiHttp.getRaw<InsightMessagePage>(`${BASE}/sessions/${id}/messages`, { caseId, page, limit });
  44. }
  45. /** 单条消息的工具调用明细 + 思考过程(大字段,按需拉) */
  46. export function getInsightMessageTrace(
  47. messageId: string | number,
  48. caseId: string | number,
  49. ): Promise<InsightMessageTraceVO> {
  50. return aiHttp.getRaw<InsightMessageTraceVO>(`${BASE}/messages/${messageId}/trace`, { caseId });
  51. }
  52. /** 删除会话(消息随外键级联) */
  53. export function deleteInsightSession(id: string | number, caseId: string | number): Promise<void> {
  54. return aiHttp.getRaw<void>(`${BASE}/sessions/${id}/delete`, { caseId });
  55. }
  56. /** 线索聚合(为「线索推送」页预留,本期不接页面) */
  57. export function listInsightClues(caseId: string | number, level?: string, limit?: number): Promise<InsightClueVO[]> {
  58. return aiHttp.getRaw<InsightClueVO[]>(`${BASE}/clues`, { caseId, level, limit });
  59. }
  60. /**
  61. * 流式分析。
  62. *
  63. * @param params 入参(首轮 message 留空)
  64. * @param handlers 事件回调(onInsight 为研判专属帧)
  65. * @param signal 中止信号
  66. */
  67. export function streamInsight(params: InsightStreamParams, handlers: SseHandlers, signal?: AbortSignal): Promise<void> {
  68. return streamSse(STREAM_URL, params, handlers, signal);
  69. }