package handler import ( "tcm-agent/internal/agent" "github.com/gin-gonic/gin" ) // KnowledgeHandler 知识库接口处理器 // 提供:检索知识库、上传文档等能力 type KnowledgeHandler struct { agentRunner *agent.Runner } // NewKnowledgeHandler 创建知识库处理器 func NewKnowledgeHandler(runner *agent.Runner) *KnowledgeHandler { return &KnowledgeHandler{agentRunner: runner} } // SearchRequest 知识检索请求 type SearchRequest struct { Query string `json:"query" binding:"required"` // 检索关键词 TopK int `json:"top_k"` // 返回条数(默认5) } // Search 检索知识库 // POST /api/v1/knowledge/search // // 直接调用MaxKB的RAG检索能力 // 用于:查询方剂组成、药典条目、诊疗规范等 func (h *KnowledgeHandler) Search(c *gin.Context) { var req SearchRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": "查询关键词不能为空"}) return } if req.TopK <= 0 { req.TopK = 5 } // 调用MaxKB检索 answer, err := h.agentRunner.MaxKB().Chat(c.Request.Context(), req.Query) if err != nil { c.JSON(500, gin.H{ "error": "知识库检索失败", "detail": err.Error(), }) return } c.JSON(200, gin.H{ "code": 200, "data": gin.H{ "query": req.Query, "answer": answer, "source": "MaxKB RAG", "top_k": req.TopK, }, }) } // IngestRequest 文档上传请求 type IngestRequest struct { Title string `json:"title" binding:"required"` // 文档标题 Content string `json:"content" binding:"required"` // 文档内容 Category string `json:"category"` // 分类(方剂/药典/指南/病历模板) } // Ingest 上传文档到知识库 // POST /api/v1/knowledge/ingest // // 将文档写入MaxKB知识库,触发自动向量化 // 支持后续RAG检索 func (h *KnowledgeHandler) Ingest(c *gin.Context) { var req IngestRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": "标题和内容不能为空"}) return } // 实际项目中调用MaxKB的文档上传API // 这里返回模拟成功 c.JSON(200, gin.H{ "code": 200, "message": "文档已加入知识库队列", "data": gin.H{ "title": req.Title, "category": req.Category, "status": "pending_vectorization", "note": "实际项目请调用MaxKB文档上传API", }, }) }