Skip to content

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。

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/completionsSPA 路由 → HTML
/v1/modelsSPA 路由 → HTML
/v1/completionsSPA 路由 → HTML
/v1/embeddingsSPA 路由 → HTML
/v1/audio/transcriptionsSPA 路由 → HTML
/v1/images/generationsSPA 路由 → HTML
/healthzSPA 路由 → HTML
/readyzSPA 路由 → HTML
/metricsSPA 路由 → HTML
/debugSPA 路由 → HTML
/versionSPA 路由 → HTML
/infoSPA 路由 → HTML
/statusSPA 路由 → HTML
/api*SPA 路由 → HTML

真正的 REST API 仅存在于:

路径说明
/health唯一返回 JSON 的健康检查
/auth/*OAuth 登录相关
/chatSSE 聊天流
/models模型列表
/providers提供商配置
/config配置读取
/codingplan/setupCodingPlan 设置
/sessions会话管理
/projects项目管理
/skills技能列表
/mcp/*MCP 管理(空架子)
/cd切换工作目录

结论:daemon不开放底层的 OpenAI 兼容 API。 它只有自己的一套 REST API(/chat SSE 协议)和 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/user/project/...
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>.json

Session 文件结构(实测):

json
{
  "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

请求结构 ​

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_KEYsk-ant-...由父进程(Claude Code)继承,非 daemon 自身使用
NODE_TLS_REJECT_UNAUTHORIZED0跳过 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 tokenrefresh_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 自动续期的实际 APIdaemon 内部自动处理,没有独立端点可观测低
邀请码机制 ATOMCODE_INVITE二进制中有引用,但未触发低
Vite 打包的 SPA 前端的 API 调用细节可以从 assets/index-*.js 反编译低

11. 更新后的发现总结(合并版) ​

  1. AtomCode 本质:Claude Code 的开源平替,CodingPlan Lite 提供免费 deepseek-v4-flash 模型
  2. OAuth 流程:短链接(10 分钟) + 轮询,登录后 token 7 天有效
  3. CodingPlan:Lite 套餐,30 天有效期,5h/500次 + 30d/8000次双层限流
  4. API key 不落盘:由 daemon 进程内存持有,不可直接获取
  5. Daemon 是唯一入口:llm-api 不接受 OAuth token,必须通过 daemon 的 /chat 调用
  6. 系统提示词注入:daemon 每次调用注入 47 个技能描述 + 运行时信息,占 6000-8000 tokens
  7. 会话持久化:每次对话完整记录到 disk(session JSON + LLM datalog)
  8. 自动更新:daemon 有内置 auto_update 机制,已验证版本升级
  9. Web UI 路由:大量路径(如 /v1/*)返回 SPA HTML 而非 API
  10. 直接不可用:无法绕过 daemon 直接调用 llm-api(403)
  11. MCP/插件系统:尚未激活(空架子)
  12. 登出不可逆:/auth/logout 删除 auth.toml 必须重新 OAuth

基于 VitePress 构建 · AtomCode v5.2.3 逆向工程分析文档