Why: RoleSpec.Tools/Skills were dead fields, BashPermission only gated an HITL prompt with nothing to enforce, leader turns dropped process events and tool profile, and the HTTP API could not start leader mode. Evidence: go vet ./... clean; go test ./... 6 packages ok. New cases: step requests carry ToolAllowlist/Skills/SessionScope/ExecutionID and a step-wide shared deadline; buildAgentNativeOptions bash gating (deny/unset get no exec tools even when configured, ask/allow do, missing model fails closed); Derive inheriting tool_profile/tools/ skills/bash_permission with request overrides; role-level HitlPolicy making a bash=ask step fail under auto instead of holding; leader requests fully assembled with detail events bridged to the sink; HTTP createRun accepting mode/leader_role/max_leader_turns (engine-driven repro of the plan-validation precondition included). Impact: RegisterAgentNative keeps its signature and delegates to a new RegisterAgentNativeFull(AgentNativeConfig); nested agent-native gitlink pinned to f9ab2ef (full-agent batch); llm planner derive schema gains tool_profile/tools/skills/bash_permission. Refs: Dev task feature/full-agent-r1 batch B9; agent-native PR #3.
Agent-Squad
通用智能体小队编排底座:角色注册、意图/目标理解与任务拆解、动态编排执行、 黑板协同、Human-in-the-Loop(HITL)挂起与恢复。不含任何预设角色或任务模板, 一切角色/模板均通过配置文件、HTTP API、CLI 注册或由规划器现场派生。
设计参考 Multica 的 agent orchestration 理念与 Agent-System internal/squad
的成熟机制(黑板/沙箱工作区/顺序并行混合调度/动态调整),按"空表起步"通用化重写。
本仓库是该模块的源码位置。Go 模块路径为 agent-squad。依赖都在 deps/,由本仓 gitlink 固定,不随上游分支浮动:
| 路径 | 作用 |
|---|---|
deps/agent-native |
智能体执行。replace agent-native => ./deps/agent-native |
deps/error-code-system |
HTTP 错误信封与规范码 |
deps/logging-system |
组合根日志。trace_id 来自 X-Trace-Id,run_id 标识一次编排 |
deps/development-guidelines |
开发规范,不参与编译 |
Agent-Native 自己的 deps/ 里还有一份错误码库、日志库和规范。本仓编译只使用本仓 go.mod 的 replace,嵌套目录里的 replace 不生效。scripts/submodule-consistency.sh 要求两侧 gitlink 相同,避免两份副本锁到不同提交。
克隆时带上子模块,否则无法编译。已有克隆若仍留着根目录 Agent-Native,先删掉该残留目录再初始化:
git clone --recurse-submodules ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git
# 已克隆时:
git submodule sync --recursive
git submodule update --init --recursive
与周边仓库的关系
| 仓库/模块 | 关系 |
|---|---|
Agent-Native(本仓 submodule deps/agent-native) |
智能体执行的唯一来源:角色执行经 agent-native adapters/native(自研内核 runtime 循环 + 工作区工具)或产品注册的其他 agent-native 后端(如 pi-agent);LLM 规划器复用 runtime/llm 客户端做编排决策。本库不实现任何 Agent——只做编排与任务拆解。依赖方向 agent-squad → agent-native,反向无依赖 |
agent-system-multi/modules/squad(U4 产品小队暂存仓) |
不在本仓,互不依赖。产品小队含医疗器械预设角色与任务键,属产品层;后续产品仓接入本底座时,预设角色/任务模板改为向本底座注册(独立一期) |
主仓 internal/squad |
机制语义(工作流驱动/黑板/子工作区/防篡改清单)的权威来源;本底座为通用化重写,不做逐行同步 |
分层
| 包 | 职责 | 依赖边界 |
|---|---|---|
| squad | 核心库:契约(模型/HITL)、角色注册表、蓝图注册表、规划器(rule/llm/mock)、执行引擎、黑板、沙箱工作区、事件 | 依赖 agent-native(exec + runtime/llm);不依赖任何产品类型/DB |
| store | 文件持久化:roles.d/.json、blueprints.d/.json | 只依赖 squad 契约;无 DB |
| server | HTTP API(REST + SSE) | 组合根之一,可独立 serve |
| cli | CLI:serve / role / blueprint / run / runs / demo | 组合根之一 |
| textextract | 纯文本抽取(txt/md/json/docx + 页码锚点),纯标准库 | 无依赖 |
| conformance | 公开 API 全链路契约验收(含 HITL 挂起-回应) | 只用公开 API |
角色:创建与绑定智能体
RoleSpec 声明角色的全部设定;Backend 字段绑定执行该角色的智能体:
内置 stub(agent-native 离线桩,测试用);真实执行用 agent-native
(自研内核:多轮循环 + 读/写/编辑/检索工作区工具,经 RegisterAgentNative
注册工厂),产品也可注册 pi-agent 等外部智能体工厂。Model/ToolProfile/Skills
角色级注入——即每个角色可以用不同的智能体、不同的模型。
执行配置贯通(full-agent-r1 起):ToolProfile/Tools(工具白名单,支持
mcp__server__* 命名空间通配)/Skills/BashPermission/Model 全部随步骤请求
下发到 agent-native(Tools/Skills 原为死字段);BashPermission=deny(默认)
的角色不装配执行工具,ask 由 permission 挂起点先行把关,allow 直接放行
(工厂层显式 allow/ask 才装配,派生构造同样兜底)。RegisterAgentNativeFull
接受 AgentNativeConfig(搜索/取回/执行/MCP/技能根/委派/压缩)由组合根注入;
步骤重试与首试共享同一截止时刻(agent-execution 标准的共享预算语义)。
角色来源三种(RoleSource):
- registered:配置文件(
roles.d/*.json)/ HTTP API / CLI 手动注册; - derived:规划器或用户按
base_role基线现场派生(领域特化专员); - 运行期 minimal 引导:空注册表澄清时人工选择"最小编制",自动注册 4 个通用角色。
未知智能体名 fail-closed(运行失败并留痕),绝不静默回落 stub。
规划:理解目标 → 拆解任务 → 分配角色
Planner 接口可插拔,内置三种实现:
| 规划器 | 机制 |
|---|---|
rule(默认,零模型依赖) |
命中蓝图→基线步骤;未命中→通用四阶段骨架(梳理→专项→成文→终审),角色按 Keywords/职责推荐,缺位现场派生(派生计划需人工确认) |
llm |
结构化 JSON 输出:复用/派生角色清单 + 步骤 + 并行分组 + 高风险标记;解析失败重试一次后 fail-closed;信息不足时输出澄清请求而非猜测计划(直接用 agent-native runtime/llm 客户端做一次编排决策调用,不是智能体执行) |
mock |
脚本化,离线演示/测试 |
蓝图(Blueprint)= 可选的任务模板(关键词匹配或显式 task key 命中),
提供基线步骤/默认编制/交付物骨架,注册表同样空表起步。
Leader-Delegation 编排模式(机制参考 Multica Squad Leader,原创实现)
除标准模式(一次性计划顺序执行)外,支持事件驱动的增量委派循环(HTTP API
POST /v1/runs 亦支持 mode/leader_role/max_leader_turns,与 CLI 等价)
(--mode leader --leader-role <role>):leader 是注册表中的普通角色,每轮被
引擎激活——读目标/黑板/委派历史,产出结构化决策 delegation.json:
delegate:委派一名成员(按 skills 挑人),引擎执行成员步骤、把交付快照进 leader 工作区inbox/<步骤id>/(leader 沙箱看不到成员目录,须物化核实)、 黑板合并,然后唤醒 leader 再评估;escalate:升级问人(HITL kind=escalation,人工回答落黑板事实后 leader 继续);close:收口(走统一质检/清单);failed:如实报告无法达成。
防失控:每运行 leader 轮次上限(默认 8,--max-leader-turns)。leader 协议
核心:只协调不实现、按能力委派、一轮一任务、委派不了就升级、严禁假装完成。
借鉴 Multica 的增强(重写实现,非代码复制)
| 能力 | 说明 |
|---|---|
| HITL 等待条件 | 缺口可声明 wait_run_id/wait_field——等目标运行终态/黑板字段出现时自动唤醒续跑(唤醒报告事实非业务完成);护栏:单请求自动唤醒上限(MaxWakeupFires=5)后自动中止;serve 每 15s sweep |
| 何时问人总则 | planner 与默认角色指令内置:"信息若实质改变结果/路径/权限/安全才问人,否则自行决定并说明;严禁假装完成" |
| 运行级 steering | POST /v1/runs/{id}/steer(CLI runs steer):运行中人工补充指令在下一次步骤边界注入当前运行(不中断进行中步骤,单次消费) |
| 角色级并发上限 | RoleSpec.MaxConcurrentTasks(1=对象级串行);per-role 缓存 + 双检锁防并行首解析竞态 |
| 用量记账 | 每步骤 token 用量按角色累计(usage.json + RunResult.Usage/Manifest) |
| 事件落盘+脱敏 | FileEventSink:事件按 seq 追加 runs/<id>/events.jsonl,落盘前脱敏(sk-key/Bearer/JWT/api_key/password 形状),转发 SSE |
| HITL severity | 请求带 action_required/attention 分级(inbox 降噪语义) |
| 会话毒化轮转 | agent-native adapters/native:resume-unsafe 失败(context overflow/迭代上限等)后自动归档旧会话换新会话,网络类失败保留会话续跑 |
HITL:六个挂起点 + 恢复
| 挂起点 | 触发 | 恢复 |
|---|---|---|
| clarification | 规划器判定目标信息不足 | 回答并入 Goal 重新规划 |
| confirmation | 高风险计划/派生编制/requires_approval 步骤 |
approve/abort(approve 后执行) |
| gap | 角色写 gaps.json 声明 blocking 缺口 |
回答落黑板 Fact 并 resolve;skip/abort 可选 |
| adjustment | 评估器建议加步/跳步且命中审批策略 | approve/reject/abort |
| permission | 角色 bash_permission=ask |
approve(本运行内授权)/reject/abort |
| quality_review | 质检失败且自动修复预算用尽 | 人工放行(记录 ManualPass)/再修复/判失败 |
挂起 = 状态与 pending.json 落盘后返回;Respond 按请求 ID 幂等应用决策并续跑,
进程重启后可恢复(磁盘即权威)。策略三级(全局→角色→Goal 覆盖):
interactive(默认)| auto(无值守:缺口记 fallback 假设继续,高风险决策 fail-closed)
| disabled(挂起点直接失败)。
执行引擎与工作区
顺序/并行混合调度(相邻 parallel=true 步骤成组并发);顺序步骤后可接
StepEvaluator(可插拔,默认 no-op)做动态调整;非关键步骤(critical=false)
失败降级继续(终态 degraded)。步骤级瞬态重试复用 agent-native
AssessStepFailure(上限 2 次),交付物物化带符号链接防护。
任务级沙箱工作区(与产品 squad 布局兼容):
<data>/runs/<run_id>/
workspace.json squad.json workflow.json blackboard.json template.md
context/{goal.md, materials/, materials_text/, index.json}
tasks/<NN>_<role>/{TASK.md, AGENTS.md, output…, fields.json?, gaps.json?, execution.log}
output.md manifest.json # 交付物 + 防篡改清单(sha256 + 质检报告)
黑板(Facts/Gaps/Assumptions/Fields)由步骤产出 fields.json/gaps.json 合并,
人工回答记录为 Source=human 的事实。
HTTP API(serve)
| 方法/路径 | 说明 |
|---|---|
GET /v1/health |
健康检查 |
GET/POST /v1/roles、PUT/DELETE /v1/roles/{key} |
角色注册管理 |
POST /v1/roles/derive |
派生角色 |
GET /v1/roles/recommend?q= |
角色推荐 |
GET/POST /v1/blueprints、DELETE /v1/blueprints/{key} |
任务模板管理 |
POST /v1/runs |
发起运行(goal/task_key/backend),同步推进至挂起或终态 |
GET /v1/runs、GET /v1/runs/{id} |
运行列表/详情 |
GET /v1/runs/{id}/pending |
当前挂起的人工请求 |
POST /v1/runs/{id}/respond |
应用人工决策(answer/choice)并续跑 |
POST /v1/runs/{id}/steer |
运行中追加人工指令(下一步骤边界注入) |
POST /v1/runs/{id}/blackboard |
写入黑板字段(可满足 field_set 等待条件) |
POST /v1/wakeups/sweep |
手动触发等待条件扫描(serve 内置 15s 周期) |
POST /v1/runs/{id}/resume |
重启恢复入口 |
GET /v1/runs/{id}/blackboard |
黑板 |
GET /v1/runs/{id}/events?cursor=N |
SSE 事件流(human_input_required/步骤事件/终态),支持断线重放 |
事件名:run_started/phase/step_started/step_completed/step_failed/step_skipped/ detail/deliverable/human_input_required/human_responded/run_completed/run_failed/run_cancelled。
CLI
agent-squad serve --addr :8090 [--planner rule|llm] [--model M]
agent-squad role list|add(-f file 或 --role/--backend/--model/--keywords…)|rm|recommend|derive
agent-squad blueprint list|add <file.json>|rm <key>
agent-squad run "目标文本" [--task-key K] [--backend B] [--materials DIR] [--hitl-mode interactive|auto|disabled]
agent-squad runs list|inspect|pending|respond|blackboard
agent-squad demo # 离线全链路演示(含一次 HITL 挂起-回应)
run 在终端交互式处理 HITL:挂起时打印问题/选项/上下文,读 stdin 回应后自动续跑。
LLM 配置走环境变量:AGENT_SQUAD_LLM_BASE_URL / AGENT_SQUAD_LLM_API_KEY /
AGENT_SQUAD_LLM_MODEL(OpenAI 兼容端点;配置后自动注册 agent-native
后端工厂与 llm 规划器,角色用 --backend agent-native 执行真实智能体)。
快速开始
在仓库根目录(需已初始化 deps/ 下的子模块):
go build -o agent-squad .
./agent-squad demo # ① 离线全链路演示
./agent-squad role add --role researcher --backend stub --keywords "调研,市场"
./agent-squad run "调研 X 并产出报告" # ② 终端交互式 HITL(stub 后端)
./agent-squad serve --addr :8090 # ③ HTTP API(REST + SSE)
CodeGraph
codegraph init 的索引写在 .codegraph/。仓库只跟踪 .codegraph/.gitignore。SQLite 数据库、WAL、pid、socket 和日志留在本机;根目录 .gitignore 与该文件双重忽略,避免索引被提交。
验证
GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...
./scripts/submodule-consistency.sh
当前全绿(conformance 全链路 + HITL 各挂起点 + server + store + textextract)。