91c9ee4b2d
广播逻辑重构: - AI 回复 (stream_start/response/stream_segments/multi_message/stream_end) 改用 broadcastToUser 发送给所有客户端 - 用户消息回显保持 broadcastToUserExcept 排除发送者 消息去重与角色修复: - CacheMessage(user) 移至回复生成后,避免本轮 LLM 调用出现重复用户消息 - action 角色消息在 DB 存储时映射为 assistant,DeepSeek 等模型不支持自定义角色 - stream_end defer 机制确保错误路径也会终止客户端思考指示器 OS 完整环境支持: - host 包重构为 HostBackend 接口 + Direct/WSL/Docker 三种后端 - 新增 os_exec/os_file/os_system 工具供 AI 在完整 Linux 环境中自由操作 其他: - 视觉模型注入 + 图片预处理后清空 Images 避免传给 Chat 模型 - 图片 URL 相对路径→绝对 URL 转换 - DevTools 链路追踪页面 + 重启修复 - 记忆搜索模糊匹配增强 - 后台思考定时调度支持 - 管理后台页面 (模型配置/用户管理等) - docs/api 更新广播机制说明 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/yourname/cyrene-ai/gateway/internal/config"
|
|
)
|
|
|
|
// ThinkingScheduleHandler handles CRUD for the thinking schedule config.
|
|
type ThinkingScheduleHandler struct {
|
|
store *config.ThinkingScheduleStore
|
|
}
|
|
|
|
// NewThinkingScheduleHandler creates a new handler.
|
|
func NewThinkingScheduleHandler(store *config.ThinkingScheduleStore) *ThinkingScheduleHandler {
|
|
return &ThinkingScheduleHandler{store: store}
|
|
}
|
|
|
|
// GetSchedule returns the current schedule config.
|
|
// GET /api/v1/admin/thinking-schedule
|
|
func (h *ThinkingScheduleHandler) GetSchedule(c *gin.Context) {
|
|
cfg := h.store.GetConfig()
|
|
if cfg == nil {
|
|
cfg = config.DefaultThinkingScheduleConfig()
|
|
}
|
|
c.JSON(http.StatusOK, cfg)
|
|
}
|
|
|
|
// SetSchedule replaces the entire schedule config.
|
|
// PUT /api/v1/admin/thinking-schedule
|
|
func (h *ThinkingScheduleHandler) SetSchedule(c *gin.Context) {
|
|
var cfg config.ThinkingScheduleConfig
|
|
if err := c.ShouldBindJSON(&cfg); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数无效: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
if err := h.store.SetConfig(&cfg); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"status": "saved"})
|
|
}
|