Files
xk-ai-agent/internal/handler/knowledge_handler.go
2026-08-14 21:50:48 +08:00

95 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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",
},
})
}