@tangle-network/agent-app 0.60.206 → 0.60.207
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/chat-routes/index.js +5 -5
- package/dist/{chunk-PMIM6DE7.js → chunk-2CBRCREL.js} +2 -2
- package/dist/{chunk-J4BZ6NPT.js → chunk-65SDSB6D.js} +5 -4
- package/dist/{chunk-J4BZ6NPT.js.map → chunk-65SDSB6D.js.map} +1 -1
- package/dist/{chunk-HPFROQZS.js → chunk-B673CO6M.js} +3 -3
- package/dist/{chunk-HPFROQZS.js.map → chunk-B673CO6M.js.map} +1 -1
- package/dist/{chunk-T7CWWC3F.js → chunk-J63KUZBE.js} +29 -3
- package/dist/chunk-J63KUZBE.js.map +1 -0
- package/dist/{chunk-7O6UQJJA.js → chunk-N7FGEWZU.js} +3 -3
- package/dist/chunk-N7FGEWZU.js.map +1 -0
- package/dist/public-consultation/index.js +1 -1
- package/dist/runtime/index.js +3 -3
- package/dist/runtime/router-turn.js +2 -2
- package/dist/sandbox/index.js +2 -2
- package/dist/turn-trace/index.js +1 -1
- package/dist/turn-trace/traced-fetch.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-7O6UQJJA.js.map +0 -1
- package/dist/chunk-T7CWWC3F.js.map +0 -1
- /package/dist/{chunk-PMIM6DE7.js.map → chunk-2CBRCREL.js.map} +0 -0
|
@@ -12,6 +12,29 @@ function nextCallIndex(trace, name) {
|
|
|
12
12
|
byName.set(name, next);
|
|
13
13
|
return next;
|
|
14
14
|
}
|
|
15
|
+
function recordRouterSteps(parent, origin, end, stamp) {
|
|
16
|
+
const offset = (name) => {
|
|
17
|
+
const ms = stamp(name);
|
|
18
|
+
return ms === void 0 ? void 0 : Math.min(end, origin + ms);
|
|
19
|
+
};
|
|
20
|
+
let at = origin;
|
|
21
|
+
for (const [step, name] of [["t_authed", "router.auth"], ["t_admitted", "router.admission"]]) {
|
|
22
|
+
const until = offset(step);
|
|
23
|
+
if (until === void 0 || until <= at) continue;
|
|
24
|
+
parent.record(name, "router", at, until);
|
|
25
|
+
at = until;
|
|
26
|
+
}
|
|
27
|
+
if (end <= at) return;
|
|
28
|
+
const dispatch = parent.record("router.dispatch", "router", at, end);
|
|
29
|
+
let stepEnd = end;
|
|
30
|
+
for (const step of ["spend_authorize", "dispatch_row"]) {
|
|
31
|
+
const ms = stamp(step);
|
|
32
|
+
if (ms === void 0) continue;
|
|
33
|
+
const start = Math.max(at, stepEnd - ms);
|
|
34
|
+
dispatch.record(`router.${step}`, "router", start, stepEnd);
|
|
35
|
+
stepEnd = start;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
15
38
|
function tracedModelFetch(trace, inner, options = {}) {
|
|
16
39
|
return async (input, init) => {
|
|
17
40
|
const sentAt = Date.now();
|
|
@@ -30,7 +53,10 @@ function tracedModelFetch(trace, inner, options = {}) {
|
|
|
30
53
|
}
|
|
31
54
|
const headersAt = Date.now();
|
|
32
55
|
const timing = parseServerTiming(response.headers.get("server-timing"));
|
|
33
|
-
const stamp = (name) =>
|
|
56
|
+
const stamp = (name) => {
|
|
57
|
+
for (let i = timing.length - 1; i >= 0; i--) if (timing[i].name === name && timing[i].durMs !== void 0) return timing[i].durMs;
|
|
58
|
+
return void 0;
|
|
59
|
+
};
|
|
34
60
|
const preUpstreamMs = stamp("upstream_start");
|
|
35
61
|
const upstreamWaitMs = stamp("upstream_headers");
|
|
36
62
|
const waitMs = headersAt - sentAt;
|
|
@@ -46,7 +72,7 @@ function tracedModelFetch(trace, inner, options = {}) {
|
|
|
46
72
|
at += networkMs;
|
|
47
73
|
if (preUpstreamMs !== void 0) {
|
|
48
74
|
const end = Math.min(headersAt, at + preUpstreamMs);
|
|
49
|
-
span.record("router.pre_upstream", "router", at, end);
|
|
75
|
+
recordRouterSteps(span.record("router.pre_upstream", "router", at, end), at, end, stamp);
|
|
50
76
|
at = end;
|
|
51
77
|
}
|
|
52
78
|
if (upstreamWaitMs !== void 0) span.record("router.upstream_wait", "model", at, headersAt);
|
|
@@ -101,4 +127,4 @@ export {
|
|
|
101
127
|
nextCallIndex,
|
|
102
128
|
tracedModelFetch
|
|
103
129
|
};
|
|
104
|
-
//# sourceMappingURL=chunk-
|
|
130
|
+
//# sourceMappingURL=chunk-J63KUZBE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/turn-trace/traced-fetch.ts"],"sourcesContent":["import type { TurnSpan, TurnTrace } from './recorder'\nimport { parseServerTiming, serverTimingAttrs } from './server-timing'\n\nconst counters = new WeakMap<TurnTrace, Map<string, number>>()\n\n/** 1-based count of `name` spans started through {@link nextCallIndex} on this trace. */\nexport function nextCallIndex(trace: TurnTrace, name: string): number {\n const byName = counters.get(trace) ?? new Map<string, number>()\n counters.set(trace, byName)\n const next = (byName.get(name) ?? 0) + 1\n byName.set(name, next)\n return next\n}\n\n/**\n * The Router's own steps before its provider fetch, as children of `router.pre_upstream` (`origin` is the Router's\n * handler start on this clock, `end` its `upstream_start`). `t_authed` and `t_admitted` are offsets from the handler\n * start: `router.auth` runs to the first, `router.admission` (budgets, credits, routing) to the second, and\n * `router.dispatch` (body, pricing, the dispatch row, the spend hold) to the provider fetch. `dispatch_row` and\n * `spend_authorize` are durations that run back to back and end just before the fetch, so they are placed backwards\n * from `end`. A step the header does not carry is left out, and nothing is placed outside `[origin, end]`.\n */\nfunction recordRouterSteps(parent: TurnSpan, origin: number, end: number, stamp: (name: string) => number | undefined): void {\n const offset = (name: string) => {\n const ms = stamp(name)\n return ms === undefined ? undefined : Math.min(end, origin + ms)\n }\n let at = origin\n for (const [step, name] of [['t_authed', 'router.auth'], ['t_admitted', 'router.admission']] as const) {\n const until = offset(step)\n if (until === undefined || until <= at) continue\n parent.record(name, 'router', at, until)\n at = until\n }\n if (end <= at) return\n const dispatch = parent.record('router.dispatch', 'router', at, end)\n let stepEnd = end\n for (const step of ['spend_authorize', 'dispatch_row']) {\n const ms = stamp(step)\n if (ms === undefined) continue\n const start = Math.max(at, stepEnd - ms)\n dispatch.record(`router.${step}`, 'router', start, stepEnd)\n stepEnd = start\n }\n}\n\nexport interface TracedModelFetchOptions {\n /** The span a model call hangs from. Default: the trace's root. */\n parent?: TurnSpan\n /** The model the request asks for. */\n model?: string\n /** Receives each model call's span as it starts, so the engine can add the token counts when usage arrives. */\n onSpan?: (span: TurnSpan) => void\n}\n\n/**\n * `fetch` for a model request, recording one `model.call` span per send: the\n * wall time from the request to the end of its body, the time to the first\n * byte, and the Router's own `Server-Timing` so the wait before the first byte\n * splits into network and server time.\n *\n * Children partition the call:\n * - `network`: the wait for headers, less the Router's server time;\n * - `router.pre_upstream`: the Router's work before its provider fetch\n * (`upstream_start`), split by its own steps (see {@link recordRouterSteps});\n * - `router.upstream_wait`: the provider's time to response headers\n * (`upstream_headers`);\n * - `model.stream`: headers to the end of the body.\n * Without a `Server-Timing` header the first byte's wait is one `model.wait`\n * span, because the split is not known.\n *\n * The response body is passed through unchanged; the span ends when the body\n * ends, errors or is cancelled.\n */\nexport function tracedModelFetch(trace: TurnTrace, inner: typeof fetch, options: TracedModelFetchOptions = {}): typeof fetch {\n return async (input, init) => {\n const sentAt = Date.now()\n const span = trace.start('model.call', 'model', {\n 'gen_ai.operation.name': 'chat',\n 'call.index': nextCallIndex(trace, 'model.call'),\n ...(options.model ? { 'gen_ai.request.model': options.model } : {}),\n }, options.parent)\n options.onSpan?.(span)\n let response: Response\n try {\n response = await inner(input, init)\n } catch (error) {\n span.end({ 'http.failed': true }, error)\n throw error\n }\n const headersAt = Date.now()\n const timing = parseServerTiming(response.headers.get('server-timing'))\n // The last entry: a fallback chain repeats a step, and the response is the last provider's.\n const stamp = (name: string) => {\n for (let i = timing.length - 1; i >= 0; i--) if (timing[i]!.name === name && timing[i]!.durMs !== undefined) return timing[i]!.durMs\n return undefined\n }\n const preUpstreamMs = stamp('upstream_start')\n const upstreamWaitMs = stamp('upstream_headers')\n const waitMs = headersAt - sentAt\n span.set({ 'http.status_code': response.status, ttfb_ms: waitMs, ...serverTimingAttrs(timing) })\n\n let firstByteAt: number | undefined\n const finish = (endedAt: number, error?: unknown, cancelled?: boolean) => {\n const known = preUpstreamMs !== undefined || upstreamWaitMs !== undefined\n if (known) {\n const serverMs = Math.min(waitMs, (preUpstreamMs ?? 0) + (upstreamWaitMs ?? 0))\n const networkMs = waitMs - serverMs\n let at = sentAt\n span.record('network', 'network', at, at + networkMs, { 'network.ms': Math.round(networkMs) })\n at += networkMs\n if (preUpstreamMs !== undefined) {\n const end = Math.min(headersAt, at + preUpstreamMs)\n recordRouterSteps(span.record('router.pre_upstream', 'router', at, end), at, end, stamp)\n at = end\n }\n if (upstreamWaitMs !== undefined) span.record('router.upstream_wait', 'model', at, headersAt)\n span.set({ network_ms: Math.round(networkMs), router_server_ms: Math.round(serverMs) })\n } else {\n span.record('model.wait', 'model', sentAt, headersAt, { split: 'unknown' })\n }\n span.record('model.stream', 'model', headersAt, Math.max(headersAt, endedAt))\n const failure = error ?? (response.status >= 400 ? `http_${response.status}` : undefined)\n span.end({\n ...(firstByteAt !== undefined ? { ttft_ms: firstByteAt - sentAt } : {}),\n ...(cancelled ? { cancelled: true } : {}),\n }, failure)\n }\n\n if (!response.body) {\n finish(headersAt)\n return response\n }\n const reader = response.body.getReader()\n let settled = false\n const settle = (error?: unknown, cancelled?: boolean) => {\n if (settled) return\n settled = true\n finish(Date.now(), error, cancelled)\n }\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read()\n if (done) {\n settle()\n controller.close()\n return\n }\n firstByteAt ??= Date.now()\n controller.enqueue(value)\n } catch (error) {\n settle(error)\n controller.error(error)\n }\n },\n async cancel(reason) {\n settle(undefined, true)\n await reader.cancel(reason)\n },\n })\n return new Response(body, { status: response.status, statusText: response.statusText, headers: response.headers })\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
} from "./chunk-6A7MYOUI.js";
|
|
24
24
|
import {
|
|
25
25
|
nextCallIndex
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-J63KUZBE.js";
|
|
27
27
|
import {
|
|
28
28
|
resolveTangleExecutionEnvironment,
|
|
29
29
|
trimOrNull
|
|
@@ -94,7 +94,7 @@ function createPromptTrace(trace, parent, meta) {
|
|
|
94
94
|
}
|
|
95
95
|
if (type === "tool_result" || type === "tool.result") {
|
|
96
96
|
const id = String(data?.id ?? data?.callId ?? data?.callID ?? data?.name ?? "");
|
|
97
|
-
tools.get(id)?.end(void 0, data?.error
|
|
97
|
+
tools.get(id)?.end(void 0, data?.error || data?.status === "error" ? "tool_error" : void 0);
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
100
|
if (type !== "message.part.updated") return;
|
|
@@ -3527,4 +3527,4 @@ export {
|
|
|
3527
3527
|
isTerminalPromptEvent,
|
|
3528
3528
|
detectInteractiveQuestion
|
|
3529
3529
|
};
|
|
3530
|
-
//# sourceMappingURL=chunk-
|
|
3530
|
+
//# sourceMappingURL=chunk-N7FGEWZU.js.map
|