From ab5c2d5cca7898c68b4da1304fd65e9053582046 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, 24 Jun 2026 23:27:29 +0800 Subject: [PATCH] Add files via upload --- internal/app/app.go | 3 +- internal/handler/agent.go | 4 +-- internal/handler/batch_queue_executor.go | 4 +-- internal/handler/eino_single_agent.go | 4 +-- internal/handler/multi_agent.go | 4 +-- internal/handler/project_context.go | 36 ++++++++++++++++++++++++ internal/projectprompt/shell_tools.go | 2 +- 7 files changed, 47 insertions(+), 10 deletions(-) diff --git a/internal/app/app.go b/internal/app/app.go index c508a5a4..d31d916f 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -305,7 +305,8 @@ func New(cfg *config.Config, log *logger.Logger, configPath string) (*App, error // Match eino_adk_run_loop: checkpoint_dir is used as configured (relative to process CWD when not absolute). checkpointBase := strings.TrimSpace(cfg.MultiAgent.EinoMiddleware.CheckpointDir) reductionRoot := strings.TrimSpace(cfg.MultiAgent.EinoMiddleware.ReductionRootDir) - db.SetEinoConversationDirs(plantaskBase, checkpointBase, reductionRoot) + workspaceRoot := strings.TrimSpace(cfg.Agent.WorkspaceRootDir) + db.SetEinoConversationDirs(plantaskBase, checkpointBase, reductionRoot, workspaceRoot) agent.SetPromptBaseDir(configDir) agentsDir := cfg.AgentsDir diff --git a/internal/handler/agent.go b/internal/handler/agent.go index 67b7aa6b..ae05ba1f 100644 --- a/internal/handler/agent.go +++ b/internal/handler/agent.go @@ -652,7 +652,7 @@ func (h *AgentHandler) runRobotEinoSingleWithRetry( ) (string, string, error) { resultMA, errMA := multiagent.RunEinoSingleChatModelAgent( taskCtx, h.config, &h.config.MultiAgent, h.agent, h.db, h.logger, - conversationID, h.conversationProjectID(conversationID), finalMessage, history, roleTools, progressCallback, nil, h.projectBlackboardBlock(conversationID), + conversationID, h.conversationProjectID(conversationID), finalMessage, history, roleTools, progressCallback, nil, h.agentSessionContextBlock(conversationID), ) if errMA != nil { *taskStatus = "failed" @@ -673,7 +673,7 @@ func (h *AgentHandler) runRobotMultiAgentWithRetry( resultMA, errMA := multiagent.RunDeepAgent( taskCtx, h.config, &h.config.MultiAgent, h.agent, h.db, h.logger, conversationID, h.conversationProjectID(conversationID), finalMessage, history, roleTools, progressCallback, - h.agentsMarkdownDir, orchestration, nil, h.projectBlackboardBlock(conversationID), + h.agentsMarkdownDir, orchestration, nil, h.agentSessionContextBlock(conversationID), ) if errMA != nil { *taskStatus = "failed" diff --git a/internal/handler/batch_queue_executor.go b/internal/handler/batch_queue_executor.go index 06640be9..4709d172 100644 --- a/internal/handler/batch_queue_executor.go +++ b/internal/handler/batch_queue_executor.go @@ -232,12 +232,12 @@ func (h *AgentHandler) executeOneBatchSubTask(queueID string, queue *BatchTaskQu var runErr error switch { case useBatchMulti: - resultMA, runErr = multiagent.RunDeepAgent(taskCtx, h.config, &h.config.MultiAgent, h.agent, h.db, h.logger, conversationID, h.conversationProjectID(conversationID), finalMessage, []agent.ChatMessage{}, roleTools, progressCallback, h.agentsMarkdownDir, batchOrch, nil, h.projectBlackboardBlock(conversationID)) + resultMA, runErr = multiagent.RunDeepAgent(taskCtx, h.config, &h.config.MultiAgent, h.agent, h.db, h.logger, conversationID, h.conversationProjectID(conversationID), finalMessage, []agent.ChatMessage{}, roleTools, progressCallback, h.agentsMarkdownDir, batchOrch, nil, h.agentSessionContextBlock(conversationID)) default: if h.config == nil { runErr = fmt.Errorf("服务器配置未加载") } else { - resultMA, runErr = multiagent.RunEinoSingleChatModelAgent(taskCtx, h.config, &h.config.MultiAgent, h.agent, h.db, h.logger, conversationID, h.conversationProjectID(conversationID), finalMessage, []agent.ChatMessage{}, roleTools, progressCallback, nil, h.projectBlackboardBlock(conversationID)) + resultMA, runErr = multiagent.RunEinoSingleChatModelAgent(taskCtx, h.config, &h.config.MultiAgent, h.agent, h.db, h.logger, conversationID, h.conversationProjectID(conversationID), finalMessage, []agent.ChatMessage{}, roleTools, progressCallback, nil, h.agentSessionContextBlock(conversationID)) } } diff --git a/internal/handler/eino_single_agent.go b/internal/handler/eino_single_agent.go index f9d4cba6..54b8e978 100644 --- a/internal/handler/eino_single_agent.go +++ b/internal/handler/eino_single_agent.go @@ -231,7 +231,7 @@ func (h *AgentHandler) EinoSingleAgentLoopStream(c *gin.Context) { roleTools, progressCallback, chatReasoningToClientIntent(req.Reasoning), - h.projectBlackboardBlock(conversationID), + h.agentSessionContextBlock(conversationID), ) if result != nil && len(result.MCPExecutionIDs) > 0 { @@ -416,7 +416,7 @@ func (h *AgentHandler) EinoSingleAgentLoop(c *gin.Context) { prep.RoleTools, progressCallback, chatReasoningToClientIntent(req.Reasoning), - h.projectBlackboardBlock(prep.ConversationID), + h.agentSessionContextBlock(prep.ConversationID), ) if runErr == nil { break diff --git a/internal/handler/multi_agent.go b/internal/handler/multi_agent.go index 850ee14c..cbf97ef8 100644 --- a/internal/handler/multi_agent.go +++ b/internal/handler/multi_agent.go @@ -243,7 +243,7 @@ func (h *AgentHandler) MultiAgentLoopStream(c *gin.Context) { h.agentsMarkdownDir, orch, chatReasoningToClientIntent(req.Reasoning), - h.projectBlackboardBlock(conversationID), + h.agentSessionContextBlock(conversationID), ) if result != nil && len(result.MCPExecutionIDs) > 0 { @@ -430,7 +430,7 @@ func (h *AgentHandler) MultiAgentLoop(c *gin.Context) { h.agentsMarkdownDir, strings.TrimSpace(req.Orchestration), chatReasoningToClientIntent(req.Reasoning), - h.projectBlackboardBlock(prep.ConversationID), + h.agentSessionContextBlock(prep.ConversationID), ) if runErr == nil { break diff --git a/internal/handler/project_context.go b/internal/handler/project_context.go index 1d0826d1..ef8eb7e5 100644 --- a/internal/handler/project_context.go +++ b/internal/handler/project_context.go @@ -7,6 +7,42 @@ import ( "go.uber.org/zap" ) +// agentSessionContextBlock 注入会话工作目录与项目黑板(用于 system prompt 追加块)。 +func (h *AgentHandler) agentSessionContextBlock(conversationID string) string { + var parts []string + if ws := h.buildWorkspaceBlock(conversationID); ws != "" { + parts = append(parts, ws) + } + if bb := h.projectBlackboardBlock(conversationID); bb != "" { + parts = append(parts, bb) + } + return strings.Join(parts, "\n\n") +} + +func (h *AgentHandler) buildWorkspaceBlock(conversationID string) string { + if h == nil || h.config == nil { + return "" + } + conversationID = strings.TrimSpace(conversationID) + if conversationID == "" { + return "" + } + projectID := h.conversationProjectID(conversationID) + rel := project.WorkspaceRootDir(h.config.Agent.WorkspaceRootDir, projectID, conversationID) + abs, err := project.EnsureWorkspace(rel) + if err != nil { + if h.logger != nil { + h.logger.Warn("创建会话工作目录失败", + zap.String("conversationId", conversationID), + zap.String("projectId", projectID), + zap.String("path", rel), + zap.Error(err)) + } + return "" + } + return project.BuildWorkspaceBlock(abs) +} + // projectBlackboardBlock 根据对话 ID 构建项目事实索引块(用于注入 system prompt)。 func (h *AgentHandler) projectBlackboardBlock(conversationID string) string { if h == nil || h.db == nil || h.config == nil { diff --git a/internal/projectprompt/shell_tools.go b/internal/projectprompt/shell_tools.go index 2f285e84..f5e98809 100644 --- a/internal/projectprompt/shell_tools.go +++ b/internal/projectprompt/shell_tools.go @@ -2,7 +2,7 @@ package projectprompt // ShellExecExecuteGuidanceSection 供单代理/多代理系统提示追加:exec 与 execute 分工(尽量短)。 func ShellExecExecuteGuidanceSection() string { - return `Shell(exec/execute):有专用 MCP 工具时优先专用工具;系统命令(管道、workdir、后台 &)用 exec;skills/ 内脚本(配合 read_file、skill)用 execute;多步扫描分拆调用,禁止一条 shell 串多个扫描器。` + return `Shell(exec/execute):有专用 MCP 工具时优先专用工具;系统命令(管道、workdir、后台 &)用 exec;skills/ 内脚本(配合 read_file、skill)用 execute;多步扫描分拆调用,禁止一条 shell 串多个扫描器。下载/临时文件须写入系统提示中的「会话工作目录」,禁止用 /tmp。` } // ShellExecExecuteGuidanceReconSuffix 侦察子代理可选追加(一行)。