前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
返回 AI 情报前线
All News · 全部资讯4458
  • 用类型系统消除量化模型格式歧义
  • Meta 发布终端编程智能体 Muse Code
  • AI 代码生成平台安全检查清单
  • 动态定价下的LLM预算保护设计
  • 把生产环境提示词当作代码治理
  • 五个被低估的MCP能力
  • 按任务场景选择大模型的方法
  • 欧盟 AI 透明度规则正式生效
  • 让 AI Agent 按工单自动结算
  • 构建可审计的半自主 EDA Agent
  • 让编码 Agent 记住被否决的方案
  • 构建动态多模型路由层
  • 用脚本自检守住高风险正则
  • 让AI代理继承用户权限而非共享密钥
  • 五款自托管AI对话前端怎么选
  • 用命令行低成本批量分析文本
  • MiniMax H3 的 ComfyUI 部署指南
  • Node.js 多模型摘要服务设计
  • 用停止条件预防AI代理越权
  • 三类协议如何组成 Agent 技术栈
  • 降低Claude Code无头调用成本
  • 百美元树莓派部署自治 AI Agent
  • 统一统计三类AI编程助手成本
  • 检测器三次重写暴露同类逻辑错误
  • VS Code 1.132 强化智能体协作
  • 代码检索为何需要三类索引协同
  • 用可替换网关解耦实时多模态模型
  • 小米开源具身智能模型完整工具链
  • 用A2A打通多智能体协作流程
  • 用连续性账本维持AI角色记忆
  • 自建全套AI开发工具:Token消耗实测下降52%
  • 我是如何构建自主Agent流水线的
  • WPA引入AI辅助定位性能瓶颈
  • 微软 SkillOpt 证明优化后的 Agent 技能可跨模型和工具链复用
  • Meta模型测试时越界攻击外部系统
  • Agent Plugins 1.0获多款开发工具支持
  • Vercel集成可自动安装Agent技能
  • Ling 3.0 Tiny上线Vercel AI Gateway
  • Agent插件开放标准正式发布
  • Meta 发布 Muse Code 编程 Agent,长上下文工具调用能力突出
  • 联网误配置让模型误攻真实网站
  • AI时代云成本剧变:决策成本反超实现成本
  • 用LLM自动诊断Python性能瓶颈:轻量级性能剖析代理实战
  • Spec转可部署微服务:FastAPI+LLaMA驱动的端到端代码生成
  • AI安全测试失控:英国AISI评测中模型绕过限制攻击真实系统
  • Meta Muse模型测试中误闯真实系统,第三方评测机构配置失误
  • Meta推出编程智能体Muse Code,挑战Claude Code和Codex
  • 如何阻止编码 Agent 在你审核计划前就写文件
  • 电话语音Agent实现中途切换语言:五语种同框对话
  • 零空闲内存队列 + 突发 ECS:AI 网红视频生成的架构实践
  • Docker容器原生AI:GPU穿透、内存隔离与弹性Agent扩缩容
  • 已加载 51 / 4458
9.0
重磅
AI SCORE
编程提效2026-08-06 10:48

降低Claude Code无头调用成本

dev.to · AI#Claude Code#自动化#Token成本
Editor brief · 编辑速览

文章解释 `claude -p` 会加载交互会话所需上下文,可能让简单定时任务在执行前消耗大量 token,并介绍用 `--bare` 控制成本。它还覆盖退出码、标准输入输出、权限参数以及 10MB 管道输入限制等自动化要点。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

你把 claude -p 接入脚本,运行起来一切正常,但用量数字却怎么都说不通:仅仅一行 prompt,成本竟然和完整的工作会话一样高。我们在定时运行 Claude Code 时就遇到了这个问题——在仓库根目录冷启动一次 claude -p,还没开始执行任何工作,就消耗了大约 150,000 个 token,因为 print 模式会加载交互式会话所加载的全部内容。

本文会介绍 -p 实际加载了什么、如何使用 --bare 解决成本问题,以及当 Claude Code 在无人值守环境中运行时,哪些权限和输出选项值得关注。

-p(完整形式:--print)会以非交互方式运行任意 claude 命令:输入一个 prompt,输出一个结果,然后进程退出。

claude -p "What does the auth module do?"

脚本层面的基础行为符合你的预期:

退出码:成功时为 0,失败时为非零,因此 CI 可以据此选择不同的处理分支。无效 flag 会在运行开始前报告到 stderr;运行过程中的失败(例如缺少身份认证)则会作为结果输出到 stdout。

支持读取 stdin:cat build-error.txt | claude -p 'explain the root cause' > out.txt 和其他 Unix 工具一样正常工作。管道输入的上限为 10MB(从 v2.1.128 开始)——超过限制后,你会收到清晰的错误,并得到非零退出码。因此,较大的输入应写入文件,再通过路径引用。

不兼容的 flag 会明确失败:同时使用 -p 与 --bg 或 --cloud 时,命令会拒绝执行,并在错误信息中指出冲突项。

下面是一个 package.json 脚本,它使用 Claude 检查 diff 中的拼写错误:

{
  "scripts": {
    "lint:claude": "git diff main | claude -p \"you are a typo linter. for each typo in this diff, report filename:line on one line and the issue on the next. return nothing else.\""
  }
}

没人纳入预算的部分:-p 会加载你的整套配置

文档中的这句话解释了我们那笔 150k token 的账单:

如果不使用它,claude -p 会加载与交互式会话相同的上下文,包括工作目录或 ~/.claude 中配置的所有内容。

这意味着,每次脚本调用都会为以下内容的自动发现付出成本:

CLAUDE.md(加载链中的所有文件,而不仅仅是仓库里的那一个)

如果你的仓库里有一份很长的 CLAUDE.md、一个 skills 目录,以及几个 MCP servers——对于成熟的项目配置来说,这很正常——那么每次调用时,一个“快速的脚本问题”都会悄无声息地把所有这些内容作为上下文发送出去。我们实测每次冷调用约消耗 150k token,这不是 bug,而是 -p 忠实地复现了我们的交互式环境,即使这项任务根本不需要其中任何内容。

--bare:从零开始,只加回你需要的内容

--bare 会完全跳过这种自动发现——不加载 hooks、skills、plugins、MCP servers、auto memory 和 CLAUDE.md:

claude --bare -p "Summarize README.md" --allowedTools "Read"

有两个特性让它成为 CI 的合理默认选择:

  1. 可复现性。队友 ~/.claude 中的 hook 或项目 .mcp.json 中的 MCP server 都不会运行,因为 bare 模式根本不会读取它们。在每台机器上执行相同的调用,都能得到相同的行为。

  2. 显式凭据。Bare 模式绝不会读取 OAuth 凭据或系统 keychain。使用 Anthropic API 时,需要设置 ANTHROPIC_API_KEY(或通过 --settings 提供 apiKeyHelper)。Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 仍会照常读取各自 provider 的凭据。这样就不会在不知情的情况下依赖最后登录的那个人。

在 bare 模式下,Claude 仍然拥有 Bash、文件读取和文件编辑工具。其他所有能力都需要通过 flag 显式启用:

文档指出,--bare 是脚本调用和 SDK 调用的推荐模式,并且会在未来版本中成为 -p 的默认模式。如果你的脚本依赖 -p 运行期间启用 CLAUDE.md 规则或 hooks,那么现在就应该留意这一点:默认值切换的那一天,这些脚本的行为也会随之改变。请逐个脚本做出判断——“需要我的规则”,还是“需要一个无干扰的干净环境”——然后显式写出对应的 flag。

面向脚本的结构化输出

--output-format 控制响应的格式:

claude -p "Summarize this project" --output-format json | jq -r '.result'

有三个细节值得了解:

json 中包含 total_cost_usd 和按 model 细分的成本信息。如果你在运行定时任务,请把它记录到日志中——这样你就能及时发现一次消耗 150k token 的冷启动,而不必等到查看 dashboard 时才知道。

--json-schema(与 --output-format json 一起使用)可以让响应遵循你提供的 JSON Schema;结构化部分会写入 structured_output 字段。

如果你正在基于输出构建进度 UI,stream-json 配合 --verbose --include-partial-messages,可以用 JSON Lines 的形式发出 token 级事件。

没人在场点击“允许”时的权限设置

Headless 运行无法响应权限提示,因此你需要提前批准:

claude -p "Run the test suite and fix any failures" \
  --allowedTools "Bash,Read,Edit"

你可以把 Bash 权限限定到特定的命令模式,而不是授予不受限制的访问权限:

claude -p "Look at my staged changes and create an appropriate commit" \
  --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"

如果要为整个会话设置权限基线,可以传入 permission mode,而不是逐一列出工具:

dontAsk 会拒绝所有未列入 permissions.allow 规则、且不属于内置只读命令集合的操作——这是适合严格受限 CI 的设置。

acceptEdits 允许 Claude 在不提示的情况下写入文件,并自动批准常见的文件系统命令(mkdir、touch、mv、cp)。其他 shell 命令和网络请求仍然需要 allow 规则——否则,一旦尝试执行,运行就会中止。

只有在 CI 中才会暴露的时序陷阱

以下问题经常会催生“本地正常,但在 CI 中卡住”的工单:

最终结果产生大约 5 秒后,后台 Bash 任务会被终止。如果 Claude 在一次 -p 运行期间启动了 dev server 或 watch build,那么在结果返回且 stdin 关闭大约五秒后,对应的 shell 就会被终止。(在 v2.1.163 之前,永不退出的后台进程会让 claude -p 调用一直无法结束——如果你曾遇到这种卡死,原因就在这里。)

后台 subagents 的行为则不同:它们的输出属于最终结果的一部分,因此 -p 会等待它们完成——从 v2.1.182 开始,默认最长等待十分钟。CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS 可以调整这个上限;设为 0 则表示无限期等待。

SIGTERM 可以被妥善处理:正在进行的 turn 会中止,所有正在运行的 Bash 命令的进程树都会被终止,SessionEnd hooks 仍会运行,退出码为 143。你的 supervisor 可以终止卡住的任务,而不会留下孤儿进程。

什么时候不该使用 -p

根据我们在生产环境中的使用经验,它有两个明确的边界:

迭代式工作。如果你看到回答后还会继续追问,那么保留着热上下文的交互式会话,会比一连串冷启动的 -p 调用更合适。(--continue 确实可以让脚本继续一次对话,但这种方式本质上是在逐个进程重建会话。)

任何需要结合项目判断标准的工作。--bare 之所以快,是因为它跳过了你的规则。定时执行的代码审查任务,或者编写面向用户文本的任务,很可能需要加载 CLAUDE.md——这意味着你应该有意识地支付上下文成本,而不是一味规避它。

对我们来说行之有效的模式是:机械性任务使用 --bare、显式的 --allowedTools 和 --output-format json;只有在规则确实值得消耗这些 token 的场景中,才使用完整上下文的 -p;同时在所有地方记录 total_cost_usd,这样一旦成本发生漂移,一周内就能发现,而不是等到一个季度后。

我在维护 Rulestack——一套面向 Claude Code、Cursor 和 Codex,经过测试的规则包、skills 与模板。

我每天都会在 Bluesky 上分享 AI coding agents 相关笔记:@ai-shop.bsky.social

如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
三类协议如何组成 Agent 技术栈
下一篇
百美元树莓派部署自治 AI Agent