agentControllers.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package controllers
  2. import (
  3. "errors"
  4. "github.com/gofiber/fiber/v2"
  5. "github.com/gofiber/fiber/v2/utils"
  6. "go.uber.org/zap"
  7. "fwh-toolbox-server/config"
  8. "fwh-toolbox-server/middleware"
  9. "fwh-toolbox-server/services"
  10. "fwh-toolbox-server/utils/agentserver"
  11. )
  12. // 新 AI 助手(AgentServer)接口,见 docs/ai-assistant-agentserver/technical-design.md §3.4、§3.5
  13. var agentService *services.AgentService
  14. // InitAgent 初始化新 AI 助手
  15. func InitAgent(cfg config.AgentConfig) {
  16. agentService = services.NewAgentService(cfg)
  17. zap.L().Info("[Agent] 初始化", zap.Bool("enabled", cfg.Enabled), zap.String("server", cfg.ServerURL))
  18. }
  19. func agentEnabled(c *fiber.Ctx) bool {
  20. return agentService != nil && agentService.Enabled(middleware.AuthGetRoleNameList(c))
  21. }
  22. // AgentGuard 未开启或角色不允许时,/agent/* 一律返回 403(/agent/config 除外)
  23. func AgentGuard(c *fiber.Ctx) error {
  24. if !agentEnabled(c) {
  25. return Forbidden(c, "AI 助手未开启或无权使用")
  26. }
  27. return c.Next()
  28. }
  29. // GetAgentConfig 新助手对当前用户是否可用
  30. // GET /agent/config
  31. func GetAgentConfig(c *fiber.Ctx) error {
  32. return Success(c, fiber.Map{"enabled": agentEnabled(c)})
  33. }
  34. // ListAgentSessions 本人会话列表
  35. // GET /agent/sessions
  36. func ListAgentSessions(c *fiber.Ctx) error {
  37. list, err := agentService.ListSessions(c.UserContext(), middleware.AuthGetUserName(c))
  38. if err != nil {
  39. return Error(c, "获取会话列表失败: "+err.Error())
  40. }
  41. return Success(c, list)
  42. }
  43. // CreateAgentSession 新建会话
  44. // POST /agent/sessions
  45. func CreateAgentSession(c *fiber.Ctx) error {
  46. item, err := agentService.CreateSession(c.UserContext(), middleware.AuthGetUserName(c), middleware.AuthGetRoleNameList(c))
  47. if err != nil {
  48. zap.L().Warn("[Agent] 创建会话失败", zap.Error(err))
  49. return Error(c, "创建会话失败: "+err.Error())
  50. }
  51. return Success(c, fiber.Map{"sessionId": item.SessionId, "title": item.Title, "profileId": item.ProfileId})
  52. }
  53. // UpdateAgentSession 修改会话标题
  54. // PATCH /agent/sessions/:id
  55. func UpdateAgentSession(c *fiber.Ctx) error {
  56. sessionId := utils.CopyString(c.Params("id"))
  57. var req struct {
  58. Title string `json:"title"`
  59. }
  60. if err := c.BodyParser(&req); err != nil {
  61. return Fail(c, "Invalid request body")
  62. }
  63. err := agentService.RenameSession(c.UserContext(), middleware.AuthGetUserName(c), sessionId, req.Title)
  64. if errors.Is(err, services.ErrAgentSessionNotFound) {
  65. return NotFound(c, err.Error())
  66. }
  67. if err != nil {
  68. return Error(c, "修改标题失败: "+err.Error())
  69. }
  70. return Success[any](c, nil, "标题已更新")
  71. }
  72. // DeleteAgentSession 删除会话
  73. // DELETE /agent/sessions/:id
  74. func DeleteAgentSession(c *fiber.Ctx) error {
  75. sessionId := utils.CopyString(c.Params("id"))
  76. err := agentService.DeleteSession(c.UserContext(), middleware.AuthGetUserName(c), sessionId)
  77. if errors.Is(err, services.ErrAgentSessionNotFound) {
  78. return NotFound(c, err.Error())
  79. }
  80. if err != nil {
  81. return Error(c, "删除会话失败: "+err.Error())
  82. }
  83. return Success[any](c, nil, "会话已删除")
  84. }
  85. // ProxyAgentServer AgentServer 代理,响应原样透传(不包装 Success)
  86. // ALL /agent/v1/*
  87. func ProxyAgentServer(c *fiber.Ctx) error {
  88. if !agentEnabled(c) {
  89. return agentserver.WriteError(c, fiber.StatusForbidden, "forbidden", "AI 助手未开启或无权使用")
  90. }
  91. rest := utils.CopyString(c.Params("*"))
  92. return agentService.Proxy().Handle(c, middleware.AuthGetUserName(c), rest)
  93. }