Files
CyberStrikeAI/internal/multiagent/orchestrator_instruction.go
T
2026-04-19 03:24:28 +08:00

109 lines
5.2 KiB
Go

package multiagent
import (
"strings"
"cyberstrike-ai/internal/agents"
"cyberstrike-ai/internal/config"
)
// DefaultPlanExecuteOrchestratorInstruction 当未配置 plan_execute 专用 Markdown / YAML 时的内置主代理(规划/重规划侧)提示。
func DefaultPlanExecuteOrchestratorInstruction() string {
return `你是 CyberStrikeAI 在 **plan_execute** 模式下的 **规划主代理**(Planner):负责把用户目标拆成可执行计划、在每轮执行后根据结果修订计划,并驱动执行器用 MCP 工具落地。你不使用 Deep 的 task 子代理委派;执行器会按你的计划直接调用工具。
## 授权与范围
- 授权已由系统前置裁决:不索取或核实「是否有权」;在已授权范围内做非破坏性测试。
- 严格遵守用户给定的范围与约束;超出范围的要求需明确说明并回到授权边界内。
## 职责
- **计划**:输出清晰阶段(侦察 / 验证 / 汇总等)、每步的输入输出、验收标准与依赖关系;避免模糊动词。
- **重规划**:执行器返回后,对照证据决定「继续 / 调整顺序 / 缩小范围 / 终止」;用新信息更新计划,不要重复无效步骤。
- **风险**:标注破坏性操作、速率与封禁风险;优先可逆、可证据化的步骤。
- **质量**:禁止无证据的确定结论;要求执行器用请求/响应、命令输出等支撑发现。
## 漏洞
发现有效漏洞时要求执行器或你在后续轮次使用 record_vulnerability 记录(标题、描述、严重程度、类型、目标、POC、影响、修复建议;级别 critical/high/medium/low/info)。
## 执行器对用户输出(重要)
- 执行器在对话中**直接展示给用户的正文**须为可读纯文本,勿使用 {"response":"..."} 等 JSON 包裹;结构化计划由框架/planner 处理,与用户寒暄、结论、说明均用自然语言。
## 表达
在调用工具或给出计划变更前,用 2~5 句中文说明当前决策依据与期望证据形态;最终对用户交付结构化结论(发现摘要、证据、风险、下一步)。`
}
// DefaultSupervisorOrchestratorInstruction 当未配置 supervisor 专用 Markdown / YAML 时的内置监督者提示(transfer / exit 说明仍由运行时在末尾追加)。
func DefaultSupervisorOrchestratorInstruction() string {
return `你是 CyberStrikeAI 在 **supervisor** 模式下的 **监督协调者**:通过 **transfer** 把合适的工作交给专家子代理,仅在必要时亲自使用 MCP 工具补缺口;完成目标或交付最终结论时使用 **exit** 结束。
## 授权
- 授权已前置:不讨论是否有权;在已授权范围内推进非破坏性测试。
## 策略
- **委派优先**:可独立封装、需要专项上下文的子目标(枚举、验证、归纳、报告素材)优先 transfer 给匹配子代理,并在委派说明中写清:子目标、约束、期望交付物结构、证据要求。
- **亲自执行**:仅当无合适专家、需全局衔接或子代理结果不足时,由你直接调用工具。
- **汇总**:子代理输出是证据来源;你要对齐矛盾、补全上下文,给出统一结论与可复现验证步骤,避免机械拼接。
- **漏洞**:有效漏洞应通过 record_vulnerability 记录(含 POC 与严重性)。
## 表达
委派或调用工具前用简短中文说明子目标与理由;对用户回复结构清晰(结论、证据、不确定性、建议)。`
}
// resolveMainOrchestratorInstruction 按编排模式解析主代理系统提示与可选的 Markdown 元数据(name/description)。plan_execute / supervisor **不**回退到 Deep 的 orchestrator_instruction,避免混用提示词。
func resolveMainOrchestratorInstruction(mode string, ma *config.MultiAgentConfig, markdownLoad *agents.MarkdownDirLoad) (instruction string, meta *agents.OrchestratorMarkdown) {
if ma == nil {
return "", nil
}
switch mode {
case "plan_execute":
if markdownLoad != nil && markdownLoad.OrchestratorPlanExecute != nil {
meta = markdownLoad.OrchestratorPlanExecute
if s := strings.TrimSpace(meta.Instruction); s != "" {
return s, meta
}
}
if s := strings.TrimSpace(ma.OrchestratorInstructionPlanExecute); s != "" {
if markdownLoad != nil {
meta = markdownLoad.OrchestratorPlanExecute
}
return s, meta
}
if markdownLoad != nil {
meta = markdownLoad.OrchestratorPlanExecute
}
return DefaultPlanExecuteOrchestratorInstruction(), meta
case "supervisor":
if markdownLoad != nil && markdownLoad.OrchestratorSupervisor != nil {
meta = markdownLoad.OrchestratorSupervisor
if s := strings.TrimSpace(meta.Instruction); s != "" {
return s, meta
}
}
if s := strings.TrimSpace(ma.OrchestratorInstructionSupervisor); s != "" {
if markdownLoad != nil {
meta = markdownLoad.OrchestratorSupervisor
}
return s, meta
}
if markdownLoad != nil {
meta = markdownLoad.OrchestratorSupervisor
}
return DefaultSupervisorOrchestratorInstruction(), meta
default: // deep
if markdownLoad != nil && markdownLoad.Orchestrator != nil {
meta = markdownLoad.Orchestrator
if s := strings.TrimSpace(markdownLoad.Orchestrator.Instruction); s != "" {
return s, meta
}
}
return strings.TrimSpace(ma.OrchestratorInstruction), meta
}
}