@axiom-lattice/cli-a2a (韩语)
多供应商A2A(代理代理)CLI网关. 环绕本地编码代理
(OpenCode, Codex, Claude Code)作为符合光谱的A2A服务器. 放下一个JSON
配置,获得一个完全符合光谱的A2A剂——可通过 npx。 。 。 .
快速启动
# 1. Start your local OpenCode server
opencode serve
# 2. Launch the A2A gateway
npx @axiom-lattice/cli-a2a --provider opencode --port 3000
# 3. Verify
curl http://localhost:3000/health
# → { "status": "healthy", "agent": "CLI A2A Agent", "provider": "opencode" }
curl http://localhost:3000/.well-known/agent-card.json
# → A2A v0.3 AgentCard JSON
供应商
| 提供者 | 状态 | 连接 |
|---|---|---|
opencode | 准备 | HTTP API (英语)opencode serve(中文(简体) ) |
codex | 准备 | CLI 子进程 (codex(中文(简体) ) |
claude | 准备 | CLI 子进程 (claude -p(中文(简体) ) |
使用量
npx @axiom-lattice/cli-a2a [options]
选项
--provider <name> Provider: opencode | codex | claude
--config, -c <path> Path to agent JSON config file
--port, -p <number> A2A server port (default: 3000)
--hostname <addr> Bind address (default: 0.0.0.0)
--advertise-host <host> Hostname for agent card URLs
--agent-name <name> Agent display name
--agent-description <desc> Agent description
--log-level <level> debug | info | warn | error (default: info)
打开代码选项
--opencode-url <url> OpenCode server URL (default: http://localhost:4096)
--directory, -d <path> Project directory
--model, -m <provider/model> LLM model
--agent <name> OpenCode agent preset
代码选项
--codex-model <model> Codex model ID (e.g. gpt-4o)
--codex-api-key <key> OpenAI API key
Claude 代码选项
--claude-model <model> Claude Code model ID
--claude-api-key <key> Anthropic API key
网关注册
CLI 可以自动注册一个 @axiom-lattice/gateway 服务器
网关作为一等远程代理发现并通向它的路线.
--register-url <url> Gateway URL to register this agent with
--register-key <key> API key for gateway authentication
--unregister-on-shutdown Remove agent from gateway on exit
npx @axiom-lattice/cli-a2a \
--provider opencode \
--port 3001 \
--register-url http://gateway:8080 \
--register-key sk-a2a-gateway-key \
--unregister-on-shutdown &
启动 CLI POST 时 {registerUrl}/api/assistants 带有
graphDefinition 类型 a2a_remote 指着自己的代理卡.
退出时( 如果 --unregister-on-shutdown这是DELETES的助手.
注册后,代理人与所有其他代理人一起出现在
网关和可以通过标准引用 /api/runs 终点.
配置文件
{
"provider": "opencode",
"agentCard": {
"name": "My Coding Agent",
"description": "A coding assistant powered by OpenCode",
"skills": [
{
"id": "code-gen",
"name": "Code Generation",
"description": "Generate and refactor code",
"tags": ["coding", "typescript"]
}
]
},
"server": {
"port": 3000,
"advertiseHost": "localhost"
},
"opencode": {
"baseUrl": "http://localhost:4096",
"projectDirectory": "/path/to/project",
"model": "anthropic/claude-sonnet-4"
},
"features": {
"autoApprovePermissions": true,
"streamArtifactChunks": false
},
"timeouts": {
"prompt": 600000
}
}
配置层以优先级顺序合并 : 默认 QQ 配置文件 QQ env vars QCLI 参数。 。 。 .
环境变量
| 变量 | 地图到 |
|---|---|
OPENCODE_URL | opencode.baseUrl |
OPENCODE_DIRECTORY | opencode.projectDirectory |
OPENCODE_MODEL | opencode.model |
OPENCODE_AGENT | opencode.agent |
OPENAI_API_KEY | codex.apiKey |
ANTHROPIC_API_KEY | claude.apiKey |
终点
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /health | 健康检查 |
GET | /.well-known/agent-card.json | A2A 代理卡 |
POST | /a2a/jsonrpc | A2A JSON-RPC运输 |
POST | /a2a/rest | A2A REST运输 |
程序化 API
import {
createA2AServer,
resolveConfig,
registerExecutor,
createOpenCodeExecutor,
createCodexExecutor,
createClaudeExecutor,
SessionBindingStore,
} from '@axiom-lattice/cli-a2a';
// Register executors
registerExecutor('opencode', createOpenCodeExecutor);
registerExecutor('codex', createCodexExecutor);
registerExecutor('claude', createClaudeExecutor);
// Load config
const config = resolveConfig('agent-config.json');
// Start server
const server = await createA2AServer(config);
// Graceful shutdown
process.on('SIGINT', async () => {
await server.shutdown();
process.exit(0);
});
多回合对话
A2A 协议使用 contextId 将信息分组到一个单独的对话中.
cli-a2a 每个地图 contextId 实现多回合制
所有三个提供者的连续性:
| 提供者 | 新建会话 | 复会 | 会话 ID 来源 |
|---|---|---|---|
| 代码 | codex exec --json <prompt> | codex exec resume <thread_id> <prompt> | thread_id 从杰森勒 thread.started 事件 |
| 克劳德代码 | claude -p --session-id <uuid> <prompt> | claude -p --resume <uuid> <prompt> | 生成的 UUID |
| 打开代码 | opencode run --format json <prompt> | opencode run --session <sessionID> <prompt> | sessionID jSON活动 |
如何运作:
- A2A 客户端发送信息
contextId cli-a2a抬头看contextId在会话框中- 如果找到: 使用提供者的恢复命令继续 CLI 会话
- 如果找不到: 创建新的 CLI 会话并保存绑定
- 随后发出相同信息
contextId重复使用相同的 CLI 会话
历史由基本的CLI工具所维持——不需要迅速召集.
会话持久性
捆绑在磁盘上,这样 cli-a2a 重新启动保存对话框 :
- 默认路径数字 :
~/Library/Application Support/axiom-lattice/cli-a2a/sessions.json - 格式JSON阵列
{ provider, contextId, sessionId, ... } - TTL 电话: 默认24小时(可通过
session.ttl(中文(简体) ) - 清理: 装入时卸出并定期卸出过期装入(每1小时)
要禁用持久性 :
{
"session": {
"persist": false
}
}
要完全禁用会话再利用( 每个请求都创建新会话) :
{
"session": {
"reuseByContext": false
}
}
会话配置
{
"session": {
"reuseByContext": true,
"persist": true,
"storePath": "~/custom/path/sessions.json",
"ttl": 86400000,
"cleanupInterval": 3600000
}
}
| 外地 | 默认 | 说明 |
|---|---|---|
reuseByContext | true | 地图 contextId 改为 CLI 会话进行多回合 |
persist | true | 在整个重启中保存磁盘绑定 |
storePath | ~/Library/Application Support/axiom-lattice/cli-a2a/sessions.json | 自定义绑定存储路径 |
ttl | 86400000 (24小时) | 会话 TTL (毫秒) |
cleanupInterval | 3600000 (1小时) | 以毫秒计的清理间隔 |
建筑
┌──────────────────────────────────────────────────────┐
│ cli-a2a (Express A2A Server) │
│ │
│ ┌─────────────┐ ┌──────────┐ ┌──────────────────┐│
│ │ Agent Card │ │ JSON-RPC │ │ REST ││
│ └─────────────┘ └──────────┘ └──────────────────┘│
│ │ │
│ ┌──────────────────────▼───────────────────────────┐│
│ │ Executor Registry ││
│ │ ┌────────────┐ ┌─────────┐ ┌──────────────────┐ ││
│ │ │ OpenCode │ │ Codex │ │ Claude Code │ ││
│ │ │ Executor │ │ Executor│ │ Executor │ ││
│ │ └─────┬──────┘ └────┬────┘ └───────┬──────────┘ ││
│ └────────┼─────────────┼──────────────┼────────────┘│
│ │ │ │ │
│ ┌────────▼─────────────▼──────────────▼────────────┐│
│ │ SessionBindingStore ││
│ │ contextId → CLI sessionId + file persistence ││
│ └──────────────────────────────────────────────────┘│
└───────────┼─────────────┼──────────────┼─────────────┘
│ HTTP │ spawn │ spawn
┌───────▼────────┐ ┌──▼───────┐ ┌───▼────────────┐
│ opencode serve │ │ codex CLI│ │ claude CLI (-p) │
└────────────────┘ └──────────┘ └────────────────┘
网络建设——对外网络曝光
该代理运行一个本地的HTTP服务器. 要从外到外,用内置 WebSocket桥(不需要SSH隧道或ngrok).
已建成的WebSocket桥(建议)
# Agent — opens outbound WebSocket to gateway
npx @axiom-lattice/cli-a2a \
--provider opencode \
--port 3001 \
--bridge-url ws://gateway:8080/api/a2a/bridge \
--bridge-key sk-xxx \
--register-url http://gateway:8080 \
--register-key sk-xxx
Internal Network (agent) Public (gateway)
┌──────────────────┐ ┌─────────────────────┐
│ cli-a2a :3001 │──WebSocket──→│ /api/a2a/bridge │
│ ↑ │ outbound │ ↑ │
│ │ local call │ │ │ HTTP proxy │
│ │ │ │ /api/a2a/bridge/ │
│ Express A2A │ │ proxy/{agentId}/* │
│ OpenCode/Codex/ │ │ │
│ Claude │ │ A2A_REMOTE agent → │
└──────────────────┘ └─────────────────────┘
如何运作:
- 代理打开一个出局的WebSocket进入网关(出局几乎从未被封锁)
- 网关存储代理 ID 的连接
- 网关曝光
GET/POST /api/a2a/bridge/proxy/{agentId}/* - 当管弦乐手调用代理 URL 时, 网关将请求推到 WebSocket 上
- Agent 给其Express 服务器发出本地 HTTP 呼叫, 返回响应
经纪人的 agentCardUrl 登记点为
http://gateway:8080/api/a2a/bridge/proxy/{agentId}/.well-known/agent-card.json。 。 。 .
SSH 倒转隧道(替代)
ssh -R 3001:localhost:3001 [email protected] -N &
npx cli-a2a --provider opencode --port 3001 \
--advertise-host public-bastion.com \
--register-url http://gateway:8080 --register-key sk-xxx
相同的网络
npx cli-a2a --provider opencode --port 3001 \
--advertise-host 192.168.1.42 \
--register-url http://gateway:8080 --register-key sk-xxx
多项目
为不同的项目运行多个实例 :
npx @axiom-lattice/cli-a2a --provider opencode -d /proj/frontend --port 3001 &
npx @axiom-lattice/cli-a2a --provider opencode -d /proj/backend --port 3002 &
软件包导出
| 导出 | 说明 |
|---|---|
createA2AServer(config) | 启动快取 A2A 服务器 |
resolveConfig(path?, overrides?) | 合并配置层 |
loadConfigFile(path) | 读取和剖析 JSON 配置文件 |
registerExecutor(provider, factory) | 注册一个执行工厂 |
createOpenCodeExecutor(config, store) | 创建 OpenCode 执行器 |
createCodexExecutor(config, store) | 创建代码x执行器 |
createClaudeExecutor(config, store) | 创建 Claude 执行器 |
SessionBindingStore | contextId → sessionId 持久性 |
generateContextId() | 生成一个新的 UUID 上下文Id |
logger, (中文(简体) ), LogLevel | 结构化日志 |
许可证
公务员制度委员会