成本警报:OpenClaw+ollama-QwQ-32B的Token消耗监控方案
成本警报:OpenClaw+ollama-QwQ-32B的Token消耗监控方案
1. 为什么需要Token监控
当我第一次在本地部署OpenClaw对接ollama-QwQ-32B模型时,完全没意识到Token消耗会如此惊人。直到月底收到云服务账单,才发现几个自动化任务已经烧掉了相当于三杯咖啡的API费用。这让我意识到:在享受AI自动化便利的同时,必须建立完善的成本监控机制。
OpenClaw的每个操作——从鼠标点击到文件处理——都需要大模型参与决策。特别是使用32B参数的大模型时,长链条任务的Token消耗会呈指数级增长。经过实测,一个简单的"整理周报+邮件发送"任务就可能消耗8000+ Token。如果不加控制,连续运行的自动化流程很快就会成为"吞金兽"。
2. 监控方案设计思路
我的监控方案核心是三个关键点:
第一是分类统计。不是简单计算总Token数,而是按任务类型(如文件处理、网页抓取、邮件发送)分别统计。这样能快速定位"耗能大户"。
第二是动态阈值。根据历史数据为每类任务设置合理的Token上限,超过阈值时触发告警。阈值不是固定值,而是会随着使用习惯动态调整。
第三是熔断机制。当某个任务的Token消耗异常激增时,系统能自动暂停该任务,防止"失控消费"。
整套方案基于Shell脚本实现,主要利用OpenClaw自带的models list接口获取原始数据。选择Shell是考虑到轻量化和跨平台性,不需要额外依赖就能在macOS/Linux上运行。
3. 核心脚本实现
3.1 基础数据采集
首先需要从OpenClaw获取原始的Token消耗数据。OpenClaw的REST API提供了/v1/models/list端点,返回JSON格式的模型使用情况:
#!/bin/bash
# 获取OpenClaw模型使用数据
fetch_model_stats() {
local api_url="http://127.0.0.1:18789/v1/models/list"
curl -s "$api_url" | jq '.models[] | select(.id == "qwen-32b")'
}
model_stats=$(fetch_model_stats)
这里使用了jq工具解析JSON。如果你的系统没有安装,可以通过brew install jq或apt-get install jq获取。
3.2 数据分类处理
接下来需要对数据进行分类汇总。我的做法是在OpenClaw的任务描述中添加#标签,然后用正则表达式提取:
parse_task_stats() {
local stats=$1
echo "$stats" | jq -r '.usage_by_task[] | "\(.task)#\(.total_tokens)"' | awk -F'#' '{
if ($1 ~ /文件/) { file+=$2 }
else if ($1 ~ /邮件/) { email+=$2 }
else if ($1 ~ /网页/) { web+=$2 }
else { other+=$2 }
total+=$2
} END {
print "文件处理:" file
print "邮件发送:" email
print "网页抓取:" web
print "其他任务:" other
print "总Token:" total
}'
}
这个函数会输出按类别分组的Token消耗情况。你可以根据实际任务类型调整分类规则。
3.3 阈值告警机制
有了基础数据后,就可以实现阈值检查功能。我将阈值配置放在单独的thresholds.conf文件中:
# 每日Token阈值配置
[default]
file=50000
email=30000
web=40000
total=150000
检查脚本会读取这个配置并与实际消耗对比:
check_thresholds() {
local stats=$1
source thresholds.conf
while IFS=: read -r category value; do
case $category in
"文件处理") threshold=$file ;;
"邮件发送") threshold=$email ;;
"网页抓取") threshold=$web ;;
"总Token") threshold=$total ;;
*) continue ;;
esac
if [ $value -gt $threshold ]; then
send_alert "$category Token超标: 已用$value > 阈值$threshold"
fi
done <<< "$stats"
}
3.4 自动熔断实现
当某个类别的Token消耗连续超过阈值时,应该自动暂停相关任务。我通过OpenClaw的/v1/tasks/pause接口实现:
pause_tasks() {
local category=$1
local task_ids=$(echo "$model_stats" | jq -r '.running_tasks[] | select(.description | contains("'"$category"'")) | .id')
for id in $task_ids; do
curl -X POST "http://127.0.0.1:18789/v1/tasks/$id/pause"
echo "已暂停任务 $id ($category)"
done
}
为了不过于敏感,我设置了"连续3次超标才熔断"的规则,具体实现可以通过外部计数器文件记录超标次数。
4. 完整脚本集成
将上述模块组合起来,就形成了完整的监控脚本:
#!/bin/bash
# 配置区域
THRESHOLD_FILE="thresholds.conf"
COUNTER_FILE="alert_counters"
OPENCLAW_PORT=18789
# 初始化计数器
init_counters() {
[ -f "$COUNTER_FILE" ] || {
echo "文件处理:0" > "$COUNTER_FILE"
echo "邮件发送:0" >> "$COUNTER_FILE"
echo "网页抓取:0" >> "$COUNTER_FILE"
}
}
# 主监控流程
main() {
init_counters
stats=$(fetch_model_stats | parse_task_stats)
check_thresholds "$stats"
# 记录超标次数并执行熔断
while IFS=: read -r category value; do
current_count=$(grep "^$category:" "$COUNTER_FILE" | cut -d: -f2)
threshold=$(grep "^$category" "$THRESHOLD_FILE" | cut -d= -f2)
if [ $value -gt $threshold ]; then
new_count=$((current_count + 1))
sed -i '' "s/^$category:.*/$category:$new_count/" "$COUNTER_FILE"
if [ $new_count -ge 3 ]; then
pause_tasks "$category"
echo "0" > "$COUNTER_FILE"
fi
else
echo "0" > "$COUNTER_FILE"
fi
done <<< "$(echo "$stats" | grep -v '总Token')"
}
main
建议通过cron设置每小时运行一次:
0 * * * * /path/to/monitor_script.sh >> /var/log/openclaw_monitor.log 2>&1
5. 实际使用效果与优化
这套监控系统已经稳定运行了两周,成功拦截了三次异常消耗:
- 一个陷入循环的网页抓取任务,累计消耗了12万Token后被自动暂停
- 文件处理脚本因PDF解析错误导致重复调用模型,触发告警
- 邮件自动回复功能因接收垃圾邮件导致暴增,被熔断机制拦截
在使用过程中,我做了几点优化:
- 动态阈值调整:脚本现在会根据历史使用情况自动建议新的阈值
- 异常模式检测:当某个任务的Token/分钟速率异常时立即告警,不等待总量超标
- 可视化报表:用Python脚本将日志数据转为每日消耗趋势图
最关键的收获是:Token监控不是一次性的工作,而需要持续观察和调整。特别是当OpenClaw新增技能或任务模式变化时,要及时更新监控策略。
6. 安全注意事项
在实施Token监控方案时,有几点安全建议:
- 最小权限原则:监控脚本只需要读取模型统计和暂停任务的权限,不要使用管理员凭证
- 日志脱敏:确保日志文件不记录敏感信息,如任务详情中的个人数据
- 熔断确认:可以考虑增加二次确认机制,在自动暂停前发送通知给用户
- 备份机制:定期备份阈值配置和计数器状态,防止意外丢失
特别是当OpenClaw处理敏感数据时,要确保监控系统本身不会成为信息泄露的渠道。我的做法是将所有日志保存在本地加密目录,不上传任何数据到云端。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐


所有评论(0)