feat: track logical call statistics across governed calls
This commit is contained in:
@@ -600,3 +600,43 @@ class TestReasonlessTelemetryContract:
|
||||
assert seen == [{"model": "embed-1", "input": ["text"]}]
|
||||
finally:
|
||||
await transport.aclose()
|
||||
|
||||
|
||||
class TestEmbedLogicalCallStats:
|
||||
"""分批共享同一逻辑调用(1.3.5 设计 §3/§3.5)。"""
|
||||
|
||||
async def test_three_batches_count_three_attempts(self):
|
||||
"""分批是库的实现细节,但每批都真打了一次网关,故计 3 次尝试。"""
|
||||
client, _ = _embed_client([_src()], ["ok", "ok", "ok"], batch_size=2)
|
||||
resp = await client.embed(["a", "bb", "ccc", "dddd", "eeeee"])
|
||||
assert resp.call_stats is not None
|
||||
assert resp.call_stats.attempts == 3
|
||||
|
||||
async def test_separate_calls_get_distinct_logical_ids(self):
|
||||
"""一次公开调用一个 ID: 两次 `embed` 不得共用同一个。
|
||||
|
||||
共用就意味着上下文被提升成了 client 实例属性(库铁律禁止的形态)。
|
||||
"""
|
||||
client, _ = _embed_client([_src()], ["ok"] * 5, batch_size=2)
|
||||
first = await client.embed(["a", "bb", "ccc", "dddd", "eeeee"]) # 3 批
|
||||
second = await client.embed(["x", "y"]) # 1 批
|
||||
assert first.call_stats.attempts == 3 and second.call_stats.attempts == 1
|
||||
assert first.call_stats.logical_call_id != second.call_stats.logical_call_id
|
||||
|
||||
async def test_retry_within_a_batch_is_counted(self):
|
||||
client, _ = _embed_client([_src(), _src(name="e2")], [TransientError("t1"), "ok"])
|
||||
resp = await client.embed(["a"])
|
||||
assert resp.call_stats.attempts == 2
|
||||
|
||||
async def test_empty_input_is_zero_attempts_and_writes_no_telemetry_row(self):
|
||||
"""合法零尝试: 返回真实统计,且**不写任何遥测行**(设计 §3 M2)。
|
||||
|
||||
与 cache_hit 不同——不要按"遥测必录"推断空输入也有台账行。
|
||||
"""
|
||||
rec = _MemoryRecorder()
|
||||
client, _ = _embed_client([_src()], [], telemetry=rec)
|
||||
resp = await client.embed([])
|
||||
assert resp.call_stats is not None
|
||||
assert resp.call_stats.attempts == 0
|
||||
assert resp.call_stats.logical_call_id # 真实 ID,不是空串
|
||||
assert rec.rows == [] # 零遥测行
|
||||
|
||||
Reference in New Issue
Block a user