Cost Optimizer — OpenClaw/Claude Code 成本优化终极工具包
核心问题:OpenClaw 默认配置下 token 消耗极高(日均 $15+,heartbeat 月均 $50-100)。
本 skill 通过智能路由、上下文压缩、heartbeat 优化三管齐下,将成本降低 60-80%。
参数解析
解析用户输入的第一个参数,路由到对应子命令:
| 参数 | 子命令 | 说明 |
|---|
| INLINECODE0 | INLINECODE1 | 智能模型路由 |
| INLINECODE2 |
/cost-compress | 上下文压缩 |
|
heartbeat |
/cost-heartbeat | Heartbeat 优化 |
|
report |
/cost-report | 消耗报告 |
|
config |
/cost-config | 配置生成 |
| (无参数) |
/cost-report | 默认显示消耗报告 |
1. /cost-route — 智能模型路由
任务分类引擎
对用户的 prompt 进行多维度分析,确定最佳模型:
Step 0: 加载定价与规则数据
CODEBLOCK0
如果 references 文件缺失或损坏,使用 index.ts 中硬编码的 MODEL_PRICING 常量作为 fallback。
Step 1: 提取分类特征
从当前 prompt 中提取以下特征:
CODEBLOCK1
Step 2: 路由决策
根据特征匹配路由规则(优先级从高到低):
| 优先级 | 条件 | 目标模型 | 预估成本/1M tokens |
|---|
| P0 | heartbeat / cron / 状态检查 / ping | INLINECODE12 或 INLINECODE13 | $0.07-0.10 |
| P1 |
简单查询(complexity 0-2)、文件列表、搜索 |
gemini-2.0-flash | $0.10 |
| P2 | 文件读取、代码补全、格式化、lint 修复 |
claude-haiku-4-5 | $0.80 |
| P3 | 代码生成、单文件调试、测试编写 |
claude-sonnet-4-6 | $3.00 |
| P4 | 多文件重构、架构设计、复杂推理 |
claude-opus-4-6 | $15.00 |
关键词匹配表:
CODEBLOCK2
Step 3: 降级策略
CODEBLOCK3
Step 4: 输出路由建议
CODEBLOCK4
用户自定义覆盖:
用户可在 openclaw.json 中添加自定义路由规则:
CODEBLOCK5
2. /cost-compress — 上下文压缩
触发条件
- - 自动触发:当对话上下文估算超过 50k tokens 时,输出压缩建议
- 手动触发:用户执行 INLINECODE20
压缩策略
Step 1: 分析当前上下文
扫描对话历史,按以下类别统计 token 占比:
CODEBLOCK6
Step 2: 执行压缩
对每种类别应用不同的压缩策略:
- 1. 历史对话压缩:
- 保留最近 5 轮完整内容
- 第 6-10 轮:提取关键决策点和结论
- 第 10 轮以前:仅保留一句话摘要
- 格式: INLINECODE21
- 2. 工具调用结果压缩:
- 成功的文件读取 → 替换为
[已读取 {path}, {lines} 行, 关键内容: {summary}]
- 成功的搜索结果 → 替换为
[搜索 "{query}": 找到 {n} 个匹配, 主要在 {files}]
- 失败的工具调用 → 保留错误信息,移除重试的中间结果
- Bash 输出 → 保留退出码和关键输出行(首尾各 5 行)
- 3. 文件内容压缩:
- 替换为路径+行号摘要:
[文件 {path}: {lines} 行, 函数: {func_list}, 关键逻辑在 L{start}-L{end}]
- 如果文件在后续被修改,只保留最终版本的摘要
- 4. 代码块压缩:
- 保留函数签名和关键逻辑
- 移除注释和空行
- 对未被后续引用的代码块,替换为 INLINECODE25
Step 3: 生成压缩快照
将压缩后的上下文摘要写入 .context-snapshot.md:
CODEBLOCK7
Step 4: 输出压缩报告
CODEBLOCK8
3. /cost-heartbeat — Heartbeat 优化
当前问题分析
OpenClaw 默认 heartbeat 配置:
- - 间隔:15-30 分钟(过于频繁)
- 内容:全量状态检查(过于冗余)
- 模型:使用默认模型(过于昂贵)
- 月成本估算:$50-100(仅 heartbeat)
优化方案
Step 1: 检查当前 heartbeat 配置
读取以下位置的配置:
CODEBLOCK9
Step 2: 生成优化配置
CODEBLOCK10
Step 3: 估算节省
CODEBLOCK11
Step 4: 应用配置
如果用户确认,将优化配置合并到 openclaw.json 和/或 .claude/settings.json。
4. /cost-report — 消耗报告
数据收集
Step 0: 加载定价数据
CODEBLOCK12
如果 references 文件缺失,使用 index.ts 中的 MODEL_PRICING 常量。
Step 1: 读取使用日志
CODEBLOCK13
日志格式(每行一个 JSON):
CODEBLOCK14
Step 2: 计算统计数据
使用 index.ts 中的工具函数计算:
- - 本次会话消耗(基于对话长度估算)
- 本日/本周/本月累计(基于日志)
- 按模型分类的消耗分布
- 按任务类型的消耗分布
- 如果启用了路由,计算实际节省
Step 3: 输出报告
CODEBLOCK15
ASCII 柱状图格式:
日期 | 成本 | 分布
03-14 Mon | $12.30 | ████████████░░░░░░░░
03-15 Tue | $8.50 | ████████░░░░░░░░░░░░
03-16 Wed | $15.20 | ███████████████░░░░░
03-17 Thu | $6.30 | ██████░░░░░░░░░░░░░░
03-18 Fri | $11.00 | ███████████░░░░░░░░░
03-19 Sat | $3.20 | ███░░░░░░░░░░░░░░░░░
03-20 Sun | $1.50 | █░░░░░░░░░░░░░░░░░░░
+---------+--------------------
总计: $58.00 日均: $8.29
5. /cost-config — 配置生成
预设方案
提供三档预设,用户可选择:
| 预设 | 说明 | 预估日均成本 | 适用场景 |
|---|
| INLINECODE33 | 保守优化,最小化风险 | $8-12 | 不确定时的安全选择 |
| INLINECODE34 |
平衡成本与质量(推荐) | $4-8 | 日常开发 |
|
aggressive | 激进节省,可能影响质量 | $1-4 | 预算紧张、简单任务为主 |
Step 1: 分析当前配置
读取现有配置文件:
CODEBLOCK17
Step 2: 生成配置
根据选择的预设生成完整的 openclaw.json(参考本 skill 目录下的 openclaw.json 模板)。
Step 3: 输出配置 diff
CODEBLOCK18
Step 4: 应用配置
用户确认后:
- 1. 备份当前配置: INLINECODE38
- 写入新配置
- 验证配置格式正确(JSON 解析测试)
- 输出确认信息
通用工具函数
本 skill 依赖 index.ts 中的工具函数,所有子命令共享:
- -
classifyTask(prompt) — 任务分类,返回 P0-P4 等级 - INLINECODE41 — 基于字符数的 token 快速估算
- INLINECODE42 — 根据分类和上下文大小选择模型
- INLINECODE43 — 上下文压缩
- INLINECODE44 — 从日志生成报告
- INLINECODE45 — 计算节省金额
详细类型定义和实现见 index.ts。
错误处理
所有文件操作均需显式 fallback,避免因单点故障中断整个流程:
| 操作 | 失败场景 | Fallback 行为 |
|---|
| 读取 INLINECODE47 | 文件不存在 / JSON 解析失败 | 使用内置默认配置,输出 INLINECODE48 |
| 读取 INLINECODE49 |
权限不足 / 路径不存在 | 跳过全局配置,仅使用项目级配置 |
| 读取
references/*.md | 文件缺失 | 使用
index.ts 中硬编码的
MODEL_PRICING 常量 |
| 写入日志
~/.openclaw/cost-optimizer.log | 目录不存在 / 磁盘满 | 回退到标准输出打印日志,输出
⚠️ 日志写入失败,回退到 stdout |
| 写入
usage-log.jsonl | 权限不足 | 跳过日志写入,输出
⚠️ 使用日志写入失败,本次数据未记录 |
| 解析
usage-log.jsonl | 某行 JSON 格式损坏 | 跳过损坏行,继续解析后续行,报告中标注
⚠️ 跳过 {n} 条损坏记录 |
| 写入
openclaw.json(配置应用) | 写入失败 | 不覆盖原文件,输出错误信息和配置内容到 stdout,让用户手动粘贴 |
| 备份配置文件 | 备份失败 | 中止配置写入,输出
⚠️ 备份失败,已中止写入以保护现有配置 |
实现原则
- 1. 读取失败 → 降级到默认值:永远不因读取失败而中断流程
- 写入失败 → 回退到 stdout:确保信息不丢失,用户可手动操作
- 解析失败 → 跳过并报告:损坏数据不影响其余有效数据的处理
- 配置写入 → 备份优先:备份失败则拒绝写入,保护用户现有配置
审计与日志
所有路由决策和配置变更都会记录日志:
CODEBLOCK19
平台兼容性
| 功能 | OpenClaw | Claude Code |
|---|
| 模型路由 | ✅ 完整支持 | ✅ 通过 /model 切换建议 |
| 上下文压缩 |
✅ 完整支持 | ✅ 生成快照文件 |
| Heartbeat 优化 | ✅ 完整支持 | ⚠️ 需手动配置 cron |
| 消耗报告 | ✅ 读取日志 | ✅ 基于会话估算 |
| 配置生成 | ✅ openclaw.json | ✅ settings.json |
Cost Optimizer — OpenClaw/Claude Code 成本优化终极工具包
核心问题:OpenClaw 默认配置下 token 消耗极高(日均 $15+,heartbeat 月均 $50-100)。
本 skill 通过智能路由、上下文压缩、heartbeat 优化三管齐下,将成本降低 60-80%。
参数解析
解析用户输入的第一个参数,路由到对应子命令:
| 参数 | 子命令 | 说明 |
|---|
| route | /cost-route | 智能模型路由 |
| compress |
/cost-compress | 上下文压缩 |
| heartbeat | /cost-heartbeat | Heartbeat 优化 |
| report | /cost-report | 消耗报告 |
| config | /cost-config | 配置生成 |
| (无参数) | /cost-report | 默认显示消耗报告 |
1. /cost-route — 智能模型路由
任务分类引擎
对用户的 prompt 进行多维度分析,确定最佳模型:
Step 0: 加载定价与规则数据
Read references/model-pricing.md — 获取最新模型定价,用于成本计算和节省估算
Read references/routing-rules.md — 获取路由规则详情和自定义方法
如果 references 文件缺失或损坏,使用 index.ts 中硬编码的 MODEL_PRICING 常量作为 fallback。
Step 1: 提取分类特征
从当前 prompt 中提取以下特征:
特征维度:
- - keywords: 关键词匹配(见下方路由规则表)
- contextlength: 当前对话上下文 token 数(用 index.ts#estimateTokens 估算)
- complexityscore: 复杂度评分(0-10)
- 0-2: 简单查询、状态检查
- 3-5: 单文件操作、格式化、补全
- 6-8: 多文件代码生成、调试、推理
- 9-10: 架构设计、多步骤复杂任务
- - toolcalls: 预期工具调用数量
- coderatio: prompt 中代码占比
Step 2: 路由决策
根据特征匹配路由规则(优先级从高到低):
| 优先级 | 条件 | 目标模型 | 预估成本/1M tokens |
|---|
| P0 | heartbeat / cron / 状态检查 / ping | deepseek/v3 或 gemini-2.0-flash | $0.07-0.10 |
| P1 |
简单查询(complexity 0-2)、文件列表、搜索 | gemini-2.0-flash | $0.10 |
| P2 | 文件读取、代码补全、格式化、lint 修复 | claude-haiku-4-5 | $0.80 |
| P3 | 代码生成、单文件调试、测试编写 | claude-sonnet-4-6 | $3.00 |
| P4 | 多文件重构、架构设计、复杂推理 | claude-opus-4-6 | $15.00 |
关键词匹配表:
P0 (最便宜):
- heartbeat, ping, status, health, alive, cron, schedule
- 是否在线, 检查状态, 心跳
P1 (低成本):
- list, find, search, grep, count, ls, pwd, which, where
- 找到, 搜索, 列出, 有几个
P2 (中低成本):
- read, cat, format, lint, fix typo, rename, move
- complete, autocomplete, suggest, snippet
- 读取, 格式化, 补全, 重命名
P3 (中等成本):
- write, create, implement, generate, test, debug, explain
- refactor (单文件), fix bug, add feature
- 写, 创建, 实现, 生成, 测试, 调试
P4 (高成本 - 仅在必要时):
- architect, design, plan, review (全局), migrate
- refactor (多文件), 从零开始, 重新设计
- complexity_score >= 9
- context_length > 100k tokens
Step 3: 降级策略
降级链: opus → sonnet → haiku → gemini-flash → deepseek/v3
触发条件:
- 目标模型 API 返回 429/503 → 降一级
- 响应时间 > 30s → 降一级
- 用户设置了成本上限且当前会话已超 80% → 强制降一级
- 降级后在日志中记录: [COST-ROUTE] 降级: {原模型} → {新模型}, 原因: {reason}
Step 4: 输出路由建议
markdown
🔀 模型路由建议
{score}/10 |
| 上下文长度 | {tokens} tokens |
| 推荐模型 | {model} |
| 预估成本 | ${cost}/次 |
| 对比默认 | 节省 {savings}% |
路由依据: {匹配的关键词/规则}
用户自定义覆盖:
用户可在 openclaw.json 中添加自定义路由规则:
json
{
cost-optimizer: {
routing: {
overrides: [
{
pattern: deploy|发布,
model: claude-sonnet-4-6,
reason: 部署操作需要中等智能但不需要最强模型
}
]
}
}
}
2. /cost-compress — 上下文压缩
触发条件
- - 自动触发:当对话上下文估算超过 50k tokens 时,输出压缩建议
- 手动触发:用户执行 /cost-optimizer compress
压缩策略
Step 1: 分析当前上下文
扫描对话历史,按以下类别统计 token 占比:
类别 | 描述 | 压缩率
-------------- | ---------------------- | ------
recent_turns | 最近 5 轮对话 | 0%(完整保留)
old_turns | 更早的对话轮次 | 80-90%
tool_results | 工具调用返回结果 | 70-85%
file_contents | 文件完整内容 | 90-95%
code_blocks | 代码块 | 50-70%
system_context | 系统 prompt / 角色定义 | 0%(不压缩)
Step 2: 执行压缩
对每种类别应用不同的压缩策略:
- 1. 历史对话压缩:
- 保留最近 5 轮完整内容
- 第 6-10 轮:提取关键决策点和结论
- 第 10 轮以前:仅保留一句话摘要
- 格式:[轮次 N 摘要] 用户请求 X,助手执行了 Y,结果是 Z
- 2. 工具调用结果压缩:
- 成功的文件读取 → 替换为 [已读取 {path}, {lines} 行, 关键内容: {summary}]
- 成功的搜索结果 → 替换为 [搜索 {query}: 找到 {n} 个匹配, 主要在 {files}]
- 失败的工具调用 → 保留错误信息,移除重试的中间结果
- Bash 输出 → 保留退出码和关键输出行(首尾各 5 行)
- 3. 文件内容压缩:
- 替换为路径+行号摘要:[文件 {path}: {lines} 行, 函数: {func_list}, 关键逻辑在 L{start}-L{end}]
- 如果文件在后续被修改,只保留最终版本的摘要
- 4. 代码块压缩:
- 保留函数签名和关键逻辑
- 移除注释和空行
- 对未被后续引用的代码块,替换为 [代码块: {language}, {lines} 行, 功能: {summary}]
Step 3: 生成压缩快照
将压缩后的上下文摘要写入 .context-snapshot.md:
markdown
Context Snapshot
生成时间: {timestamp}
原始 tokens: {original} → 压缩后: {compressed} (节省 {ratio}%)
关键决策
活跃文件
- - {file1}: {summary}
- {file2}: {summary}
待处理事项
最近对话(完整)
{last
5turns}
Step 4: 输出压缩报告
markdown
📦 上下文压缩报告
| 指标 | 值 |
|------|