diff --git a/server/cmd/api/main.go b/server/cmd/api/main.go index 79b97f4..2919e23 100644 --- a/server/cmd/api/main.go +++ b/server/cmd/api/main.go @@ -151,7 +151,7 @@ func main() { } // 3. 自动迁移表 - db.AutoMigrate(&model.DatabaseInfo{}, &model.SubTableInfo{}, &model.ModelInfo{}, &model.KnowledgeBase{}, &model.KnowledgeDocument{}, &model.User{}, &model.Role{}, &model.Tool{}, &model.MCP{}) + db.AutoMigrate(&model.DatabaseInfo{}, &model.SubTableInfo{}, &model.ModelInfo{}, &model.KnowledgeBase{}, &model.KnowledgeDocument{}, &model.User{}, &model.Role{}, &model.Tool{}, &model.MCP{}, &model.Skill{}, &model.Agent{}, &model.AgentSkill{}, &model.AgentKnowledgeBase{}, &model.AgentMemory{}, &model.AgentTeam{}, &model.AgentTask{}) // 3.1 确保 users 和 roles 表存在(使用 SQL 强制创建) db.Exec(` @@ -198,6 +198,46 @@ func main() { ) `) + // 3.3 确保 MCP 表存在 + db.Exec(` + CREATE TABLE IF NOT EXISTS mcp ( + id VARCHAR(191) PRIMARY KEY, + name VARCHAR(100) UNIQUE NOT NULL, + description TEXT, + description_cn TEXT, + category VARCHAR(50) NOT NULL, + transport VARCHAR(20) DEFAULT 'stdio', + command VARCHAR(500), + args TEXT, + env TEXT, + status VARCHAR(20) DEFAULT 'active', + created_at DATETIME(3), + updated_at DATETIME(3), + INDEX idx_mcp_name (name), + INDEX idx_mcp_category (category), + INDEX idx_mcp_status (status) + ) + `) + log.Println("MCP table verified/created") + + // 3.4 确保 skills 表存在 + db.Exec(` + CREATE TABLE IF NOT EXISTS skills ( + id VARCHAR(191) PRIMARY KEY, + skill_name VARCHAR(200) NOT NULL, + skill_type VARCHAR(20) NOT NULL, + skill_desc TEXT, + path VARCHAR(500), + status VARCHAR(20) DEFAULT 'active', + created_at DATETIME(3), + updated_at DATETIME(3), + INDEX idx_skills_name (skill_name), + INDEX idx_skills_type (skill_type), + INDEX idx_skills_status (status) + ) + `) + log.Println("Skills table verified/created") + // 使用GORM Migrator添加缺失的列 migrator := db.Migrator() if !migrator.HasColumn(&model.Tool{}, "security_level") { @@ -236,6 +276,8 @@ func main() { userRepo := repository.NewUserRepository(db) toolRepo := repository.NewToolRepository(db) mcpRepo := repository.NewMCPRepository(db) + skillRepo := repository.NewSkillRepository(db) + agentRepo := repository.NewAgentRepository(db) // 4.1 初始化默认管理员用户 initDefaultAdmin(userRepo) @@ -253,6 +295,9 @@ func main() { authService := service.NewAuthService(cfg.JWTSecret, userRepo) toolService := service.NewToolService(toolRepo) mcpService := service.NewMCPService(mcpRepo) + skillService := service.NewSkillService(skillRepo) + agentService := service.NewAgentService(cfg.PythonServiceURL) + memoryService := service.NewMemoryService(agentRepo) // 4.2 初始化默认工具 if err := toolService.InitDefaultTools(); err != nil { @@ -261,6 +306,13 @@ func main() { log.Println("Default tools initialized") } + // 4.3 初始化 skills + if err := skillService.InitSkills(); err != nil { + log.Printf("Warning: Failed to init skills: %v", err) + } else { + log.Println("Skills initialized") + } + // 6. 初始化 Handler dbHandler := handler.NewDatabaseHandler(dbService) subTableHandler := handler.NewSubTableHandler(subTableService) @@ -271,6 +323,9 @@ func main() { authHandler := handler.NewAuthHandler(authService) toolHandler := handler.NewToolHandler(toolService) mcpHandler := handler.NewMCPHandler(mcpService) + skillHandler := handler.NewSkillHandler(skillService) + agentHandler := handler.NewAgentHandler(agentService) + memoryHandler := handler.NewMemoryHandler(memoryService) var uploadHandler *handler.UploadHandler if uploadService != nil { uploadHandler = handler.NewUploadHandler(uploadService, knowledgeRepo) @@ -425,6 +480,32 @@ func main() { mcpGroup.DELETE("/:id", mcpHandler.Delete) } + // Skill管理模块 + skillGroup := r.Group("/skill") + { + skillGroup.GET("/list", skillHandler.List) + skillGroup.GET("/sync", skillHandler.Sync) + skillGroup.GET("/:id", skillHandler.GetByID) + skillGroup.POST("/add", skillHandler.Create) + skillGroup.PUT("/:id", skillHandler.Update) + skillGroup.DELETE("/:id", skillHandler.Delete) + } + + // Agent管理模块 (调用 Python Agent Engine) + agentGroup := r.Group("/api/agent") + { + agentGroup.POST("/chat", agentHandler.Chat) + agentGroup.POST("/team/chat", agentHandler.TeamChat) + } + + // 记忆管理模块 + memoryGroup := r.Group("/api/agent/:id/memories") + { + memoryGroup.GET("", memoryHandler.GetMemories) + memoryGroup.POST("", memoryHandler.CreateMemory) + memoryGroup.DELETE("/:memory_id", memoryHandler.DeleteMemory) + } + // Swagger 文档 r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) diff --git a/server/internal/service/model_service.go b/server/internal/service/model_service.go index 427beff..428b305 100644 --- a/server/internal/service/model_service.go +++ b/server/internal/service/model_service.go @@ -137,15 +137,15 @@ func (s *ModelService) TestConnection(req model.TestModelRequest) (*model.TestMo // chat 模型使用 /chat/completions switch req.Provider { case "OpenAI": - baseURL = baseURL + "/v1/chat/completions" + baseURL = baseURL + "/chat/completions" case "Ollama": baseURL = baseURL + "/api/chat" case "ali", "Ali", "aliyun", "Aliyun": // 阿里云 DashScope 兼容 OpenAI 格式 baseURL = baseURL + "/chat/completions" default: - // 默认使用 OpenAI 兼容格式 - baseURL = baseURL + "/v1/chat/completions" + // 默认使用 /chat/completions + baseURL = baseURL + "/chat/completions" } } }