跳转至

成本控制

Echo Agent 内置成本追踪与预算控制系统,帮助你了解各模型的实际开销并避免意外超支。

概述

成本系统涵盖以下能力:

  • 按模型归因计费(per-model cost attribution)
  • 每日预算上限与软阈值预警
  • 自定义定价表(适配本地/私有化部署模型)
  • CLI 与 Dashboard 双入口查询
  • 路由器成本感知决策集成

配置

在项目配置文件中启用成本追踪:

cost:
  enabled: true
  daily_budget_usd: 5.0
  soft_threshold_ratio: 0.8
  pricing_overrides:
    my-local-llama:
      input_per_1m: 0.0
      output_per_1m: 0.0
    custom-gpt4:
      input_per_1m: 30.0
      output_per_1m: 60.0

单价按每百万 token 计

覆盖项的键名是 input_per_1moutput_per_1mcache_read_per_1mcache_write_per_1m —— 单位是每 1M token,不是每 1K。_resolve_price()ov.get("input_per_1m", 0.0) 读取,因此写成 input_per_1k 不会报错,而是取到默认值 0.0,结果是该模型的费用恒为零。

字段说明

字段 类型 默认值 说明
enabled bool false 是否启用成本追踪与预算控制
daily_budget_usd float 0.0 每日预算(美元),0 表示不限制
soft_threshold_ratio float 0.8 软预警触发比例(相对于 daily_budget_usd)
pricing_overrides dict {} 模型定价覆盖表

每日预算与软预警

daily_budget_usd 设置为正数时,系统会在每个 UTC 自然日内累计消耗。

  • 软预警:当日消耗达到 daily_budget_usd * soft_threshold_ratio 时触发告警日志。例如预算 $5、阈值 0.8,则在消耗 $4 时发出预警。
  • 硬上限:当日消耗达到 daily_budget_usd 时触发预算耗尽行为(见下文)。

硬上限的行为是硬停止:达到 daily_budget_usd 后,新的模型调用会被拒绝并抛出 BudgetExceeded,错误信息包含已花费金额与「将于明日重置」的提示。系统不会自动降级到更廉价的模型——预算耗尽时停止工作,而非静默改变输出质量。

软预警只写一条告警日志,且每个预算周期只告警一次,不影响调用。计数按 UTC 自然日滚动重置。

daily_budget_usd 默认为 0,即不限制。


按模型成本归因

每次 LLM 调用的 token 用量通过 LLMResponse.usage 追踪:

  • input_tokens — 输入 token 数
  • output_tokens — 输出 token 数
  • cache_read_input_tokens — 命中缓存的输入 token 数

系统根据各模型的定价表(内置或 pricing_overrides)计算每次调用的成本,并按模型维度汇总。


定价覆盖

对于自托管模型或自定义端点,使用 pricing_overrides 设置实际单价:

cost:
  pricing_overrides:
    # 本地模型不计费
    ollama-llama3:
      input_per_1m: 0
      output_per_1m: 0
    # 自定义价格
    azure-gpt4o:
      input_per_1m: 5
      output_per_1m: 15

未在覆盖表中出现的模型将使用内置定价数据。


CLI 查询

使用 echo-agent cost 命令查看成本报告:

# 查看最近 7 天成本
echo-agent cost --days 7

# 输出 JSON 格式(适合脚本处理)
echo-agent cost --days 30 --json

输出内容包含:

  • 每日总消耗
  • 按模型分组的成本明细
  • 预算使用百分比
  • 缓存命中率统计

Dashboard 分析页

Dashboard 的 Analytics 页面提供可视化成本视图:

  • 日/周/月成本趋势图
  • 模型成本占比饼图
  • 缓存命中率趋势
  • 预算消耗进度条

成本优化策略

1. 模型路由

按任务类型把不同工作分流到不同模型,把便宜的模型用在简单任务上。分流规则写在 models.routes,每条规则用 task_types 匹配:

models:
  default_model: claude-sonnet-4-5
  routes:
    - task_types: [simple]
      provider: openai
      model: gpt-4o-mini
      max_tokens: 4096
    - task_types: [coding]
      provider: anthropic
      model: claude-sonnet-4-5
      fallback_models: [gpt-4o]

每条路由可设 providermodeltask_typesfallback_modelsmax_tokenstemperaturecontext_window

不存在 router 配置节

配置中没有 router 顶层节,也没有 strategy: cost_awarerules / condition / prefer 这类字段。分流一律通过 models.routestask_types 表达。

2. 提示缓存

利用 prompt caching 减少重复输入 token 的计费:

  • 系统提示、工具定义等静态内容会被缓存
  • 通过 cache_read_input_tokens 指标监控缓存命中率
  • 缓存命中的 token 通常以大幅折扣计费

3. 凭证池负载均衡

当配置多个 API Key 时,系统自动进行负载均衡,避免单 Key 限流导致的重试开销。

4. 上下文窗口管理

  • 控制对话历史长度,避免不必要的 token 堆积
  • 使用摘要而非完整历史进行长期对话
  • 合理设置 max_tokens 限制输出长度

预算告警行为

状态 行为
消耗 < 软阈值 正常运行
消耗 >= 软阈值 日志 WARNING,Dashboard 黄色提示
消耗 >= 硬上限 见下方说明

预算耗尽

当日消耗达到 daily_budget_usd 时,系统将阻止新的 LLM 调用。请确保预算设置留有适当余量,或在非关键场景使用 0(不限制)。


完整配置示例

cost:
  enabled: true
  daily_budget_usd: 10.0
  soft_threshold_ratio: 0.75
  pricing_overrides:
    local-llama3-70b:
      input_per_1m: 0
      output_per_1m: 0
    deepseek-chat:
      input_per_1m: 1
      output_per_1m: 2

models:
  default_model: claude-sonnet-4-5
  routes:
    - task_types: [simple]
      provider: openai
      model: gpt-4o-mini