@aexol/spectral 0.9.223 → 0.9.225
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +5 -4
- package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openai-completions.js +44 -2
- package/dist/sdk/ai/types.d.ts +10 -0
- package/dist/sdk/ai/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/agent-session.d.ts +1 -1
- package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/agent-session.js +5 -1
- package/dist/sdk/coding-agent/core/model-registry.d.ts +8 -0
- package/dist/sdk/coding-agent/core/model-registry.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/model-registry.js +2 -0
- package/dist/sdk/coding-agent/core/settings-manager.d.ts +7 -0
- package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/settings-manager.js +9 -2
- package/dist/sdk/coding-agent/index.d.ts +1 -1
- package/dist/sdk/coding-agent/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/index.js +1 -1
- package/dist/server/agent-bridge/tps-metrics.d.ts +38 -0
- package/dist/server/agent-bridge/tps-metrics.d.ts.map +1 -0
- package/dist/server/agent-bridge/tps-metrics.js +50 -0
- package/dist/server/agent-bridge.d.ts +29 -0
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +134 -19
- package/dist/server/session-stream/turn-events.d.ts +15 -0
- package/dist/server/session-stream/turn-events.d.ts.map +1 -1
- package/dist/server/session-stream/turn-events.js +31 -0
- package/dist/server/session-stream.d.ts +1 -1
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +39 -2
- package/dist/server/storage/rows.d.ts +4 -0
- package/dist/server/storage/rows.d.ts.map +1 -1
- package/dist/server/storage/schema.d.ts +1 -1
- package/dist/server/storage/schema.d.ts.map +1 -1
- package/dist/server/storage/schema.js +4 -0
- package/dist/server/storage/types.d.ts +8 -0
- package/dist/server/storage/types.d.ts.map +1 -1
- package/dist/server/storage.d.ts +15 -0
- package/dist/server/storage.d.ts.map +1 -1
- package/dist/server/storage.js +66 -18
- package/dist/server/wire.d.ts +39 -0
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-LLM-round timing metrics (duration / TPS / TTFT) for the agent bridge.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions — no bridge state — so the math is unit-testable in
|
|
5
|
+
* isolation. The bridge stamps wall-clock `Date.now()` values while
|
|
6
|
+
* translating spectral events to wire frames (spectral's
|
|
7
|
+
* `AssistantMessageEvent` carries no timing) and feeds them through
|
|
8
|
+
* {@link computeTpsMetrics} when `token_usage` is emitted.
|
|
9
|
+
*
|
|
10
|
+
* Semantics (shared contract with the landing frontend):
|
|
11
|
+
* - `durationMs` = tEnd(message_end) − tFirstDelta — the generation
|
|
12
|
+
* window only, excludes time-to-first-token.
|
|
13
|
+
* - `ttftMs` = tFirstDelta − tStart(message_start).
|
|
14
|
+
* - `tokensPerSecond` = round(outputTokens / (durationMs / 1000), 1).
|
|
15
|
+
*
|
|
16
|
+
* Any metric that cannot be computed from sound inputs is `null` —
|
|
17
|
+
* consumers must treat these fields as optional/unreliable indicators.
|
|
18
|
+
*/
|
|
19
|
+
function isUsableStamp(value) {
|
|
20
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compute per-round timing metrics from wall-clock stamps and output token
|
|
24
|
+
* count. Null-safe: missing stamps, negative windows (clock skew) and
|
|
25
|
+
* non-positive token counts or durations yield `null` for the affected
|
|
26
|
+
* fields rather than fabricated numbers.
|
|
27
|
+
*/
|
|
28
|
+
export function computeTpsMetrics(startAt, firstDeltaAt, endAt, outputTokens) {
|
|
29
|
+
// TTFT: message_start → first streamed delta. A negative window means
|
|
30
|
+
// clock nonsense — null it. Zero is legitimate (instant first delta).
|
|
31
|
+
const ttftMs = isUsableStamp(startAt) &&
|
|
32
|
+
isUsableStamp(firstDeltaAt) &&
|
|
33
|
+
firstDeltaAt >= startAt
|
|
34
|
+
? firstDeltaAt - startAt
|
|
35
|
+
: null;
|
|
36
|
+
// Generation window: first streamed delta → message_end. Non-positive
|
|
37
|
+
// durations can't back a tokens/sec figure; negative ones are clock skew.
|
|
38
|
+
// Zero is representable (single flush at message_end) but yields null TPS.
|
|
39
|
+
const durationMs = isUsableStamp(firstDeltaAt) && isUsableStamp(endAt) && endAt >= firstDeltaAt
|
|
40
|
+
? endAt - firstDeltaAt
|
|
41
|
+
: null;
|
|
42
|
+
const tokensPerSecond = durationMs != null &&
|
|
43
|
+
durationMs > 0 &&
|
|
44
|
+
typeof outputTokens === "number" &&
|
|
45
|
+
Number.isFinite(outputTokens) &&
|
|
46
|
+
outputTokens > 0
|
|
47
|
+
? Math.round((outputTokens / (durationMs / 1000)) * 10) / 10
|
|
48
|
+
: null;
|
|
49
|
+
return { durationMs, tokensPerSecond, ttftMs };
|
|
50
|
+
}
|
|
@@ -207,6 +207,15 @@ export declare class AgentBridge {
|
|
|
207
207
|
private activeCreditRates;
|
|
208
208
|
private memoryPhase;
|
|
209
209
|
private promptMutationPhase;
|
|
210
|
+
/**
|
|
211
|
+
* Wall-clock ms of the most recent `auto_retry_start` / `auto_retry_end`
|
|
212
|
+
* seen by the bridge. spectral's retry backoff/attempt cycles emit no
|
|
213
|
+
* meaningful progress events, so without this record the inactivity
|
|
214
|
+
* watchdog would abort a session that is merely waiting out a retry.
|
|
215
|
+
* Consumed by `isSessionAutoRetrying()` alongside spectral's own
|
|
216
|
+
* `session.isRetrying` flag.
|
|
217
|
+
*/
|
|
218
|
+
private lastAutoRetryActivity;
|
|
210
219
|
/**
|
|
211
220
|
* Studio project id resolved from `.aexol/aexol.jsonc` in the session cwd.
|
|
212
221
|
* Sent as the `X-Project-Id` header on every proxied LLM call so the
|
|
@@ -453,6 +462,26 @@ export declare class AgentBridge {
|
|
|
453
462
|
private bumpPromptActivity;
|
|
454
463
|
/** Arm a fresh inactivity watchdog timeout (used by bump/resume paths). */
|
|
455
464
|
private schedulePromptActivityTimeout;
|
|
465
|
+
/**
|
|
466
|
+
* Whether the session is currently inside spectral's auto-retry machinery.
|
|
467
|
+
* Two signals, checked in order:
|
|
468
|
+
* 1. spectral's `isRetrying` flag — true only during the backoff sleep
|
|
469
|
+
* window, not across the whole backoff/retry cycle;
|
|
470
|
+
* 2. a recent `auto_retry_start`/`auto_retry_end` bridge sighting —
|
|
471
|
+
* `lastAutoRetryActivity` covers the gaps between attempts where the
|
|
472
|
+
* flag has flipped false (belt-and-braces for the windows between one
|
|
473
|
+
* retry cycle ending and the next attempt emitting its first event).
|
|
474
|
+
*/
|
|
475
|
+
private isSessionAutoRetrying;
|
|
476
|
+
/**
|
|
477
|
+
* Fire the inactivity watchdog. A session mid auto-retry is NOT stuck —
|
|
478
|
+
* spectral is deliberately sleeping between provider attempts, which emits
|
|
479
|
+
* no meaningful progress events. Never abort a retrying session for
|
|
480
|
+
* inactivity: re-arm a fresh window instead of rejecting the prompt. The
|
|
481
|
+
* watchdog stays fully armed for non-retrying silence, and
|
|
482
|
+
* `clearPromptTimers()` still runs at turn end, so this pause cannot leak.
|
|
483
|
+
*/
|
|
484
|
+
private firePromptInactivityTimeout;
|
|
456
485
|
/**
|
|
457
486
|
* Pause the parent inactivity watchdog while a subagent tool is running.
|
|
458
487
|
* Idempotent per active subagent: the watchdog stays cleared until the last
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAaH,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AAatC,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAatC,OAAO,EACL,kBAAkB,IAAI,yBAAyB,EAEhD,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,6 +70,7 @@ import { humanizeProviderError } from "./error-humanizer.js";
|
|
|
70
70
|
import { readStudioBinding, getBindingFilePath } from "../studio-binding.js";
|
|
71
71
|
// Facade imports: cohesive helpers extracted verbatim to `./agent-bridge/` modules.
|
|
72
72
|
import { calculateCredits, getModelCost, resolveCreditRatesForModel, } from "./agent-bridge/pricing.js";
|
|
73
|
+
import { computeTpsMetrics } from "./agent-bridge/tps-metrics.js";
|
|
73
74
|
import { SPECTRAL_PROXY_OPENAI, SPECTRAL_PROXY_USER_MODEL, inferSyntheticContextWindow, inferSyntheticOpenAICompat, inferSyntheticThinkingLevelMap, } from "./agent-bridge/synthetic-model.js";
|
|
74
75
|
import { parseWireToolEvents, sanitizeRehydratedBlock, toRestoredMemorySnapshot, } from "./agent-bridge/rehydrate.js";
|
|
75
76
|
import { createHeadlessUIContext } from "./agent-bridge/headless-ui.js";
|
|
@@ -255,6 +256,15 @@ export class AgentBridge {
|
|
|
255
256
|
activeCreditRates = null;
|
|
256
257
|
memoryPhase = "idle";
|
|
257
258
|
promptMutationPhase = "idle";
|
|
259
|
+
/**
|
|
260
|
+
* Wall-clock ms of the most recent `auto_retry_start` / `auto_retry_end`
|
|
261
|
+
* seen by the bridge. spectral's retry backoff/attempt cycles emit no
|
|
262
|
+
* meaningful progress events, so without this record the inactivity
|
|
263
|
+
* watchdog would abort a session that is merely waiting out a retry.
|
|
264
|
+
* Consumed by `isSessionAutoRetrying()` alongside spectral's own
|
|
265
|
+
* `session.isRetrying` flag.
|
|
266
|
+
*/
|
|
267
|
+
lastAutoRetryActivity = 0;
|
|
258
268
|
/**
|
|
259
269
|
* Studio project id resolved from `.aexol/aexol.jsonc` in the session cwd.
|
|
260
270
|
* Sent as the `X-Project-Id` header on every proxied LLM call so the
|
|
@@ -790,6 +800,10 @@ export class AgentBridge {
|
|
|
790
800
|
authHeader: true,
|
|
791
801
|
headers: providerHeaders,
|
|
792
802
|
api: "openai-completions",
|
|
803
|
+
// Backend-proxied traffic must never reuse pooled keep-alive sockets:
|
|
804
|
+
// a wedged connection would survive the agent-loop + OpenAI-SDK
|
|
805
|
+
// retries, hanging every retry for the full headersTimeout.
|
|
806
|
+
noKeepAlive: true,
|
|
793
807
|
models: openaiCompatModels.map((m) => {
|
|
794
808
|
return {
|
|
795
809
|
id: m.modelId,
|
|
@@ -824,6 +838,9 @@ export class AgentBridge {
|
|
|
824
838
|
authHeader: true,
|
|
825
839
|
headers: providerHeaders,
|
|
826
840
|
api: "openai-completions",
|
|
841
|
+
// Same as SPECTRAL_PROXY_OPENAI: never reuse pooled sockets for
|
|
842
|
+
// backend-proxied traffic (see the comment above).
|
|
843
|
+
noKeepAlive: true,
|
|
827
844
|
models: userModelEntries.map((m) => {
|
|
828
845
|
return {
|
|
829
846
|
id: m.modelId,
|
|
@@ -1141,9 +1158,7 @@ export class AgentBridge {
|
|
|
1141
1158
|
// tool calls. Triggers on total silence, NOT on long active prompts.
|
|
1142
1159
|
const inactivityPromise = new Promise((_, reject) => {
|
|
1143
1160
|
this.promptReject = reject;
|
|
1144
|
-
this.promptActivityTimer = setTimeout(() =>
|
|
1145
|
-
reject(new Error(`Agent prompt inactive for ${PROMPT_INACTIVITY_TIMEOUT_MS / 1000}s`));
|
|
1146
|
-
}, PROMPT_INACTIVITY_TIMEOUT_MS);
|
|
1161
|
+
this.promptActivityTimer = setTimeout(() => this.firePromptInactivityTimeout(), PROMPT_INACTIVITY_TIMEOUT_MS);
|
|
1147
1162
|
});
|
|
1148
1163
|
try {
|
|
1149
1164
|
await Promise.race([prompt, inactivityPromise]);
|
|
@@ -1178,9 +1193,12 @@ export class AgentBridge {
|
|
|
1178
1193
|
case "tool_execution_end":
|
|
1179
1194
|
return true;
|
|
1180
1195
|
default:
|
|
1181
|
-
// compaction_*, prompt_mutation_status,
|
|
1182
|
-
//
|
|
1183
|
-
//
|
|
1196
|
+
// compaction_*, prompt_mutation_status, queue_update,
|
|
1197
|
+
// length_continuation, session_info_changed, thinking_level_changed —
|
|
1198
|
+
// churn / non-progress, do NOT reset watchdog. (auto_retry_start/end
|
|
1199
|
+
// also land here, but their handleEvent cases explicitly record
|
|
1200
|
+
// `lastAutoRetryActivity` and bump the watchdog: a retry cycle is
|
|
1201
|
+
// real agent activity, just not message/tool progress.)
|
|
1184
1202
|
return false;
|
|
1185
1203
|
}
|
|
1186
1204
|
}
|
|
@@ -1198,9 +1216,38 @@ export class AgentBridge {
|
|
|
1198
1216
|
}
|
|
1199
1217
|
/** Arm a fresh inactivity watchdog timeout (used by bump/resume paths). */
|
|
1200
1218
|
schedulePromptActivityTimeout() {
|
|
1201
|
-
return setTimeout(() =>
|
|
1202
|
-
|
|
1203
|
-
|
|
1219
|
+
return setTimeout(() => this.firePromptInactivityTimeout(), PROMPT_INACTIVITY_TIMEOUT_MS);
|
|
1220
|
+
}
|
|
1221
|
+
/**
|
|
1222
|
+
* Whether the session is currently inside spectral's auto-retry machinery.
|
|
1223
|
+
* Two signals, checked in order:
|
|
1224
|
+
* 1. spectral's `isRetrying` flag — true only during the backoff sleep
|
|
1225
|
+
* window, not across the whole backoff/retry cycle;
|
|
1226
|
+
* 2. a recent `auto_retry_start`/`auto_retry_end` bridge sighting —
|
|
1227
|
+
* `lastAutoRetryActivity` covers the gaps between attempts where the
|
|
1228
|
+
* flag has flipped false (belt-and-braces for the windows between one
|
|
1229
|
+
* retry cycle ending and the next attempt emitting its first event).
|
|
1230
|
+
*/
|
|
1231
|
+
isSessionAutoRetrying() {
|
|
1232
|
+
if (this.session?.isRetrying === true)
|
|
1233
|
+
return true;
|
|
1234
|
+
return (this.lastAutoRetryActivity > 0 &&
|
|
1235
|
+
Date.now() - this.lastAutoRetryActivity < PROMPT_INACTIVITY_TIMEOUT_MS);
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* Fire the inactivity watchdog. A session mid auto-retry is NOT stuck —
|
|
1239
|
+
* spectral is deliberately sleeping between provider attempts, which emits
|
|
1240
|
+
* no meaningful progress events. Never abort a retrying session for
|
|
1241
|
+
* inactivity: re-arm a fresh window instead of rejecting the prompt. The
|
|
1242
|
+
* watchdog stays fully armed for non-retrying silence, and
|
|
1243
|
+
* `clearPromptTimers()` still runs at turn end, so this pause cannot leak.
|
|
1244
|
+
*/
|
|
1245
|
+
firePromptInactivityTimeout() {
|
|
1246
|
+
if (this.isSessionAutoRetrying()) {
|
|
1247
|
+
this.promptActivityTimer = this.schedulePromptActivityTimeout();
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1250
|
+
this.promptReject?.(new Error(`Agent prompt inactive for ${PROMPT_INACTIVITY_TIMEOUT_MS / 1000}s`));
|
|
1204
1251
|
}
|
|
1205
1252
|
/**
|
|
1206
1253
|
* Pause the parent inactivity watchdog while a subagent tool is running.
|
|
@@ -1429,7 +1476,7 @@ export class AgentBridge {
|
|
|
1429
1476
|
if (!this.pending || this.pending.finalized)
|
|
1430
1477
|
return;
|
|
1431
1478
|
this.pending.finalized = true;
|
|
1432
|
-
const { messageId, text, wireEvents, content, nativeResponseId } = this.pending;
|
|
1479
|
+
const { messageId, text, wireEvents, content, nativeResponseId, stopReason, } = this.pending;
|
|
1433
1480
|
// Skip persistence for pure-framing intermediate "messages". Pi
|
|
1434
1481
|
// emits a `message_end` for each internal step (e.g. between two
|
|
1435
1482
|
// tool-calling rounds) and many of those carry no visible content
|
|
@@ -1449,7 +1496,14 @@ export class AgentBridge {
|
|
|
1449
1496
|
e.type === "thinking_end" ||
|
|
1450
1497
|
e.type === "tool_call" ||
|
|
1451
1498
|
e.type === "tool_result");
|
|
1452
|
-
|
|
1499
|
+
// A terminal failed turn (stopReason "error") must NEVER be dropped: the
|
|
1500
|
+
// user has to see that the turn failed. When the provider died before
|
|
1501
|
+
// streaming text, the message_end handler has already rewritten
|
|
1502
|
+
// `content` to the humanized error; if even that is empty we still
|
|
1503
|
+
// persist the row — its JSONL carries message_end with
|
|
1504
|
+
// stopReason:"error", which the client renders as a failed turn.
|
|
1505
|
+
const isTerminalError = stopReason === "error";
|
|
1506
|
+
if (!finalContent && !hasMeaningfulEvent && !isTerminalError) {
|
|
1453
1507
|
console.debug("[agent-bridge] skipping empty intermediate message");
|
|
1454
1508
|
try {
|
|
1455
1509
|
this.opts.onAssistantMessageSkipped?.(messageId);
|
|
@@ -1514,7 +1568,12 @@ export class AgentBridge {
|
|
|
1514
1568
|
messageId,
|
|
1515
1569
|
role: "assistant",
|
|
1516
1570
|
};
|
|
1517
|
-
this.pending = {
|
|
1571
|
+
this.pending = {
|
|
1572
|
+
messageId,
|
|
1573
|
+
text: "",
|
|
1574
|
+
wireEvents: [wireEvent],
|
|
1575
|
+
startedAt: Date.now(),
|
|
1576
|
+
};
|
|
1518
1577
|
this.opts.emit(wireEvent);
|
|
1519
1578
|
return;
|
|
1520
1579
|
}
|
|
@@ -1523,6 +1582,11 @@ export class AgentBridge {
|
|
|
1523
1582
|
return;
|
|
1524
1583
|
const inner = ev.assistantMessageEvent;
|
|
1525
1584
|
if (inner.type === "text_delta") {
|
|
1585
|
+
// Stamp the first streamed delta (text OR thinking) — it ends the
|
|
1586
|
+
// TTFT window and starts the generation window used by TPS.
|
|
1587
|
+
if (this.pending.firstDeltaAt === undefined) {
|
|
1588
|
+
this.pending.firstDeltaAt = Date.now();
|
|
1589
|
+
}
|
|
1526
1590
|
this.pending.text += inner.delta;
|
|
1527
1591
|
this.emitAndBuffer({
|
|
1528
1592
|
type: "text_delta",
|
|
@@ -1538,6 +1602,9 @@ export class AgentBridge {
|
|
|
1538
1602
|
});
|
|
1539
1603
|
}
|
|
1540
1604
|
else if (inner.type === "thinking_delta") {
|
|
1605
|
+
if (this.pending.firstDeltaAt === undefined) {
|
|
1606
|
+
this.pending.firstDeltaAt = Date.now();
|
|
1607
|
+
}
|
|
1541
1608
|
this.emitAndBuffer({
|
|
1542
1609
|
type: "thinking_delta",
|
|
1543
1610
|
messageId: this.pending.messageId,
|
|
@@ -1802,6 +1869,9 @@ export class AgentBridge {
|
|
|
1802
1869
|
case "message_end": {
|
|
1803
1870
|
if (ev.message.role !== "assistant" || !this.pending)
|
|
1804
1871
|
return;
|
|
1872
|
+
// Wall-clock stamp for per-round timing metrics (TPS/TTFT). Taken at
|
|
1873
|
+
// handler entry so the usage event below measures the whole stream.
|
|
1874
|
+
const endedAt = Date.now();
|
|
1805
1875
|
const { messageId, text } = this.pending;
|
|
1806
1876
|
if (ev.message.api === "openai-responses" &&
|
|
1807
1877
|
typeof ev.message.responseId === "string" &&
|
|
@@ -1823,17 +1893,20 @@ export class AgentBridge {
|
|
|
1823
1893
|
// Raw upstream provider errors (e.g. 429 JSON blobs with internal
|
|
1824
1894
|
// ids) must not reach the UI verbatim — same policy as the `error`
|
|
1825
1895
|
// ServerEvent path. The humanizer keeps a short, sanitized cause.
|
|
1896
|
+
// Humanized once here and shared by the wire event and the persisted
|
|
1897
|
+
// content fallback below, so the error text can never appear twice.
|
|
1898
|
+
const humanizedError = stopReason === "error" &&
|
|
1899
|
+
typeof errorMessage === "string" &&
|
|
1900
|
+
errorMessage.length > 0
|
|
1901
|
+
? humanizeProviderError(errorMessage)
|
|
1902
|
+
: undefined;
|
|
1826
1903
|
const endEvent = stopReason
|
|
1827
1904
|
? {
|
|
1828
1905
|
type: "message_end",
|
|
1829
1906
|
messageId,
|
|
1830
1907
|
stopReason,
|
|
1831
1908
|
...(stopReason === "length" ? { truncated: true } : {}),
|
|
1832
|
-
...(
|
|
1833
|
-
typeof errorMessage === "string" &&
|
|
1834
|
-
errorMessage.length > 0
|
|
1835
|
-
? { errorMessage: humanizeProviderError(errorMessage) }
|
|
1836
|
-
: {}),
|
|
1909
|
+
...(humanizedError ? { errorMessage: humanizedError } : {}),
|
|
1837
1910
|
}
|
|
1838
1911
|
: { type: "message_end", messageId };
|
|
1839
1912
|
this.pending.wireEvents.push(endEvent);
|
|
@@ -1855,6 +1928,10 @@ export class AgentBridge {
|
|
|
1855
1928
|
(usage?.cacheRead ?? 0) +
|
|
1856
1929
|
(usage?.cacheWrite ?? 0);
|
|
1857
1930
|
if (usage && totalTokens > 0) {
|
|
1931
|
+
// Per-round timing: TTFT (message_start → first delta) and the
|
|
1932
|
+
// generation window (first delta → now). Null-safe — providers
|
|
1933
|
+
// that skip deltas or zero-usage rounds yield null fields.
|
|
1934
|
+
const tpsMetrics = computeTpsMetrics(this.pending.startedAt, this.pending.firstDeltaAt, endedAt, usage.output ?? 0);
|
|
1858
1935
|
// Resolve current context window usage from spectral's built-in
|
|
1859
1936
|
// `getContextUsage()`, which handles post-compaction ambiguity
|
|
1860
1937
|
// and estimates total tokens from the full session tree.
|
|
@@ -1873,6 +1950,9 @@ export class AgentBridge {
|
|
|
1873
1950
|
},
|
|
1874
1951
|
contextWindowUsed: ctxUsage?.tokens ?? null,
|
|
1875
1952
|
contextWindowMax: ctxUsage?.contextWindow ?? null,
|
|
1953
|
+
durationMs: tpsMetrics.durationMs,
|
|
1954
|
+
tokensPerSecond: tpsMetrics.tokensPerSecond,
|
|
1955
|
+
ttftMs: tpsMetrics.ttftMs,
|
|
1876
1956
|
};
|
|
1877
1957
|
this.pending.wireEvents.push(usageEvent);
|
|
1878
1958
|
this.opts.emit(usageEvent);
|
|
@@ -1882,7 +1962,16 @@ export class AgentBridge {
|
|
|
1882
1962
|
// BETWEEN messages) are buffered into `pending.wireEvents`. We store
|
|
1883
1963
|
// the final content and persist later — when the next `message_start`
|
|
1884
1964
|
// signals a new step, or when `agent_end` closes the turn.
|
|
1885
|
-
|
|
1965
|
+
// Remember the terminal stop reason: finalizePendingMessage persists
|
|
1966
|
+
// failed turns even when they are otherwise empty.
|
|
1967
|
+
this.pending.stopReason = stopReason;
|
|
1968
|
+
// Terminal failed turns must persist visibly: when the provider died
|
|
1969
|
+
// before streaming any text, surface the humanized error as the
|
|
1970
|
+
// message content. When text WAS streamed, keep it as the content —
|
|
1971
|
+
// the humanized detail already rides on the message_end event, so
|
|
1972
|
+
// the error text is never duplicated.
|
|
1973
|
+
this.pending.content =
|
|
1974
|
+
content || (stopReason === "error" ? humanizedError : undefined);
|
|
1886
1975
|
return;
|
|
1887
1976
|
}
|
|
1888
1977
|
case "agent_end": {
|
|
@@ -1954,9 +2043,35 @@ export class AgentBridge {
|
|
|
1954
2043
|
return;
|
|
1955
2044
|
}
|
|
1956
2045
|
case "auto_retry_start": {
|
|
2046
|
+
// A retry cycle is real agent activity (backoff sleep + next provider
|
|
2047
|
+
// attempt) even though it emits no message/tool progress: record it
|
|
2048
|
+
// and re-arm the inactivity watchdog so a long backoff cannot be
|
|
2049
|
+
// mistaken for a hang (see firePromptInactivityTimeout).
|
|
2050
|
+
this.lastAutoRetryActivity = Date.now();
|
|
2051
|
+
this.bumpPromptActivity();
|
|
1957
2052
|
this.opts.emit({ type: "turn_continue", reason: "retry" });
|
|
1958
2053
|
return;
|
|
1959
2054
|
}
|
|
2055
|
+
case "auto_retry_end": {
|
|
2056
|
+
this.lastAutoRetryActivity = Date.now();
|
|
2057
|
+
this.bumpPromptActivity();
|
|
2058
|
+
// Give-up signal: spectral exhausted all retry attempts. This
|
|
2059
|
+
// previously fell into the default case and was intentionally not on
|
|
2060
|
+
// the wire, so a finally-failed turn surfaced nothing in the UI or
|
|
2061
|
+
// logs. Emit the additive `retry_failed` event on give-up only —
|
|
2062
|
+
// successful retry ends are followed by the next attempt's own
|
|
2063
|
+
// message events, so they stay off the wire.
|
|
2064
|
+
if (ev.success === false) {
|
|
2065
|
+
this.opts.emit({
|
|
2066
|
+
type: "retry_failed",
|
|
2067
|
+
...(typeof ev.attempt === "number" ? { attempt: ev.attempt } : {}),
|
|
2068
|
+
...(typeof ev.finalError === "string" && ev.finalError.length > 0
|
|
2069
|
+
? { finalError: humanizeProviderError(ev.finalError) }
|
|
2070
|
+
: {}),
|
|
2071
|
+
});
|
|
2072
|
+
}
|
|
2073
|
+
return;
|
|
2074
|
+
}
|
|
1960
2075
|
case "length_continuation": {
|
|
1961
2076
|
if (ev.status === "queued") {
|
|
1962
2077
|
this.opts.emit({
|
|
@@ -1989,7 +2104,7 @@ export class AgentBridge {
|
|
|
1989
2104
|
}
|
|
1990
2105
|
default:
|
|
1991
2106
|
// Other spectral-internal events (turn_start, queue_update,
|
|
1992
|
-
//
|
|
2107
|
+
// tool_execution_update) are intentionally not on
|
|
1993
2108
|
// the wire surface for MVP and are NOT persisted — the wire format
|
|
1994
2109
|
// is the source of truth for replay.
|
|
1995
2110
|
return;
|
|
@@ -12,6 +12,21 @@ import type { InProgressTurnSnapshot, ReplayableTurnEvent, ServerEvent } from ".
|
|
|
12
12
|
* column exists to bridge). Best-effort: malformed lines are skipped.
|
|
13
13
|
*/
|
|
14
14
|
export declare function extractCreditsFromEventsJsonl(eventsJsonl: string): number | null;
|
|
15
|
+
/** Per-round timing metrics extractable from a `token_usage` wire event. */
|
|
16
|
+
export interface PersistedMessageMetrics {
|
|
17
|
+
outputTokens: number | null;
|
|
18
|
+
durationMs: number | null;
|
|
19
|
+
tokensPerSecond: number | null;
|
|
20
|
+
ttftMs: number | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract the per-round timing metrics (`durationMs` / `tokensPerSecond` /
|
|
24
|
+
* `ttftMs` plus the authoritative `usage.outputTokens`) from a `token_usage`
|
|
25
|
+
* event embedded in an events JSONL string. Returns `null` if no
|
|
26
|
+
* `token_usage` event is present at persist time. Best-effort: malformed
|
|
27
|
+
* lines are skipped.
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractMessageMetricsFromEventsJsonl(eventsJsonl: string): PersistedMessageMetrics | null;
|
|
15
30
|
export type BufferedTurnEvent = Exclude<ReplayableTurnEvent, {
|
|
16
31
|
type: "subagent_progress";
|
|
17
32
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-events.d.ts","sourceRoot":"","sources":["../../../src/server/session-stream/turn-events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBhF;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACrC,mBAAmB,EACnB;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAC9B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;yEACqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,iBAAiB,CAoB3E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAM5E;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,sBAAsB,UAAQ,GAC7B,sBAAsB,CAWxB"}
|
|
1
|
+
{"version":3,"file":"turn-events.d.ts","sourceRoot":"","sources":["../../../src/server/session-stream/turn-events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBhF;AAED,4EAA4E;AAC5E,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,MAAM,GAClB,uBAAuB,GAAG,IAAI,CAoBhC;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACrC,mBAAmB,EACnB;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAC9B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;yEACqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,iBAAiB,CAoB3E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAM5E;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,sBAAsB,UAAQ,GAC7B,sBAAsB,CAWxB"}
|
|
@@ -24,6 +24,37 @@ export function extractCreditsFromEventsJsonl(eventsJsonl) {
|
|
|
24
24
|
}
|
|
25
25
|
return creditsUsed;
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Extract the per-round timing metrics (`durationMs` / `tokensPerSecond` /
|
|
29
|
+
* `ttftMs` plus the authoritative `usage.outputTokens`) from a `token_usage`
|
|
30
|
+
* event embedded in an events JSONL string. Returns `null` if no
|
|
31
|
+
* `token_usage` event is present at persist time. Best-effort: malformed
|
|
32
|
+
* lines are skipped.
|
|
33
|
+
*/
|
|
34
|
+
export function extractMessageMetricsFromEventsJsonl(eventsJsonl) {
|
|
35
|
+
if (!eventsJsonl)
|
|
36
|
+
return null;
|
|
37
|
+
let metrics = null;
|
|
38
|
+
for (const line of eventsJsonl.split("\n")) {
|
|
39
|
+
if (!line.includes("token_usage"))
|
|
40
|
+
continue;
|
|
41
|
+
try {
|
|
42
|
+
const ev = JSON.parse(line);
|
|
43
|
+
if (ev.type === "token_usage") {
|
|
44
|
+
metrics = {
|
|
45
|
+
outputTokens: ev.usage.outputTokens,
|
|
46
|
+
durationMs: ev.durationMs ?? null,
|
|
47
|
+
tokensPerSecond: ev.tokensPerSecond ?? null,
|
|
48
|
+
ttftMs: ev.ttftMs ?? null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Skip malformed lines — best-effort extraction.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return metrics;
|
|
57
|
+
}
|
|
27
58
|
export function isReplayable(event) {
|
|
28
59
|
return (event.type === "message_start" ||
|
|
29
60
|
event.type === "text_delta" ||
|
|
@@ -47,7 +47,7 @@ export { formatCompactionTokenStats, isSkippedCompactionResult, } from "./sessio
|
|
|
47
47
|
export { branchMessageRole, branchMessageSignature, branchMessageTimestampMs, contentAsPersistedText, getCompactionEndPruneSkipReason, getKeptBranchMessageSignatures, isRecord, matchKeptPersistedMessageIds, prunePersistedHistoryAfterCompaction, selectUniqueCandidate, } from "./session-stream/history-prune.js";
|
|
48
48
|
export { applyDcpLiteRuntimeStatus, buildDcpLiteThresholds, contextPercent, dcpLiteEventFromServerEvent, defaultMemoryStatus, loadCompactionPolicy, persistObservationalMemorySnapshot, type SessionMemoryStatus, } from "./session-stream/memory.js";
|
|
49
49
|
export { estimateStoredMessageReplayTokens, selectHistoryForBridge, } from "./session-stream/replay-tail.js";
|
|
50
|
-
export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
|
|
50
|
+
export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, extractMessageMetricsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
|
|
51
51
|
export { resolveTurnSilenceMaxRearm, resolveTurnSilenceTimeoutMs, } from "./session-stream/turn-silence.js";
|
|
52
52
|
/**
|
|
53
53
|
* Anything we can `send` and `close` on. The `ws` library's WebSocket fits;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../src/server/session-stream.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../src/server/session-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,13 +57,13 @@ import { formatCompactionTokenStats, isSkippedCompactionResult, } from "./sessio
|
|
|
57
57
|
import { getCompactionEndPruneSkipReason, prunePersistedHistoryAfterCompaction, } from "./session-stream/history-prune.js";
|
|
58
58
|
import { applyDcpLiteRuntimeStatus, dcpLiteEventFromServerEvent, defaultMemoryStatus, loadCompactionPolicy, persistObservationalMemorySnapshot, } from "./session-stream/memory.js";
|
|
59
59
|
import { selectHistoryForBridge } from "./session-stream/replay-tail.js";
|
|
60
|
-
import { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
|
|
60
|
+
import { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, extractMessageMetricsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
|
|
61
61
|
import { resolveTurnSilenceMaxRearm, resolveTurnSilenceTimeoutMs, } from "./session-stream/turn-silence.js";
|
|
62
62
|
export { formatCompactionTokenStats, isSkippedCompactionResult, } from "./session-stream/compaction-events.js";
|
|
63
63
|
export { branchMessageRole, branchMessageSignature, branchMessageTimestampMs, contentAsPersistedText, getCompactionEndPruneSkipReason, getKeptBranchMessageSignatures, isRecord, matchKeptPersistedMessageIds, prunePersistedHistoryAfterCompaction, selectUniqueCandidate, } from "./session-stream/history-prune.js";
|
|
64
64
|
export { applyDcpLiteRuntimeStatus, buildDcpLiteThresholds, contextPercent, dcpLiteEventFromServerEvent, defaultMemoryStatus, loadCompactionPolicy, persistObservationalMemorySnapshot, } from "./session-stream/memory.js";
|
|
65
65
|
export { estimateStoredMessageReplayTokens, selectHistoryForBridge, } from "./session-stream/replay-tail.js";
|
|
66
|
-
export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
|
|
66
|
+
export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, extractMessageMetricsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
|
|
67
67
|
export { resolveTurnSilenceMaxRearm, resolveTurnSilenceTimeoutMs, } from "./session-stream/turn-silence.js";
|
|
68
68
|
const DEFAULT_BRIDGE_FACTORY = (args) => new AgentBridge(args);
|
|
69
69
|
/** Safety limit for autonomous loop iterations per session. */
|
|
@@ -842,11 +842,21 @@ export class SessionStreamManager {
|
|
|
842
842
|
emit: (event) => this.handleBridgeEvent(stream, event),
|
|
843
843
|
onAssistantMessageComplete: ({ messageId, content, eventsJsonl, nativeResponseId, }) => {
|
|
844
844
|
try {
|
|
845
|
+
// Re-extract credits and per-round timing metrics from the
|
|
846
|
+
// events JSONL so this INSERT OR REPLACE stays idempotent
|
|
847
|
+
// instead of nulling columns already written by
|
|
848
|
+
// updateMessageCredits / updateMessageMetrics (same pattern as
|
|
849
|
+
// the Path B persist below). Best-effort: null when no
|
|
850
|
+
// token_usage event is present yet.
|
|
851
|
+
const creditsUsed = extractCreditsFromEventsJsonl(eventsJsonl);
|
|
852
|
+
const messageMetrics = extractMessageMetricsFromEventsJsonl(eventsJsonl);
|
|
845
853
|
this.store.appendMessage(sessionId, {
|
|
846
854
|
id: messageId,
|
|
847
855
|
role: "assistant",
|
|
848
856
|
content,
|
|
849
857
|
eventsJsonl,
|
|
858
|
+
...(creditsUsed != null ? { creditsUsed } : {}),
|
|
859
|
+
...(messageMetrics ?? {}),
|
|
850
860
|
});
|
|
851
861
|
if (nativeResponseId) {
|
|
852
862
|
this.store.setSessionNativeResponseId(sessionId, nativeResponseId);
|
|
@@ -1659,12 +1669,19 @@ export class SessionStreamManager {
|
|
|
1659
1669
|
// yet, credits_used stays null and updateMessageCredits will fill it
|
|
1660
1670
|
// later when the event streams in.
|
|
1661
1671
|
const creditsUsed = extractCreditsFromEventsJsonl(eventsJsonl);
|
|
1672
|
+
// Same for the per-round timing metrics (output_tokens,
|
|
1673
|
+
// duration_ms, tokens_per_second, ttft_ms): if token_usage already
|
|
1674
|
+
// streamed, re-extracting here keeps the final INSERT OR REPLACE
|
|
1675
|
+
// idempotent instead of nulling the columns updateMessageMetrics
|
|
1676
|
+
// wrote.
|
|
1677
|
+
const messageMetrics = extractMessageMetricsFromEventsJsonl(eventsJsonl);
|
|
1662
1678
|
this.store.appendMessage(sessionId, {
|
|
1663
1679
|
id: messageId,
|
|
1664
1680
|
role: "assistant",
|
|
1665
1681
|
content,
|
|
1666
1682
|
eventsJsonl,
|
|
1667
1683
|
...(creditsUsed != null ? { creditsUsed } : {}),
|
|
1684
|
+
...(messageMetrics ?? {}),
|
|
1668
1685
|
});
|
|
1669
1686
|
if (nativeResponseId) {
|
|
1670
1687
|
this.store.setSessionNativeResponseId(sessionId, nativeResponseId);
|
|
@@ -1898,6 +1915,16 @@ export class SessionStreamManager {
|
|
|
1898
1915
|
// should already exist. Best-effort: errors are logged in storage.
|
|
1899
1916
|
if (event.messageId) {
|
|
1900
1917
|
this.store.updateMessageCredits(event.messageId, event.usage.creditsUsed);
|
|
1918
|
+
// Persist per-round timing metrics (output tokens, generation
|
|
1919
|
+
// duration, TPS, TTFT) to dedicated columns — same pattern as
|
|
1920
|
+
// credits_used above. Synthetic context-window refresh events carry
|
|
1921
|
+
// no messageId, so they're skipped by the same guard.
|
|
1922
|
+
this.store.updateMessageMetrics(event.messageId, {
|
|
1923
|
+
outputTokens: event.usage.outputTokens,
|
|
1924
|
+
durationMs: event.durationMs ?? null,
|
|
1925
|
+
tokensPerSecond: event.tokensPerSecond ?? null,
|
|
1926
|
+
ttftMs: event.ttftMs ?? null,
|
|
1927
|
+
});
|
|
1901
1928
|
}
|
|
1902
1929
|
}
|
|
1903
1930
|
// Relay compaction_delta events to subscribers so the frontend can show
|
|
@@ -2276,12 +2303,22 @@ export class SessionStreamManager {
|
|
|
2276
2303
|
// always a complete, self-consistent snapshot. Older batches are
|
|
2277
2304
|
// included so history rehydration doesn't need to stitch fragments.
|
|
2278
2305
|
const eventsJsonl = turn.events.map((e) => JSON.stringify(e)).join("\n");
|
|
2306
|
+
// token_usage events are buffered into the turn, so credits and
|
|
2307
|
+
// per-round timing metrics can be re-extracted from the JSONL here.
|
|
2308
|
+
// Without them this INSERT OR REPLACE would null the credits_used /
|
|
2309
|
+
// metric columns that updateMessageCredits / updateMessageMetrics
|
|
2310
|
+
// already wrote for this message row during an earlier batch flush of
|
|
2311
|
+
// the same turn. Best-effort: null when no token_usage event yet.
|
|
2312
|
+
const creditsUsed = extractCreditsFromEventsJsonl(eventsJsonl);
|
|
2313
|
+
const messageMetrics = extractMessageMetricsFromEventsJsonl(eventsJsonl);
|
|
2279
2314
|
this.store.appendMessage(stream.sessionId, {
|
|
2280
2315
|
id: messageId,
|
|
2281
2316
|
role: "assistant",
|
|
2282
2317
|
content: turn.assistantText,
|
|
2283
2318
|
eventsJsonl,
|
|
2284
2319
|
createdAt: turn.startedAt,
|
|
2320
|
+
...(creditsUsed != null ? { creditsUsed } : {}),
|
|
2321
|
+
...(messageMetrics ?? {}),
|
|
2285
2322
|
});
|
|
2286
2323
|
stream.lastFlushedEventCount = turn.events.length;
|
|
2287
2324
|
turn.persistedEventCount = turn.events.length;
|