debug: 添加 streaming 状态更新时 provider 为空的调试日志

- base_handler: 更新 streaming 状态时检测并记录 provider 为空的情况
- cli_handler_base: 修复预读数据为空时未更新 streaming 状态的问题
- usage service: 检测状态变为 streaming 但 provider 仍为 pending 的异常
This commit is contained in:
fawney19
2026-01-04 23:16:01 +08:00
parent a2f33a6c35
commit f46aaa2182
3 changed files with 20 additions and 0 deletions

View File

@@ -423,6 +423,13 @@ class BaseMessageHandler:
provider = ctx.provider_name
target_model = ctx.mapped_model
# 如果 provider 为空,记录警告(不应该发生,但用于调试)
if not provider:
logger.warning(
f"[{target_request_id}] 更新 streaming 状态时 provider 为空: "
f"ctx.provider_name={ctx.provider_name}, ctx.provider_id={ctx.provider_id}"
)
async def _do_update() -> None:
try:
db_gen = get_db()

View File

@@ -834,6 +834,7 @@ class CliMessageHandlerBase(BaseMessageHandler):
last_data_time = time.time()
buffer = b""
first_yield = True # 标记是否是第一次 yield
streaming_status_updated = False # 标记状态是否已更新
# 使用增量解码器处理跨 chunk 的 UTF-8 字符
decoder = codecs.getincrementaldecoder("utf-8")(errors="replace")
@@ -843,6 +844,7 @@ class CliMessageHandlerBase(BaseMessageHandler):
# 在第一次输出数据前更新状态为 streaming
if prefetched_chunks:
self._update_usage_to_streaming_with_ctx(ctx)
streaming_status_updated = True
# 先处理预读的字节块
for chunk in prefetched_chunks:
@@ -907,6 +909,11 @@ class CliMessageHandlerBase(BaseMessageHandler):
# 继续处理剩余的流数据(使用同一个迭代器)
async for chunk in byte_iterator:
# 如果预读数据为空,在收到第一个 chunk 时更新状态
if not streaming_status_updated:
self._update_usage_to_streaming_with_ctx(ctx)
streaming_status_updated = True
buffer += chunk
# 处理缓冲区中的完整行
while b"\n" in buffer:

View File

@@ -1503,6 +1503,12 @@ class UsageService:
usage.error_message = error_message
if provider:
usage.provider = provider
elif status == "streaming" and usage.provider == "pending":
# 状态变为 streaming 但 provider 仍为 pending记录警告
logger.warning(
f"状态更新为 streaming 但 provider 为空: request_id={request_id}, "
f"当前 provider={usage.provider}"
)
if target_model:
usage.target_model = target_model
if first_byte_time_ms is not None: