feat: track logical call statistics across governed calls

This commit is contained in:
2026-09-09 10:04:39 -04:00
parent 300ced5dbd
commit 87c261bf73
13 changed files with 650 additions and 10 deletions
+12 -1
View File
@@ -9,6 +9,7 @@
from __future__ import annotations
import asyncio
import dataclasses
import hashlib
import json
import random
@@ -46,6 +47,7 @@ from polygateway.types import (
Effort,
LLMResponse,
TelemetryStatus,
_CallContext,
coerce_effort,
validate_caller_dimensions,
validate_request_overlay,
@@ -289,6 +291,10 @@ class GatewayClient:
self._structured_available = structured_strategy is not None
self._terminal = terminal # 内部引用: 装配自省/测试用
self._handler = compose(middlewares, terminal)
# 逻辑调用统计需要同一只注入钟(1.3.5);现之前只传给中间件未自存
self._now = now
# 终态行由公开边界统一写出(T3),故边界也需持有 emitter
self._emitter = emitter
self._transport = transport
self._telemetry = telemetry
self._cache = cache
@@ -370,6 +376,8 @@ class GatewayClient:
else coerce_effort(reasoning_effort, origin="chat(reasoning_effort=...)")
)
validate_thinking_raw(sampling, effort=effort, wire=None, origin="chat overlay")
# 三项校验均已通过 → 进入统计边界(设计 §3: 输入校验异常在边界之外,保持原行为)
context = _CallContext(now=self._now)
request = ChatRequest(
messages=messages,
session_id=session_id,
@@ -383,8 +391,11 @@ class GatewayClient:
reasoning_effort=effort,
tenant_id=dimension_tenant_id,
meta=dimensions,
call_context=context,
)
return await self._handler(request)
response = await self._handler(request)
# 快照在返回前冻结: 故它含缓存命中路径与已完成的内联遥测耗时
return dataclasses.replace(response, call_stats=context.snapshot())
async def aclose(self) -> None:
"""幂等释放**自建**资源: transport、遥测、缓存、限流/熔断后端。