Skip to content

AtomCode 深度分析补充报告

基于实际运行时探查,补充 ANALYSIS.mdAUTHORIZATION_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/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>.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_KEYe5e86d37-...由父进程(Claude Code)继承,非 daemon 自身使用
NODE_TLS_REJECT_UNAUTHORIZED0跳过 TLS 验证(开发/测试环境)
ATOMCODE_TELEMETRY未设置(默认启用)设为 0 禁用
CLAUDE_CODE_*多种父进程 Claude Code 的环境变量

Daemon 自身不依赖特殊环境变量。 CodingPlan 的 API key 完全由 daemon 进程内部管理,不暴露到环境变量或写入磁盘。

自更新机制

特性
配置项config.tomlauto_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: falseclear_api_keyclear_base_url 均未暴露
  • CodingPlan 通过 claim-v2 流程派生 API key,daemon 进程内部持有

这验证了我们选择 "Daemon 代理方案" 是正确的。


8. MCP 与插件系统状态

均未启用(空架子):

组件状态
MCP 服务器已启用但 "servers": []
mcp.json不存在
installed_plugins.json不存在
marketplaces.json不存在

config.tomlauto_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 v4.25.3 逆向工程分析文档