
Agent SDK 自托管不是普通 API wrapper 部署,而是要管理 claude CLI 子进程、本地 transcript、工作目录、路由粘性和多租户边界。本文拆解 Hosting 文档里的 session 模式、SessionStore、资源估算、网络代理、OTEL 与成本上限,帮助开发者把 Agent 服务跑得可恢复、可观测、可控。
query() 时会拉起一个独立的 claude CLI 子进程,这个子进程拥有 shell、工作目录和本地 JSONL 会话文件;所以它不是无状态 HTTP 客户端,而是一套带本地状态的长生命周期运行时。1claude CLI subprocess,并通过 stdio 和它通信;这个 subprocess 负责 shell、工作目录、会话 transcript,也会向 Anthropic API 发出 HTTPS 请求。一个 agent session 对应一个 subprocess,N 个并发 session 就是 N 个 subprocess。1| 你以为在部署 | 实际在部署 |
|---|---|
| 一组无状态 API handler | 一组会长期占用内存的本地进程 |
| 一段 prompt 处理逻辑 | prompt + shell + 工作目录 + session 文件 |
| 横向扩容后自动无感 | session 需要路由回原容器或从持久层恢复 |
| 只要限 API key 就够了 | 还要限文件系统、网络、进程和租户上下文 |
cwd 是隔离的第一道门query({
prompt,
options: { cwd: "/work/session-a" }
})query(
prompt=prompt,
options=ClaudeAgentOptions(cwd="/work/session-a")
)CLAUDE.md、中间产物、临时凭据被 B 用户的 session 读到。生产环境里,cwd 应该按 user、tenant、task 或 session 切开,而不是让所有人挤在应用根目录。CLAUDE.md memory files、工作目录产物。文档也明确说,这些状态默认不会在容器重启、缩容或迁移到另一台节点后保留下来。1SessionStore adapter 把 transcript 持久化到共享存储;但 SessionStore 只镜像 transcript,不负责 CLAUDE.md memory 文件和工作目录里的其它产物。1SessionStore。CLAUDE.md/memory 要恢复:单独设计存储策略。SessionStore 当成万能存档。它解决的是会话文本,不是整个工作区快照。| 模式 | 容器怎么活 | 适合什么任务 | 最容易踩的坑 |
|---|---|---|---|
| Ephemeral | 一个任务一个容器,结束即销毁 | 修 bug、抽取票据、翻译文档、媒体处理 | 用户回头想继续,状态已经没了 |
| Long-running | 容器长期在线,里面挂多个 session | Slack bot、邮件 agent、站点 builder | 并发 session 把内存吃满 |
| Hybrid | 闲时缩容,回来后从 SessionStore 恢复 | 项目经理、深度研究、客服工单 | 没配 store 就缩容,transcript 丢失 |
| Multi-agent container | 一个容器里跑多个 SDK subprocess | 多 Agent 仿真、共享环境协作 | 工作目录和 settings 互相污染 |
agents per host = (host RAM - overhead) / (per-session RAM ceiling)per-session RAM ceiling 不是文档替你填的数字。你得拿一条有代表性的任务跑到目标长度,打开预期工具负载,记录 peak RSS,再决定一台机器能塞几个 session。1sessionId 做 consistent hashing,让同一个 session 持续命中同一个容器和同一个运行中的 subprocess。1api.anthropic.com;如果跑在 Bedrock 或 Google Cloud Agent Platform,就要到对应 provider endpoint;如果 agent 用 MCP server 或外部工具,也需要访问这些 endpoint。官方建议生产环境把出站流量走 egress proxy,用它做域名 allowlist、凭据注入和请求日志。1settingSources 还不够CLAUDE.md memory;在共享容器里,这些文件可能把一个租户的上下文带进另一个租户的 session。1query({
prompt,
options: {
cwd: tenantDir,
settingSources: [],
env: {
...process.env,
CLAUDE_CONFIG_DIR: configDir,
CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
},
},
})setting_sources=[]、cwd=tenant_dir、CLAUDE_CONFIG_DIR 和 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。文档还特别提醒:TypeScript 的 env 会替换 subprocess 环境,所以要展开 ...process.env,否则 PATH、ANTHROPIC_API_KEY 这类继承变量可能没了。1settingSources: [] 不等于关掉所有本地上下文。官方明确说 auto memory 会从 ~/.claude/projects//memory/ 进入 system prompt,所以多租户时还要设 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。1query() 都导出 spans、metrics 和 log events。1CLAUDE_CODE_ENABLE_TELEMETRY=1
CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1
OTEL_TRACES_EXPORTER=otlp
OTEL_METRICS_EXPORTER=otlp
OTEL_LOGS_EXPORTER=otlp
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINT=http://collector.example.com:4318maxTurns 限制 agent 在停止前最多走多少轮 tool-use round trip。1total_cost_usd / costUSD 是客户端估算,不是权威账单。它适合开发调试和预算预估,但不能拿来给终端用户计费或触发财务决策;权威数据要看 Usage and Cost API 或 Claude Console。3maxTurns、任务级 timeout、subagent 批量大小。cwd,不要共用应用根目录。SessionStore,工作目录产物另做 volume 或对象存储同步。sessionId 做粘性路由。cwd、settingSources: []、独立 CLAUDE_CONFIG_DIR 和 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。maxTurns 给每类任务设硬上限。docs.anthropic.com
docs.anthropic.com
docs.anthropic.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.