AtomCode 深度分析补充报告
基于实际运行时探查,补充
ANALYSIS.md和AUTHORIZATION_PROTOCOL.md中未覆盖的发现。 2026-06-21
1. Daemon 本质:开源 Claude Code 平替
AtomCode daemon 的自述描述为:
"AtomCode — Claude Code 的开源平替。连接任意大模型,自主多步执行,30 秒上手。"
关键推断:
- AtomCode 是 Claude Code(Anthropic 的终端 AI 编码助手)的开源替代品
- 代码仓库托管在
atomgit.com/atomgit_atomcode/atomcode - 安装脚本自托管:
raw.atomgit.com/atomgit_atomcode/atomcode/raw/main/scripts/install.sh - 支持 Linux / macOS / HarmonyOS
- 通过 GitHub release 下载二进制(跨平台,go/bun 编译)
2. Daemon 内置 API 端点的本质
之前的扫描发现大量路径返回 HTTP 200,但它们不是 REST API——所有未被识别为 API 的路由都返回嵌入式 Web UI 的 HTML。
<!doctype html>
<html lang="zh">
<title>AtomCode · 在你的终端中运行的 AI 编程助手</title>
<meta name="description"
content="AtomCode — Claude Code 的开源平替..." />
<!-- Vite 打包的 SPA: assets/index-2VWO9kfe.js + assets/index-DQAxDfIC.css -->暴露的路径(全部返回 SPA HTML):
| 路径 | 性质 |
|---|---|
/v1/chat/completions | SPA 路由 → HTML |
/v1/models | SPA 路由 → HTML |
/v1/completions | SPA 路由 → HTML |
/v1/embeddings | SPA 路由 → HTML |
/v1/audio/transcriptions | SPA 路由 → HTML |
/v1/images/generations | SPA 路由 → HTML |
/healthz | SPA 路由 → HTML |
/readyz | SPA 路由 → HTML |
/metrics | SPA 路由 → HTML |
/debug | SPA 路由 → HTML |
/version | SPA 路由 → HTML |
/info | SPA 路由 → HTML |
/status | SPA 路由 → HTML |
/api* | SPA 路由 → HTML |
真正的 REST API 仅存在于:
| 路径 | 说明 |
|---|---|
/health | 唯一返回 JSON 的健康检查 |
/auth/* | OAuth 登录相关 |
/chat | SSE 聊天流 |
/models | 模型列表 |
/providers | 提供商配置 |
/config | 配置读取 |
/codingplan/setup | CodingPlan 设置 |
/sessions | 会话管理 |
/projects | 项目管理 |
/skills | 技能列表 |
/mcp/* | MCP 管理(空架子) |
/cd | 切换工作目录 |
结论:daemon不开放底层的 OpenAI 兼容 API。 它只有自己的一套 REST API(
/chatSSE 协议)和 Web UI。我们写的 proxy 是正确的路径。
3. Daemon 注入的 System Prompt 实测
通过 datalog 抓取到 daemon 每次调用前自动注入的 system prompt。这是完整内容:
You are AtomCode. When asked who you are, say you are AtomCode
(an AI coding agent by AtomGit) running the deepseek-v4-flash model.
Never claim to be another product.
Working directory: /home/cc11001100/github/...
All file paths in tool calls must be absolute, resolved under ...
=== GIT COMMITS ===
When you create a git commit on the user's behalf, end the commit
message with: Co-Authored-By: AtomCode <noreply@atomgit.com>
=== AVAILABLE SKILLS ===
[47 个内置技能描述,占 10000+ tokens]
=== GIT STATUS (snapshot at session start) ===
Branch: main | HEAD: c9a8eab | Status: 1 change(s)
=== RULES ===
You are AtomCode...关键点:
- 每次调用注入 47 个内置技能到 system prompt——占用大量 token
- 含当前 git branch/status/diff 快照(会话启动时)
- 含工作目录、平台、shell 等运行时信息
- 这些 system prompt 是 daemon 注入的,不是 llm-api 处理的
- system prompt 大约占用 6000-8000 tokens(主要被技能描述撑满)
daemon 注入的 12 个可用工具(Tool Definitions)
每次 LLM 调用会附加 12 个工具定义,包括文件操作、命令执行、文本编辑等。
注意: 工具定义的名称和参数在 datalog 中记录为匿名格式,需要直接解析二进制才能获取完整结构。
4. 多轮对话的 Session 持久化机制
每次 chat 产生的 session 都会写入磁盘 JSON:
~/.atomcode/sessions/<project_hash>/<session_id>.jsonSession 文件结构(实测):
{
"id": "ea21aa73-...",
"name": "第一句用户消息截取",
"working_dir": "/path/to/project",
"created_at": 1781279460,
"updated_at": 1781279467,
"messages": [
{
"role": "User",
"content": {
"Text": "回复一句话:你好"
}
},
{
"role": "Assistant",
"content": {
"AssistantWithToolCalls": {
"text": "你好!...",
"tool_calls": [],
"reasoning_content": "The user wants..."
}
}
}
],
"turn_stats": [],
"cold_summaries": [],
"user_renamed": false
}多轮对话细节:
- daemon 通过
session_id追踪上下文(非 OpenAI 的 messages 拼接) - 传入已存在的
session_id→ daemon 加载该 session 的全部历史 - 每次
/chat返回的done事件含session_id - 当前 proxy 已实现 session_id 自动追踪
5. LLM 调用日志 (Datalog) 完整结构
每次 LLM 调用记录为一个 JSON 文件:
~/.atomcode/datalog/<project>-<hash>/llm/<timestamp>.json请求结构
{
"context_window": 1000000,
"model": "deepseek-v4-flash",
"session_id": "uuid",
"step": 0,
"timestamp": "2026-06-12T15:51:05",
"request": {
"estimated_tokens": 6332,
"message_count": 2,
"messages": [
{"role": "System", "content": {"Text": "<daemon 注入的完整 system prompt>"}},
{"role": "User", "content": {"Text": "<用户消息>"}}
],
"tool_count": 12,
"tools": [...]
},
"response": {
"duration_ms": 2023,
"reasoning_content": "...",
"text": "...",
"tool_calls": []
}
}汇总统计 calls.log
2026-06-17_17-30-22_832 deepseek-v4-flash step=0 msgs=4/6391tok → 1528ms tools=0 text_only| 字段 | 说明 |
|---|---|
timestamp | 调用时间 |
model | 模型名 |
step=N | 当前推理步数 |
msgs=N/Mtok | 消息数 / 估算 token 数 |
→ Nms | 响应时长毫秒 |
tools=N [names] | 工具调用次数与名称 |
text_only | 纯文本(无工具调用)标记 |
日志分析: 在实际使用的 35+ 次调用的历史记录中,平均延迟 1.5s-3s,最长 9.8s,工具调用占比约 10%。
6. Daemon 进程环境与运行模式
环境变量
Daemon 继承用户 shell 环境。观察到的关键变量:
| 变量 | 值 | 说明 |
|---|---|---|
ANTHROPIC_API_KEY | e5e86d37-... | 由父进程(Claude Code)继承,非 daemon 自身使用 |
NODE_TLS_REJECT_UNAUTHORIZED | 0 | 跳过 TLS 验证(开发/测试环境) |
ATOMCODE_TELEMETRY | 未设置(默认启用) | 设为 0 禁用 |
CLAUDE_CODE_* | 多种 | 父进程 Claude Code 的环境变量 |
Daemon 自身不依赖特殊环境变量。 CodingPlan 的 API key 完全由 daemon 进程内部管理,不暴露到环境变量或写入磁盘。
自更新机制
| 特性 | 值 |
|---|---|
| 配置项 | config.toml 中 auto_update = true |
| 版本升级 | v4.25.1 → v4.25.3(服务器自动) |
| 二进制哈希 | 11f305616a4f84b853bfa05cda7c60179146c9e953efff1c3f8a728274ce1727 |
| 文件大小 | 28,447,568 字节 |
| 最后修改 | 2026-06-20 |
每次 health check 返回 binary_hash,可用于完整性验证。
7. 直接调用 llm-api 的可行性验证
结论:不可行。 daemon 是唯一入口。
尝试:curl https://llm-api.atomgit.com/v1/models (用 OAuth access_token)
结果:403 {"error":"model is not enabled for codingplan 'Lite'","code":"403"}原因:
llm-api需要的不是 OAuth access_token,而是 CodingPlan 内部 API key- CodingPlan API key 只存在于 daemon 进程内存中
- 配置文件中
has_api_key: false、clear_api_key和clear_base_url均未暴露 - CodingPlan 通过 claim-v2 流程派生 API key,daemon 进程内部持有
这验证了我们选择 "Daemon 代理方案" 是正确的。
8. MCP 与插件系统状态
均未启用(空架子):
| 组件 | 状态 |
|---|---|
| MCP 服务器 | 已启用但 "servers": [] |
mcp.json | 不存在 |
installed_plugins.json | 不存在 |
marketplaces.json | 不存在 |
config.toml 中 auto_install_default_skills = true 但实际未生效,因为需要网络访问插件市场。
9. 登出行为与 Token 管理
| 端点 | 行为 |
|---|---|
POST /auth/logout | 删除 ~/.atomcode/auth.toml,不可逆 |
| Token 有效期 | expires_in = 601397 秒(约 7 天) |
| Refresh token | refresh_token 字段存在,daemon 自动续期 |
| 文件更新时间 | auth.toml 自创建后未被 daemon 覆写 |
验证: daemon 登出会删除 auth.toml,必须重新走完整 OAuth 流程(短链接 → 浏览器授权 → 轮询)。不存在绕过方式。
10. 未被覆盖的盲区(未来可研究)
以下项目在本次分析中未深入触及:
| 盲区 | 原因 | 优先级 |
|---|---|---|
| CodingPlan 加密层 | 仅知在 codingplan-crypto/src/versions/v1.rs,需 Rust 源码 | 低 |
| Telemetry 上报协议 | acs.atomgit.com 抓包需实际触发上报 | 低 |
| 47 个内置 Skills 完整列表 | daemon 返回全部 47 个,但源码不可见 | 中 |
| 12 个 Tool Definitions 完整参数 | datalog 中工具名为空,需直接解析 binary | 中 |
| Refresh token 自动续期的实际 API | daemon 内部自动处理,没有独立端点可观测 | 低 |
邀请码机制 ATOMCODE_INVITE | 二进制中有引用,但未触发 | 低 |
| Vite 打包的 SPA 前端的 API 调用细节 | 可以从 assets/index-*.js 反编译 | 低 |
11. 更新后的发现总结(合并版)
- AtomCode 本质:Claude Code 的开源平替,CodingPlan Lite 提供免费 deepseek-v4-flash 模型
- OAuth 流程:短链接(10 分钟) + 轮询,登录后 token 7 天有效
- CodingPlan:Lite 套餐,30 天有效期,5h/500次 + 30d/8000次双层限流
- API key 不落盘:由 daemon 进程内存持有,不可直接获取
- Daemon 是唯一入口:llm-api 不接受 OAuth token,必须通过 daemon 的
/chat调用 - 系统提示词注入:daemon 每次调用注入 47 个技能描述 + 运行时信息,占 6000-8000 tokens
- 会话持久化:每次对话完整记录到 disk(session JSON + LLM datalog)
- 自动更新:daemon 有内置 auto_update 机制,已验证版本升级
- Web UI 路由:大量路径(如
/v1/*)返回 SPA HTML 而非 API - 直接不可用:无法绕过 daemon 直接调用 llm-api(403)
- MCP/插件系统:尚未激活(空架子)
- 登出不可逆:
/auth/logout删除 auth.toml 必须重新 OAuth