Skip to content

fix: add estimated openai usage stats#366

Open
majorcheng wants to merge 1 commit intochenyme:mainfrom
majorcheng:main
Open

fix: add estimated openai usage stats#366
majorcheng wants to merge 1 commit intochenyme:mainfrom
majorcheng:main

Conversation

@majorcheng
Copy link

Summary

修复当前 Python 主线下 OpenAI 兼容接口的 usage 统计问题。

在本次修改前:

  • 非流式 /v1/chat/completions 返回的 usage 基本是写死为 0
  • 流式 /v1/chat/completions 的最终 chunk 不带 usage
  • /v1/responses 没有把 chat usage 正确映射到最终的 response.completed

这会导致像 CLIProxyAPI 这类上游客户端虽然能正常拿到响应,但看到的
prompt_tokenscompletion_tokensinput_tokensoutput_tokens
始终是 0。

本 PR 采用最小侵入方式修复该问题:

  • 为当前 Python 主线新增轻量 usage 估算与 chat/responses 映射逻辑
  • 让非流式 chat 返回非 0 usage
  • 让流式 chat 在最终 finish chunk 中返回 usage
  • /v1/responses 非流式与流式完成事件都能透传 usage

说明:
这里返回的是 本地估算的 usage,用于 OpenAI 兼容客户端展示与统计,
不是上游 Grok 官方精确 billing 口径

Changes

  • Bug 修复
  • 功能新增
  • 重构/清理
  • 文档更新
  • 其他(请说明)

具体改动:

  • 新增 app/services/grok/utils/usage.py

    • 提供轻量 token 估算
    • 提供 chat usage -> responses usage 的字段映射
  • 修改 app/services/grok/services/chat.py

    • chat_openai() 中先估算 prompt_tokens
    • 非流式 CollectProcessor 不再返回写死 0 的 usage
    • 流式 StreamProcessor 在最终 finish chunk 中附带 usage
    • 流式过程中累计文本/tool_calls 以生成 completion usage
  • 修改 app/services/grok/services/responses.py

    • 非流式 /v1/responses 使用映射后的 usage
    • 流式 /v1/responses 从 chat completion 最终 chunk 中提取 usage
    • response.completed 中返回 input_tokens / output_tokens
  • 新增回归测试 tests/test_openai_usage.py

    • 覆盖非流式 chat usage
    • 覆盖流式 chat 最终 chunk usage
    • 覆盖 responses completed event usage 透传

Related Issues

N/A

Verification

  • 本地运行验证
  • 单元/集成测试
  • Docker 构建通过
  • 未验证(请说明原因)

验证说明:

- UV_CACHE_DIR=/tmp/.uv-cache timeout 60s uv run --with pytest python -m pytest -q tests/test_openai_usage.py
- timeout 60s uv run ruff check app/services/grok/utils/usage.py app/services/grok/services/chat.py app/services/grok/services/responses.py tests/test_openai_usage.py

结果:
- pytest: 3 passed
- ruff: All checks passed

## Breaking Changes

- [x] 无
- [ ] 有(请说明迁移方式)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant