auto-sync: 2026-05-29 07:55:09
This commit is contained in:
@@ -213,3 +213,107 @@ class BootstrapBuilder:
|
|||||||
project_context=project_context,
|
project_context=project_context,
|
||||||
experiences=experiences,
|
experiences=experiences,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def build_for_review(
|
||||||
|
self,
|
||||||
|
parent_task: Any,
|
||||||
|
summary: Dict[str, Any],
|
||||||
|
outputs: List[Dict[str, Any]],
|
||||||
|
comments: List[Dict[str, Any]],
|
||||||
|
round_num: int,
|
||||||
|
max_rounds: int = 5,
|
||||||
|
project_config: Optional[Dict] = None,
|
||||||
|
) -> str:
|
||||||
|
"""从 parent task 构建庞统 review 上下文(便捷方法)
|
||||||
|
|
||||||
|
Args:
|
||||||
|
parent_task: parent Task 对象
|
||||||
|
summary: get_subtasks_summary() 返回的状态摘要
|
||||||
|
outputs: get_aggregate_outputs() 返回的产出列表
|
||||||
|
comments: get_round_comments() 返回的讨论列表
|
||||||
|
round_num: 当前轮次
|
||||||
|
max_rounds: 最大轮次
|
||||||
|
project_config: 项目配置
|
||||||
|
"""
|
||||||
|
task_context = {
|
||||||
|
"task_id": parent_task.id,
|
||||||
|
"title": parent_task.title,
|
||||||
|
"description": parent_task.description,
|
||||||
|
"task_type": parent_task.task_type,
|
||||||
|
"must_haves": parent_task.must_haves,
|
||||||
|
}
|
||||||
|
|
||||||
|
project_context = None
|
||||||
|
if project_config:
|
||||||
|
project_context = {
|
||||||
|
"name": project_config.get("name"),
|
||||||
|
"description": project_config.get("description"),
|
||||||
|
"agents": project_config.get("agents", []),
|
||||||
|
}
|
||||||
|
|
||||||
|
# 构建基础 bootstrap
|
||||||
|
bootstrap = self.build(
|
||||||
|
role="pangtong",
|
||||||
|
task_context=task_context,
|
||||||
|
project_context=project_context,
|
||||||
|
)
|
||||||
|
|
||||||
|
# 追加 review 专用上下文
|
||||||
|
review_section = self._format_review_context(
|
||||||
|
summary, outputs, comments, round_num, max_rounds)
|
||||||
|
|
||||||
|
return bootstrap + "\n\n---\n\n" + review_section
|
||||||
|
|
||||||
|
def _format_review_context(
|
||||||
|
self,
|
||||||
|
summary: Dict[str, Any],
|
||||||
|
outputs: List[Dict[str, Any]],
|
||||||
|
comments: List[Dict[str, Any]],
|
||||||
|
round_num: int,
|
||||||
|
max_rounds: int,
|
||||||
|
) -> str:
|
||||||
|
"""格式化庞统 review 专用上下文"""
|
||||||
|
parts = ["## 庞统 Review 上下文"]
|
||||||
|
|
||||||
|
# Sub Task 状态摘要
|
||||||
|
parts.append(f"### 本轮 Sub Task 状态")
|
||||||
|
parts.append(f"- 完成: {summary.get('done', 0)}")
|
||||||
|
parts.append(f"- 失败: {summary.get('failed', 0)}")
|
||||||
|
parts.append(f"- 取消: {summary.get('cancelled', 0)}")
|
||||||
|
parts.append(f"- 总计: {summary.get('total', 0)}")
|
||||||
|
parts.append(f"- 当前轮次: {round_num}/{max_rounds}")
|
||||||
|
|
||||||
|
# 成果物摘要(限制 20 条)
|
||||||
|
if outputs:
|
||||||
|
parts.append("\n### 成果物")
|
||||||
|
for o in outputs[:20]:
|
||||||
|
parts.append(
|
||||||
|
f"- [{o.get('task_title', '?')}] "
|
||||||
|
f"{o.get('title', '?')} ({o.get('output_type', '?')}) "
|
||||||
|
f"by {o.get('agent', '?')}"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
parts.append("\n### 成果物\n无")
|
||||||
|
|
||||||
|
# 讨论摘要(限制 50 条)
|
||||||
|
if comments:
|
||||||
|
parts.append("\n### 黑板讨论")
|
||||||
|
for c in comments[:50]:
|
||||||
|
body = (c.get('body', '') or '')[:200]
|
||||||
|
parts.append(
|
||||||
|
f"[{(c.get('created_at', '') or '?')[:16]}] "
|
||||||
|
f"{c.get('author', '?')}: {body}"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
parts.append("\n### 黑板讨论\n无")
|
||||||
|
|
||||||
|
# 失败处理指引
|
||||||
|
failed = summary.get('failed', 0)
|
||||||
|
if failed > 0:
|
||||||
|
parts.append(
|
||||||
|
f"\n### 失败处理\n"
|
||||||
|
f"有 {failed} 个 sub task failed,"
|
||||||
|
f"优先判断是应该重试(同一 Agent)、换人(换 Agent)、还是调整方案。"
|
||||||
|
)
|
||||||
|
|
||||||
|
return "\n".join(parts)
|
||||||
|
|||||||
Reference in New Issue
Block a user