@huajiwuyan/hello 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +68 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +448 -0
  4. package/package.json +38 -0
  5. package/templates/claude/commands/hello.md +760 -0
  6. package/templates/claude/skills/SKILL.md +90 -0
  7. package/templates/claude/skills/SKILL.toml +7 -0
  8. package/templates/claude/skills/assets/icon-large.svg +12 -0
  9. package/templates/claude/skills/assets/icon-small-400px.svg +12 -0
  10. package/templates/claude/skills/assets/templates/CHANGELOG.md +24 -0
  11. package/templates/claude/skills/assets/templates/CHANGELOG_{YYYY}.md +25 -0
  12. package/templates/claude/skills/assets/templates/INDEX.md +36 -0
  13. package/templates/claude/skills/assets/templates/archive/_index.md +22 -0
  14. package/templates/claude/skills/assets/templates/context.md +82 -0
  15. package/templates/claude/skills/assets/templates/modules/_index.md +22 -0
  16. package/templates/claude/skills/assets/templates/modules/module.md +35 -0
  17. package/templates/claude/skills/assets/templates/plan/proposal.md +104 -0
  18. package/templates/claude/skills/assets/templates/plan/tasks.md +49 -0
  19. package/templates/claude/skills/references/functions/auto.md +217 -0
  20. package/templates/claude/skills/references/functions/clean.md +167 -0
  21. package/templates/claude/skills/references/functions/commit.md +374 -0
  22. package/templates/claude/skills/references/functions/exec.md +178 -0
  23. package/templates/claude/skills/references/functions/help.md +105 -0
  24. package/templates/claude/skills/references/functions/init.md +228 -0
  25. package/templates/claude/skills/references/functions/plan.md +219 -0
  26. package/templates/claude/skills/references/functions/review.md +146 -0
  27. package/templates/claude/skills/references/functions/rollback.md +208 -0
  28. package/templates/claude/skills/references/functions/test.md +153 -0
  29. package/templates/claude/skills/references/functions/upgrade.md +371 -0
  30. package/templates/claude/skills/references/functions/validate.md +147 -0
  31. package/templates/claude/skills/references/rules/package.md +212 -0
  32. package/templates/claude/skills/references/rules/scaling.md +150 -0
  33. package/templates/claude/skills/references/rules/state.md +318 -0
  34. package/templates/claude/skills/references/rules/tools.md +371 -0
  35. package/templates/claude/skills/references/services/knowledge.md +408 -0
  36. package/templates/claude/skills/references/services/templates.md +344 -0
  37. package/templates/claude/skills/references/stages/analyze.md +201 -0
  38. package/templates/claude/skills/references/stages/design.md +379 -0
  39. package/templates/claude/skills/references/stages/develop.md +497 -0
  40. package/templates/claude/skills/references/stages/evaluate.md +286 -0
  41. package/templates/claude/skills/references/stages/tweak.md +244 -0
  42. package/templates/claude/skills/scripts/create_package.py +260 -0
  43. package/templates/claude/skills/scripts/list_packages.py +145 -0
  44. package/templates/claude/skills/scripts/migrate_package.py +399 -0
  45. package/templates/claude/skills/scripts/project_stats.py +438 -0
  46. package/templates/claude/skills/scripts/upgradewiki.py +321 -0
  47. package/templates/claude/skills/scripts/utils.py +596 -0
  48. package/templates/claude/skills/scripts/validate_package.py +309 -0
  49. package/templates/codex/prompts/hello.md +757 -0
  50. package/templates/codex/skills/SKILL.md +74 -0
  51. package/templates/codex/skills/SKILL.toml +7 -0
  52. package/templates/codex/skills/assets/icon-large.svg +12 -0
  53. package/templates/codex/skills/assets/icon-small-400px.svg +12 -0
  54. package/templates/codex/skills/assets/templates/CHANGELOG.md +24 -0
  55. package/templates/codex/skills/assets/templates/CHANGELOG_{YYYY}.md +25 -0
  56. package/templates/codex/skills/assets/templates/INDEX.md +36 -0
  57. package/templates/codex/skills/assets/templates/archive/_index.md +22 -0
  58. package/templates/codex/skills/assets/templates/context.md +82 -0
  59. package/templates/codex/skills/assets/templates/modules/_index.md +22 -0
  60. package/templates/codex/skills/assets/templates/modules/module.md +35 -0
  61. package/templates/codex/skills/assets/templates/plan/proposal.md +104 -0
  62. package/templates/codex/skills/assets/templates/plan/tasks.md +29 -0
  63. package/templates/codex/skills/references/functions/auto.md +181 -0
  64. package/templates/codex/skills/references/functions/brain.md +275 -0
  65. package/templates/codex/skills/references/functions/clean.md +154 -0
  66. package/templates/codex/skills/references/functions/commit.md +265 -0
  67. package/templates/codex/skills/references/functions/debug/condition-based-waiting.md +151 -0
  68. package/templates/codex/skills/references/functions/debug/defense-in-depth.md +147 -0
  69. package/templates/codex/skills/references/functions/debug/root-cause-tracing.md +168 -0
  70. package/templates/codex/skills/references/functions/debug.md +389 -0
  71. package/templates/codex/skills/references/functions/exec.md +153 -0
  72. package/templates/codex/skills/references/functions/help.md +101 -0
  73. package/templates/codex/skills/references/functions/init.md +221 -0
  74. package/templates/codex/skills/references/functions/plan.md +178 -0
  75. package/templates/codex/skills/references/functions/review.md +135 -0
  76. package/templates/codex/skills/references/functions/rlm.md +864 -0
  77. package/templates/codex/skills/references/functions/rollback.md +190 -0
  78. package/templates/codex/skills/references/functions/test.md +140 -0
  79. package/templates/codex/skills/references/functions/upgrade.md +363 -0
  80. package/templates/codex/skills/references/functions/validate.md +135 -0
  81. package/templates/codex/skills/references/rules/cache.md +136 -0
  82. package/templates/codex/skills/references/rules/scaling.md +124 -0
  83. package/templates/codex/skills/references/rules/state.md +201 -0
  84. package/templates/codex/skills/references/rules/tools.md +301 -0
  85. package/templates/codex/skills/references/services/attention.md +53 -0
  86. package/templates/codex/skills/references/services/knowledge.md +559 -0
  87. package/templates/codex/skills/references/services/package.md +383 -0
  88. package/templates/codex/skills/references/services/templates.md +390 -0
  89. package/templates/codex/skills/references/stages/analyze.md +191 -0
  90. package/templates/codex/skills/references/stages/design.md +355 -0
  91. package/templates/codex/skills/references/stages/develop.md +520 -0
  92. package/templates/codex/skills/references/stages/tweak.md +239 -0
  93. package/templates/codex/skills/rlm/__init__.py +39 -0
  94. package/templates/codex/skills/rlm/agent_orchestrator.py +422 -0
  95. package/templates/codex/skills/rlm/context_manager.py +366 -0
  96. package/templates/codex/skills/rlm/engine.py +915 -0
  97. package/templates/codex/skills/rlm/folding.py +391 -0
  98. package/templates/codex/skills/rlm/repl.py +452 -0
  99. package/templates/codex/skills/rlm/roles/analyzer.md +66 -0
  100. package/templates/codex/skills/rlm/roles/designer.md +94 -0
  101. package/templates/codex/skills/rlm/roles/explorer.md +43 -0
  102. package/templates/codex/skills/rlm/roles/implementer.md +62 -0
  103. package/templates/codex/skills/rlm/roles/kb_keeper.md +138 -0
  104. package/templates/codex/skills/rlm/roles/pkg_keeper.md +163 -0
  105. package/templates/codex/skills/rlm/roles/reviewer.md +74 -0
  106. package/templates/codex/skills/rlm/roles/synthesizer.md +90 -0
  107. package/templates/codex/skills/rlm/roles/tester.md +83 -0
  108. package/templates/codex/skills/rlm/schemas/agent_result.json +174 -0
  109. package/templates/codex/skills/rlm/session.py +376 -0
  110. package/templates/codex/skills/rlm/shared_tasks.py +370 -0
  111. package/templates/codex/skills/scripts/create_package.py +260 -0
  112. package/templates/codex/skills/scripts/list_packages.py +145 -0
  113. package/templates/codex/skills/scripts/migrate_package.py +399 -0
  114. package/templates/codex/skills/scripts/project_stats.py +438 -0
  115. package/templates/codex/skills/scripts/upgradewiki.py +321 -0
  116. package/templates/codex/skills/scripts/utils.py +596 -0
  117. package/templates/codex/skills/scripts/validate_package.py +309 -0
@@ -0,0 +1,239 @@
1
+ # 微调模式模块
2
+
3
+ 本模块定义微调模式(≤2文件且≤30行改动)的执行规则。
4
+
5
+ ---
6
+
7
+ ## 模块入口
8
+
9
+ ### 触发条件
10
+
11
+ ```yaml
12
+ 前置条件: 需求评估阶段复杂度判定为微调模式
13
+ 加载时机: 用户确认进入微调模式后加载
14
+ 特点: 直接修改代码,不创建方案包
15
+ ```
16
+
17
+ ### 状态设置
18
+
19
+ ```yaml
20
+ 设置时机: 本模块被加载时
21
+ 设置内容:
22
+ - CURRENT_STAGE = TWEAK
23
+ - 保持 WORKFLOW_MODE 不变(继承自需求评估阶段)
24
+ - 保持 STAGE_ENTRY_MODE = NATURAL
25
+ ```
26
+
27
+ ---
28
+
29
+ ## 执行模式适配
30
+
31
+ <mode_adaptation>
32
+
33
+ ### 模式行为
34
+
35
+ ```yaml
36
+ 读取状态变量: WORKFLOW_MODE
37
+
38
+ "交互模式"(INTERACTIVE,默认):
39
+ - 执行下方"执行流程"步骤1-7
40
+ - 完成后输出结果,等待用户确认
41
+
42
+ "全授权模式"(AUTO_FULL,~auto命令):
43
+ - 静默执行下方"执行流程"步骤1-7(不输出中间状态)
44
+ - 完成后在总结中列出微调结果
45
+ - 不单独输出微调完成状态
46
+
47
+ "规划模式"(AUTO_PLAN,~plan命令):
48
+ - "微调模式"不适用于~plan命令(~plan需要生成方案包)
49
+ - 如判定为微调,自动升级为"轻量迭代模式",进入项目分析和方案设计
50
+ ```
51
+
52
+ ### 阶段流转
53
+
54
+ ```yaml
55
+ 微调完成后:
56
+ 执行: 按 G6 状态重置协议执行
57
+ 输出: 按G3场景内容规则(完成场景)输出
58
+ ```
59
+
60
+ </mode_adaptation>
61
+
62
+ ---
63
+
64
+ ## 执行流程
65
+
66
+ > 📌 触发条件见 G5 微调模式
67
+
68
+ ### 步骤1: 知识库开关检查
69
+
70
+ 按 G1 "KB开关检查规则" 和 "KB_SKIPPED 变量生命周期" 执行。
71
+
72
+ ```yaml
73
+ 微调模式特殊规则:
74
+ - 无论 KB_CREATE_MODE 值如何,微调模式始终设置 KB_SKIPPED = true
75
+ - CHANGELOG 更新: 按 G1 "目录/文件自动创建规则 - CHANGELOG.md" 处理
76
+ - 原因: 微调模式是轻量级操作,不触发完整知识库创建
77
+ ```
78
+
79
+ ### 步骤2: 定位文件
80
+
81
+ ```yaml
82
+ 工具使用:
83
+ - 文件查找: 根据需求定位目标文件
84
+ - 内容搜索: 定位具体修改位置
85
+
86
+ 定位失败处理:
87
+ "交互模式": 询问用户确认
88
+ "全授权模式": 输出错误,终止流程
89
+ ```
90
+
91
+ ### 步骤3: 直接修改
92
+
93
+ ```yaml
94
+ 执行规则:
95
+ - 按需求直接修改代码
96
+ - 单次修改≤30行
97
+ - 不创建方案包
98
+
99
+ 修改前检查:
100
+ - 确认修改范围符合微调条件
101
+ - 如超出范围: 触发升级判定(见下方"升级判定"章节)
102
+ ```
103
+
104
+ ### 步骤4: 知识库同步
105
+
106
+ ```yaml
107
+ 执行规则: 按 G1 "目录/文件自动创建规则" 执行
108
+
109
+ CHANGELOG 更新(微调模式特殊规则):
110
+ 触发条件: 改动≤2文件且≤30行,无方案包
111
+ 记录位置: helloagents/CHANGELOG.md 的"微调"分类下
112
+ 记录格式: - **[模块名]**: 微调描述 + 类型标注 + 文件路径:行号范围
113
+
114
+ 例外规则(优先于 G1 KB_CREATE_MODE=3 的 ALWAYS 模式):
115
+ - 微调模式不触发完整知识库创建(即使 KB_CREATE_MODE=3)
116
+ - 仅更新 CHANGELOG(如 helloagents/ 目录已存在)
117
+ - 模块文档不存在时不创建
118
+ - KB_CREATE_MODE=0 且 helloagents/ 目录不存在时跳过 CHANGELOG 更新
119
+
120
+ 设计理由: 微调模式是轻量级操作,不应产生创建完整知识库的副作用
121
+ ```
122
+
123
+ ### 步骤5: 遗留方案包扫描
124
+
125
+ 按 G6 "遗留方案包扫描" 执行。
126
+
127
+ ### 步骤6: 微调后验收
128
+
129
+ > 按 G8 阶段验收标准(tweak)执行
130
+
131
+ ```yaml
132
+ 验收项:
133
+ - 变更已应用 (警告性): 确认代码已修改
134
+ - 基础功能正常 (警告性): 快速验证通过(如有测试)
135
+
136
+ 验收方式:
137
+ 变更验证:
138
+ - 确认目标文件已保存
139
+ - 确认变更内容与预期一致
140
+ - 检查是否有语法错误(如 IDE 或编译器报错)
141
+
142
+ 快速测试验证(如项目有测试):
143
+ 触发条件: 项目存在测试框架或测试文件
144
+ 验证范围:
145
+ - 优先: 与修改文件相关的单元测试
146
+ - 次选: 项目的快速冒烟测试(如有)
147
+ 验证方式:
148
+ - 执行测试命令,观察测试结果
149
+ - 仅关注与本次修改相关的测试失败
150
+ 跳过条件:
151
+ - 项目无测试框架
152
+ - 无法识别相关测试文件
153
+ - 测试执行超时(>30秒)
154
+
155
+ 验收失败处理:
156
+ 警告性失败:
157
+ - 记录到微调报告
158
+ - 提示用户检查变更
159
+ - 不阻塞流程完成
160
+
161
+ 自动模式行为: 静默执行,问题记录到验收报告
162
+ ```
163
+
164
+ ### 步骤7: 输出与流转
165
+
166
+ ```yaml
167
+ 输出: 按"执行模式适配 - 阶段流转"规则执行
168
+ ```
169
+
170
+ ---
171
+
172
+ ## 升级判定
173
+
174
+ ```yaml
175
+ 触发条件(执行过程中发现以下情况):
176
+ - 实际修改超过2个文件
177
+ - 实际修改超过30行
178
+ - 发现需要跨模块修改
179
+ - 检测到 EHRB 风险(按 G2 EHRB 检测规则)
180
+
181
+ "交互模式"处理:
182
+ 按G3场景内容规则(确认场景)输出升级询问
183
+
184
+ 用户选择处理:
185
+ 升级:
186
+ - 保存当前修改内容(不提交)
187
+ - 保持 WORKFLOW_MODE = INTERACTIVE
188
+ - 设置 CURRENT_STAGE = ANALYZE
189
+ - 进入轻量迭代流程(项目分析 → 方案设计)
190
+ - 方案包中包含已分析的修改内容
191
+ 强制继续:
192
+ - 继续微调模式
193
+ - 在CHANGELOG中标注"超范围微调"
194
+ 取消:
195
+ - 回滚已做的修改(如有)
196
+ - 按 G6 状态重置协议执行
197
+
198
+ "全授权模式"处理:
199
+ - 保持 WORKFLOW_MODE = AUTO_FULL(升级后继续静默执行)
200
+ - 设置 CURRENT_STAGE = ANALYZE
201
+ - 自动进入轻量迭代流程
202
+ - 在最终总结中标注升级原因
203
+
204
+ "规划模式"处理:
205
+ - 注意: ~plan命令在 G4 需求评估阶段会将微调升级为轻量迭代,不会进入tweak.md
206
+ - 如果意外进入: 保持 WORKFLOW_MODE = AUTO_PLAN,升级为轻量迭代
207
+ ```
208
+
209
+ ---
210
+
211
+ ## 用户选择处理
212
+
213
+ > 本章节定义微调模式需要用户确认的场景,供 G3 输出格式统一提取。
214
+
215
+ ### 场景: 升级判定确认
216
+
217
+ ```yaml
218
+ 内容要素:
219
+ - 升级原因: 触发升级的具体原因(超出文件数/行数/跨模块/EHRB)
220
+ - 当前修改: 已完成的修改内容摘要
221
+ - 升级说明: 升级后将进入轻量迭代流程
222
+
223
+ 选项:
224
+ 升级: 保存当前修改,进入轻量迭代流程
225
+ 强制继续: 继续微调模式,在CHANGELOG中标注"超范围微调"
226
+ 取消: 回滚已做的修改,按 G6 状态重置协议执行
227
+ ```
228
+
229
+ ### 场景: 微调后验收完成
230
+
231
+ ```yaml
232
+ 内容要素:
233
+ - 验收状态: 通过/部分通过
234
+ - 变更摘要: 修改的文件和行数
235
+ - 验证结果: 基础功能验证结果(如适用)
236
+ - 问题汇总: 警告信息(如有)
237
+
238
+ 输出格式: 按G3场景内容规则(完成场景)输出
239
+ ```
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ HelloAGENTS-RLM: Recursive Language Model Engine
5
+
6
+ 基于以下前沿技术:
7
+ - MIT RLM (Recursive Language Models) - Python REPL + 递归自调用
8
+ - Context Folding (OpenReview) - 子轨迹分支 + 折叠 + 摘要保留
9
+ - Google ADK - 三层上下文架构
10
+ - GPT-5.2-Codex - 原生Context Compaction
11
+
12
+ 核心特点:
13
+ - 零MCP预加载开销: 利用Codex原生spawn_agent
14
+ - 三层上下文分离: Working Context / Session Events / Memory
15
+ - 5层递归深度: 分治处理任意规模任务
16
+ - 24并行子Agent: 最大化利用Codex能力
17
+ - 主动Context Folding: 不被动等待溢出
18
+ """
19
+
20
+ from .engine import RLMEngine, RLMMode, AgentResult, FoldedTrajectory
21
+ from .context_manager import ContextManager, ContextLayer
22
+ from .agent_orchestrator import AgentOrchestrator, OrchestrationMode
23
+ from .folding import ContextFolder, FoldingStrategy
24
+ from .repl import RLMREPL
25
+
26
+ __version__ = "1.0.0"
27
+ __all__ = [
28
+ "RLMEngine",
29
+ "RLMMode",
30
+ "AgentResult",
31
+ "FoldedTrajectory",
32
+ "ContextManager",
33
+ "ContextLayer",
34
+ "AgentOrchestrator",
35
+ "OrchestrationMode",
36
+ "ContextFolder",
37
+ "FoldingStrategy",
38
+ "RLMREPL",
39
+ ]
@@ -0,0 +1,422 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ HelloAGENTS-RLM Agent Orchestrator
5
+ 子Agent编排器实现
6
+
7
+ 支持四种编排模式:
8
+ 1. Sequential Chain (顺序链)
9
+ 2. Parallel Fan-out (并行扇出)
10
+ 3. Divide & Conquer (分治递归)
11
+ 4. Expert Consultation (专家会诊)
12
+ """
13
+
14
+ import asyncio
15
+ from dataclasses import dataclass, field
16
+ from datetime import datetime
17
+ from enum import Enum
18
+ from typing import Any, Callable, Dict, List, Optional, Union
19
+
20
+ from .engine import RLMEngine, AgentResult
21
+
22
+
23
+ class OrchestrationMode(Enum):
24
+ """编排模式"""
25
+ SEQUENTIAL = "sequential" # 顺序链: A → B → C
26
+ PARALLEL = "parallel" # 并行扇出: → [A, B, C] →
27
+ DIVIDE_CONQUER = "divide" # 分治递归
28
+ EXPERT_CONSULT = "expert" # 专家会诊
29
+
30
+
31
+ @dataclass
32
+ class TaskNode:
33
+ """任务节点"""
34
+ task_id: str
35
+ role: str
36
+ task: str
37
+ context_hint: List[str] = field(default_factory=list)
38
+ depends_on: List[str] = field(default_factory=list)
39
+ timeout: int = 120
40
+ result: Optional[AgentResult] = None
41
+ status: str = "pending" # pending | running | completed | failed
42
+
43
+
44
+ @dataclass
45
+ class OrchestrationPlan:
46
+ """编排计划"""
47
+ mode: OrchestrationMode
48
+ nodes: List[TaskNode]
49
+ merge_strategy: str = "synthesize"
50
+ max_parallel: int = 24
51
+ metadata: Dict[str, Any] = field(default_factory=dict)
52
+
53
+
54
+ class AgentOrchestrator:
55
+ """
56
+ 子Agent编排器
57
+
58
+ 负责:
59
+ - 任务分解
60
+ - 依赖管理
61
+ - 并行/顺序执行
62
+ - 结果合并
63
+ """
64
+
65
+ def __init__(self, engine: RLMEngine):
66
+ self.engine = engine
67
+ self.task_counter = 0
68
+ self.execution_log: List[Dict[str, Any]] = []
69
+
70
+ # ==================== 编排模式实现 ====================
71
+
72
+ async def execute_sequential(
73
+ self,
74
+ tasks: List[Dict[str, Any]],
75
+ pass_output: bool = True,
76
+ ) -> List[AgentResult]:
77
+ """
78
+ 顺序链执行
79
+
80
+ Args:
81
+ tasks: 任务列表 [{role, task, context_hint}]
82
+ pass_output: 是否将前一任务输出传递给下一任务
83
+
84
+ Returns:
85
+ 按顺序执行的结果列表
86
+ """
87
+ results = []
88
+ previous_output = ""
89
+
90
+ for i, task_config in enumerate(tasks):
91
+ task_desc = task_config.get("task", "")
92
+
93
+ # 如果需要传递输出,替换模板
94
+ if pass_output and previous_output and "{{previous_output}}" in task_desc:
95
+ task_desc = task_desc.replace("{{previous_output}}", previous_output)
96
+ elif pass_output and previous_output:
97
+ task_desc = f"{task_desc}\n\n前置任务输出:\n{previous_output}"
98
+
99
+ result = await self.engine.spawn_agent(
100
+ role=task_config.get("role", "explorer"),
101
+ task=task_desc,
102
+ context_hint=task_config.get("context_hint"),
103
+ timeout=task_config.get("timeout", 120),
104
+ )
105
+
106
+ results.append(result)
107
+
108
+ # 记录日志
109
+ self._log_execution("sequential", i, task_config, result)
110
+
111
+ # 如果失败,根据策略决定是否继续
112
+ if result.status == "failed":
113
+ break
114
+
115
+ # 准备传递给下一任务的输出
116
+ previous_output = result.to_summary()
117
+
118
+ return results
119
+
120
+ async def execute_parallel(
121
+ self,
122
+ tasks: List[Dict[str, Any]],
123
+ merge_strategy: str = "synthesize",
124
+ ) -> tuple[List[AgentResult], str]:
125
+ """
126
+ 并行扇出执行
127
+
128
+ Args:
129
+ tasks: 任务列表
130
+ merge_strategy: 合并策略 (concat | synthesize | vote)
131
+
132
+ Returns:
133
+ (结果列表, 合并后的输出)
134
+ """
135
+ # 使用engine的batch方法并行执行
136
+ results = await self.engine.batch(tasks)
137
+
138
+ # 记录日志
139
+ for i, (task_config, result) in enumerate(zip(tasks, results)):
140
+ self._log_execution("parallel", i, task_config, result)
141
+
142
+ # 合并结果
143
+ merged = self.engine.merge(results, strategy=merge_strategy)
144
+
145
+ return results, merged
146
+
147
+ async def execute_divide_conquer(
148
+ self,
149
+ task: str,
150
+ subtasks: List[Dict[str, Any]],
151
+ synthesizer_prompt: str = "综合以下子任务结果",
152
+ max_depth: int = 3,
153
+ current_depth: int = 0,
154
+ ) -> AgentResult:
155
+ """
156
+ 分治递归执行
157
+
158
+ Args:
159
+ task: 主任务描述
160
+ subtasks: 子任务列表 (可嵌套)
161
+ synthesizer_prompt: 综合提示
162
+ max_depth: 最大递归深度
163
+ current_depth: 当前深度
164
+
165
+ Returns:
166
+ 综合后的结果
167
+ """
168
+ if current_depth >= max_depth:
169
+ # 达到最大深度,直接执行
170
+ return await self.engine.spawn_agent(
171
+ role="implementer",
172
+ task=task,
173
+ )
174
+
175
+ # 并行执行子任务
176
+ sub_results = []
177
+ for subtask in subtasks:
178
+ if "subtasks" in subtask:
179
+ # 递归处理嵌套子任务
180
+ result = await self.execute_divide_conquer(
181
+ task=subtask.get("task", ""),
182
+ subtasks=subtask.get("subtasks", []),
183
+ synthesizer_prompt=synthesizer_prompt,
184
+ max_depth=max_depth,
185
+ current_depth=current_depth + 1,
186
+ )
187
+ else:
188
+ # 叶子任务,直接执行
189
+ result = await self.engine.spawn_agent(
190
+ role=subtask.get("role", "implementer"),
191
+ task=subtask.get("task", ""),
192
+ context_hint=subtask.get("context_hint"),
193
+ )
194
+ sub_results.append(result)
195
+
196
+ # 综合子任务结果
197
+ merged = self.engine.merge(sub_results, strategy="synthesize")
198
+
199
+ # 使用synthesizer生成最终结果
200
+ final_result = await self.engine.spawn_agent(
201
+ role="synthesizer",
202
+ task=f"{synthesizer_prompt}\n\n子任务结果:\n{merged}",
203
+ )
204
+
205
+ return final_result
206
+
207
+ async def execute_expert_consultation(
208
+ self,
209
+ question: str,
210
+ perspectives: List[str],
211
+ final_decision_prompt: str = "基于以上专家意见,做出最终决策",
212
+ ) -> tuple[List[AgentResult], AgentResult]:
213
+ """
214
+ 专家会诊执行
215
+
216
+ Args:
217
+ question: 需要决策的问题
218
+ perspectives: 不同视角列表 (如: ["性能", "安全", "可维护性"])
219
+ final_decision_prompt: 最终决策提示
220
+
221
+ Returns:
222
+ (各专家意见列表, 最终决策)
223
+ """
224
+ # 构建多视角任务
225
+ expert_tasks = [
226
+ {
227
+ "role": "analyzer",
228
+ "task": f"从{perspective}角度分析: {question}",
229
+ }
230
+ for perspective in perspectives
231
+ ]
232
+
233
+ # 并行获取各专家意见
234
+ expert_results, merged_opinions = await self.execute_parallel(
235
+ tasks=expert_tasks,
236
+ merge_strategy="synthesize",
237
+ )
238
+
239
+ # 综合决策
240
+ final_decision = await self.engine.spawn_agent(
241
+ role="synthesizer",
242
+ task=f"{final_decision_prompt}\n\n各角度分析:\n{merged_opinions}\n\n原始问题: {question}",
243
+ )
244
+
245
+ return expert_results, final_decision
246
+
247
+ # ==================== 高级编排 ====================
248
+
249
+ async def execute_plan(self, plan: OrchestrationPlan) -> Dict[str, Any]:
250
+ """
251
+ 执行编排计划
252
+
253
+ Args:
254
+ plan: 编排计划
255
+
256
+ Returns:
257
+ 执行结果
258
+ """
259
+ start_time = datetime.now()
260
+
261
+ if plan.mode == OrchestrationMode.SEQUENTIAL:
262
+ tasks = [
263
+ {
264
+ "role": node.role,
265
+ "task": node.task,
266
+ "context_hint": node.context_hint,
267
+ "timeout": node.timeout,
268
+ }
269
+ for node in plan.nodes
270
+ ]
271
+ results = await self.execute_sequential(tasks)
272
+ merged = self.engine.merge(results, strategy=plan.merge_strategy)
273
+
274
+ elif plan.mode == OrchestrationMode.PARALLEL:
275
+ tasks = [
276
+ {
277
+ "role": node.role,
278
+ "task": node.task,
279
+ "context_hint": node.context_hint,
280
+ "timeout": node.timeout,
281
+ }
282
+ for node in plan.nodes
283
+ ]
284
+ results, merged = await self.execute_parallel(
285
+ tasks=tasks,
286
+ merge_strategy=plan.merge_strategy,
287
+ )
288
+
289
+ elif plan.mode == OrchestrationMode.DIVIDE_CONQUER:
290
+ # 转换为分治结构
291
+ main_task = plan.metadata.get("main_task", "执行任务")
292
+ subtasks = [
293
+ {"role": node.role, "task": node.task, "context_hint": node.context_hint}
294
+ for node in plan.nodes
295
+ ]
296
+ result = await self.execute_divide_conquer(
297
+ task=main_task,
298
+ subtasks=subtasks,
299
+ )
300
+ results = [result]
301
+ merged = result.to_summary()
302
+
303
+ elif plan.mode == OrchestrationMode.EXPERT_CONSULT:
304
+ question = plan.metadata.get("question", "")
305
+ perspectives = [node.task for node in plan.nodes]
306
+ results, final = await self.execute_expert_consultation(
307
+ question=question,
308
+ perspectives=perspectives,
309
+ )
310
+ results.append(final)
311
+ merged = final.to_summary()
312
+
313
+ else:
314
+ raise ValueError(f"未知编排模式: {plan.mode}")
315
+
316
+ execution_time = (datetime.now() - start_time).total_seconds()
317
+
318
+ return {
319
+ "mode": plan.mode.value,
320
+ "results": [r.to_dict() for r in results],
321
+ "merged": merged,
322
+ "execution_time": execution_time,
323
+ "node_count": len(plan.nodes),
324
+ }
325
+
326
+ # ==================== 便捷方法 ====================
327
+
328
+ def create_sequential_plan(
329
+ self,
330
+ tasks: List[Dict[str, Any]],
331
+ ) -> OrchestrationPlan:
332
+ """创建顺序编排计划"""
333
+ nodes = []
334
+ for i, task in enumerate(tasks):
335
+ node = TaskNode(
336
+ task_id=f"seq_{i}",
337
+ role=task.get("role", "explorer"),
338
+ task=task.get("task", ""),
339
+ context_hint=task.get("context_hint", []),
340
+ depends_on=[f"seq_{i-1}"] if i > 0 else [],
341
+ )
342
+ nodes.append(node)
343
+
344
+ return OrchestrationPlan(
345
+ mode=OrchestrationMode.SEQUENTIAL,
346
+ nodes=nodes,
347
+ )
348
+
349
+ def create_parallel_plan(
350
+ self,
351
+ tasks: List[Dict[str, Any]],
352
+ merge_strategy: str = "synthesize",
353
+ ) -> OrchestrationPlan:
354
+ """创建并行编排计划"""
355
+ nodes = [
356
+ TaskNode(
357
+ task_id=f"par_{i}",
358
+ role=task.get("role", "explorer"),
359
+ task=task.get("task", ""),
360
+ context_hint=task.get("context_hint", []),
361
+ )
362
+ for i, task in enumerate(tasks)
363
+ ]
364
+
365
+ return OrchestrationPlan(
366
+ mode=OrchestrationMode.PARALLEL,
367
+ nodes=nodes,
368
+ merge_strategy=merge_strategy,
369
+ )
370
+
371
+ def create_expert_plan(
372
+ self,
373
+ question: str,
374
+ perspectives: List[str],
375
+ ) -> OrchestrationPlan:
376
+ """创建专家会诊计划"""
377
+ nodes = [
378
+ TaskNode(
379
+ task_id=f"expert_{i}",
380
+ role="analyzer",
381
+ task=perspective,
382
+ )
383
+ for i, perspective in enumerate(perspectives)
384
+ ]
385
+
386
+ return OrchestrationPlan(
387
+ mode=OrchestrationMode.EXPERT_CONSULT,
388
+ nodes=nodes,
389
+ metadata={"question": question},
390
+ )
391
+
392
+ # ==================== 内部方法 ====================
393
+
394
+ def _generate_task_id(self) -> str:
395
+ """生成任务ID"""
396
+ self.task_counter += 1
397
+ return f"task_{self.task_counter}_{datetime.now().strftime('%H%M%S')}"
398
+
399
+ def _log_execution(
400
+ self,
401
+ mode: str,
402
+ index: int,
403
+ task_config: Dict[str, Any],
404
+ result: AgentResult,
405
+ ):
406
+ """记录执行日志"""
407
+ self.execution_log.append({
408
+ "mode": mode,
409
+ "index": index,
410
+ "role": task_config.get("role"),
411
+ "task": task_config.get("task", "")[:100],
412
+ "status": result.status,
413
+ "timestamp": datetime.now().isoformat(),
414
+ })
415
+
416
+ def get_execution_log(self) -> List[Dict[str, Any]]:
417
+ """获取执行日志"""
418
+ return self.execution_log
419
+
420
+ def clear_execution_log(self):
421
+ """清空执行日志"""
422
+ self.execution_log.clear()