AI Teams 是一个三方协作系统:人类 Leader 通过 Web 控制台或 REST API 向 Server 提交任务,Server 将任务智能调度给多个 AI Agent(运行 Claude CLI)执行。支持任务队列、负载均衡、标签路由、优先级调度、端到端加密和实时监控。
智能调度
优先级队列 + 标签匹配 + 最小负载优先,三种调度模式灵活适配。
实时监控
Web 控制台实时展示 Agent 状态、任务输出、统计分析,支持移动端。
安全加密
可选 AES-256-GCM 端到端加密,WebSocket 消息全链路保护。
高可用
守护进程自动重启、Agent 断线任务恢复(最多重试 3 次)、心跳检测、Webhook 回调。
快速开始
1. 安装依赖
需要 Node.js ≥ 22 和 pnpm ≥ 9。
git clone <your-repo> ai-teams
cd ai-teams
pnpm install
2. 一键启动(开发模式)
pnpm dev:all
这将同时启动 Server(:3789)、Agent Alice 和 Web 控制台(:5173),使用 dev-token 自动认证。
提示:开发模式下 Agent 需要 claude CLI 已安装且登录。如无 Claude CLI,可使用 RUNNER_MODE=fake 模拟。
3. 访问控制台
浏览器打开 http://localhost:5173,输入 token dev-token 即可进入。
架构概览
┌──────────────┐ WebSocket ┌──────────────┐ WebSocket ┌──────────────┐
│ Web 控制台 │ ◄──────────────► │ Server │ ◄─────────────► │ Agent (N) │
│ (Leader) │ /ws/leader │ Fastify │ /ws/agent │ Claude CLI │
│ React SPA │ │ SQLite / PG │ │ Heartbeat │
└──────────────┘ └──────┬───────┘ └──────────────┘
│ │
│ REST API (/api/*) │
└────────────────────────────────────┘
核心组件
| 组件 | 技术栈 | 职责 |
|---|---|---|
| Server | Fastify 5 + WebSocket + SQLite/PostgreSQL | 中央调度枢纽:任务队列、Agent 管理、持久化、API 网关 |
| Agent | Node.js + WebSocket | 连接 Server、接收任务、启动 claude -p 子进程执行 |
| Web | React 19 + Vite | Leader 控制台:监控、命令分发、日志查看、统计分析 |
| Shared | TypeScript | 共享协议类型、消息解析、加密工具 |
任务生命周期
终态(completed / failed / cancelled / timeout)不可变更,后续事件将被忽略。
调度模式
| 模式 | 参数 | 行为 |
|---|---|---|
| Queue | atAgents: "queue" |
进入共享优先级队列,按负载和标签匹配分发给空闲 Agent。每个队列任务使用独立 Claude 会话。 |
| Direct | atAgents: ["alice"] |
直接分发给指定 Agent,使用其持久化会话(支持 --resume 连续对话)。 |
| Broadcast | atAgents: "all" |
同时发送给所有在线 Agent,共享同一 leaderCommandId。 |
部署指南
环境要求
- Node.js ≥ 22(需要
node:sqlite支持) - pnpm ≥ 9
- Claude CLI(Agent 执行任务所需)
- 可选:PostgreSQL(替代 SQLite)
构建
# 构建顺序:shared → server → agent
pnpm build
# Web 独立构建
cd apps/web && pnpm build
生产启动
# 设置认证 Token(必填)
export AI_TEAMS_AUTH_TOKEN="your-secret-token"
# 启动 Server(守护进程模式)
ai-teams-server start --token "your-secret-token" --port 3789
# 启动 Agent(守护进程模式)
ai-teams-agent start --server ws://localhost:3789 --token "your-secret-token" \
--id alice --name "Alice"
# 或使用 pnpm(开发模式)
pnpm start:server
pnpm start:agent:alice
# 启动 Web 控制台
pnpm start:web
一键全部启动
AI_TEAMS_AUTH_TOKEN="your-secret-token" pnpm start:all
Agent 交互式配置
首次运行 Agent 会自动进入配置向导:
node apps/agent/dist/index.js
也可使用 --config 重新配置。配置保存在 ~/.ai-teams/config.json。
通过 npm 安装
Server 和 Agent 已发布到 npm,无需克隆仓库即可使用。
全局安装
# 安装 Server
npm install -g @csdwd/ai-teams-server
# 安装 Agent
npm install -g @csdwd/ai-teams-agent
安装后即可直接使用 CLI 命令:
# 以守护进程方式启动 Server(推荐)
ai-teams-server start --token "your-secret-token" --port 3789
# 以守护进程方式启动 Agent(首次运行自动进入配置向导)
ai-teams-agent start
使用 npx(无需安装)
# 直接运行 Server
npx @csdwd/ai-teams-server start --token "your-secret-token"
# 直接运行 Agent
npx @csdwd/ai-teams-agent start
CLI 命令
ai-teams-server
| 子命令 | 说明 |
|---|---|
start [选项] | 以守护进程方式启动 |
stop | 停止守护进程 |
restart [选项] | 重启守护进程 |
status | 查看运行状态和 PID |
update | 从 npm 更新到最新版本 |
| 参数 | 说明 |
|---|---|
--token <token> | 认证 Token(必填) |
--port <port> | 服务端口(默认 3789) |
--host <host> | 绑定地址(默认 0.0.0.0) |
--data-dir <dir> | 数据目录 |
--db-path <path> | 数据库路径 |
--log-level <level> | 日志级别(默认 info) |
--log-dir <dir> | 日志文件目录 |
-v, --version | 显示版本号 |
-h, --help | 显示帮助 |
ai-teams-agent
| 子命令 | 说明 |
|---|---|
start [选项] | 以守护进程方式启动 |
stop | 停止守护进程 |
restart [选项] | 重启守护进程 |
status | 查看运行状态和 PID |
update | 从 npm 更新到最新版本 |
| 参数 | 说明 |
|---|---|
--server <url> | Server WebSocket 地址 |
--token <token> | 认证 Token |
--id <id> | Agent 唯一标识 |
--name <name> | 显示名称 |
--workspace <dir> | 默认工作目录 |
--runner <mode> | 执行模式(claude / fake) |
--config | 重新运行配置向导 |
-v, --version | 显示版本号 |
-h, --help | 显示帮助 |
配置持久化:首次使用 start 时传入的参数(token、server、id 等)会自动保存到配置文件。后续使用 start、restart 无需重复指定。
- Server 配置:
~/.ai-teams/server-config.json - Agent 配置:
~/.ai-teams/config.json
多 Agent 部署示例
# 启动 Server(后台守护进程)
ai-teams-server start --token "my-secret"
# 启动 Agent Alice(后台守护进程)
ai-teams-agent start --server ws://localhost:3789 --token "my-secret" \
--id alice --name "Alice" --workspace ~/projects/project-a
# 启动 Agent Bob
ai-teams-agent start --server ws://localhost:3789 --token "my-secret" \
--id bob --name "Bob" --workspace ~/projects/project-b \
--labels "backend,python"
# 查看运行状态
ai-teams-server status
ai-teams-agent status
# 更新到最新版本
ai-teams-agent update
ai-teams-agent restart # 应用更新
包说明:
@csdwd/ai-teams-server— 服务端,依赖 Fastify / WebSocket / SQLite@csdwd/ai-teams-agent— Agent 端,依赖ws,需要系统安装claudeCLI- 共享协议包
@ai-teams/shared在构建时已内联,无需单独安装
环境变量
Server
| 变量 | 默认值 | 说明 |
|---|---|---|
AI_TEAMS_AUTH_TOKEN | 必填 | 共享认证 Token |
AI_TEAMS_SERVER_PORT / PORT | 3789 | 服务端口 |
HOST | 0.0.0.0 | 绑定地址 |
DATA_DIR | ./data | 数据目录 |
DB_PATH | <DATA_DIR>/ai-teams.db | SQLite 数据库路径 |
DATABASE_URL | - | PostgreSQL 连接串(设置后使用 PG 替代 SQLite) |
DEFAULT_TIMEOUT_SEC | 1800 | 默认任务超时(秒) |
DISCONNECT_GRACE_MS | 15000 | 断线宽限期(ms) |
MAX_LOG_CHUNKS_PER_TASK | 400 | 每任务最大日志块数 |
LOG_LEVEL | info | 日志级别:trace / debug / info / warn / error |
LOG_DIR | - | 日志文件目录(不设则仅 stdout) |
AI_TEAMS_ENCRYPTION_KEY | - | E2E 加密密钥(64 位 hex = 32 字节) |
Agent
| 变量 | 默认值 | 说明 |
|---|---|---|
AI_TEAMS_AUTH_TOKEN | 必填 | 认证 Token(需与 Server 一致) |
SERVER_URL | ws://localhost:3789 | Server WebSocket 地址 |
EMPLOYEE_ID | emp_local | Agent 唯一标识 |
EMPLOYEE_NAME | Local Agent | 显示名称 |
EMPLOYEE_LABELS | - | 逗号分隔的标签(如 backend,python) |
RUNNER_MODE | claude | 执行模式:claude 或 fake |
DEFAULT_WORKSPACE | 当前目录 | 默认工作目录 |
RECONNECT_MS | 5000 | 重连间隔(ms) |
AI_TEAMS_ENCRYPTION_KEY | - | E2E 加密密钥(需与 Server 一致) |
Web
| 变量 | 默认值 | 说明 |
|---|---|---|
VITE_AI_TEAMS_AUTH_TOKEN | - | 开发模式默认 Token |
AI_TEAMS_SERVER_PORT | 3789 | Vite 代理目标端口 |
VITE_AI_TEAMS_ENCRYPTION_KEY | - | Web 端 E2E 加密密钥 |
REST API
所有 API 需要认证(Authorization: Bearer <token> 或 ?token=<token>)。Swagger UI:/docs。
健康检查,返回服务器状态摘要。
{
"status": "ok",
"timestamp": "2026-05-12T10:00:00.000Z",
"dbPath": "./data/ai-teams.db",
"employees": 2,
"leaders": 1,
"tasks": 42
}
获取完整状态快照(员工列表、所有任务、日志)。
{
"employees": [{ "id": "alice", "name": "Alice", "status": "online", ... }],
"tasks": [{ "id": "...", "prompt": "...", "status": "completed", ... }],
"logs": { "task-id": [{ "content": "...", "seq": 1 }] }
}
提交任务。支持三种目标模式、优先级、标签筛选和 Webhook 回调。
请求体
{
"prompt": "分析这段代码的性能问题",
"atAgents": "queue",
"workspace": "/path/to/project",
"timeoutSec": 600,
"priority": 2,
"requiredLabels": ["backend"],
"cliConfig": {
"model": "claude-sonnet-4-6",
"maxTurns": 10,
"systemPrompt": "你是一个代码审查专家",
"allowedTools": ["Read", "Grep", "Bash"]
},
"webhook": "https://your-server.com/callback"
}
响应 202 Accepted
{
"status": "accepted",
"leaderCommandId": "cmd_xxx",
"tasks": [{ "id": "task_xxx", "status": "queued", ... }]
}
查询任务列表,支持分页和过滤。
查询参数
| 参数 | 类型 | 说明 |
|---|---|---|
status | string | 过滤状态:queued / dispatched / accepted / running / completed / failed / cancelled / timeout |
employeeId | string | 按 Agent ID 过滤 |
limit | number | 每页数量(1-100,默认 50) |
offset | number | 偏移量(默认 0) |
{ "tasks": [...] }
获取单个任务详情。
更新任务。仅允许修改 status(设为 cancelled)、timeoutSec、cliConfig。
取消任务。运行中的任务会通知 Agent 终止 Claude 进程。
删除任务。仅终态任务可删除(completed / failed / cancelled / timeout)。
按 Session ID 获取对话历史(包含 prompt、输出、最终结果)。
列出指定 Agent 工作区下的 Claude Code 会话列表。
定时任务 API
完整的 CRUD + 手动触发接口,详见定时任务章节。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/schedules | 列出所有定时任务 |
| GET | /api/schedules/:id | 获取单个定时任务 |
| POST | /api/schedules | 创建定时任务 |
| PATCH | /api/schedules/:id | 更新定时任务 |
| DELETE | /api/schedules/:id | 删除定时任务 |
| POST | /api/schedules/:id/trigger | 手动触发一次执行 |
WebSocket 协议
两个 WebSocket 通道均需要 Token 认证(Header 或 ?token= 参数)。未授权连接将被关闭(code 1008)。
/ws/agent — Agent 通道
Agent 连接此通道,双向通信:接收任务、上报状态。
Server → Agent 消息
| 类型 | 字段 | 说明 |
|---|---|---|
task.dispatch | taskId, leaderCommandId, employeeId, targetMode, prompt, workspace, timeoutSec, cliConfig | 下发任务给 Agent |
task.cancel | taskId | 要求 Agent 取消任务 |
Agent → Server 消息
| 类型 | 字段 | 说明 |
|---|---|---|
agent.register | employeeId, name, machineId, hostname, labels, activeMainTaskId?, activeQueueTaskId?, lastOutputSeq? | 注册 Agent(连接后立即发送) |
agent.heartbeat | employeeId | 心跳(每 10s) |
agent.request_task | employeeId | 请求分配队列任务 |
task.accepted | taskId | Agent 接受任务 |
task.started | taskId, pid, sessionId? | Claude 进程已启动 |
task.output | taskId, stream (stdout|stderr), seq, content | 实时输出流 |
task.completed | taskId, exitCode, summary?, durationMs?, totalCostUsd?, usageInputTokens?, ... | 任务完成 |
task.failed | taskId, error | 任务失败 |
task.cancelled | taskId | 任务已取消 |
/ws/leader — Leader 通道
Web 控制台连接此通道。连接后 Server 立即推送完整 snapshot。
Server → Leader 消息
| 类型 | 字段 | 说明 |
|---|---|---|
snapshot | snapshot (StateSnapshot) | 完整状态快照(连接时推送) |
employee.upsert | employee (EmployeeSnapshot) | Agent 状态变更 |
task.upsert | task (TaskRecord) | 任务状态变更 |
task.output | chunk (TaskOutputChunk) | 任务实时输出 |
server.error | code, message | 服务端错误 |
command.error | code, message, leaderCommandId? | 命令执行错误 |
Leader → Server 消息
| 类型 | 字段 | 说明 |
|---|---|---|
command.dispatch | atAgents, prompt, workspace?, timeoutSec?, priority?, requiredLabels? | 通过 atAgents 调度任务 |
command.send | employeeId, prompt, workspace?, timeoutSec? | 直接发送给指定 Agent |
command.broadcast | prompt, workspace?, timeoutSec? | 广播给所有 Agent |
task.cancel | taskId | 取消任务 |
数据模型
TaskRecord
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 任务 ID |
| leaderCommandId | string | 命令批次 ID(同一命令产生的多个任务共享) |
| employeeId | string | null | 分配的 Agent ID |
| sessionId | string | null | Claude 会话 ID |
| targetMode | "queue" | "direct" | "broadcast" | 调度模式 |
| prompt | string | 任务指令 |
| workspace | string | null | 工作目录 |
| timeoutSec | number | 超时时间(秒) |
| cliConfig | TaskCliConfig | null | Claude CLI 配置 |
| priority | number (0-3) | 优先级(0=低, 1=普通, 2=高, 3=紧急) |
| requiredLabels | string[] | null | 要求的 Agent 标签 |
| status | TaskStatus | 当前状态 |
| createdAt / startedAt / finishedAt | string | null | 时间戳(ISO 8601) |
| exitCode | number | null | 退出码 |
| summary | string | null | 任务摘要 |
| error | string | null | 错误信息 |
| durationMs / durationApiMs | number | null | 耗时(ms) |
| numTurns | number | null | 对话轮次 |
| totalCostUsd | number | null | 总费用(USD) |
| usageInputTokens / usageOutputTokens | number | null | Token 用量 |
| usageCacheReadTokens / usageCacheCreationTokens | number | null | 缓存 Token 用量 |
| retryCount | number | 断线重试次数(上限 3 次) |
EmployeeSnapshot
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | Agent 唯一标识 |
| name | string | 显示名称 |
| machineId / hostname | string | 机器信息 |
| labels | string[] | 标签列表 |
| status | "online" | "offline" | 在线状态 |
| mainTaskId / mainTaskPrompt | string | null | 主槽任务 |
| queueTaskId / queueTaskPrompt | string | null | 队列槽任务 |
| lastSeenAt | string | 最后心跳时间 |
TaskCliConfig
| 字段 | 类型 | 说明 |
|---|---|---|
| model | string? | 模型名称(如 claude-sonnet-4-6) |
| maxTurns | number? | 最大对话轮次 |
| systemPrompt | string? | 系统提示词 |
| appendSystemPrompt | string? | 追加系统提示词 |
| allowedTools | string[]? | 允许的工具列表 |
| disallowedTools | string[]? | 禁止的工具列表 |
| extraArgs | string[]? | 额外 CLI 参数 |
Agent 使用
守护进程命令
ai-teams-agent <command> [选项]
命令:
start [选项] 后台启动守护进程
stop 停止守护进程
restart [选项] 重启守护进程
status 查看运行状态
update 更新到最新版本
选项:
--server <url> Server WebSocket 地址
--token <token> 认证 Token
--id <id> Agent 唯一标识
--name <name> 显示名称
--workspace <dir> 默认工作目录
--runner <mode> 执行模式 (claude | fake)
--config 重新运行配置向导
-h, --help 显示帮助
标签系统
通过 EMPLOYEE_LABELS 环境变量为 Agent 设置标签(逗号分隔):
EMPLOYEE_LABELS="backend,python,review" node dist/index.js
提交任务时可通过 requiredLabels 筛选匹配的 Agent:
{ "prompt": "审查 Python 代码", "atAgents": "queue", "requiredLabels": ["python"] }
双槽位并行
每个 Agent 有两个任务槽位:
- Main 槽 — 接收 direct / broadcast 任务,使用持久化会话
- Queue 槽 — 接收 queue 任务,使用独立会话
两个槽位可以同时运行,实现并行执行。
Fake Runner 模式
用于测试,无需安装 Claude CLI:
RUNNER_MODE=fake node dist/index.js
模拟 Agent 会定时输出步骤信息,最终返回成功结果。
Agent 文件结构
.ai-teams/agents/<EMPLOYEE_ID>/
├── session-state.json # 持久化会话 ID
├── daily/
│ └── 2026-05-12.md # 每日活动日志
└── hooks/
└── claude-hooks.settings.json # Claude hooks 配置
Web 控制台
六个功能页面
实时监控
Agent 卡片展示在线状态、活跃任务、终端输出。支持取消运行中任务。
员工管理
所有已注册 Agent 列表,显示标签、主机名、完成/失败任务统计。
任务日志
按状态筛选、分页加载。显示任务指令、执行者、时间、错误信息。
异常记录
筛选失败/超时/取消的任务,显示错误原因,支持一键重试。
统计分析
总任务、完成率、费用汇总、平均耗时。按 Agent 维度展示详细统计。
定时任务
创建和管理 cron 定时任务,启用/禁用、手动触发、查看执行历史。
命令面板
右侧命令面板支持:
- 目标选择 — 任务队列 / @所有员工 / 指定 Agent
- 工作目录 — 可选覆盖
- @ 提及 — 输入
@Alice自动解析为直接调度 - 群聊视图 — 历史命令和 Agent 回复按时间线展示
移动端适配
Web 控制台完全适配移动端:
- 固定全屏布局,仅聊天区域滚动
- 底部 Agent 状态快捷栏
- 点击 Agent 名称弹出终端输出浮层
- 自动重连 + 断线提示按钮
高级功能
任务优先级
任务支持 4 级优先级(默认 1 = 普通):
| 值 | 级别 | 说明 |
|---|---|---|
| 0 | 低 | 低于普通优先级 |
| 1 | 普通(默认) | 标准 FIFO |
| 2 | 高 | 插队到普通任务前 |
| 3 | 紧急 | 最优先执行 |
{ "prompt": "紧急修复线上 Bug", "priority": 3 }
标签调度
结合 Agent 标签和任务 requiredLabels 实现精准路由:
# Agent 端设置标签
EMPLOYEE_LABELS="frontend,react" node dist/index.js
# 任务端要求标签
{ "prompt": "重构组件", "requiredLabels": ["frontend"] }
调度逻辑:在匹配标签的 Agent 中选择负载最低的,同等负载时 round-robin 轮转。
端到端加密
设置 AI_TEAMS_ENCRYPTION_KEY(64 位 hex = 32 字节 AES 密钥)后,所有 WebSocket 消息使用 AES-256-GCM 加密。
# 生成随机密钥
openssl rand -hex 32
# 三端设置相同密钥
export AI_TEAMS_ENCRYPTION_KEY="生成的密钥"
注意:Web 端需使用 VITE_AI_TEAMS_ENCRYPTION_KEY 环境变量,在构建时嵌入。修改密钥后需重新构建 Web 应用。
不设置密钥时,所有通信为明文 JSON(向后兼容)。
Webhook 回调
提交任务时可指定 Webhook URL,Server 会在任务生命周期事件时向该 URL 发送 POST 请求。支持三种字段名:webhook、webhookUrl 或 webHook。
{ "prompt": "部署到生产环境", "webhook": "https://your-server.com/hooks/ai-teams" }
事件类型
| 事件 | 触发时机 | 附加字段 |
|---|---|---|
queue.updated | 任务入队或出队时,通知队列中所有注册了 webhook 的任务 | queuePosition(从 0 开始), queueLength |
task.started | Agent 开始执行任务 | - |
task.output | 消息级别的输出(tool 调用、文本回复、result 结果) 不包含 token 级别的流式 delta | chunk(TaskOutputChunk) |
task.completed | 任务执行成功 | - |
task.failed | 任务执行失败 | - |
task.cancelled | 任务被取消 | - |
task.timeout | 任务超时 | - |
回调示例
queue.updated — 队列位置通知
{
"event": "queue.updated",
"timestamp": "2026-05-19T03:37:07.000Z",
"task": { "id": "task_xxx", "status": "queued", ... },
"queuePosition": 2,
"queueLength": 5
}
task.started — 任务开始
{
"event": "task.started",
"timestamp": "2026-05-19T03:38:01.132Z",
"task": {
"id": "task_xxx",
"status": "running",
"employeeId": "alice",
"startedAt": "2026-05-19T03:38:01.132Z",
...
}
}
task.output — 工具调用
{
"event": "task.output",
"timestamp": "2026-05-19T03:40:14.572Z",
"task": { "id": "task_xxx", "status": "running", ... },
"chunk": {
"taskId": "task_xxx",
"employeeId": "alice",
"stream": "stdout",
"seq": 1,
"content": "[tool] WebSearch\n",
"createdAt": "2026-05-19T03:40:14.571Z"
}
}
task.output — 最终结果
{
"event": "task.output",
"timestamp": "2026-05-19T03:40:39.611Z",
"task": { "id": "task_xxx", "status": "running", ... },
"chunk": {
"taskId": "task_xxx",
"employeeId": "alice",
"stream": "stdout",
"seq": 109,
"content": "\n[done] Claude result\n[done] subtype: success\n[done] session_id: xxx\n[done] duration_ms: 30139\n[done] duration_api_ms: 29859\n[done] num_turns: 2\n[done] total_cost_usd: 0.0767\n[done] result: 天津今天阴天,气温17~24℃...",
"createdAt": "2026-05-19T03:40:39.611Z"
}
}
task.completed — 任务完成
{
"event": "task.completed",
"timestamp": "2026-05-19T03:40:39.705Z",
"task": {
"id": "task_xxx",
"status": "completed",
"employeeId": "alice",
"exitCode": 0,
"summary": "天津今天阴天,气温17~24℃...",
"finishedAt": "2026-05-19T03:40:39.704Z",
...
}
}
安全验证
每个回调请求包含签名头,用于验证请求来源:
x-ai-teams-signature: sha256=<HMAC-SHA256>
签名密钥为 AI_TEAMS_AUTH_TOKEN,对请求 body 做 HMAC-SHA256 签名。验证示例:
import hmac, hashlib
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
投递保证
- 失败自动重试,最多 3 次,间隔 1 秒
- 请求超时 10 秒,超时后触发重试
- 任务进入终态后自动清理内存中的 webhook 记录
数据库
默认使用 SQLite(node:sqlite),设置 DATABASE_URL 可切换到 PostgreSQL。
| 表 | 说明 |
|---|---|
| employees | Agent 注册信息(JSON 快照) |
| tasks | 任务记录(完整字段) |
| task_logs | 任务输出日志(按 task_id + seq) |
| task_webhooks | 任务 Webhook URL |
| schedules | 定时任务配置(cron 表达式、目标、提示词) |
| schema_meta | Schema 元信息(版本号、游标等) |
Server 启动时从数据库恢复状态,标记所有 Agent 为 offline,重新入队未完成任务。
守护进程
Server 和 Agent 均支持守护进程模式,使用三阶段进程模型确保稳定性:
用户执行 start
│
▼
┌──────────┐ fork (detached) ┌──────────┐ fork (env: WORKER=1) ┌──────────┐
│ Launcher │ ──────────────────► │ Watchdog │ ───────────────────────► │ Worker │
│ (退出) │ │ 写 PID │ │ 业务逻辑 │
└──────────┘ │ 监控存活 │ │ connect()│
│ 自动重启 │ └──────────┘
└──────────┘
常用命令
# 启动(后台运行)
ai-teams-server start --token "your-token"
ai-teams-agent start --server ws://localhost:3789 --token "your-token"
# 查看状态
ai-teams-server status # → running (PID 12345)
ai-teams-agent status
# 重启
ai-teams-server restart
ai-teams-agent restart
# 停止
ai-teams-server stop
ai-teams-agent stop
# 更新版本
ai-teams-server update # npm 全局更新
ai-teams-agent update # 更新后提示 restart
自动恢复
Watchdog 进程监控 Worker,异常退出时自动重启(每分钟最多 10 次)。PID 文件位于工作目录下:
- Server:
<data-dir>/.ai-teams/server/server.pid - Agent:
<workspace>/.ai-teams/agents/<id>/agent.pid
日志输出到各守护进程的 logs/ 目录,可用 status 命令查看路径。
配置持久化:CLI 参数在首次 start 时保存到配置文件(Server: ~/.ai-teams/server-config.json,Agent: ~/.ai-teams/config.json)。后续 start、restart 自动加载已保存配置,无需重复指定。不带子命令运行仍为前台模式。
容错机制
断线任务恢复
当 Agent 意外断开连接时,Server 执行以下恢复流程:
- 宽限期等待(默认 15 秒)— 如果 Agent 在宽限期内重连,任务继续执行
- 自动重新入队 — 宽限期过后,未完成任务重新进入队列
- 重试次数限制 — 每个任务最多重试 3 次,超过后标记为 failed
重试策略
| 重试次数 | 行为 | 调度延迟 |
|---|---|---|
| 第 1 次 (retryCount=1) | 重新入队并立即调度 | 无延迟 |
| 第 2 次 (retryCount=2) | 重新入队,延迟后调度 | 5 秒 |
| 第 3 次 (retryCount=3) | 重新入队,延迟后调度 | 10 秒 |
| 第 4 次 (retryCount>3) | 标记为 failed | - |
心跳检测
Server 为每个在线 Agent 维护 30 秒心跳超时:
- Agent 每 10 秒发送
agent.heartbeat - 超过 30 秒无心跳自动标记为
offline - 回收未执行的队列任务到共享队列
Server 重启恢复
Server 重启时从数据库恢复全部状态:
- 所有 Agent 标记为
offline,等待重新注册 - 未完成的任务重新入队(不受重试次数限制)
- Agent 重连后可恢复原有任务(通过
activeMainTaskId/activeQueueTaskId)
定时任务
通过 REST API 创建 cron 定时任务,Server 会按计划自动执行。支持所有任务调度模式(queue / direct / broadcast)。
创建定时任务
POST /api/schedules
{
"name": "每日代码审查",
"cron": "0 9 * * 1-5",
"enabled": true,
"targetMode": "queue",
"prompt": "检查最近的代码变更并生成审查报告",
"workspace": "/path/to/project",
"priority": 1,
"requiredLabels": ["backend"]
}
返回包含 nextRunAt 字段,表示下次执行时间。
Schedule REST API
列出所有定时任务。
获取单个定时任务详情。
创建定时任务。必填:name、cron(cron 表达式)、prompt。
更新定时任务。可修改 enabled、cron、prompt 等字段。
删除定时任务。
手动触发一次定时任务执行(不受 cron 计划限制)。
Schedule 数据模型
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 定时任务 ID |
| name | string | 名称 |
| cronExpr | string | Cron 表达式(如 0 9 * * 1-5 = 工作日 9 点) |
| enabled | boolean | 是否启用 |
| targetMode | "queue" | "direct" | "broadcast" | 调度模式 |
| targetAgents | string[] | direct 模式的目标 Agent 列表 |
| prompt | string | 任务提示词 |
| workspace | string | null | 工作目录 |
| timeoutSec | number | null | 超时时间 |
| priority | number (0-3) | 优先级 |
| requiredLabels | string[] | null | 标签筛选 |
| lastRunAt | string | null | 上次执行时间 |
| nextRunAt | string | null | 下次计划执行时间 |
| createdAt / updatedAt | string | 创建 / 更新时间 |
提示:修改 enabled、cron 等字段后,Server 自动重启定时器,无需手动重启服务。更新和删除操作立即生效。