Files
hms/apps/web/src/api/ai/knowledge.ts
iven 8b88cb4a50 feat(ai): Phase 3A RAG 知识库 — CRUD API + Agent Tool + 向量知识源 + 前端管理页
- 知识库 REST API: 10 个端点 (references/guides CRUD + re-embed)
- search_medical_knowledge Agent Tool: 语义检索参考资料和临床指南
- VectorKnowledgeSource: 实现 KnowledgeSource trait,自动降级
- 沙箱配置: Patient/MedicalStaff 允许使用知识库检索
- 前端 AiKnowledgePage: Tabs(参考资料/临床指南) + Table + Modal CRUD
- 权限码 seed 迁移: ai.knowledge.list + ai.knowledge.manage + 菜单
2026-05-19 09:10:53 +08:00

111 lines
3.0 KiB
TypeScript

import client from '../client';
// === Types ===
export interface KnowledgeReference {
id: string;
tenant_id: string;
title: string;
analysis_type: string;
source_name: string;
content_summary: string;
tags: Record<string, unknown> | null;
is_enabled: boolean;
created_at: string;
updated_at: string;
}
export interface KnowledgeGuide {
id: string;
tenant_id: string;
title: string;
analysis_type: string;
content: string;
category: string | null;
is_enabled: boolean;
created_at: string;
updated_at: string;
}
export interface CreateReferenceReq {
title: string;
analysis_type: string;
source_name: string;
content_summary: string;
tags?: Record<string, unknown>;
is_enabled?: boolean;
}
export interface UpdateReferenceReq {
title?: string;
analysis_type?: string;
source_name?: string;
content_summary?: string;
tags?: Record<string, unknown>;
is_enabled?: boolean;
}
export interface CreateGuideReq {
title: string;
analysis_type: string;
content: string;
category?: string;
is_enabled?: boolean;
}
export interface UpdateGuideReq {
title?: string;
analysis_type?: string;
content?: string;
category?: string;
is_enabled?: boolean;
}
// === API ===
export const knowledgeApi = {
// References
listReferences: async (params?: { analysis_type?: string }) => {
const resp = await client.get('/ai/knowledge/references', { params });
return resp.data.data as { data: KnowledgeReference[]; total: number };
},
createReference: async (data: CreateReferenceReq) => {
const resp = await client.post('/ai/knowledge/references', data);
return resp.data.data as { id: string };
},
updateReference: async (id: string, data: UpdateReferenceReq) => {
const resp = await client.put(`/ai/knowledge/references/${id}`, data);
return resp.data.data as { id: string };
},
deleteReference: async (id: string) => {
const resp = await client.delete(`/ai/knowledge/references/${id}`);
return resp.data.data as { id: string };
},
reEmbedReference: async (id: string) => {
const resp = await client.post(`/ai/knowledge/references/${id}/re-embed`);
return resp.data.data as { id: string };
},
// Guides
listGuides: async (params?: { analysis_type?: string }) => {
const resp = await client.get('/ai/knowledge/guides', { params });
return resp.data.data as { data: KnowledgeGuide[]; total: number };
},
createGuide: async (data: CreateGuideReq) => {
const resp = await client.post('/ai/knowledge/guides', data);
return resp.data.data as { id: string };
},
updateGuide: async (id: string, data: UpdateGuideReq) => {
const resp = await client.put(`/ai/knowledge/guides/${id}`, data);
return resp.data.data as { id: string };
},
deleteGuide: async (id: string) => {
const resp = await client.delete(`/ai/knowledge/guides/${id}`);
return resp.data.data as { id: string };
},
reEmbedGuide: async (id: string) => {
const resp = await client.post(`/ai/knowledge/guides/${id}/re-embed`);
return resp.data.data as { id: string };
},
};