@assistant-ui/react-ai-sdk 1.3.26 → 1.3.27

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.
Files changed (102) hide show
  1. package/dist/frontendTools.d.ts +9 -5
  2. package/dist/frontendTools.d.ts.map +1 -1
  3. package/dist/frontendTools.js +36 -35
  4. package/dist/frontendTools.js.map +1 -1
  5. package/dist/index.d.ts +9 -11
  6. package/dist/index.js +9 -10
  7. package/dist/injectQuoteContext.d.ts +6 -2
  8. package/dist/injectQuoteContext.d.ts.map +1 -1
  9. package/dist/injectQuoteContext.js +46 -53
  10. package/dist/injectQuoteContext.js.map +1 -1
  11. package/dist/modelContentEnvelope.d.ts +12 -10
  12. package/dist/modelContentEnvelope.d.ts.map +1 -1
  13. package/dist/modelContentEnvelope.js +17 -15
  14. package/dist/modelContentEnvelope.js.map +1 -1
  15. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  16. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  17. package/dist/packages/assistant-stream/dist/core/AssistantStream.d.ts +1 -0
  18. package/dist/packages/assistant-stream/dist/core/AssistantStreamChunk.d.ts +1 -0
  19. package/dist/packages/assistant-stream/dist/core/accumulators/AssistantMessageStream.d.ts +1 -0
  20. package/dist/packages/assistant-stream/dist/core/accumulators/assistant-message-accumulator.d.ts +1 -0
  21. package/dist/packages/assistant-stream/dist/core/modules/assistant-stream.d.ts +1 -0
  22. package/dist/packages/assistant-stream/dist/core/modules/text.d.ts +1 -0
  23. package/dist/packages/assistant-stream/dist/core/modules/tool-call.d.ts +1 -0
  24. package/dist/packages/assistant-stream/dist/core/serialization/PlainText.d.ts +1 -0
  25. package/dist/packages/assistant-stream/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +1 -0
  26. package/dist/packages/assistant-stream/dist/core/serialization/data-stream/DataStream.d.ts +1 -0
  27. package/dist/packages/assistant-stream/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +1 -0
  28. package/dist/packages/assistant-stream/dist/core/tool/ToolExecutionStream.d.ts +1 -0
  29. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.d.ts +1 -0
  30. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js +50 -0
  31. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js.map +1 -0
  32. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts +43 -0
  33. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts.map +1 -0
  34. package/dist/packages/assistant-stream/dist/core/tool/toolResultStream.d.ts +1 -0
  35. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +1 -0
  36. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantTransformStream.d.ts +1 -0
  37. package/dist/packages/assistant-stream/dist/core/utils/types.d.ts +1 -0
  38. package/dist/packages/assistant-stream/dist/index.d.ts +1 -0
  39. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -0
  40. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -0
  41. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js +6 -0
  42. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -0
  43. package/dist/packages/assistant-stream/dist/resumable/index.d.ts +1 -0
  44. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts +10 -0
  45. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts.map +1 -0
  46. package/dist/packages/assistant-stream/dist/utils.d.ts +1 -0
  47. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts +8 -4
  48. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts.map +1 -1
  49. package/dist/ui/adapters/aiSDKFormatAdapter.js +24 -20
  50. package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
  51. package/dist/ui/getVercelAIMessages.d.ts +7 -3
  52. package/dist/ui/getVercelAIMessages.d.ts.map +1 -1
  53. package/dist/ui/getVercelAIMessages.js +7 -3
  54. package/dist/ui/getVercelAIMessages.js.map +1 -1
  55. package/dist/ui/resumable.d.ts +18 -15
  56. package/dist/ui/resumable.d.ts.map +1 -1
  57. package/dist/ui/resumable.js +21 -20
  58. package/dist/ui/resumable.js.map +1 -1
  59. package/dist/ui/use-chat/AssistantChatTransport.d.ts +17 -14
  60. package/dist/ui/use-chat/AssistantChatTransport.d.ts.map +1 -1
  61. package/dist/ui/use-chat/AssistantChatTransport.js +98 -108
  62. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  63. package/dist/ui/use-chat/useAISDKRuntime.d.ts +43 -33
  64. package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -1
  65. package/dist/ui/use-chat/useAISDKRuntime.js +176 -204
  66. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  67. package/dist/ui/use-chat/useChatRuntime.d.ts +19 -12
  68. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  69. package/dist/ui/use-chat/useChatRuntime.js +60 -81
  70. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  71. package/dist/ui/use-chat/useExternalHistory.d.ts +8 -4
  72. package/dist/ui/use-chat/useExternalHistory.d.ts.map +1 -1
  73. package/dist/ui/use-chat/useExternalHistory.js +178 -200
  74. package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
  75. package/dist/ui/use-chat/useStreamingTiming.d.ts +7 -3
  76. package/dist/ui/use-chat/useStreamingTiming.d.ts.map +1 -1
  77. package/dist/ui/use-chat/useStreamingTiming.js +60 -75
  78. package/dist/ui/use-chat/useStreamingTiming.js.map +1 -1
  79. package/dist/ui/utils/convertMessage.d.ts +29 -20
  80. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  81. package/dist/ui/utils/convertMessage.js +219 -299
  82. package/dist/ui/utils/convertMessage.js.map +1 -1
  83. package/dist/ui/utils/sliceMessagesUntil.d.ts +6 -2
  84. package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -1
  85. package/dist/ui/utils/sliceMessagesUntil.js +10 -10
  86. package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
  87. package/dist/ui/utils/toCreateMessage.d.ts +7 -3
  88. package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
  89. package/dist/ui/utils/toCreateMessage.js +34 -38
  90. package/dist/ui/utils/toCreateMessage.js.map +1 -1
  91. package/dist/ui/utils/vercelAttachmentAdapter.d.ts +6 -2
  92. package/dist/ui/utils/vercelAttachmentAdapter.d.ts.map +1 -1
  93. package/dist/ui/utils/vercelAttachmentAdapter.js +37 -35
  94. package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
  95. package/dist/usage.d.ts +15 -12
  96. package/dist/usage.d.ts.map +1 -1
  97. package/dist/usage.js +80 -99
  98. package/dist/usage.js.map +1 -1
  99. package/package.json +11 -11
  100. package/src/ui/use-chat/useAISDKRuntime.test.ts +2 -2
  101. package/dist/index.d.ts.map +0 -1
  102. package/dist/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useExternalHistory.js","sourceRoot":"","sources":["../../../src/ui/use-chat/useExternalHistory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useExternalHistory.js","names":[],"sources":["../../../src/ui/use-chat/useExternalHistory.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n AssistantRuntime,\n ThreadHistoryAdapter,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatRepository,\n ExportedMessageRepository,\n} from \"@assistant-ui/core\";\nimport { getExternalStoreMessages } from \"@assistant-ui/core\";\nimport { MessageRepository } from \"@assistant-ui/core/internal\";\nimport { useAui } from \"@assistant-ui/store\";\nimport {\n useRef,\n useEffect,\n useState,\n type RefObject,\n useCallback,\n useMemo,\n} from \"react\";\n\nexport const toExportedMessageRepository = <TMessage>(\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n messages: MessageFormatRepository<TMessage>,\n): ExportedMessageRepository => {\n return {\n headId: messages.headId!,\n messages: messages.messages.map((m) => {\n const message = toThreadMessages([m.message])[0]!;\n return {\n ...m,\n message,\n };\n }),\n };\n};\n\nexport const useExternalHistory = <TMessage>(\n runtimeRef: RefObject<AssistantRuntime>,\n historyAdapter: ThreadHistoryAdapter | undefined,\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n onSetMessages: (messages: TMessage[]) => void,\n) => {\n const loadedRef = useRef(false);\n\n const aui = useAui();\n const optionalThreadListItem = useCallback(\n () => (aui.threadListItem.source ? aui.threadListItem() : null),\n [aui],\n );\n\n const [isLoading, setIsLoading] = useState(false);\n\n const historyIds = useRef(new Set<string>());\n\n const onSetMessagesRef = useRef(onSetMessages);\n useEffect(() => {\n onSetMessagesRef.current = onSetMessages;\n });\n\n const formatAdapter = useMemo(() => {\n if (!historyAdapter) return undefined;\n if (!historyAdapter.withFormat) {\n throw new Error(\n \"useAISDKRuntime: ThreadHistoryAdapter is missing the required `withFormat` method.\",\n );\n }\n return historyAdapter.withFormat<TMessage, any>(storageFormatAdapter);\n }, [historyAdapter, storageFormatAdapter]);\n\n useEffect(() => {\n if (!formatAdapter || loadedRef.current) return;\n\n const loadHistory = async () => {\n setIsLoading(true);\n try {\n const repo = await formatAdapter.load();\n if (repo && repo.messages.length > 0) {\n const converted = toExportedMessageRepository(toThreadMessages, repo);\n runtimeRef.current.thread.import(converted);\n\n const tempRepo = new MessageRepository();\n tempRepo.import(converted);\n const messages = tempRepo.getMessages();\n\n onSetMessagesRef.current(\n messages.flatMap(getExternalStoreMessages<TMessage>),\n );\n\n historyIds.current = new Set(\n converted.messages.map((m) => m.message.id),\n );\n }\n } catch (error) {\n console.error(\"Failed to load message history:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n loadedRef.current = true;\n\n if (!optionalThreadListItem()?.getState().remoteId) {\n setIsLoading(false);\n return;\n }\n\n loadHistory();\n }, [formatAdapter, toThreadMessages, runtimeRef, optionalThreadListItem]);\n\n const runStartRef = useRef<number | null>(null);\n const persistTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stepBoundariesRef = useRef<number[]>([]);\n const wasRunningRef = useRef(false);\n const toolCallCountRef = useRef(0);\n\n useEffect(() => {\n if (!formatAdapter) return;\n\n const unsubscribe = runtimeRef.current.thread.subscribe(() => {\n const { isRunning } = runtimeRef.current.thread.getState();\n const wasRunning = wasRunningRef.current;\n wasRunningRef.current = isRunning;\n\n // Track step boundaries by content changes (more reliable than isRunning)\n if (runStartRef.current != null) {\n const lastMsg = runtimeRef.current.thread.getState().messages.at(-1);\n if (lastMsg?.role === \"assistant\") {\n const currentToolCallCount = lastMsg.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n while (toolCallCountRef.current < currentToolCallCount) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n toolCallCountRef.current++;\n }\n }\n }\n\n if (isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n }\n // Cancel any pending persist — isRunning went back to true\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n }\n return;\n }\n\n // Only act on the true→false transition\n if (!wasRunning) return;\n\n // Record step boundary offset (synchronous for accuracy)\n if (runStartRef.current != null) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n }\n\n // Debounce: wait one macrotask so agentic step flickers are absorbed\n if (persistTimerRef.current) clearTimeout(persistTimerRef.current);\n persistTimerRef.current = setTimeout(async () => {\n persistTimerRef.current = null;\n\n // Re-read latest state — may have changed since the timeout was scheduled\n const latest = runtimeRef.current.thread.getState();\n if (latest.isRunning) return; // was just a flicker\n\n // Derive durationMs from the last boundary (covers all steps)\n const boundaries = stepBoundariesRef.current;\n const durationMs =\n boundaries.length > 0 ? boundaries.at(-1) : undefined;\n\n // Fallback: if only 1 boundary but message has multiple steps, distribute evenly\n if (boundaries.length === 1 && durationMs != null) {\n const lastAssistant = latest.messages.findLast(\n (m) => m.role === \"assistant\",\n );\n if (lastAssistant) {\n const tcCount = lastAssistant.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n if (tcCount > 0) {\n const totalSteps = tcCount + 1;\n const stepDur = durationMs / totalSteps;\n boundaries.length = 0;\n for (let i = 0; i < totalSteps; i++) {\n boundaries.push(Math.round((i + 1) * stepDur));\n }\n }\n }\n }\n\n // Build per-step timestamps when there are multiple steps\n const stepTimestamps =\n boundaries.length > 1\n ? boundaries.map((endMs, i) => ({\n start_ms: i === 0 ? 0 : boundaries[i - 1]!,\n end_ms: endMs,\n }))\n : undefined;\n\n runStartRef.current = null;\n stepBoundariesRef.current = [];\n\n const telemetryOptions = {\n ...(durationMs != null ? { durationMs } : undefined),\n ...(stepTimestamps != null ? { stepTimestamps } : undefined),\n };\n\n const { messages } = latest;\n let lastInnerMessageId: string | null = null;\n\n const getLastInnerId = (msgs: TMessage[]): string | null =>\n msgs.length > 0 ? storageFormatAdapter.getId(msgs.at(-1)!) : null;\n\n const toBatchItems = (msgs: TMessage[]) =>\n msgs.map((msg, idx) => ({\n parentId:\n idx === 0\n ? lastInnerMessageId\n : storageFormatAdapter.getId(msgs[idx - 1]!),\n message: msg,\n }));\n\n for (const message of messages) {\n const innerMessages = getExternalStoreMessages<TMessage>(message);\n\n const isReady =\n message.status === undefined ||\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\";\n\n if (!isReady) {\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n continue;\n }\n\n if (historyIds.current.has(message.id)) {\n if (durationMs !== undefined) {\n let parentId = lastInnerMessageId;\n for (const innerMessage of innerMessages) {\n try {\n await formatAdapter.update?.(\n { parentId, message: innerMessage },\n storageFormatAdapter.getId(innerMessage),\n );\n } catch {\n // ignore update failures to avoid breaking the message processing loop\n }\n parentId = storageFormatAdapter.getId(innerMessage);\n }\n }\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n continue;\n }\n historyIds.current.add(message.id);\n\n const batchItems = toBatchItems(innerMessages);\n for (const item of batchItems) {\n await formatAdapter.append(item);\n }\n\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n\n formatAdapter.reportTelemetry?.(batchItems, telemetryOptions);\n }\n }, 0);\n });\n\n return () => {\n unsubscribe();\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n }\n };\n }, [formatAdapter, storageFormatAdapter, runtimeRef]);\n\n return isLoading;\n};\n"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
- import type { UIMessage } from "@ai-sdk/react";
2
- import type { MessageTiming } from "@assistant-ui/core";
1
+ import { MessageTiming } from "@assistant-ui/core";
2
+ import { UIMessage } from "@ai-sdk/react";
3
+
4
+ //#region src/ui/use-chat/useStreamingTiming.d.ts
3
5
  /**
4
6
  * Tracks streaming timing for AI SDK messages client-side.
5
7
  *
@@ -7,5 +9,7 @@ import type { MessageTiming } from "@assistant-ui/core";
7
9
  * timing metrics (TTFT, duration, tok/s). Timing is finalized when
8
10
  * streaming ends and stored per message ID.
9
11
  */
10
- export declare const useStreamingTiming: (messages: UIMessage[], isRunning: boolean) => Record<string, MessageTiming>;
12
+ declare const useStreamingTiming: (messages: UIMessage[], isRunning: boolean) => Record<string, MessageTiming>;
13
+ //#endregion
14
+ export { useStreamingTiming };
11
15
  //# sourceMappingURL=useStreamingTiming.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStreamingTiming.d.ts","sourceRoot":"","sources":["../../../src/ui/use-chat/useStreamingTiming.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA4BxD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,SAAS,EAAE,EACrB,WAAW,OAAO,KACjB,MAAM,CAAC,MAAM,EAAE,aAAa,CA0D9B,CAAC"}
1
+ {"version":3,"file":"useStreamingTiming.d.ts","names":[],"sources":["../../../src/ui/use-chat/useStreamingTiming.ts"],"mappings":";;;;;;AAwCA;;;;;cAAa,kBAAA,GACX,QAAA,EAAU,SAAA,IACV,SAAA,cACC,MAAA,SAAe,aAAA"}
@@ -1,84 +1,69 @@
1
1
  "use client";
2
- import { useEffect, useRef, useState } from "react";
3
2
  import { isToolUIPart } from "ai";
3
+ import { useEffect, useRef, useState } from "react";
4
+ //#region src/ui/use-chat/useStreamingTiming.ts
4
5
  function getTextLength(message) {
5
- if (!message?.parts)
6
- return 0;
7
- let len = 0;
8
- for (const part of message.parts) {
9
- if (part.type === "text")
10
- len += part.text.length;
11
- }
12
- return len;
6
+ if (!message?.parts) return 0;
7
+ let len = 0;
8
+ for (const part of message.parts) if (part.type === "text") len += part.text.length;
9
+ return len;
13
10
  }
14
11
  function getToolCallCount(message) {
15
- if (!message?.parts)
16
- return 0;
17
- let count = 0;
18
- for (const part of message.parts) {
19
- if (isToolUIPart(part))
20
- count++;
21
- }
22
- return count;
12
+ if (!message?.parts) return 0;
13
+ let count = 0;
14
+ for (const part of message.parts) if (isToolUIPart(part)) count++;
15
+ return count;
23
16
  }
24
17
  /**
25
- * Tracks streaming timing for AI SDK messages client-side.
26
- *
27
- * Observes `isRunning` transitions and content changes to estimate
28
- * timing metrics (TTFT, duration, tok/s). Timing is finalized when
29
- * streaming ends and stored per message ID.
30
- */
31
- export const useStreamingTiming = (messages, isRunning) => {
32
- const [timings, setTimings] = useState({});
33
- const trackRef = useRef(null);
34
- useEffect(() => {
35
- const lastAssistant = messages.findLast((m) => m.role === "assistant");
36
- if (isRunning && lastAssistant) {
37
- // Start tracking if not already or if message changed
38
- if (!trackRef.current ||
39
- trackRef.current.messageId !== lastAssistant.id) {
40
- trackRef.current = {
41
- messageId: lastAssistant.id,
42
- startTime: Date.now(),
43
- lastContentLength: 0,
44
- totalChunks: 0,
45
- };
46
- }
47
- // Track content changes
48
- const t = trackRef.current;
49
- const len = getTextLength(lastAssistant);
50
- if (len > t.lastContentLength) {
51
- if (t.firstTokenTime === undefined) {
52
- t.firstTokenTime = Date.now() - t.startTime;
53
- }
54
- t.totalChunks++;
55
- t.lastContentLength = len;
56
- }
57
- }
58
- else if (!isRunning && trackRef.current) {
59
- // Streaming ended — finalize timing
60
- const t = trackRef.current;
61
- const totalStreamTime = Date.now() - t.startTime;
62
- const tokenCount = Math.ceil(t.lastContentLength / 4);
63
- const toolCallCount = getToolCallCount(lastAssistant);
64
- const timing = {
65
- streamStartTime: t.startTime,
66
- totalStreamTime,
67
- totalChunks: t.totalChunks,
68
- toolCallCount,
69
- ...(t.firstTokenTime !== undefined && {
70
- firstTokenTime: t.firstTokenTime,
71
- }),
72
- ...(tokenCount > 0 && { tokenCount }),
73
- ...(totalStreamTime > 0 &&
74
- tokenCount > 0 && {
75
- tokensPerSecond: tokenCount / (totalStreamTime / 1000),
76
- }),
77
- };
78
- setTimings((prev) => ({ ...prev, [t.messageId]: timing }));
79
- trackRef.current = null;
80
- }
81
- }, [messages, isRunning]);
82
- return timings;
18
+ * Tracks streaming timing for AI SDK messages client-side.
19
+ *
20
+ * Observes `isRunning` transitions and content changes to estimate
21
+ * timing metrics (TTFT, duration, tok/s). Timing is finalized when
22
+ * streaming ends and stored per message ID.
23
+ */
24
+ const useStreamingTiming = (messages, isRunning) => {
25
+ const [timings, setTimings] = useState({});
26
+ const trackRef = useRef(null);
27
+ useEffect(() => {
28
+ const lastAssistant = messages.findLast((m) => m.role === "assistant");
29
+ if (isRunning && lastAssistant) {
30
+ if (!trackRef.current || trackRef.current.messageId !== lastAssistant.id) trackRef.current = {
31
+ messageId: lastAssistant.id,
32
+ startTime: Date.now(),
33
+ lastContentLength: 0,
34
+ totalChunks: 0
35
+ };
36
+ const t = trackRef.current;
37
+ const len = getTextLength(lastAssistant);
38
+ if (len > t.lastContentLength) {
39
+ if (t.firstTokenTime === void 0) t.firstTokenTime = Date.now() - t.startTime;
40
+ t.totalChunks++;
41
+ t.lastContentLength = len;
42
+ }
43
+ } else if (!isRunning && trackRef.current) {
44
+ const t = trackRef.current;
45
+ const totalStreamTime = Date.now() - t.startTime;
46
+ const tokenCount = Math.ceil(t.lastContentLength / 4);
47
+ const toolCallCount = getToolCallCount(lastAssistant);
48
+ const timing = {
49
+ streamStartTime: t.startTime,
50
+ totalStreamTime,
51
+ totalChunks: t.totalChunks,
52
+ toolCallCount,
53
+ ...t.firstTokenTime !== void 0 && { firstTokenTime: t.firstTokenTime },
54
+ ...tokenCount > 0 && { tokenCount },
55
+ ...totalStreamTime > 0 && tokenCount > 0 && { tokensPerSecond: tokenCount / (totalStreamTime / 1e3) }
56
+ };
57
+ setTimings((prev) => ({
58
+ ...prev,
59
+ [t.messageId]: timing
60
+ }));
61
+ trackRef.current = null;
62
+ }
63
+ }, [messages, isRunning]);
64
+ return timings;
83
65
  };
66
+ //#endregion
67
+ export { useStreamingTiming };
68
+
84
69
  //# sourceMappingURL=useStreamingTiming.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStreamingTiming.js","sourceRoot":"","sources":["../../../src/ui/use-chat/useStreamingTiming.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useStreamingTiming.js","names":[],"sources":["../../../src/ui/use-chat/useStreamingTiming.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { UIMessage } from \"@ai-sdk/react\";\nimport { isToolUIPart } from \"ai\";\nimport type { MessageTiming } from \"@assistant-ui/core\";\n\ntype TrackingState = {\n messageId: string;\n startTime: number;\n firstTokenTime?: number;\n lastContentLength: number;\n totalChunks: number;\n};\n\nfunction getTextLength(message: UIMessage | undefined): number {\n if (!message?.parts) return 0;\n let len = 0;\n for (const part of message.parts) {\n if (part.type === \"text\") len += part.text.length;\n }\n return len;\n}\n\nfunction getToolCallCount(message: UIMessage | undefined): number {\n if (!message?.parts) return 0;\n let count = 0;\n for (const part of message.parts) {\n if (isToolUIPart(part)) count++;\n }\n return count;\n}\n\n/**\n * Tracks streaming timing for AI SDK messages client-side.\n *\n * Observes `isRunning` transitions and content changes to estimate\n * timing metrics (TTFT, duration, tok/s). Timing is finalized when\n * streaming ends and stored per message ID.\n */\nexport const useStreamingTiming = (\n messages: UIMessage[],\n isRunning: boolean,\n): Record<string, MessageTiming> => {\n const [timings, setTimings] = useState<Record<string, MessageTiming>>({});\n const trackRef = useRef<TrackingState | null>(null);\n\n useEffect(() => {\n const lastAssistant = messages.findLast((m) => m.role === \"assistant\");\n\n if (isRunning && lastAssistant) {\n // Start tracking if not already or if message changed\n if (\n !trackRef.current ||\n trackRef.current.messageId !== lastAssistant.id\n ) {\n trackRef.current = {\n messageId: lastAssistant.id,\n startTime: Date.now(),\n lastContentLength: 0,\n totalChunks: 0,\n };\n }\n\n // Track content changes\n const t = trackRef.current;\n const len = getTextLength(lastAssistant);\n if (len > t.lastContentLength) {\n if (t.firstTokenTime === undefined) {\n t.firstTokenTime = Date.now() - t.startTime;\n }\n t.totalChunks++;\n t.lastContentLength = len;\n }\n } else if (!isRunning && trackRef.current) {\n // Streaming ended — finalize timing\n const t = trackRef.current;\n const totalStreamTime = Date.now() - t.startTime;\n const tokenCount = Math.ceil(t.lastContentLength / 4);\n const toolCallCount = getToolCallCount(lastAssistant);\n\n const timing: MessageTiming = {\n streamStartTime: t.startTime,\n totalStreamTime,\n totalChunks: t.totalChunks,\n toolCallCount,\n ...(t.firstTokenTime !== undefined && {\n firstTokenTime: t.firstTokenTime,\n }),\n ...(tokenCount > 0 && { tokenCount }),\n ...(totalStreamTime > 0 &&\n tokenCount > 0 && {\n tokensPerSecond: tokenCount / (totalStreamTime / 1000),\n }),\n };\n setTimings((prev) => ({ ...prev, [t.messageId]: timing }));\n trackRef.current = null;\n }\n }, [messages, isRunning]);\n\n return timings;\n};\n"],"mappings":";;;;AAeA,SAAS,cAAc,SAAwC;CAC7D,IAAI,CAAC,SAAS,OAAO,OAAO;CAC5B,IAAI,MAAM;CACV,KAAK,MAAM,QAAQ,QAAQ,OACzB,IAAI,KAAK,SAAS,QAAQ,OAAO,KAAK,KAAK;CAE7C,OAAO;AACT;AAEA,SAAS,iBAAiB,SAAwC;CAChE,IAAI,CAAC,SAAS,OAAO,OAAO;CAC5B,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,QAAQ,OACzB,IAAI,aAAa,IAAI,GAAG;CAE1B,OAAO;AACT;;;;;;;;AASA,MAAa,sBACX,UACA,cACkC;CAClC,MAAM,CAAC,SAAS,cAAc,SAAwC,CAAC,CAAC;CACxE,MAAM,WAAW,OAA6B,IAAI;CAElD,gBAAgB;EACd,MAAM,gBAAgB,SAAS,UAAU,MAAM,EAAE,SAAS,WAAW;EAErE,IAAI,aAAa,eAAe;GAE9B,IACE,CAAC,SAAS,WACV,SAAS,QAAQ,cAAc,cAAc,IAE7C,SAAS,UAAU;IACjB,WAAW,cAAc;IACzB,WAAW,KAAK,IAAI;IACpB,mBAAmB;IACnB,aAAa;GACf;GAIF,MAAM,IAAI,SAAS;GACnB,MAAM,MAAM,cAAc,aAAa;GACvC,IAAI,MAAM,EAAE,mBAAmB;IAC7B,IAAI,EAAE,mBAAmB,KAAA,GACvB,EAAE,iBAAiB,KAAK,IAAI,IAAI,EAAE;IAEpC,EAAE;IACF,EAAE,oBAAoB;GACxB;EACF,OAAO,IAAI,CAAC,aAAa,SAAS,SAAS;GAEzC,MAAM,IAAI,SAAS;GACnB,MAAM,kBAAkB,KAAK,IAAI,IAAI,EAAE;GACvC,MAAM,aAAa,KAAK,KAAK,EAAE,oBAAoB,CAAC;GACpD,MAAM,gBAAgB,iBAAiB,aAAa;GAEpD,MAAM,SAAwB;IAC5B,iBAAiB,EAAE;IACnB;IACA,aAAa,EAAE;IACf;IACA,GAAI,EAAE,mBAAmB,KAAA,KAAa,EACpC,gBAAgB,EAAE,eACpB;IACA,GAAI,aAAa,KAAK,EAAE,WAAW;IACnC,GAAI,kBAAkB,KACpB,aAAa,KAAK,EAChB,iBAAiB,cAAc,kBAAkB,KACnD;GACJ;GACA,YAAY,UAAU;IAAE,GAAG;KAAO,EAAE,YAAY;GAAO,EAAE;GACzD,SAAS,UAAU;EACrB;CACF,GAAG,CAAC,UAAU,SAAS,CAAC;CAExB,OAAO;AACT"}
@@ -1,23 +1,32 @@
1
- import { type UIMessage } from "ai";
2
- import { type useExternalMessageConverter } from "@assistant-ui/core/react";
3
- import { type McpAppMetadata } from "@assistant-ui/core";
4
- import type { ReadonlyJSONObject } from "assistant-stream/utils";
5
- export type AISDKMessageConverterMetadata = useExternalMessageConverter.Metadata & {
6
- toolArgsKeyOrderCache?: Map<string, Map<string, string[]>>;
7
- toolLastInputCache?: Map<string, ReadonlyJSONObject>;
8
- mcpAppMetadataCache?: Map<string, McpAppMetadata>;
1
+ import { ReadonlyJSONObject } from "../../packages/assistant-stream/dist/utils/json/json-value.js";
2
+ import { UIMessage } from "ai";
3
+ import { useExternalMessageConverter } from "@assistant-ui/core/react";
4
+ import { McpAppMetadata } from "@assistant-ui/core";
5
+
6
+ //#region src/ui/utils/convertMessage.d.ts
7
+ type AISDKMessageConverterMetadata = useExternalMessageConverter.Metadata & {
8
+ toolArgsKeyOrderCache?: Map<string, Map<string, string[]>>;
9
+ toolLastInputCache?: Map<string, ReadonlyJSONObject>;
10
+ mcpAppMetadataCache?: Map<string, McpAppMetadata>;
9
11
  };
10
- export declare const AISDKMessageConverter: {
11
- useThreadMessages: ({ messages, isRunning, joinStrategy, metadata, }: {
12
- messages: UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[];
13
- isRunning: boolean;
14
- joinStrategy?: "concat-content" | "none" | undefined;
15
- metadata?: useExternalMessageConverter.Metadata;
16
- }) => import("@assistant-ui/core").ThreadMessage[];
17
- toThreadMessages: (messages: UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[], isRunning?: boolean, metadata?: useExternalMessageConverter.Metadata) => import("@assistant-ui/core").ThreadMessage[];
18
- toOriginalMessages: (input: import("@assistant-ui/core").ThreadState | import("@assistant-ui/core").ThreadMessage | import("@assistant-ui/core").ThreadMessage["content"][number]) => unknown[];
19
- toOriginalMessage: (input: import("@assistant-ui/core").ThreadState | import("@assistant-ui/core").ThreadMessage | import("@assistant-ui/core").ThreadMessage["content"][number]) => {};
20
- useOriginalMessage: () => {};
21
- useOriginalMessages: () => unknown[];
12
+ declare const AISDKMessageConverter: {
13
+ useThreadMessages: ({
14
+ messages,
15
+ isRunning,
16
+ joinStrategy,
17
+ metadata
18
+ }: {
19
+ messages: UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[];
20
+ isRunning: boolean;
21
+ joinStrategy?: "concat-content" | "none" | undefined;
22
+ metadata?: useExternalMessageConverter.Metadata;
23
+ }) => import("@assistant-ui/core").ThreadMessage[];
24
+ toThreadMessages: (messages: UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[], isRunning?: boolean, metadata?: useExternalMessageConverter.Metadata) => import("@assistant-ui/core").ThreadMessage[];
25
+ toOriginalMessages: (input: import("@assistant-ui/core").ThreadState | import("@assistant-ui/core").ThreadMessage | import("@assistant-ui/core").ThreadMessage["content"][number]) => unknown[];
26
+ toOriginalMessage: (input: import("@assistant-ui/core").ThreadState | import("@assistant-ui/core").ThreadMessage | import("@assistant-ui/core").ThreadMessage["content"][number]) => {};
27
+ useOriginalMessage: () => {};
28
+ useOriginalMessages: () => unknown[];
22
29
  };
30
+ //#endregion
31
+ export { AISDKMessageConverter, AISDKMessageConverterMetadata };
23
32
  //# sourceMappingURL=convertMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/D,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAUL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAIjE,MAAM,MAAM,6BAA6B,GACvC,2BAA2B,CAAC,QAAQ,GAAG;IACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACrD,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACnD,CAAC;AAsUJ,eAAO,MAAM,qBAAqB;;;;;;;;wHAzUd,qDAAyB;uHAEtC,qDAAyB;;;CAiY/B,CAAC"}
1
+ {"version":3,"file":"convertMessage.d.ts","names":[],"sources":["../../../src/ui/utils/convertMessage.ts"],"mappings":";;;;;;KAqBY,6BAAA,GACV,2BAAA,CAA4B,QAAA;EAC1B,qBAAA,GAAwB,GAAA,SAAY,GAAA;EACpC,kBAAA,GAAqB,GAAA,SAAY,kBAAA;EACjC,mBAAA,GAAsB,GAAA,SAAY,cAAA;AAAA;AAAA,cAuUzB,qBAAA;;;;;;;;;;;;;mJAzUyC,aAAA;kJAEf,aAAA"}