Council
A boardroom for your AI agents.
Multi-agent orchestration over MCP — deliberation, voting, and human oversight built in.
Quick Start · How It Works · Configuration · Architecture · Contributing
______________________________________________________________________
Council是一个协调器,让人工智能代理对决策进行辩论、提出建议、改进和投票,就像公司董事会一样。代理通过连接 主控程序 (模型上下文协议),通过理事会的信息总线进行沟通,并遵循结构化的审议阶段。人类通过实时web UI来审查和批准决策。
为什么是理事会?
- 结构化多智能体审议 --不仅仅是聊天,还有调查、提案、修正案和正式投票
- 可配置的治理 --法定人数规则、否决权、加权投票、5种投票方案、升级政策
- 默认情况下,人在循环中 --每个决定在执行前都需要人工审查
- MCP本地 --代理作为标准MCP客户端连接,带来自己的工具和功能
- 零配置代理 --在YAML中定义人物角色;理事会负责产卵、路由和状态管理
- 持久性药剂 --代理可以在会话之间保持连接,接收新的任务而无需重新生成
- 动态投票权重 --专业知识主题匹配会自动调整每个会话的代理影响力
- 多用户身份验证 --基于会话的身份验证,可选TOTP 2FA和基于角色的访问控制
- MCP也适用于人类 --一个专用
/mcp/user端点允许ClaudeDesktop、Cursor和VS Code通过API密钥验证来管理会话、审查决策和浏览资源
运作原理
- 事件到达 --GitHub webhooks、通用webhooks或手动触发器
- 议会路线 根据事件类型、标签和专业知识选择合适的代理
- 特工调查 通过MCP工具自主协商
- 有人提议 并在多轮审议中进行了辩论
- 提出修正案 --代理人在投票前对提案进行完善
- 代理人投票 --加权多数、绝对多数、一致、基于同意或咨询
- 火灾升级规则 关于死锁、超时、否决或仲裁失败
- 人类评论 web仪表板中的最终决定
所有沟通均通过理事会进行。代理之间从不直接对话——理事会执行通信图,保存每条消息,并驱动状态机。
快速开始
先决条件
- Node.js 22+
- pnpm
安装并运行
pnpm install
pnpm dev服务器启动于 http://localhost:3000 使用web仪表板和默认开发配置。
使用示例板运行
CONFIG_PATH=config/examples/board-of-directors.yaml pnpm dev这将产生一个4人代理的董事会(CTO、CPO、Legal、CFO),其中包含升级规则、否决权和加权投票权。
更多示例配置 config/examples/: minimal-two-agent, code-review-council, security-review-board, incident-response-team, advisory-panel, momentumeq-board (6个代理板,具有动态权重和会话主题)。
运行测试
pnpm test码头工人
理事会每次推送Docker镜像到GitHub容器注册表 main 以及版本标签。
拉取最新图像:
docker pull ghcr.io/dadcoachengineer/council:main使用配置文件运行:
docker run -d \
--name council \
-p 3000:3000 \
-v council-data:/app/data \
-v $(pwd)/config:/app/config:ro \
-e CONFIG_PATH=/app/config/examples/board-of-directors.yaml \
ghcr.io/dadcoachengineer/council:main或者使用Docker Compose:
cd docker
docker compose up --build组合文件挂载 config/ 只读,并将SQLite数据库保存在命名卷中。
可用图像标签:
| 标签 | 描述 |
|---|---|
main | 主分支的最新构建 |
v1.0.0, v1.0等等。 | 语义版本标签(发布时) |
sha-abc1234 | 固定在一个特定的承诺上 |
体积:
| 路径 | 目的 |
|---|---|
/app/data | SQLite数据库(坚持这个!) |
/app/config | 议会YAML配置文件(只读挂载) |
集装箱露出端口 3000 并包括在以下地点进行健康检查 /api/health.
配置
理事会完全通过YAML配置。看 config/examples/board-of-directors.yaml 一个完整的工作示例。
council:
name: "Product Strategy Board"
agents:
- id: cto
role: "Chief Technology Officer"
expertise: [architecture, security, scalability]
can_veto: true
voting_weight: 1.5
persistent: true # Stay connected across sessions
system_prompt: "You are the CTO..."
rules:
quorum: 3
voting_threshold: 0.66
voting_scheme:
type: supermajority
preset: two_thirds
enable_refinement: true
dynamic_weights: # Optional: expertise-topic weight adjustment
enabled: true
expertise_match_bonus: 0.5 # Added per matching expertise tag
max_multiplier: 3.0 # Cap on total effective weight
escalation:
- name: "deadlock_retry"
trigger: { type: deadlock }
action: { type: restart_discussion }
event_routing:
- match: { source: github, type: issues.opened, labels: [bug] }
assign:
lead: cto
consult: [cpo]
topics: [architecture, security] # Session expertise tags配置部分
| 第节 | 目的 |
|---|---|
council.agents | 代理人角色——角色、专业知识、投票权重、否决权、系统提示 |
council.rules | 治理——法定人数、阈值、投票方案、细化、最大轮次、动态权重 |
council.rules.escalation | 死锁、超时、否决、法定人数失败或最大轮次时自动升级 |
council.rules.dynamic_weights | 在计票时可选择专业主题权重调整 |
council.event_routing | 按来源、类型、标签和主题将事件路由给领导/咨询代理 |
council.communication_graph | 控制哪些代理可以相互发送消息 |
council.spawner | 代理启动模式: log (dev), webhook,或 sdk (生产) |
代理 persistent 旗帜
代理商与 persistent: true 在多个会话中保持联系:
- 他们收到存储在数据库中的稳定身份验证令牌
- 创建新会话时,编排器通过MCP通知它们,而不是重新生成
- 他们可以使用
council_get_assignments工具 - SDK生成的持久代理在循环中运行,处理来自内部队列的会话
手动代理示例
这 examples/manual-agent.ts 该脚本演示了如何将外部MCP客户端作为独立代理连接到Council。运行它:
npx tsx examples/manual-agent.ts投票方案
| 方案 | 工作原理 |
|---|---|
weighted_majority | 加权投票,阈值通过(默认) |
supermajority | 需要2/3或3/4的多数票,或自定义阈值 |
unanimous | 每一位非弃权选民都必须批准 |
consent_based | 除非有人正式反对,否则通过 |
advisory | 不具约束力——始终通过,结果仅供参考 |
升级规则
在审议过程中,当事情发生意外时,升级规则会自动启动。
| 触发器 | 火灾发生时 |
|---|---|
deadlock | 投票结果出现分歧,没有明确的获胜者 |
quorum_not_met | 没有足够的代理人投票 |
veto_exercised | 一位拥有否决权的代理人阻止了该提案 |
timeout | 某个阶段超过了其时间限制 |
max_rounds_exceeded | 审议回合太多 |
| 行动 | 它做什么 |
|---|---|
escalate_to_human | 标记会话以供人工审核 |
restart_discussion | 将审议重新安排到下一轮 |
add_agent | 引入额外的代理 |
auto_decide | 强制做出决定(批准/拒绝/升级) |
notify_external | 将webhook发送到外部服务 |
规则支持 priority 订购, stop_after 在第一场比赛后停止,以及 max_fires_per_session.
认证
理事会使用基于多用户会话的身份验证,并可选择TOTP双因素身份验证。
- 首次运行设置:
POST /auth/setup创建初始管理员用户 - 登录:
POST /auth/login返回会话cookie;支持可选的TOTP验证POST /auth/2fa/verify - 用户管理:管理员可以在以下位置创建和管理用户
/api/admin/users - MCP端点(代理):
/mcp免于身份验证——代理使用自己的身份验证x-agent-token头球 - MCP端点(用户):
/mcp/user通过以下方式进行身份验证Authorization: Bearer--适用于人类MCP客户端 - API密钥管理:管理员在创建/列出/撤销API密钥
/api/admin/api-keys
建筑
src/
engine/ Pure logic — orchestrator, voting, escalation, spawner, message bus
server/ HTTP layer — Express 5 routes, MCP server, WebSocket, auth, DB
web/ Frontend — Preact + Vite dashboard
shared/ Types, Zod schemas, event definitions (imported by all layers)REST API
| 终点 | 目的 |
|---|---|
POST /webhooks/github | GitHub webhook接收器(HMAC验证) |
POST /webhooks/ingest | 通用webhook接收器 |
GET /api/sessions | 列出审议会议 |
GET /api/sessions/:id | 会话详细信息,包括消息、投票、决定 |
POST /api/sessions | 创建手动会话 |
POST /api/sessions/:id/review | 提交人工审核 |
GET /api/events | 列出传入事件 |
GET /api/agents | 列出代理连接状态 |
GET /api/decisions | 列出待决决定 |
POST /auth/setup | 首次运行管理员用户创建 |
POST /auth/login | 登录(返回会话cookie) |
GET /api/admin/users | 列出用户(仅限管理员) |
POST /api/admin/api-keys | 为用户创建API密钥(仅限管理员) |
GET /api/admin/api-keys | 列出用户的API密钥(仅限管理员) |
DELETE /api/admin/api-keys/:id | 吊销API密钥(仅限管理员) |
GET /api/admin/agent-tokens | 列出持久代理令牌(仅限管理员) |
POST /api/admin/agent-tokens/:agentId | 提供持久令牌(仅限管理员) |
DELETE /api/admin/agent-tokens/:agentId | 撤销持久令牌(仅限管理员) |
ws://host/ws | WebSocket用于实时UI更新 |
MCP工具(面向代理)
代理连接到 /mcp 通过Streamable HTTP并使用以下工具:
| 工具 | 说明 |
|---|---|
council_get_context | 获取待处理任务、消息和会话状态 |
council_get_session | 完整的会议细节,包括投票和阶段 |
council_send_message | 向代理发送消息或广播(强制图形) |
council_consult_agent | 请求另一位董事会成员提供意见 |
council_create_proposal | 制定一份正式提案供审议 |
council_submit_findings | 提交调查结果 |
council_cast_vote | 理性投票(价值取决于投票方案) |
council_propose_amendment | 对当前提案提出更改 |
council_resolve_amendment | 接受或拒绝修正案(主要代理人) |
council_get_voting_info | 获取投票方案和有效投票值 |
council_list_sessions | 列出带有可选筛选器的会话 |
council_list_councils | 列出可用的议会 |
council_get_assignments | 获取当前会话分配(持久代理) |
MCP工具(面向用户)
人类MCP客户端(克劳德桌面、光标、VS代码)连接到 /mcp/user 使用API密钥并访问:
| 工具 | 说明 |
|---|---|
council_user_list_sessions | 列出带有可选相位过滤器的会话 |
council_user_get_session | 完整的会话详细信息,包括消息、投票和决定 |
council_user_create_session | 创建新的审议会议 |
council_user_submit_review | 批准、拒绝或发回决定 |
council_user_list_pending_decisions | 列出等待人工审查的决定 |
council_user_get_agents | 获取代理连接状态 |
council_user_transition_phase | 手动推进会话阶段 |
council_user_ingest_event | 接收事件以触发路由 |
资源 (council:// URI方案): config, agents, decisions/pending, sessions, sessions/{sessionId}
提示: start-deliberation, review-decisions, check-agents
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
PORT | 3000 | 服务器端口 |
HOST | 0.0.0.0 | 服务器主机 |
DB_PATH | ./data/council.db | SQLite数据库路径 |
CONFIG_PATH | -- | 理事会YAML配置路径 |
MCP_BASE_URL | http://localhost:3000/mcp | URL代理用于连接回 |
GITHUB_WEBHOOK_SECRET | -- | GitHub webhook HMAC密钥 |
技术栈
| 运行时 | Node.js 22+,TypeScript 5.7+ |
| 服务器 | 快递5 |
| 前端 | Preact+Vite |
| 数据库 | SQLite(更好的平方3+Drizzle ORM) |
| 代理协议 | 通过@modelcontextprotocol/sdk实现MCP(模型上下文协议) |
| 特工产卵 | 基于Claude Agent SDK或webhook |
| 测试 | Vitest——265次测试 |
贡献
欢迎投稿!议会还处于早期阶段,还有很多地方需要改进。
良好的第一个领域:
- 新的投票方案 --实施
VotingScheme接口在src/engine/voting-schemes/ - 新的升级行动 --在中添加处理程序
src/engine/escalation-engine.ts - Web UI改进 --中的Preact仪表板
src/web/可以用抛光剂 - 新产卵器后端 --在中添加Claude SDK的替代方案
src/engine/spawner.ts - 文档 --示例、教程和指南
开发工作流程
pnpm install # Install dependencies
pnpm dev # Start dev server with hot reload
pnpm test # Run test suite
npx tsc --noEmit # Type check提交更改
- 分叉仓库并创建功能分支
- 通过测试进行更改
- 跑
pnpm test和npx tsc --noEmit - 用摘要和测试计划打开PR
