fix(web): address request telemetry review
This commit is contained in:
@@ -1137,16 +1137,17 @@ export function createFixtureApi(options: FixtureOptions = {}): ApiProxy {
|
||||
}
|
||||
append(id, { type: 'user/message', surfaceOp: 'append', data: userMessage(content) })
|
||||
const target = modelTargets.get(id) ?? { provider: 'deepseek', model: 'deepseek-v4-flash' }
|
||||
const usage = tokenUsageOf(logOf(id))
|
||||
emitMux({
|
||||
type: 'session/model-request',
|
||||
sessionId: id,
|
||||
turn,
|
||||
// The fixture's durable transcript is historically zero-based, while
|
||||
// the real Agent's request telemetry opens turns at one.
|
||||
turn: turn + 1,
|
||||
step: 0,
|
||||
provider: target.provider,
|
||||
model: target.model,
|
||||
contextTokens: usage.uncachedInputTokens + usage.outputTokens
|
||||
+ usage.cacheReadTokens + usage.cacheWriteTokens,
|
||||
// No fixture token-meter is composed, so omit the request-pressure
|
||||
// numerator instead of substituting cumulative provider billing.
|
||||
contextWindow: 128_000,
|
||||
})
|
||||
startReply(
|
||||
|
||||
@@ -197,11 +197,10 @@ describe('createFixtureApi', () => {
|
||||
expect(frames).toContainEqual({
|
||||
type: 'session/model-request',
|
||||
sessionId: id,
|
||||
turn: 0,
|
||||
turn: 1,
|
||||
step: 0,
|
||||
provider: 'deepseek',
|
||||
model: 'deepseek-v4-flash',
|
||||
contextTokens: 0,
|
||||
contextWindow: 128_000,
|
||||
})
|
||||
expect(frames.some(frame =>
|
||||
|
||||
@@ -154,11 +154,11 @@ export function apply(ctx: Context): void {
|
||||
workspaces.handleConnected()
|
||||
ctx.emit('connection/reset')
|
||||
},
|
||||
onStateChange: (state) => {
|
||||
onDisconnected: () => {
|
||||
// Generation death fires before any next-generation frame can arrive
|
||||
// (reconnect replays flow from stream open, ahead of onConnected):
|
||||
// the only safe moment to drop generation-scoped interaction state.
|
||||
if (state === 'reconnecting') sessions.handleDisconnected()
|
||||
sessions.handleDisconnected()
|
||||
},
|
||||
})
|
||||
ctx.effect(() => () => { loop.stop() }, 'runtime: connection stream loop')
|
||||
|
||||
@@ -102,7 +102,7 @@ describe('runtime client apply', () => {
|
||||
expect(bench.api.callsOf('session.create')).toHaveLength(1)
|
||||
})
|
||||
|
||||
it('clears connection-local request telemetry on reconnect but not connected', async () => {
|
||||
it('clears connection-local request telemetry after every disconnected generation but not connected', async () => {
|
||||
const bench = await mount()
|
||||
const sessions = bench.ctx.get('sessions') as SessionsService
|
||||
bench.sinks?.onHostEnvelope?.({
|
||||
@@ -118,7 +118,7 @@ describe('runtime client apply', () => {
|
||||
type: 'session/model-request',
|
||||
sessionId: 's-state',
|
||||
turn: 1,
|
||||
step: 1,
|
||||
step: 0,
|
||||
provider: 'test',
|
||||
model: 'alpha',
|
||||
contextTokens: 32_000,
|
||||
@@ -133,7 +133,27 @@ describe('runtime client apply', () => {
|
||||
contextWindow: 128_000,
|
||||
})
|
||||
|
||||
bench.sinks?.onStateChange?.('reconnecting')
|
||||
bench.sinks?.onDisconnected?.()
|
||||
expect(session.getSnapshot().modelRequest).toBeNull()
|
||||
|
||||
// A second failed generation does not produce another deduplicated
|
||||
// `reconnecting` state transition, but its own disconnect callback still
|
||||
// clears telemetry received before that generation's handshake failed.
|
||||
bench.sinks?.onMuxEnvelope?.({
|
||||
rpcId: 'request-2' as never,
|
||||
payload: {
|
||||
type: 'session/model-request',
|
||||
sessionId: 's-state',
|
||||
turn: 2,
|
||||
step: 0,
|
||||
provider: 'test',
|
||||
model: 'beta',
|
||||
contextTokens: 48_000,
|
||||
contextWindow: 256_000,
|
||||
} as never,
|
||||
})
|
||||
expect(session.getSnapshot().modelRequest?.model).toBe('beta')
|
||||
bench.sinks?.onDisconnected?.()
|
||||
expect(session.getSnapshot().modelRequest).toBeNull()
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user