文件最后提交记录最后更新时间
fix(webui): /webui 用 TUI 当前会话播种 LiveSession,续聊后直接落到该会话 atomcode -c 续聊后 ctx.current_session 已是续聊会话,但 /webui 调用的是 ensure_live_session——新建空 LiveSession(空消息 + 随机 LIVE_SESSION_ID),从不把 当前会话搬进去。于是 webui 连 /live 拿到空快照、落到空白新页面而非续聊会话。 - live_api.rs:新增 ensure_live_session_seeded(initial, session_id),新建时用给定消息 播种并复用 session_id(LIVE_SESSION_ID + 执行器 id 一致,后续每轮覆盖同一会话文件、 不产生重复);ensure_live_session 改为空播种封装。lib.rs 导出之。 - commands.rs:/webui 在开浏览器之前先用 ctx.current_session 的消息+id 播种(非空才复用 id;先播种再开浏览器,避免浏览器抢先连 /live 建出空会话)。attach_live_session 加 render_snapshot 参数:/webui 传 false(画面已有该对话,跳过快照回放避免重复刷), /sync 传 true(重新附着补 webui 期间对话)。 live 测试 core(4)/daemon(3) 全过;LiveSession initial 播种本就被 core 测试覆盖。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 5 小时前
feat(daemon): DaemonTurnExecutor 包裹 TurnRunner 接入 LiveSession(阶段②) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 3 天前
chore: 版本号 4.23.2 → 4.23.3 6 天前
README.md

atomcode-daemon

AtomCode HTTP API 服务,提供对话历史查询、流式聊天、配置管理、Provider 管理等 RESTful 接口。

基于 Axum 框架构建,支持 SSE(Server-Sent Events)流式响应。

快速开始

编译

cargo build -p atomcode-daemon

启动服务

# 默认启动,绑定 127.0.0.1:13456
cargo run -p atomcode-daemon

# 指定端口
cargo run -p atomcode-daemon -- --port 8080

# 指定绑定 IP(允许外部访问)
cargo run -p atomcode-daemon -- --host 0.0.0.0

# 同时指定 host 和 port
cargo run -p atomcode-daemon -- --host 0.0.0.0 --port 8080

启动参数

参数 格式 默认值 说明
--host --host <ip> 127.0.0.1 绑定 IP 地址
--port --port <port> 13456 监听端口号

也支持 --host=<ip>--port=<port> 的等号格式。

安全提示:当绑定非 loopback 地址(非 127.0.0.1localhost::1)时,服务会打印安全警告。daemon 暴露了聊天、文件编辑、工具执行等敏感端点,请确保网络可信或在前方部署反向代理并配置认证。

环境变量

环境变量 说明
ATOMCODE_DAEMON_ENABLE_DANGEROUS_TOOLS 设为 1 启用 bash 和写文件的 daemon 工具
ATOMCODE_DISABLE_TOOLS 逗号分隔的工具名列表,禁用指定工具(如 bash,write_file

API 接口

所有接口基础路径为 http://<host>:<port>,请求和响应均为 JSON 格式。

健康检查

GET /health

健康检查端点。

响应示例:

{
  "status": "ok",
  "version": "4.23.3",
  "service": "atomcode-daemon"
}

项目管理

GET /project

获取当前项目状态(工作目录)。

响应示例:

{
  "working_dir": "/home/user/my-project",
  "previous_dir": "/home/user/other-project",
  "recent_dirs": ["/home/user/my-project", "/home/user/other-project"],
  "name": "my-project"
}

POST /cd

切换工作目录(类似终端 cd 命令)。

请求体:

{
  "path": "/path/to/project"
}
  • path:目标目录路径,支持 ~ 展开;传 "-" 返回上一次目录

响应示例:

{
  "success": true,
  "message": "Changed to /path/to/project",
  "current_dir": "/path/to/project",
  "project_hash": "a1b2c3d4e5f6a1b2"
}

GET /projects

列出所有历史项目(从 sessions 目录扫描)。

响应示例:

[
  {
    "hash": "a1b2c3d4e5f6a1b2",
    "name": "my-project",
    "working_dir": "/home/user/my-project",
    "description": null,
    "session_count": 5,
    "created_at": 1715000000,
    "last_updated": 1715100000
  }
]

会话管理

GET /projects/:hash/sessions

列出指定项目下的所有会话。

路径参数:

  • hash:项目哈希值(从 /projects 接口获取)

GET /projects/:hash/sessions/:id

获取会话详情,包含完整消息列表。

路径参数:

  • hash:项目哈希值
  • id:会话 ID

响应示例:

{
  "id": "abc123",
  "name": "Bug fix session",
  "working_dir": "/home/user/my-project",
  "created_at": 1715000000,
  "updated_at": 1715100000,
  "message_count": 10,
  "messages": [
    {
      "role": "user",
      "content": "Fix the bug in main.rs"
    },
    {
      "role": "assistant",
      "content": "I'll fix the bug...",
      "tool_calls": null,
      "tool_result": null,
      "artifacts": null
    }
  ]
}

DELETE /projects/:hash/sessions/:id

删除指定会话。

PATCH /projects/:hash/sessions/:id/rename

重命名会话。

请求体:

{
  "name": "New session name"
}

GET /sessions

列出所有项目下的所有会话(跨项目),按更新时间倒序,最多返回 50 条。

POST /sessions

创建新会话。

请求体:

{
  "working_dir": "/path/to/project",
  "title": "Optional session title"
}
  • working_dir:可选,默认使用当前项目工作目录
  • title:可选,会话标题

响应示例:

{
  "id": "new-session-id",
  "name": "Optional session title",
  "working_dir": "/path/to/project",
  "project_hash": "a1b2c3d4e5f6a1b2",
  "created_at": 1715100000
}

GET /sessions/search?q=<keyword>

按名称搜索会话(不区分大小写)。

查询参数:

  • q:搜索关键词

模型

GET /models

列出所有已配置 Provider 提供的可用模型。

响应示例:

[
  {
    "provider": "openai",
    "model": "gpt-4o",
    "provider_type": "openai",
    "is_default": true
  },
  {
    "provider": "claude",
    "model": "claude-sonnet-4-20250514",
    "provider_type": "claude",
    "is_default": false
  }
]

聊天(SSE 流式)

POST /chat

发送聊天消息,以 SSE(Server-Sent Events)流式返回响应。

请求体:

{
  "message": "你的问题",
  "provider": "openai",
  "working_dir": "/path/to/project",
  "session_id": "existing-session-id"
}
字段 类型 必填 说明
message string 用户消息内容
provider string Provider 名称,默认使用配置中的默认 Provider
working_dir string 工作目录,默认使用当前项目目录
session_id string 会话 ID,传入则继续已有会话,不传则创建新会话

SSE 事件类型:

事件类型 (type) 说明
text LLM 文本增量输出
reasoning LLM 推理/思考内容
tool_start 工具调用开始(含 namearguments
tool_output 工具实时输出片段
tool_result 工具调用完成(含 nameoutputsuccessduration_ms
tokens Token 用量更新(含 promptcompletiontotal
artifact_start 检测到代码/HTML/SVG 等制品开始
artifact_content 制品内容片段
artifact_end 制品输出结束
done 聊天完成(含 tokenstool_callssession_id
stopped 聊天被用户停止
error 发生错误(含 message

示例(curl):

curl -N -X POST http://127.0.0.1:13456/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "Hello, how are you?"}'

POST /chat/stop

停止正在进行的聊天。

请求体:

{
  "session_id": "session-id-to-stop"
}

响应示例:

{
  "success": true,
  "message": "Chat session abc123 stopped"
}

配置

GET /config

获取脱敏后的配置信息(不暴露 api_key)。

响应示例:

{
  "path": "/home/user/.atomcode/config.toml",
  "default_provider": "openai",
  "default_workdir": "/home/user/my-project",
  "providers": [
    {
      "name": "openai",
      "type": "openai",
      "model": "gpt-4o",
      "base_url": null,
      "has_api_key": true,
      "is_default": true,
      "context_window": 128000,
      "max_tokens": null,
      "thinking_enabled": null,
      "thinking_budget": null,
      "thinking_type": null,
      "thinking_keep": null,
      "reasoning_history": null,
      "skip_tls_verify": false,
      "ephemeral": false
    }
  ]
}

POST /config/reload

从磁盘重新加载配置并返回。


Provider 管理

GET /providers

列出所有已配置的 Provider(脱敏,不暴露 api_key)。

响应示例:

{
  "default_provider": "openai",
  "providers": [
    {
      "name": "openai",
      "type": "openai",
      "model": "gpt-4o",
      "has_api_key": true,
      "is_default": true,
      "..."
    }
  ]
}

POST /providers

创建或替换一个 Provider。

请求体:

{
  "name": "my-provider",
  "type": "openai",
  "model": "gpt-4o",
  "api_key": "sk-xxx",
  "base_url": "https://api.openai.com/v1",
  "context_window": 128000,
  "max_tokens": 4096,
  "thinking_enabled": true,
  "thinking_budget": 10000,
  "thinking_type": "enabled",
  "thinking_keep": "last",
  "reasoning_history": "full",
  "skip_tls_verify": false,
  "set_default": true
}
字段 类型 必填 说明
name string Provider 名称
type string Provider 类型(如 openaiclaudeollama
model string 模型标识
api_key string API 密钥
base_url string 自定义 API 地址
context_window number 上下文窗口大小(默认根据类型自动推断)
max_tokens number 最大输出 token 数
thinking_enabled boolean 是否启用思考模式
thinking_budget number 思考预算(最低 1024)
thinking_type string 思考类型
thinking_keep string 思考保留策略
reasoning_history string 推理历史策略
skip_tls_verify boolean 跳过 TLS 验证(默认 false
set_default boolean 设为默认 Provider(默认 false

PATCH /providers/:name

部分更新指定 Provider 的配置。

请求体(所有字段可选):

{
  "type": "openai",
  "model": "gpt-4o-mini",
  "api_key": "sk-new-key",
  "clear_api_key": false,
  "base_url": "https://new-url.com/v1",
  "clear_base_url": false,
  "context_window": 192000,
  "max_tokens": 8192,
  "clear_max_tokens": false,
  "thinking_enabled": true,
  "thinking_budget": 10000,
  "thinking_type": "enabled",
  "thinking_keep": "last",
  "reasoning_history": "full",
  "skip_tls_verify": false
}

对于可清空的字段(如 api_keybase_urlmax_tokens),使用 clear_* 布尔字段设为 true 来清除,传 null 值到对应字段也可清除。

DELETE /providers/:name

删除指定 Provider。如果删除的是默认 Provider,会自动选择剩余中的第一个作为新默认。

POST /providers/:name/default

将指定 Provider 设为默认。

PATCH /providers/:name/thinking

更新指定 Provider 的思考模式设置。

请求体(所有字段可选):

{
  "enabled": true,
  "budget": 10000,
  "type": "enabled",
  "keep": "last",
  "reasoning_history": "full"
}

认证

GET /auth/status

获取当前认证状态。

响应示例:

{
  "logged_in": true,
  "auth_path": "/home/user/.atomcode/auth.json",
  "user": {
    "username": "example_user",
    "email": "user@example.com"
  },
  "token": {
    "token_type": "Bearer",
    "expires_in": 3600,
    "created_at": 1715000000,
    "has_refresh_token": true
  }
}

POST /auth/login/start

启动 OAuth 登录流程。

请求体:

{
  "open_browser": true
}
  • open_browser:是否自动打开浏览器(默认 true

响应示例:

{
  "login_id": "uuid-of-login-session",
  "url": "https://auth.example.com/login?code=xxx",
  "expires_in_seconds": 600
}

POST /auth/login/:login_id/poll

轮询登录会话状态。

响应示例(等待中):

{
  "status": "pending",
  "user": null
}

响应示例(已授权):

{
  "status": "authorized",
  "user": {
    "username": "example_user"
  }
}

DELETE /auth/login/:login_id

取消并移除进行中的登录会话。

POST /auth/logout

登出(删除本地存储的认证信息)。


MCP(Model Context Protocol)

GET /mcp/status

获取所有 MCP 服务器的连接状态。

响应示例:

{
  "servers": [
    {
      "name": "filesystem",
      "status": "connected",
      "tool_count": 5,
      "error": null
    },
    {
      "name": "github",
      "status": "error",
      "tool_count": null,
      "error": "Connection refused"
    }
  ]
}

POST /mcp/reload

重新加载 MCP 配置(从 ~/.atomcode/mcp.json)。

响应示例:

{
  "status": "reloading"
}

CodingPlan

POST /codingplan/setup

运行 CodingPlan 初始化设置(登录、领取模型、配置 Provider)。

请求体:

{
  "login_id": "optional-login-session-id"
}
  • login_id:可选,如果未登录可传入登录会话 ID

响应示例:

{
  "success": true,
  "report_text": "Setup complete!",
  "default_provider": "codingplan",
  "providers": ["..."],
  "steps": {
    "login": { "status": "skipped", "message": "Already logged in" },
    "claim": { "status": "ok", "message": "" },
    "models": { "status": "ok", "message": "" },
    "status": { "status": "ok", "message": "" }
  }
}

CORS 策略

daemon 默认仅允许来自 loopback 地址的跨域请求:

  • http://localhost:*
  • http://127.0.0.1:*
  • http://[::1]:*
  • https://localhost:*

来自局域网 IP(如 192.168.x.x)或其他非 loopback 地址的请求将被 CORS 策略拒绝。

可用工具

daemon 聊天模式下注册的工具(可通过 ATOMCODE_DISABLE_TOOLS 环境变量禁用):

工具名 说明
read_file 读取文件内容
write_file 创建/写入文件
edit_file 编辑已有文件
bash 执行 Shell 命令
grep 搜索文件内容
glob 按模式匹配文件
list_directory 列出目录内容
web_search 网页搜索
web_fetch 获取网页内容
search_replace 搜索替换文件内容
diagnostics LSP 诊断信息(需配置 LSP)
use_skill 调用已注册的 Skill(需有可用 Skill)

项目结构

atomcode-daemon/
├── Cargo.toml
├── README.md
└── src/
    ├── main.rs            # 主入口、路由定义、聊天流处理
    ├── api_auth.rs        # 认证相关接口(登录/登出/状态)
    ├── api_config.rs      # 配置相关接口及共享工具函数
    ├── api_provider.rs    # Provider 管理接口
    └── api_codingplan.rs  # CodingPlan 初始化接口

配置文件

daemon 使用以下配置文件(位于 ~/.atomcode/ 目录):

文件 说明
config.toml 主配置(Provider、默认工作目录等)
mcp.json MCP 服务器配置
auth.json 认证信息(OAuth token)
sessions/ 会话数据存储目录