Skip to content

[Bug] OpenAI Responses WebSocket 多轮请求计费幂等键冲突,导致后续 turn 漏计费 #2923

@Memory-9527

Description

@Memory-9527

OpenAI Responses WebSocket 多轮请求计费幂等冲突导致后续 turn 漏计费 0.1.133版本遇到的

问题描述

启用 OpenAI Responses WebSocket 后,服务端日志中大量出现计费失败错误:

openai.websocket_record_usage_failed method=GET path=/responses req=resp_xxx client_req=xxx user=2 acc=4 model=gpt-5.5 error=usage billing request fingerprint conflict

请求本身可以正常返回,但本地 usage billing 失败。

影响

同一个 WebSocket 连接内,第一轮 turn 可能正常计费,但后续 turn 可能因为计费幂等冲突而失败。

这会导致:

  • 后续 turn 没有正常扣费
  • 后续 turn 没有写入 usage log
  • 用户余额、订阅用量、API Key quota、账号 quota 等统计可能不准确
  • 日志中持续出现大量 openai.websocket_record_usage_failed

预期行为

OpenAI Responses WebSocket 下,每个 turn 应该可以独立、稳定地完成计费。

同一个 WebSocket 连接内的多轮请求不应互相产生计费幂等冲突。

实际行为

同一个 WebSocket 连接内的后续 turn 可能触发:

usage billing request fingerprint conflict

触发后,该 turn 的本地计费流程失败,usage log 也可能不会写入。

复现现象

  1. 启用 OpenAI Responses WebSocket
  2. 使用支持多轮 WebSocket 请求的客户端发起对话
  3. 在同一个 WebSocket 连接内连续进行多个 turn
  4. 观察服务端日志

可见大量类似错误:

openai.websocket_record_usage_failed method=GET path=/responses req=resp_xxx client_req=xxx user=xxx acc=xxx model=xxx error=usage billing request fingerprint conflict

建议修复方向

  • WebSocket 多轮请求应按 turn 维度进行计费幂等处理
  • 每个 turn 应拥有独立的计费标识
  • 后续 turn 不应因为复用同一个 WebSocket 连接而与前一轮 turn 发生计费 fingerprint 冲突
  • 修复后应补充多轮 WebSocket 计费测试,确保多个 turn 都能正常扣费并写入 usage log

临时规避

在修复前,可以临时关闭 OpenAI Responses WebSocket,回退到 HTTP/SSE,避免该问题继续影响计费。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions