feat: 💬 新增对话创建与上下文记忆机制 * 新增对话的创建与使用功能,实现会话级上下文隔离 * 实现上下文保存与传递机制,使模型具备持续对话记忆能力 * 引入滑动窗口策略控制上下文规模 * 当前窗口大小限制为 20 条消息,超过后自动丢弃最早消息以控制上下文长度 docs: 📝 更新示例配置文件 * 更新示例配置文件,新增 `agent` 相关配置信息 * 明确 Agent 模块运行所需参数,方便本地部署与环境初始化 undo: ⚠️ Agent 上下文读取性能待优化 * 当前测试中模型响应速度偏慢 * 计划后续将上下文暂存至缓存层,以减少读取与拼接开销并提升响应速度
58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
|
|
"github.com/LoveLosita/smartflow/backend/model"
|
|
"github.com/LoveLosita/smartflow/backend/respond"
|
|
"github.com/LoveLosita/smartflow/backend/service"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type AgentHandler struct {
|
|
svc *service.AgentService
|
|
}
|
|
|
|
// NewAgentHandler 组装 Handler 的“工厂”
|
|
func NewAgentHandler(svc *service.AgentService) *AgentHandler {
|
|
return &AgentHandler{
|
|
svc: svc, // 把传进来的 Service 揣进口袋里
|
|
}
|
|
}
|
|
|
|
func (api *AgentHandler) ChatAgent(c *gin.Context) {
|
|
// 1. 设置请求头
|
|
c.Writer.Header().Set("Content-Type", "text/event-stream")
|
|
c.Writer.Header().Set("Cache-Control", "no-cache")
|
|
c.Writer.Header().Set("Connection", "keep-alive")
|
|
c.Writer.Header().Set("Transfer-Encoding", "chunked")
|
|
// 2. 从请求中获取用户输入
|
|
var req model.UserSendMessageRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, respond.WrongParamType)
|
|
return
|
|
}
|
|
userID := c.GetInt("user_id") // 从上下文中获取用户 ID
|
|
// 3. 调用 Service 层的聊天方法,获取输出通道和错误通道
|
|
outChan, errChan := api.svc.AgentChat(c.Request.Context(), req.Message, userID, req.ConversationID)
|
|
// 4. 循环转发消息/错误
|
|
c.Stream(func(w io.Writer) bool {
|
|
select {
|
|
case err, ok := <-errChan:
|
|
if ok && err != nil {
|
|
respond.DealWithError(c, err)
|
|
}
|
|
return false
|
|
case msg, ok := <-outChan:
|
|
if !ok {
|
|
return false
|
|
}
|
|
c.SSEvent("message", msg) // 发送 SSE 格式消息
|
|
return true
|
|
case <-c.Request.Context().Done():
|
|
return false
|
|
}
|
|
})
|
|
}
|