用 WorkBuddy、Cursor、Claude Code 这类 AI 编码工具时,你看到的“积分”或“费用”本质上都是 Token 消耗的映射。一次“帮我重构这个函数”背后,可能悄悄吃掉了上万 input token + 几千 output token。本文把成本拆开讲清楚,并给出 5 个能立刻落地的省钱手段,附可直接复用的 Python 代码。
一、成本到底花在哪
一次模型调用的账单通常包含三类 token:
- input token:你发给模型的上下文(系统提示、历史对话、代码文件)
- output token:模型生成的回复
- cache token:命中缓存的部分,单价通常是 input 的 1/10
容易被忽略的隐性消耗:AI 编码工具为了“懂你的项目”,每次请求都会把大量代码文件、目录结构塞进上下文,input token 往往是 output 的 5~10 倍。所以省成本的第一战场是 input,不是 output。
二、省钱手段 1:榨干缓存命中
OpenAI、Claude、Gemini 都支持 prompt caching:把长期不变的前缀(系统提示、项目背景、常量定义)标成可缓存段,命中后这部分单价大幅下降。
import os
from openai import OpenAI
# easy88ai 提供 OpenAI 兼容接口,可直接作为统一 base_url
client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
base_url="https://easy88ai.com/v1",
)
# 把不变的项目背景放在前面,并打上 cache_control 标记
system_prompt = (
"你是资深 Python 工程师,负责维护下面的项目:\n"
"<项目背景与常量定义,长期不变>"
)
resp = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "把 utils.py 里的 parse_config 改成支持嵌套字典"},
],
extra_body={"cache_control": {"type": "ephemeral"}},
)
print(resp.usage.model_dump())
要点:缓存按“前缀匹配”生效,变动越靠后的内容,缓存命中率越高。把稳定内容前置,是成本优化里性价比最高的一招。
三、省钱手段 2:模型路由,贵模型只干贵活
不是每一步都需要旗舰模型。常见做法是:用便宜模型做分类、提取、格式化,只在真正需要推理的环节调用贵模型。
def route(task: str):
# 简单任务走轻量模型
cheap = {"gpt-5.6-mini", "claude-haiku"}
# 复杂任务走旗舰
if any(k in task for k in ["重构", "设计架构", "debug"]):
return "gpt-5.6-sol"
return "gpt-5.6-mini"
model = route("把函数参数改成可选")
print("本次调用模型:", model)
实测下来,编码助手类场景里 60%~70% 的请求可以用轻量模型兜底,整体账单能降一半以上。
四、省钱手段 3:上下文瘦身
AI 编码工具默认会把整个文件甚至整个仓库塞进上下文。你可以主动做三件事:
- 只发“相关函数”而不是整个文件
- 历史对话做摘要压缩,别把完整对话来回传
- 用 tree 命令输出目录结构代替逐个读文件
def slim_context(file_text: str, max_lines: int = 120) -> str:
lines = file_text.splitlines()
if len(lines) <= max_lines:
return file_text
# 超长文件只保留头尾 + 关键签名行
head = lines[:60]
tail = lines[-60:]
return "\n".join(head + ["... (省略中间) ..."] + tail)
五、省钱手段 4:批量请求走 Batch
有离线需求(比如一次性给 100 个函数加类型注解)时,用各家的 Batch API,价格通常再打 5 折,且享有更宽松的速率限制。
batch_requests = [
{"custom_id": f"req-{i}", "method": "POST", "url": "/v1/chat/completions",
"body": {"model": "gpt-5.6-mini", "messages": [{"role": "user", "content": task}]}}
for i, task in enumerate(task_list)
]
# 提交 batch,异步取结果,单价约为实时的一半
六、省钱手段 5:预算熔断
最怕的是“半夜跑了个失控的循环,早上起来额度清零”。给调用层加一个预算熔断:
from datetime import datetime, timedelta
class BudgetGuard:
def __init__(self, daily_limit_usd: float):
self.limit = daily_limit_usd
self.spent = 0.0
self.window_start = datetime.now()
def charge(self, cost_usd: float):
if (datetime.now() - self.window_start) > timedelta(days=1):
self.spent = 0.0
self.window_start = datetime.now()
self.spent += cost_usd
if self.spent > self.limit:
raise RuntimeError(f"预算熔断:今日已花 ${self.spent:.2f},超过 ${self.limit:.2f}")
七、把多家模型收敛到同一调用范式
OpenAI、Claude、Gemini、DeepSeek 的 chat 接口形态高度一致,用同一套调用函数切换 model 参数即可,不必为每个家单独维护 SDK。上面的示例都基于 OpenAI 兼容接口,切换模型只改 model 字段。
小结
AI 编码工具的费用不是玄学,它由 input / output / cache 三类 token 决定。把稳定内容前置吃缓存、用轻量模型兜底简单任务、上下文瘦身、离线任务走 Batch、加预算熔断,这五招叠加,账单通常能砍掉一半以上。先从不改业务逻辑的“缓存 + 路由”两招入手,见效最快。
