@assistant-ui/react-ag-ui 0.0.30 → 0.0.32
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/index.d.ts +3 -4
- package/dist/index.js +2 -2
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts +85 -82
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtime/AgUiThreadRuntimeCore.js +542 -627
- package/dist/runtime/AgUiThreadRuntimeCore.js.map +1 -1
- package/dist/runtime/adapter/conversions.d.ts +39 -36
- package/dist/runtime/adapter/conversions.d.ts.map +1 -1
- package/dist/runtime/adapter/conversions.js +294 -390
- package/dist/runtime/adapter/conversions.js.map +1 -1
- package/dist/runtime/adapter/run-aggregator.d.ts +54 -47
- package/dist/runtime/adapter/run-aggregator.d.ts.map +1 -1
- package/dist/runtime/adapter/run-aggregator.js +367 -364
- package/dist/runtime/adapter/run-aggregator.js.map +1 -1
- package/dist/runtime/adapter/subscriber.d.ts +94 -91
- package/dist/runtime/adapter/subscriber.d.ts.map +1 -1
- package/dist/runtime/adapter/subscriber.js +77 -86
- package/dist/runtime/adapter/subscriber.js.map +1 -1
- package/dist/runtime/event-parser.d.ts +9 -5
- package/dist/runtime/event-parser.d.ts.map +1 -1
- package/dist/runtime/event-parser.js +172 -177
- package/dist/runtime/event-parser.js.map +1 -1
- package/dist/runtime/logger.d.ts +7 -4
- package/dist/runtime/logger.d.ts.map +1 -1
- package/dist/runtime/logger.js +7 -3
- package/dist/runtime/logger.js.map +1 -1
- package/dist/runtime/types.d.ts +121 -117
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js +0 -2
- package/dist/useAgUiRuntime.d.ts +10 -6
- package/dist/useAgUiRuntime.d.ts.map +1 -1
- package/dist/useAgUiRuntime.js +136 -142
- package/dist/useAgUiRuntime.js.map +1 -1
- package/package.json +9 -8
- package/src/runtime/AgUiThreadRuntimeCore.ts +1 -0
- package/src/runtime/adapter/run-aggregator.ts +111 -45
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/runtime/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgUiRuntime.js","sourceRoot":"","sources":["../src/useAgUiRuntime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAgUiRuntime.js","names":[],"sources":["../src/useAgUiRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useExternalStoreRuntime,\n useRuntimeAdapters,\n useToolInvocations,\n} from \"@assistant-ui/core/react\";\nimport type { ToolExecutionStatus } from \"@assistant-ui/core/react\";\nimport type {\n AssistantRuntime,\n AppendMessage,\n ExternalStoreAdapter,\n ThreadMessage,\n} from \"@assistant-ui/core\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport { makeLogger } from \"./runtime/logger\";\nimport type {\n AgUiInterrupt,\n AgUiResumeEntry,\n UseAgUiRuntimeOptions,\n} from \"./runtime/types\";\nimport { AgUiThreadRuntimeCore } from \"./runtime/AgUiThreadRuntimeCore\";\n\nexport type AgUiAssistantRuntime = AssistantRuntime & {\n unstable_getPendingInterrupts: () => readonly AgUiInterrupt[];\n unstable_submitInterruptResponses: (\n responses: readonly AgUiResumeEntry[],\n ) => Promise<void>;\n};\n\nexport function useAgUiRuntime(\n options: UseAgUiRuntimeOptions,\n): AgUiAssistantRuntime {\n const logger = useMemo(() => makeLogger(options.logger), [options.logger]);\n const [_version, setVersion] = useState(0);\n const notifyUpdate = useCallback(() => setVersion((v) => v + 1), []);\n const coreRef = useRef<AgUiThreadRuntimeCore | null>(null);\n const runtimeAdapters = useRuntimeAdapters();\n\n const historyAdapter = options.adapters?.history ?? runtimeAdapters?.history;\n const threadListAdapter = options.adapters?.threadList;\n\n if (!coreRef.current) {\n coreRef.current = new AgUiThreadRuntimeCore({\n agent: options.agent,\n logger,\n showThinking: options.showThinking ?? true,\n ...(options.onError && { onError: options.onError }),\n ...(options.onCancel && { onCancel: options.onCancel }),\n ...(historyAdapter && { history: historyAdapter }),\n notifyUpdate,\n });\n }\n\n const core = coreRef.current;\n core.updateOptions({\n agent: options.agent,\n logger,\n showThinking: options.showThinking ?? true,\n ...(options.onError && { onError: options.onError }),\n ...(options.onCancel && { onCancel: options.onCancel }),\n ...(historyAdapter && { history: historyAdapter }),\n });\n\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n\n const [runtimeRef] = useState(() => ({\n get current(): AssistantRuntime {\n return runtime;\n },\n }));\n\n const toolInvocationsRef = useRef({\n reset: () => {},\n abort: (): Promise<void> => Promise.resolve(),\n resume: (_toolCallId: string, _payload: unknown) => {},\n });\n\n const threadList = useMemo(() => {\n if (!threadListAdapter) return undefined;\n\n const { onSwitchToNewThread, onSwitchToThread } = threadListAdapter;\n\n return {\n threadId: threadListAdapter.threadId,\n onSwitchToNewThread: onSwitchToNewThread\n ? async () => {\n toolInvocationsRef.current.reset();\n await onSwitchToNewThread();\n core.applyExternalMessages([]);\n }\n : undefined,\n onSwitchToThread: onSwitchToThread\n ? async (threadId: string) => {\n toolInvocationsRef.current.reset();\n const result = await onSwitchToThread(threadId);\n core.applyExternalMessages(result.messages);\n if (result.state) {\n core.loadExternalState(result.state);\n }\n }\n : undefined,\n };\n }, [threadListAdapter, core]);\n\n const adapters = options.adapters;\n const adapterAdapters = useMemo(\n () => ({\n attachments: adapters?.attachments ?? runtimeAdapters?.attachments,\n speech: adapters?.speech,\n dictation: adapters?.dictation,\n feedback: adapters?.feedback,\n threadList,\n }),\n [adapters, runtimeAdapters, threadList],\n );\n\n const toolInvocations = useToolInvocations({\n state: {\n messages: core.getMessages(),\n isRunning: core.isRunning() || hasExecutingTools,\n },\n getTools: () => runtimeRef.current.thread.getModelContext().tools,\n onResult: (command) => {\n if (command.type === \"add-tool-result\") {\n const messageId = core.findMessageIdForToolCall(command.toolCallId);\n if (messageId) {\n core.addToolResult({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact && { artifact: command.artifact }),\n });\n }\n }\n },\n setToolStatuses,\n });\n toolInvocationsRef.current = toolInvocations;\n\n const store = useMemo(\n () => {\n void _version; // rerender on version change\n\n return {\n isLoading: core.isLoading,\n messages: core.getMessages(),\n state: core.getState(),\n isRunning: core.isRunning() || hasExecutingTools,\n onNew: (message: AppendMessage) => core.append(message),\n onEdit: (message: AppendMessage) => core.edit(message),\n onReload: (parentId: string | null, config: { runConfig?: any }) =>\n core.reload(parentId, config),\n onCancel: async () => {\n core.cancel();\n await toolInvocationsRef.current.abort();\n },\n onAddToolResult: (options) => core.addToolResult(options),\n onResume: (config) => core.resume(config),\n onResumeToolCall: (options) =>\n toolInvocationsRef.current.resume(\n options.toolCallId,\n options.payload,\n ),\n setMessages: (messages: readonly ThreadMessage[]) =>\n core.applyExternalMessages(messages),\n onImport: (messages: readonly ThreadMessage[]) =>\n core.applyExternalMessages(messages),\n onLoadExternalState: (state: ReadonlyJSONValue) =>\n core.loadExternalState(state),\n adapters: adapterAdapters,\n } satisfies ExternalStoreAdapter<ThreadMessage>;\n },\n // _version is intentionally included to trigger re-computation when core state changes via notifyUpdate\n // toolInvocations intentionally excluded: abort/resume use refs internally and work with stale captures\n [adapterAdapters, core, _version, hasExecutingTools],\n );\n\n const baseRuntime = useExternalStoreRuntime(store);\n\n const runtime = useMemo<AgUiAssistantRuntime>(() => {\n const wrapper = Object.create(baseRuntime) as AgUiAssistantRuntime;\n wrapper.unstable_getPendingInterrupts = () =>\n core.getPendingInterrupts()?.interrupts ?? [];\n wrapper.unstable_submitInterruptResponses = (responses) =>\n core.submitInterruptResponses(responses);\n return wrapper;\n }, [baseRuntime, core]);\n\n useEffect(() => {\n core.attachRuntime(runtime);\n return () => {\n core.detachRuntime();\n };\n }, [core, runtime]);\n\n useEffect(() => {\n core.__internal_load();\n }, [core]);\n\n return runtime;\n}\n"],"mappings":";;;;;;AA+BA,SAAgB,eACd,SACsB;CACtB,MAAM,SAAS,cAAc,WAAW,QAAQ,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC;CACzE,MAAM,CAAC,UAAU,cAAc,SAAS,CAAC;CACzC,MAAM,eAAe,kBAAkB,YAAY,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;CACnE,MAAM,UAAU,OAAqC,IAAI;CACzD,MAAM,kBAAkB,mBAAmB;CAE3C,MAAM,iBAAiB,QAAQ,UAAU,WAAW,iBAAiB;CACrE,MAAM,oBAAoB,QAAQ,UAAU;CAE5C,IAAI,CAAC,QAAQ,SACX,QAAQ,UAAU,IAAI,sBAAsB;EAC1C,OAAO,QAAQ;EACf;EACA,cAAc,QAAQ,gBAAgB;EACtC,GAAI,QAAQ,WAAW,EAAE,SAAS,QAAQ,QAAQ;EAClD,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS;EACrD,GAAI,kBAAkB,EAAE,SAAS,eAAe;EAChD;CACF,CAAC;CAGH,MAAM,OAAO,QAAQ;CACrB,KAAK,cAAc;EACjB,OAAO,QAAQ;EACf;EACA,cAAc,QAAQ,gBAAgB;EACtC,GAAI,QAAQ,WAAW,EAAE,SAAS,QAAQ,QAAQ;EAClD,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS;EACrD,GAAI,kBAAkB,EAAE,SAAS,eAAe;CAClD,CAAC;CAED,MAAM,CAAC,cAAc,mBAAmB,SAEtC,CAAC,CAAC;CAEJ,MAAM,oBAAoB,OAAO,OAAO,YAAY,EAAE,MACnD,MAAM,GAAG,SAAS,WACrB;CAEA,MAAM,CAAC,cAAc,gBAAgB,EACnC,IAAI,UAA4B;EAC9B,OAAO;CACT,EACF,EAAE;CAEF,MAAM,qBAAqB,OAAO;EAChC,aAAa,CAAC;EACd,aAA4B,QAAQ,QAAQ;EAC5C,SAAS,aAAqB,aAAsB,CAAC;CACvD,CAAC;CAED,MAAM,aAAa,cAAc;EAC/B,IAAI,CAAC,mBAAmB,OAAO,KAAA;EAE/B,MAAM,EAAE,qBAAqB,qBAAqB;EAElD,OAAO;GACL,UAAU,kBAAkB;GAC5B,qBAAqB,sBACjB,YAAY;IACV,mBAAmB,QAAQ,MAAM;IACjC,MAAM,oBAAoB;IAC1B,KAAK,sBAAsB,CAAC,CAAC;GAC/B,IACA,KAAA;GACJ,kBAAkB,mBACd,OAAO,aAAqB;IAC1B,mBAAmB,QAAQ,MAAM;IACjC,MAAM,SAAS,MAAM,iBAAiB,QAAQ;IAC9C,KAAK,sBAAsB,OAAO,QAAQ;IAC1C,IAAI,OAAO,OACT,KAAK,kBAAkB,OAAO,KAAK;GAEvC,IACA,KAAA;EACN;CACF,GAAG,CAAC,mBAAmB,IAAI,CAAC;CAE5B,MAAM,WAAW,QAAQ;CACzB,MAAM,kBAAkB,eACf;EACL,aAAa,UAAU,eAAe,iBAAiB;EACvD,QAAQ,UAAU;EAClB,WAAW,UAAU;EACrB,UAAU,UAAU;EACpB;CACF,IACA;EAAC;EAAU;EAAiB;CAAU,CACxC;CAyBA,mBAAmB,UAvBK,mBAAmB;EACzC,OAAO;GACL,UAAU,KAAK,YAAY;GAC3B,WAAW,KAAK,UAAU,KAAK;EACjC;EACA,gBAAgB,WAAW,QAAQ,OAAO,gBAAgB,EAAE;EAC5D,WAAW,YAAY;GACrB,IAAI,QAAQ,SAAS,mBAAmB;IACtC,MAAM,YAAY,KAAK,yBAAyB,QAAQ,UAAU;IAClE,IAAI,WACF,KAAK,cAAc;KACjB;KACA,YAAY,QAAQ;KACpB,UAAU,QAAQ;KAClB,QAAQ,QAAQ;KAChB,SAAS,QAAQ;KACjB,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS;IACvD,CAAC;GAEL;EACF;EACA;CACF,CAC2C;CAwC3C,MAAM,cAAc,wBAtCN,cACN;EAGJ,OAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY;GAC3B,OAAO,KAAK,SAAS;GACrB,WAAW,KAAK,UAAU,KAAK;GAC/B,QAAQ,YAA2B,KAAK,OAAO,OAAO;GACtD,SAAS,YAA2B,KAAK,KAAK,OAAO;GACrD,WAAW,UAAyB,WAClC,KAAK,OAAO,UAAU,MAAM;GAC9B,UAAU,YAAY;IACpB,KAAK,OAAO;IACZ,MAAM,mBAAmB,QAAQ,MAAM;GACzC;GACA,kBAAkB,YAAY,KAAK,cAAc,OAAO;GACxD,WAAW,WAAW,KAAK,OAAO,MAAM;GACxC,mBAAmB,YACjB,mBAAmB,QAAQ,OACzB,QAAQ,YACR,QAAQ,OACV;GACF,cAAc,aACZ,KAAK,sBAAsB,QAAQ;GACrC,WAAW,aACT,KAAK,sBAAsB,QAAQ;GACrC,sBAAsB,UACpB,KAAK,kBAAkB,KAAK;GAC9B,UAAU;EACZ;CACF,GAGA;EAAC;EAAiB;EAAM;EAAU;CAAiB,CAGL,CAAC;CAEjD,MAAM,UAAU,cAAoC;EAClD,MAAM,UAAU,OAAO,OAAO,WAAW;EACzC,QAAQ,sCACN,KAAK,qBAAqB,GAAG,cAAc,CAAC;EAC9C,QAAQ,qCAAqC,cAC3C,KAAK,yBAAyB,SAAS;EACzC,OAAO;CACT,GAAG,CAAC,aAAa,IAAI,CAAC;CAEtB,gBAAgB;EACd,KAAK,cAAc,OAAO;EAC1B,aAAa;GACX,KAAK,cAAc;EACrB;CACF,GAAG,CAAC,MAAM,OAAO,CAAC;CAElB,gBAAgB;EACd,KAAK,gBAAgB;CACvB,GAAG,CAAC,IAAI,CAAC;CAET,OAAO;AACT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-ag-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.32",
|
|
4
4
|
"description": "AG-UI protocol adapter for assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ag-ui",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"sideEffects": false,
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@ag-ui/client": "^0.0.53",
|
|
33
|
-
"@assistant-ui/core": "^0.2.
|
|
34
|
-
"assistant-stream": "^0.3.
|
|
33
|
+
"@assistant-ui/core": "^0.2.5",
|
|
34
|
+
"assistant-stream": "^0.3.16"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"@types/react": "*",
|
|
@@ -43,14 +43,15 @@
|
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@types/react": "^19.2.
|
|
47
|
-
"react": "^19.2.
|
|
48
|
-
"vitest": "^4.1.
|
|
46
|
+
"@types/react": "^19.2.15",
|
|
47
|
+
"react": "^19.2.6",
|
|
48
|
+
"vitest": "^4.1.7",
|
|
49
49
|
"zod": "^4.4.3",
|
|
50
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
50
|
+
"@assistant-ui/x-buildutils": "0.0.9"
|
|
51
51
|
},
|
|
52
52
|
"publishConfig": {
|
|
53
|
-
"access": "public"
|
|
53
|
+
"access": "public",
|
|
54
|
+
"provenance": true
|
|
54
55
|
},
|
|
55
56
|
"homepage": "https://www.assistant-ui.com/",
|
|
56
57
|
"repository": {
|
|
@@ -716,6 +716,7 @@ export class AgUiThreadRuntimeCore {
|
|
|
716
716
|
unstable_annotations: annotations,
|
|
717
717
|
unstable_data: data,
|
|
718
718
|
steps,
|
|
719
|
+
...(incoming.timing ? { timing: incoming.timing } : {}),
|
|
719
720
|
custom: incoming.custom
|
|
720
721
|
? { ...current.custom, ...incoming.custom }
|
|
721
722
|
: current.custom,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type {
|
|
4
4
|
ChatModelRunResult,
|
|
5
|
+
MessageTiming,
|
|
5
6
|
ThreadAssistantMessagePart,
|
|
6
7
|
ToolCallMessagePart,
|
|
7
8
|
} from "@assistant-ui/core";
|
|
@@ -53,18 +54,22 @@ export class RunAggregator {
|
|
|
53
54
|
{ buffer: string; touched: boolean }
|
|
54
55
|
>();
|
|
55
56
|
private activeTextMessageId: string | undefined;
|
|
56
|
-
private
|
|
57
|
-
private
|
|
57
|
+
private readonly reasoningParts = new Map<string, string>(); // key → buffer
|
|
58
|
+
private activeReasoningKey: string | undefined;
|
|
59
|
+
private reasoningPartCounter = 0;
|
|
58
60
|
private readonly toolCalls = new Map<string, ToolCallState>();
|
|
59
61
|
private readonly partOrder: (
|
|
60
62
|
| { kind: "text"; key: string }
|
|
61
|
-
| { kind: "reasoning" }
|
|
63
|
+
| { kind: "reasoning"; key: string }
|
|
62
64
|
| { kind: "tool-call"; toolCallId: string }
|
|
63
65
|
)[] = [];
|
|
64
|
-
private hasReasoningPart = false;
|
|
65
66
|
private textPartCounter = 0;
|
|
66
67
|
private serverMessageIdReported = false;
|
|
67
68
|
|
|
69
|
+
private streamStartTime: number | undefined;
|
|
70
|
+
private firstTokenTime: number | undefined;
|
|
71
|
+
private totalChunks = 0;
|
|
72
|
+
|
|
68
73
|
constructor(options: RunAggregatorOptions) {
|
|
69
74
|
this.emitUpdate = options.emit;
|
|
70
75
|
this.showThinking = options.showThinking;
|
|
@@ -76,15 +81,18 @@ export class RunAggregator {
|
|
|
76
81
|
switch (event.type) {
|
|
77
82
|
case "RUN_STARTED": {
|
|
78
83
|
this.clearTextParts();
|
|
79
|
-
this.
|
|
80
|
-
this.
|
|
84
|
+
this.reasoningParts.clear();
|
|
85
|
+
this.activeReasoningKey = undefined;
|
|
86
|
+
this.reasoningPartCounter = 0;
|
|
81
87
|
this.toolCalls.clear();
|
|
82
88
|
this.partOrder.length = 0;
|
|
83
|
-
this.hasReasoningPart = false;
|
|
84
89
|
this.textPartCounter = 0;
|
|
85
90
|
this.activeTextMessageId = undefined;
|
|
86
91
|
this.interrupts = undefined;
|
|
87
92
|
this.serverMessageIdReported = false;
|
|
93
|
+
this.streamStartTime = Date.now();
|
|
94
|
+
this.firstTokenTime = undefined;
|
|
95
|
+
this.totalChunks = 0;
|
|
88
96
|
this.status = { type: "running" };
|
|
89
97
|
this.emit();
|
|
90
98
|
break;
|
|
@@ -138,8 +146,10 @@ export class RunAggregator {
|
|
|
138
146
|
const incomingId = "messageId" in event ? event.messageId : undefined;
|
|
139
147
|
this.reportServerMessageId(incomingId);
|
|
140
148
|
if (!event.delta) break;
|
|
149
|
+
this.recordFirstToken();
|
|
141
150
|
const id = this.resolveTextMessageId(incomingId);
|
|
142
151
|
this.appendText(id, event.delta);
|
|
152
|
+
this.totalChunks++;
|
|
143
153
|
this.emit();
|
|
144
154
|
break;
|
|
145
155
|
}
|
|
@@ -156,11 +166,22 @@ export class RunAggregator {
|
|
|
156
166
|
case "THINKING_TEXT_MESSAGE_START":
|
|
157
167
|
case "REASONING_START":
|
|
158
168
|
case "REASONING_MESSAGE_START":
|
|
159
|
-
this.handleReasoningStart(
|
|
169
|
+
this.handleReasoningStart(
|
|
170
|
+
"messageId" in event ? event.messageId : undefined,
|
|
171
|
+
);
|
|
160
172
|
break;
|
|
161
173
|
case "THINKING_TEXT_MESSAGE_CONTENT":
|
|
162
|
-
case "REASONING_MESSAGE_CONTENT":
|
|
163
174
|
this.handleReasoningContent(event.delta);
|
|
175
|
+
this.totalChunks++;
|
|
176
|
+
this.recordFirstToken();
|
|
177
|
+
break;
|
|
178
|
+
case "REASONING_MESSAGE_CONTENT":
|
|
179
|
+
this.handleReasoningContent(
|
|
180
|
+
event.delta,
|
|
181
|
+
"messageId" in event ? event.messageId : undefined,
|
|
182
|
+
);
|
|
183
|
+
this.totalChunks++;
|
|
184
|
+
this.recordFirstToken();
|
|
164
185
|
break;
|
|
165
186
|
case "THINKING_TEXT_MESSAGE_END":
|
|
166
187
|
case "THINKING_END":
|
|
@@ -280,6 +301,9 @@ export class RunAggregator {
|
|
|
280
301
|
parentMessageId?: string,
|
|
281
302
|
) {
|
|
282
303
|
if (!id) return;
|
|
304
|
+
// A new tool call acts as a boundary: any anonymous text that arrives
|
|
305
|
+
// after it should be a new part, not appended to the pre-tool text.
|
|
306
|
+
this.activeTextMessageId = undefined;
|
|
283
307
|
if (
|
|
284
308
|
!this.partOrder.some(
|
|
285
309
|
(part) => part.kind === "tool-call" && part.toolCallId === id,
|
|
@@ -364,14 +388,11 @@ export class RunAggregator {
|
|
|
364
388
|
|
|
365
389
|
for (const part of this.partOrder) {
|
|
366
390
|
if (part.kind === "reasoning") {
|
|
367
|
-
if (
|
|
368
|
-
this.
|
|
369
|
-
(
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
type: "reasoning",
|
|
373
|
-
text: this.reasoningBuffer,
|
|
374
|
-
} as const);
|
|
391
|
+
if (this.showThinking) {
|
|
392
|
+
const buffer = this.reasoningParts.get(part.key) ?? "";
|
|
393
|
+
if (buffer.length > 0 || this.activeReasoningKey === part.key) {
|
|
394
|
+
snapshot.push({ type: "reasoning", text: buffer } as const);
|
|
395
|
+
}
|
|
375
396
|
}
|
|
376
397
|
continue;
|
|
377
398
|
}
|
|
@@ -402,52 +423,97 @@ export class RunAggregator {
|
|
|
402
423
|
snapshot.push(toolPart);
|
|
403
424
|
}
|
|
404
425
|
|
|
405
|
-
const
|
|
406
|
-
|
|
407
|
-
...(
|
|
426
|
+
const timing = this.getTiming();
|
|
427
|
+
const metadata = {
|
|
428
|
+
...(timing ? { timing } : {}),
|
|
408
429
|
...(this.interrupts
|
|
409
430
|
? {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
} satisfies AgUiCustomMetadata,
|
|
415
|
-
},
|
|
431
|
+
custom: {
|
|
432
|
+
[AG_UI_METADATA_NAMESPACE]: {
|
|
433
|
+
interrupts: this.interrupts,
|
|
434
|
+
} satisfies AgUiCustomMetadata,
|
|
416
435
|
},
|
|
417
436
|
}
|
|
418
|
-
:
|
|
437
|
+
: {}),
|
|
438
|
+
};
|
|
439
|
+
const result: ChatModelRunResult = {
|
|
440
|
+
content: snapshot,
|
|
441
|
+
...(this.status ? { status: this.status } : undefined),
|
|
442
|
+
...(Object.keys(metadata).length > 0 ? { metadata } : undefined),
|
|
419
443
|
};
|
|
420
444
|
this.emitUpdate(result);
|
|
421
445
|
}
|
|
422
446
|
|
|
423
|
-
private
|
|
447
|
+
private recordFirstToken(): void {
|
|
448
|
+
if (
|
|
449
|
+
this.firstTokenTime === undefined &&
|
|
450
|
+
this.streamStartTime !== undefined
|
|
451
|
+
) {
|
|
452
|
+
this.firstTokenTime = Date.now() - this.streamStartTime;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
private getTiming(): MessageTiming | undefined {
|
|
457
|
+
if (this.streamStartTime === undefined) return undefined;
|
|
458
|
+
|
|
459
|
+
const now = Date.now();
|
|
460
|
+
const totalStreamTime = now - this.streamStartTime;
|
|
461
|
+
const tokenCount =
|
|
462
|
+
this.totalChunks > 0
|
|
463
|
+
? Math.ceil(
|
|
464
|
+
Array.from(this.textParts.values()).reduce(
|
|
465
|
+
(sum, p) => sum + p.buffer.length,
|
|
466
|
+
0,
|
|
467
|
+
) / 4,
|
|
468
|
+
)
|
|
469
|
+
: undefined;
|
|
470
|
+
const tokensPerSecond =
|
|
471
|
+
tokenCount && totalStreamTime > 0
|
|
472
|
+
? (tokenCount / totalStreamTime) * 1000
|
|
473
|
+
: undefined;
|
|
474
|
+
|
|
475
|
+
return {
|
|
476
|
+
streamStartTime: this.streamStartTime,
|
|
477
|
+
...(this.firstTokenTime !== undefined
|
|
478
|
+
? { firstTokenTime: this.firstTokenTime }
|
|
479
|
+
: {}),
|
|
480
|
+
totalStreamTime,
|
|
481
|
+
...(tokenCount !== undefined ? { tokenCount } : {}),
|
|
482
|
+
...(tokensPerSecond !== undefined ? { tokensPerSecond } : {}),
|
|
483
|
+
totalChunks: this.totalChunks,
|
|
484
|
+
toolCallCount: this.toolCalls.size,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
private handleReasoningStart(messageId?: string): void {
|
|
424
489
|
if (!this.showThinking) return;
|
|
425
|
-
|
|
426
|
-
|
|
490
|
+
// A reasoning block acts as a boundary: anonymous text arriving after it
|
|
491
|
+
// should be a new part, not appended to any pre-reasoning text.
|
|
492
|
+
this.activeTextMessageId = undefined;
|
|
493
|
+
const key = messageId ?? `__auto-reasoning-${++this.reasoningPartCounter}`;
|
|
494
|
+
if (!this.reasoningParts.has(key)) {
|
|
495
|
+
this.reasoningParts.set(key, "");
|
|
496
|
+
this.partOrder.push({ kind: "reasoning", key });
|
|
497
|
+
}
|
|
498
|
+
this.activeReasoningKey = key;
|
|
427
499
|
this.emit();
|
|
428
500
|
}
|
|
429
501
|
|
|
430
|
-
private handleReasoningContent(delta: string): void {
|
|
502
|
+
private handleReasoningContent(delta: string, messageId?: string): void {
|
|
431
503
|
if (!this.showThinking || !delta) return;
|
|
432
|
-
this.
|
|
433
|
-
|
|
504
|
+
if (!this.activeReasoningKey) {
|
|
505
|
+
// Content arrived without a preceding START — create the slot lazily.
|
|
506
|
+
this.handleReasoningStart(messageId);
|
|
507
|
+
}
|
|
508
|
+
const key = this.activeReasoningKey;
|
|
509
|
+
if (!key) return;
|
|
510
|
+
this.reasoningParts.set(key, (this.reasoningParts.get(key) ?? "") + delta);
|
|
434
511
|
this.emit();
|
|
435
512
|
}
|
|
436
513
|
|
|
437
514
|
private handleReasoningEnd(): void {
|
|
438
515
|
if (!this.showThinking) return;
|
|
516
|
+
this.activeReasoningKey = undefined;
|
|
439
517
|
this.emit();
|
|
440
518
|
}
|
|
441
|
-
|
|
442
|
-
private ensureReasoningPart(): void {
|
|
443
|
-
if (this.hasReasoningPart) return;
|
|
444
|
-
// ensure reasoning appears before the first text segment if possible
|
|
445
|
-
const textIndex = this.partOrder.findIndex((part) => part.kind === "text");
|
|
446
|
-
if (textIndex === -1) {
|
|
447
|
-
this.partOrder.push({ kind: "reasoning" });
|
|
448
|
-
} else {
|
|
449
|
-
this.partOrder.splice(textIndex, 0, { kind: "reasoning" });
|
|
450
|
-
}
|
|
451
|
-
this.hasReasoningPart = true;
|
|
452
|
-
}
|
|
453
519
|
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,4BAAyB;AAClD,YAAY,EAAE,oBAAoB,EAAE,4BAAyB;AAC7D,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,2BAAwB"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,4BAAyB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":""}
|