1. 项目概述:一个为异构AI智能体打造的分布式指挥中心
如果你和我一样,在尝试构建一个由多个AI智能体组成的“团队”时,常常会感到头疼。这些智能体可能运行在不同的环境里——有的在云端的GPU服务器上跑着大模型推理,有的在你本地的MacBook上处理文档,还有的专门负责对接Slack或Telegram。如何让它们知道彼此在做什么?如何给它们分派任务,并确保任务被合适的“人”执行?如何让它们安全地通信和共享文件?这正是ACC(Agent Command Center)要解决的核心问题。
ACC不是一个单一的AI模型,而是一个分布式协调框架。你可以把它想象成一个项目的“指挥中心”或“调度大厅”。它通过一个中心化的Hub(枢纽)来管理一个异构的机器集群,为运行在这些机器上的各种AI智能体(Agent)提供共享的工作队列、消息总线和统一的API。无论你的智能体是用Python写的脚本,还是基于hermes-agent这样的运行时,只要它们能通过HTTP与Hub通信,就能被纳入这个统一的协调体系中。
我最初接触这个项目,是因为需要协调一个包含代码生成、内容创作和数据分析的混合智能体工作流。手动在服务器之间同步状态和文件简直是噩梦。ACC提供的这套“中心调度,边缘执行”的架构,完美地将任务编排、资源发现和跨机通信抽象了出来,让我能更专注于智能体本身的能力建设。
2. 核心架构与设计哲学
2.1 为什么是“中心-边缘”架构?
在分布式系统设计中,我们常在完全对等的P2P架构和中心化的星型架构之间做选择。ACC选择了后者,并在此基础上做了增强,这背后有非常实际的考量。
一个纯粹的中心化架构(所有通信都经过中心节点)容易成为性能和单点故障的瓶颈。而一个完全的去中心化P2P架构,虽然健壮,但会让任务调度、状态同步和全局视图变得极其复杂,尤其是在智能体能力各异(异构)的场景下。
ACC采用了一种混合架构:它有一个绝对的中心——acc-server(即Hub),负责维护全局状态(工作队列、智能体注册表、密钥库);同时,它又通过AgentBus机制支持智能体之间的点对点(P2P)直接通信。这种设计的好处是:
- 调度与发现集中化:Hub知道每个智能体的能力(是否有GPU、是否运行了Claude CLI等)。当一个任务进入队列时,Hub可以根据
preferred_executor字段,高效地将其匹配给最合适的空闲智能体。智能体无需相互探测,简化了系统逻辑。 - 通信可直连可中转:对于需要低延迟、大数据量传输的通信(如文件传输、流式执行结果),智能体可以通过
AgentBus直接建立连接。而对于轻量的控制指令、状态同步,则通过Hub广播。这兼顾了效率与可靠性。 - 简化运维与调试:所有关键状态(队列、智能体列表、密钥)都存储在Hub的
~/.ccc/data/目录下,是简单的JSON文件。这意味着你可以直接查看、备份甚至手动修改系统状态,调试和问题排查的门槛大大降低。
2.2 核心组件角色解析
ACC的生态系统由多个相互协作的组件构成,理解它们各自扮演的角色,是部署和运维的关键。
Hub节点组件(运行在中心服务器):
acc-server(Rust/Axum):这是整个系统的大脑和门户。它提供了:- REST API (端口8789):所有智能体注册、任务拉取、状态上报、密钥管理的接口。
- Web Dashboard:通过浏览器访问
http://your-server:8789/,可以获得一个直观的图形化界面,查看队列状态、智能体在线情况、系统日志等。这对于非命令行用户监控系统至关重要。 - 数据持久化:将队列、智能体信息等写入本地JSON文件。
ccc-queue-worker:这是一个常驻进程,负责从Hub的队列中“认领”(claim)任务,并驱动本地智能体运行时(如hermes-driver)去执行。它是连接Hub任务调度和本地智能体执行的“桥梁”。ccc-bus-listener:监听AgentBus的Server-Sent Events (SSE)流。当其他智能体通过Hub广播消息时,本地的监听器能实时接收到。ccc-exec-listen:一个安全的远程命令执行端点。当其他智能体或Hub通过AgentBus发送执行指令时,由它接收并在一个受控的沙箱环境中执行,然后将结果返回。- 辅助服务 (Docker Compose):通过
make docker-up一键启动的配套服务,包括:- MinIO:提供S3兼容的对象存储。这是智能体之间共享文件(如生成的图片、数据集、模型权重)的核心设施。所有智能体都配置了相同的MinIO终端和密钥,从而实现共享存储。
- Qdrant:向量数据库。为需要语义搜索、记忆检索的智能体提供支持。
- TokenHub:LLM路由代理。这是一个关键组件,它统一了不同LLM API(如OpenAI、Anthropic、本地vLLM服务)的调用接口,并提供配额管理和路由功能。智能体无需关心具体调用哪个终端,只需向TokenHub发起请求。
智能体节点组件(运行在各工作机器):
hermes-agent:这是ACC生态中智能体的主要运行时环境。你可以通过pipx安装。它本身是一个功能强大的智能体框架,ACC通过hermes-driver来驱动和管理hermes-agent的会话。hermes-driver(deploy/hermes-driver.py):这是一个Python脚本,是ACC与hermes-agent之间的“粘合剂”。它持续向Hub轮询是否有分配给本智能体的任务(preferred_executor: hermes),如果有,则启动一个hermes-agent会话来执行该任务,并负责将会话的心跳和最终结果回传给Hub。- Claude Code CLI会话:对于编码类任务,ACC支持直接与Claude Code CLI交互。这通常通过一个在
tmux或screen中运行的持久会话来实现。workqueue/scripts/claude-worker.mjs这个Node.js脚本会监控这个会话,并将队列任务转发给它执行。 - 本地vLLM服务:如果智能体节点有GPU,可以配置并启动一个vLLM服务,在本地托管一个大模型(如
google/gemma-4-31B-it)。这样,其他智能体或通过TokenHub路由过来的请求,就可以直接使用本地的GPU算力进行推理,节省成本并降低延迟。
注意:一个物理节点(一台机器)上可以运行多个“逻辑智能体”,但通常一个节点配置一个主智能体更为清晰。节点的能力(如
AGENT_HAS_GPU)是注册到Hub的,而具体的任务执行由该节点上的hermes-driver或claude-worker等进程来完成。
3. 从零开始:部署你的第一个ACC集群
理论讲得再多,不如动手搭一遍。下面我将带你完成一个最小化可用的ACC集群部署,包含一个Hub节点和一个智能体节点。
3.1 Hub节点部署(中心服务器)
假设你有一台具有公网IP的云服务器(Ubuntu 22.04),这将作为我们的Hub。
第一步:环境准备与代码获取
# 1. 安装基础依赖 sudo apt update && sudo apt install -y git curl make docker.io docker-compose-v2 jq # 2. 克隆ACC仓库 git clone https://github.com/jordanhubbard/ACC.git ~/ACC cd ~/ACC # 3. 安装Rust工具链(用于构建acc-server) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env第二步:配置Hub环境变量
这是最关键的一步,所有服务的行为都由环境变量控制。
# 1. 创建配置目录并复制模板 mkdir -p ~/.ccc cp deploy/.env.server.template ~/.ccc/.env # 2. 编辑配置文件,填入你的实际值 nano ~/.ccc/.env你需要修改以下关键变量:
# Hub服务端口 CCC_PORT=8789 # 允许连接到Hub的智能体令牌(用逗号分隔)。可以生成UUID或随机字符串。 CCC_AUTH_TOKENS=agent_token_1,agent_token_2 # 管理员令牌,用于高危操作,务必与CCC_AUTH_TOKENS不同且严格保密。 CCC_ADMIN_TOKEN=your_super_secret_admin_token_here # MinIO对象存储配置(用于文件共享) MINIO_ENDPOINT=http://localhost:9000 MINIO_ACCESS_KEY=your_minio_access_key MINIO_SECRET_KEY=your_minio_secret_key MINIO_BUCKET=agents # (可选)Slack/Mattermost集成,用于接收通知 # SLACK_TOKEN=xoxb-... # SLACK_DEFAULT_CHANNEL=general实操心得:
CCC_AUTH_TOKENS可以预先为你的智能体生成。例如,你可以用openssl rand -hex 16生成一个强随机令牌。每个智能体使用其中一个令牌进行认证。CCC_ADMIN_TOKEN务必单独生成并妥善保管,不要泄露给智能体。
第三步:启动Docker Compose服务栈
ACC使用Docker Compose来管理MinIO、Qdrant等依赖服务。
# 在ACC项目根目录下执行 make docker-up这个命令会启动定义在docker-compose.yml中的所有服务。使用docker ps检查服务是否正常运行。你应该能看到minio、qdrant等容器。
第四步:构建并启动ACC核心服务
# 1. 构建Rust API服务器 (acc-server) make build # 2. 启动acc-server(通常在前台运行以观察日志) # 它会读取 ~/.ccc/.env 的配置,并在CCC_PORT指定的端口(如8789)监听。 cargo run --bin acc-server现在,打开浏览器访问http://你的服务器IP:8789,你应该能看到ACC的Web仪表盘。恭喜,Hub已经就绪!
为了让服务在后台稳定运行,我强烈建议使用提供的systemd服务文件。
# 将systemd服务文件复制到系统目录 sudo cp deploy/systemd/*.service /etc/systemd/system/ # 重新加载systemd配置 sudo systemctl daemon-reload # 启用并启动acc-server服务 sudo systemctl enable acc-server.service sudo systemctl start acc-server.service # 查看服务状态和日志 sudo systemctl status acc-server.service sudo journalctl -u acc-server.service -f3.2 智能体节点部署(工作机器)
智能体节点可以是任何能联网的机器,比如你本地的Linux/Mac笔记本,或者另一台云服务器。
第一步:基础环境准备
# 在智能体节点上操作 # 安装基础工具 sudo apt update && sudo apt install -y git curl make jq tmux python3-pip # 克隆ACC仓库(只需要代码,不需要启动全部服务) git clone https://github.com/jordanhubbard/ACC.git ~/ACC-agent cd ~/ACC-agent # 安装hermes-agent(智能体运行时) pipx install hermes-agent第二步:配置智能体环境变量
智能体的配置更关注自身的能力和如何连接到Hub。
mkdir -p ~/.ccc cp deploy/.env.template ~/.ccc/.env nano ~/.ccc/.env关键配置如下:
# 指向Hub的URL CCC_URL=http://你的Hub服务器IP:8789 # 该智能体使用的令牌,必须在Hub的CCC_AUTH_TOKENS列表中 CCC_AGENT_TOKEN=agent_token_1 # 智能体标识 AGENT_NAME=rocky # 例如,用卡通角色名命名很有趣 AGENT_HOST=my-laptop # 可读的主机名 # 声明你的智能体具备的能力 AGENT_CLAUDE_CLI=false # 如果你安装了Claude Code CLI并配置了tmux会话,可设为true AGENT_HAS_GPU=false # 如果有GPU则设为true,并设置下方GPU参数 # AGENT_GPU_MODEL=RTX 4090 # AGENT_GPU_COUNT=1 # AGENT_GPU_VRAM_GB=24 # 配置如何访问Hub上的共享服务 TOKENHUB_URL=http://你的Hub服务器IP:8090 # TokenHub地址 MINIO_ENDPOINT=http://你的Hub服务器IP:9000 # MinIO地址 QDRANT_URL=http://你的Hub服务器IP:6333 # Qdrant地址 # 对应的访问密钥需要从Hub同步,后面会讲第三步:向Hub注册智能体
配置好环境变量后,执行注册命令,将本智能体的信息(名称、主机名、能力)上报给Hub。
make register如果一切正常,你会在终端看到成功的响应,同时在Hub的仪表盘上(http://Hub-IP:8789/agents)应该能看到名为rocky的智能体上线。
第四步:启动智能体工作进程
注册只是上报了元数据,要让智能体开始干活,需要启动它的工作进程。
# 启动队列工作进程,它会持续向Hub询问是否有任务 make queue-worker # 在另一个终端,启动AgentBus监听器,接收其他智能体的消息 make bus-listener现在,你的智能体节点已经处于待命状态。它会定期向Hub发送心跳,证明自己在线,并准备接收任务。
注意事项:和Hub一样,在生产环境中,你应该使用systemd或launchd来管理这些后台进程。项目提供了对应的服务文件(
deploy/systemd/或deploy/launchd/),可以将ccc-queue-worker和ccc-bus-listener作为守护进程运行。
4. 核心工作流详解:任务从创建到完成
理解了部署,我们深入看看ACC的核心——工作队列(Work Queue)系统。这是协调智能体工作的中枢神经系统。
4.1 工作队列模型与生命周期
ACC的工作队列不是一个简单的先进先出(FIFO)队列,而是一个基于能力的任务调度系统。每个队列项(Job)包含一个preferred_executor字段,指明了执行该任务所需的“执行器”类型。
| 执行器类型 | 含义与要求 | 典型场景 |
|---|---|---|
claude_cli | 需要能访问Claude Code CLI的持久会话(tmux)。智能体需设置AGENT_CLAUDE_CLI=true。 | 复杂的代码生成、重构、调试任务。 |
hermes | 需要能运行hermes-agent。由hermes-driver驱动。 | 通用的AI智能体任务,如规划、工具使用、多步推理。 |
inference_key | 需要消耗LLM API额度。任务将通过TokenHub路由到配置的LLM服务(如OpenAI, Anthropic)。 | 任何需要调用大模型API的任务。 |
gpu | 需要GPU硬件。智能体需设置AGENT_HAS_GPU=true。 | 大模型微调、批量推理、图像生成等计算密集型任务。 |
一个任务的生命周期如下:
- 创建:通过向Hub的
POST /api/queue接口提交一个JSON对象来创建任务。这个对象包含任务指令(instruction)、执行器偏好、优先级、元数据等。 - 待定:任务进入队列,状态为
pending。Hub会检查所有已注册的、在线的智能体,寻找其capabilities与任务的preferred_executor匹配的智能体。 - 认领:匹配的智能体上的
ccc-queue-worker进程会定期调用GET /api/queue/claim来“认领”一个适合它的任务。认领后,任务状态变为running,并记录认领的智能体ID。 - 执行:
ccc-queue-worker根据任务类型,调用相应的本地执行器(如启动hermes-driver,或通知claude-worker)。执行器开始工作。 - 心跳与更新:执行过程中,智能体会定期向Hub发送
POST /api/queue/<job_id>/heartbeat,更新任务进度,防止任务因超时被重新放回队列。 - 完成/失败:任务执行完毕后,智能体向Hub发送
POST /api/queue/<job_id>/complete或/fail,并附上结果或错误信息。任务状态相应更新为completed或failed,并可能触发后续动作(如通知)。
4.2 实战:提交你的第一个任务
让我们通过一个具体例子,看看如何让智能体“Rocky”写一首诗。
第一步:在Hub上创建任务
你可以使用curl命令,或者任何你喜欢的HTTP客户端(如Postman)。
# 在任意能访问Hub的机器上执行 curl -X POST http://你的Hub服务器IP:8789/api/queue \ -H "Authorization: Bearer your_super_secret_admin_token_here" \ -H "Content-Type: application/json" \ -d '{ "instruction": "Write a short haiku about distributed AI systems.", "preferred_executor": "hermes", # 让hermes-agent来执行 "metadata": { "project": "demo", "created_by": "operator" } }'如果成功,Hub会返回一个JSON响应,包含新创建任务的ID(如job_abc123)。
第二步:观察任务流转
- 打开Hub仪表盘 (
http://Hub-IP:8789),进入“Queue”标签页。你会看到刚创建的任务,状态是pending。 - 在智能体“Rocky”的终端,观察
ccc-queue-worker的日志。几秒内,它应该会打印出认领任务的消息。 - 同时,
hermes-driver会被触发,启动一个hermes-agent会话来处理“写俳句”的指令。你可以在hermes-driver的日志中看到详细的执行过程。 - 任务完成后,Hub仪表盘上该任务的状态会变为
completed。点击任务可以查看详细结果,其中应包含hermes-agent生成的俳句。
第三步:通过API获取结果
curl -X GET http://你的Hub服务器IP:8789/api/queue/job_abc123 \ -H "Authorization: Bearer your_super_secret_admin_token_here"返回的JSON中,result字段就包含了智能体生成的诗句。
实操心得:
preferred_executor是一个“偏好”,而非强制。如果系统内没有匹配的智能体,任务会一直处于pending状态。你可以设计一个“降级”策略,例如,如果一个gpu任务等待超时,可以将其preferred_executor修改为inference_key,转而使用云端API。这可以通过在Hub上运行一个监控脚本,或利用ACC的“技能”(Skill)机制来实现。
5. 高级特性与运维技巧
5.1 穿越防火墙:反向隧道连接
很多位于公司内网或家庭NAT后的机器无法被公网Hub直接访问。ACC提供了优雅的反向SSH隧道方案来解决这个问题。
其原理是,让内网智能体主动向公网Hub建立一个SSH连接,并在该连接上反向映射一个端口。这样,Hub就可以通过localhost:映射端口来访问内网智能体本地的服务(如ccc-exec-listen)。
配置步骤:
- 在Hub上准备隧道用户:Hub需要有一个用于接收隧道连接的系统用户(如
tunnel)。 - 智能体申请隧道:内网智能体向Hub的
POST /api/tunnel/request接口发送自己的SSH公钥。 - Hub授权:Hub将该公钥添加到
tunnel用户的~/.ssh/authorized_keys文件中。 - 建立隧道:内网智能体执行类似下面的命令:
这条命令将智能体本地的8080端口(ssh -N -R 10022:localhost:8080 tunnel@你的Hub服务器IPccc-exec-listen服务端口)映射到了Hub的10022端口。 - Hub调用:当Hub需要向内网智能体发送远程执行命令时,它会向
http://localhost:10022发送请求,该请求通过SSH隧道被转发到内网智能体的8080端口。
项目中的deploy/systemd/sparky-reverse-tunnel.service就是一个自动管理此隧道的systemd服务模板。
5.2 安全管理:密钥与通信安全
在分布式系统中,安全是重中之重。ACC设计了多层安全机制:
- 认证与授权:所有API调用都需要Bearer Token(
CCC_AGENT_TOKEN或CCC_ADMIN_TOKEN)。Hub会验证令牌是否在CCC_AUTH_TOKENS列表中,或者是否是管理员令牌。 - 密钥管理:永远不要将密钥硬编码在代码或手动写入多个智能体的
.env文件。ACC使用Hub端的密钥库(/api/secrets)来集中存储敏感信息(如API密钥、数据库密码)。通过deploy/secrets-sync.sh脚本,Hub可以将密钥安全地同步到各个智能体的环境变量文件中。 - AgentBus签名:智能体之间的点对点消息通过
AgentBus传输,每条消息都使用共享的AGENTBUS_TOKEN进行HMAC-SHA256签名。接收方会验证签名,确保消息来源可信且未被篡改。 - 远程执行沙箱:
ccc-exec-listen服务在执行来自网络的命令时,应在严格的沙箱环境中进行(例如,使用docker run或nsjail),限制其文件系统、网络和系统调用权限,防止恶意指令破坏主机。
5.3 监控与调试
当系统规模变大时,有效的监控至关重要。
- 仪表盘:Hub自带的Web界面是首要的监控工具,可以快速查看队列积压、智能体在线状态。
- 日志聚合:ACC组件默认输出日志到标准输出(stdout)和文件。建议使用
systemd journal(Linux)或logrotate+云日志服务(如Loki, ELK)来集中收集和查询所有节点的日志。 - 健康检查:每个智能体通过
heartbeat-local.service定期向Hub发送心跳。Hub可以根据心跳超时判断智能体是否离线,并将它认领的任务重新标记为pending。 - 数据备份:Hub的所有状态都存储在
~/.ccc/data/下的JSON文件中。定期备份这个目录,可以在灾难恢复时快速重建整个集群的状态。可以使用简单的cron任务配合rsync或云存储来完成。
5.4 扩展性与自定义
ACC的架构是模块化和可扩展的。
- 添加新的执行器类型:如果你有一种特殊类型的任务(例如,需要特定硬件设备),你可以在Hub的队列匹配逻辑和智能体的能力注册中添加新的
preferred_executor类型,并编写对应的本地工作进程。 - 集成外部系统:Hub的REST API允许你轻松地将ACC集成到现有的CI/CD流水线、任务管理系统或聊天机器人中。例如,你可以写一个GitHub Action,在Issue创建时自动向ACC队列提交一个代码审查任务。
- 开发自定义技能(Skills):
hermes-agent支持技能扩展。你可以为你的智能体开发专用技能,并将其注册到ACC系统中,这样其他智能体或操作员就可以通过队列任务来调用这些技能。
6. 常见问题与故障排查实录
在实际部署和运行ACC的过程中,你肯定会遇到各种问题。下面是我踩过的一些坑和解决方法。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
智能体注册失败 (make register报错) | 1. Hub地址或端口错误。 2. 网络不通或防火墙阻挡。 3. CCC_AGENT_TOKEN未在Hub的CCC_AUTH_TOKENS中列出。 | 1. 用curl -v http://Hub-IP:8789/api/agents测试Hub API是否可达。2. 检查Hub服务器防火墙是否开放了8789端口。 3.仔细核对智能体 .env中的CCC_AGENT_TOKEN是否完全一致地出现在Hub.env的CCC_AUTH_TOKENS列表中(注意逗号分隔,无空格)。 |
| 智能体在线但认领不到任务 | 1. 智能体能力 (capabilities) 与任务要求的preferred_executor不匹配。2. ccc-queue-worker服务未运行或崩溃。3. 队列中根本没有 pending状态的任务。 | 1. 在Hub仪表盘检查该智能体的“Capabilities”是否包含任务所需的类型(如hermes)。2. 在智能体节点运行 systemctl status ccc-queue-worker检查服务状态,查看日志journalctl -u ccc-queue-worker -f。3. 确认已成功创建任务,且状态为 pending。 |
hermes-driver启动失败或任务执行出错 | 1. Python环境或依赖问题。 2. hermes-agent未正确安装。3. 任务指令格式错误,导致 hermes解析失败。 | 1. 确认Python版本(建议3.9+),使用pip install -r requirements.txt安装依赖。2. 运行 hermes --version确认安装成功。3. 查看 hermes-driver的详细日志,错误通常会有明确提示。尝试用一个简单的指令(如“echo hello”)提交任务,测试基础流程。 |
| Hub仪表盘无法访问 | 1.acc-server进程未运行。2. 端口被占用或配置错误。 3. 服务器防火墙限制。 | 1.systemctl status acc-server。2. `sudo netstat -tlnp |
| MinIO或Qdrant连接失败 | 1. Docker Compose服务未启动。 2. 网络配置问题(如Docker网络隔离)。 3. 环境变量中的终端地址或密钥错误。 | 1. 在Hub节点运行docker ps,确认minio和qdrant容器状态为Up。2. 尝试从Hub节点内部用 curl http://localhost:9000测试MinIO。3.重中之重:确保智能体 .env中的MINIO_ENDPOINT等地址指向的是Hub的公网IP或域名,而不是localhost。智能体是从外部访问这些服务的。 |
| 反向隧道建立失败 | 1. Hub上tunnel用户或SSH服务未配置好。2. 智能体的SSH公钥未正确添加到Hub的 authorized_keys。3. Hub的SSH端口(22)被防火墙阻挡。 | 1. 在Hub上手动测试:sudo -u tunnel ssh localhost应能免密登录。2. 检查 /home/tunnel/.ssh/authorized_keys文件权限(应为600),并确认公钥内容正确。3. 在智能体上使用 ssh -v选项查看详细的连接调试信息。 |
一个典型的排错流程:
- 定位问题层面:是网络问题、配置问题,还是服务进程问题?
- 查看日志:永远是第一选择。使用
journalctl -u <service_name> -f或直接查看服务的输出日志。 - 简化测试:用最基础的
curl命令测试API连通性,提交一个最简单的任务,排除复杂指令的干扰。 - 对比配置:仔细对比Hub和智能体的
.env文件,确保所有URL、令牌、端口都正确无误,特别是那些需要完全匹配的令牌字符串。 - 检查依赖服务:确认Docker容器(MinIO, Qdrant, TokenHub)是否全部健康运行。
部署这样一套分布式系统,耐心和细致的排查是关键。我的经验是,第一次搭建时,严格按照文档一步步来,并做好每一步的验证。一旦第一个智能体成功运行并完成一个任务,后面的扩展就会顺利很多。ACC提供的这套架构,虽然初看组件不少,但一旦理顺,它为你带来的那种“一群AI智能体井然有序协同工作”的体验,绝对是物超所值的。