Files
xk-ai-agent/internal/handler/knowledge_handler.go

95 lines
2.4 KiB
Go
Raw Permalink Normal View History

2026-08-14 21:50:48 +08:00
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",
},
})
}