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

103 lines
2.5 KiB
Go
Raw Permalink Normal View History

2026-08-14 21:50:48 +08:00
package handler
import (
"net/http"
"tcm-agent/internal/service"
"github.com/gin-gonic/gin"
)
// ========================================================================
// EnhancerHandler —— 知识增强接口的 HTTP 处理器
// ========================================================================
// 对接 PHP 端的 TcmAgentClient提供 POST /api/v1/agent/enhance 端点。
// PHP 端拿到的响应里包含 content + steps会把 steps 写入 xk_ai_generation_step。
// ========================================================================
// EnhancerHandler 知识增强接口处理器
type EnhancerHandler struct {
svc *service.EnhancerService
}
// NewEnhancerHandler 构造函数
func NewEnhancerHandler(svc *service.EnhancerService) *EnhancerHandler {
return &EnhancerHandler{svc: svc}
}
// Enhance HTTP 入口
//
// POST /api/v1/agent/enhance
//
// 请求体(与 service.EnhanceRequest 一致):
//
// {
// "scene": "medical_record",
// "context": "痰湿中阻 煎法",
// "messages": [
// {"role": "system", "content": "..."},
// {"role": "user", "content": "..."}
// ],
// "kb_enabled": true,
// "top_k": 5,
// "provider": "" // 空 = 按 scene 路由
// }
//
// 响应:
//
// {
// "code": 200,
// "data": {
2026-08-15 17:05:22 +08:00
// "content": "...", // 第一份成功(兼容)
// "contents": ["..."], // 仅成功内容
// "results": [{index,ok,content,error,steps}], // 多份时按槽位
2026-08-14 21:50:48 +08:00
// "provider": "spark",
// "model": "spark-max",
// "steps": [...],
// "total_ms": 1234
// }
// }
func (h *EnhancerHandler) Enhance(c *gin.Context) {
if h.svc == nil {
c.JSON(http.StatusServiceUnavailable, gin.H{
"code": 503,
"message": "知识增强服务未初始化",
})
return
}
var req service.EnhanceRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": "参数错误: " + err.Error(),
})
return
}
// 校验messages 至少 1 条
if len(req.Messages) == 0 {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": "messages 不能为空",
})
return
}
resp, err := h.svc.Enhance(c.Request.Context(), &req)
if err != nil {
// 业务失败:仍然把已收集的 steps 返回,让 PHP 能记录失败过程
c.JSON(http.StatusOK, gin.H{
"code": 500,
"message": err.Error(),
"data": resp,
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 200,
"data": resp,
})
}