feat: add a content event and stall accounting to the transport port
T1(计划 §4):观测原语与端口契约(issue #27/#28 底层)。 - Transport.complete 加必填 kw content_event(顺序在 first_token_event 后,无默认值,同款约定):流式每增量 chunk 置位一次,非流式/对冲路 恒不置位,None = 不观测 - TransportResult 增 stall_ms/stall_count(带默认 None):超阈值相邻 增量 chunk 沉默总额与段数,chunk<2/非流式 → None,尾部不计 - SourceConfig 增 stall_threshold_ms(默认 1000,正整数拒 bool, _validate_watchdog 同款落点) - _complete_stream 记增量 chunk 时间戳(空 chunk/usage 帧/keepalive 不产生记录点)+ 模块级纯函数 _stall_from_chunk_times(严格大于 阈值才减);max_inter_token_ms 原语义一字不动 - §2.2 同步清单全量:11 实现 + 11 调用点(重跑 grep 复核零遗漏) - 批次 A 12 用例先红(TypeError/ImportError/AttributeError)后绿, 证据 tests/outputs/138/t1/
This commit is contained in:
@@ -80,7 +80,16 @@ class FakeTransport:
|
||||
self.entered = asyncio.Event()
|
||||
|
||||
async def complete(
|
||||
self, *, messages, source, stream, overlay, call_id, reasoning_effort, first_token_event
|
||||
self,
|
||||
*,
|
||||
messages,
|
||||
source,
|
||||
stream,
|
||||
overlay,
|
||||
call_id,
|
||||
reasoning_effort,
|
||||
first_token_event,
|
||||
content_event,
|
||||
):
|
||||
self.calls.append((source.name, call_id))
|
||||
self.efforts.append(reasoning_effort)
|
||||
@@ -110,7 +119,16 @@ class _GenClockTransport:
|
||||
return self._inner.calls
|
||||
|
||||
async def complete(
|
||||
self, *, messages, source, stream, overlay, call_id, reasoning_effort, first_token_event
|
||||
self,
|
||||
*,
|
||||
messages,
|
||||
source,
|
||||
stream,
|
||||
overlay,
|
||||
call_id,
|
||||
reasoning_effort,
|
||||
first_token_event,
|
||||
content_event,
|
||||
):
|
||||
advance = self._advances.pop(0)
|
||||
result = await self._inner.complete(
|
||||
@@ -121,6 +139,7 @@ class _GenClockTransport:
|
||||
call_id=call_id,
|
||||
reasoning_effort=reasoning_effort,
|
||||
first_token_event=first_token_event,
|
||||
content_event=content_event,
|
||||
)
|
||||
self._clock.advance(advance)
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user