From da8fdafe59df52d4874924217516969763badf37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Wed, 3 Jun 2026 17:13:54 +0800 Subject: [PATCH] Add files via upload --- internal/app/app.go | 3 +++ internal/app/vision_tools.go | 13 +++++++++++++ internal/multiagent/eino_single_runner.go | 1 + internal/multiagent/runner.go | 4 +++- 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 internal/app/vision_tools.go diff --git a/internal/app/app.go b/internal/app/app.go index 40f2dd50..573ad64b 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -113,6 +113,7 @@ func New(cfg *config.Config, log *logger.Logger, configPath string) (*App, error // 注册漏洞记录工具 registerVulnerabilityTools(mcpServer, db, log.Logger) registerProjectFactTools(mcpServer, db, cfg, log.Logger) + registerVisionTools(mcpServer, cfg, log.Logger) if cfg.Auth.GeneratedPassword != "" { config.PrintGeneratedPasswordWarning(cfg.Auth.GeneratedPassword, cfg.Auth.GeneratedPasswordPersisted, cfg.Auth.GeneratedPasswordPersistErr) @@ -418,6 +419,7 @@ func New(cfg *config.Config, log *logger.Logger, configPath string) (*App, error vulnerabilityRegistrar := func() error { registerVulnerabilityTools(mcpServer, db, log.Logger) registerProjectFactTools(mcpServer, db, cfg, log.Logger) + registerVisionTools(mcpServer, cfg, log.Logger) return nil } configHandler.SetVulnerabilityToolRegistrar(vulnerabilityRegistrar) @@ -888,6 +890,7 @@ func setupRoutes( protected.PUT("/config", configHandler.UpdateConfig) protected.POST("/config/apply", configHandler.ApplyConfig) protected.POST("/config/test-openai", configHandler.TestOpenAI) + protected.POST("/config/test-vision", configHandler.TestVision) // 系统设置 - 终端(执行命令,提高运维效率) protected.POST("/terminal/run", terminalHandler.RunCommand) diff --git a/internal/app/vision_tools.go b/internal/app/vision_tools.go new file mode 100644 index 00000000..f833588a --- /dev/null +++ b/internal/app/vision_tools.go @@ -0,0 +1,13 @@ +package app + +import ( + "cyberstrike-ai/internal/config" + "cyberstrike-ai/internal/mcp" + "cyberstrike-ai/internal/vision" + + "go.uber.org/zap" +) + +func registerVisionTools(mcpServer *mcp.Server, cfg *config.Config, logger *zap.Logger) { + vision.RegisterAnalyzeImageTool(mcpServer, cfg, logger) +} diff --git a/internal/multiagent/eino_single_runner.go b/internal/multiagent/eino_single_runner.go index 06ff1fd0..50dc9acc 100644 --- a/internal/multiagent/eino_single_runner.go +++ b/internal/multiagent/eino_single_runner.go @@ -180,6 +180,7 @@ func RunEinoSingleChatModelAgent( EmitInternalEvents: true, } ins := project.AppendSystemPromptBlock(ag.EinoSingleAgentSystemInstruction(), systemPromptExtra) + ins = project.AppendVisionImageAnalysisIfReady(ins, appCfg.Vision.Ready()) ins = injectToolNamesOnlyInstruction(ctx, ins, mainTools, singleToolSearchActive) if logger != nil { names := collectToolNames(ctx, mainTools) diff --git a/internal/multiagent/runner.go b/internal/multiagent/runner.go index 6e33fcd3..0d126001 100644 --- a/internal/multiagent/runner.go +++ b/internal/multiagent/runner.go @@ -262,7 +262,8 @@ func RunDeepAgent( subHandlers = append(subHandlers, teleMw) } - subInstrFinal := injectToolNamesOnlyInstruction(ctx, instr, subTools, subToolSearchActive) + subInstrFinal := project.AppendVisionImageAnalysisIfReady(instr, appCfg.Vision.Ready()) + subInstrFinal = injectToolNamesOnlyInstruction(ctx, subInstrFinal, subTools, subToolSearchActive) if logger != nil { subNames := collectToolNames(ctx, subTools) mountedNames := collectToolNames(ctx, subToolsForCfg) @@ -342,6 +343,7 @@ func RunDeepAgent( } orchInstruction = project.AppendSystemPromptBlock(orchInstruction, systemPromptExtra) + orchInstruction = project.AppendVisionImageAnalysisIfReady(orchInstruction, appCfg.Vision.Ready()) orchInstruction = injectToolNamesOnlyInstruction(ctx, orchInstruction, mainTools, mainToolSearchActive) if logger != nil { mainNames := collectToolNames(ctx, mainTools)