@convex-dev/agent 0.6.3 → 0.7.0-alpha.0

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 (246) hide show
  1. package/MIGRATION.md +60 -116
  2. package/dist/client/messages.d.ts +1 -398
  3. package/dist/client/messages.d.ts.map +1 -1
  4. package/dist/client/messages.js +3 -47
  5. package/dist/client/messages.js.map +1 -1
  6. package/dist/client/types.d.ts +1 -455
  7. package/dist/client/types.d.ts.map +1 -1
  8. package/dist/component/_generated/component.d.ts +805 -45
  9. package/dist/component/_generated/component.d.ts.map +1 -1
  10. package/dist/component/apiKeys.js +5 -5
  11. package/dist/component/apiKeys.js.map +1 -1
  12. package/dist/component/files.d.ts.map +1 -1
  13. package/dist/component/files.js +13 -11
  14. package/dist/component/files.js.map +1 -1
  15. package/dist/component/messages.d.ts +1252 -201
  16. package/dist/component/messages.d.ts.map +1 -1
  17. package/dist/component/messages.js +83 -47
  18. package/dist/component/messages.js.map +1 -1
  19. package/dist/component/schema.d.ts +2593 -332
  20. package/dist/component/schema.d.ts.map +1 -1
  21. package/dist/component/streams.d.ts +7 -1
  22. package/dist/component/streams.d.ts.map +1 -1
  23. package/dist/component/streams.js +46 -47
  24. package/dist/component/streams.js.map +1 -1
  25. package/dist/component/threads.d.ts.map +1 -1
  26. package/dist/component/threads.js +8 -9
  27. package/dist/component/threads.js.map +1 -1
  28. package/dist/component/users.js +2 -2
  29. package/dist/component/users.js.map +1 -1
  30. package/dist/component/vector/index.d.ts.map +1 -1
  31. package/dist/component/vector/index.js +14 -8
  32. package/dist/component/vector/index.js.map +1 -1
  33. package/dist/react/index.d.ts +5 -5
  34. package/dist/react/index.d.ts.map +1 -1
  35. package/dist/react/index.js +5 -5
  36. package/dist/react/index.js.map +1 -1
  37. package/dist/shared.d.ts +19 -7
  38. package/dist/shared.d.ts.map +1 -1
  39. package/dist/shared.js +4 -4
  40. package/dist/shared.js.map +1 -1
  41. package/dist/streaming/materializePersistedUIMessageChunks.d.ts +16 -0
  42. package/dist/streaming/materializePersistedUIMessageChunks.d.ts.map +1 -0
  43. package/dist/streaming/materializePersistedUIMessageChunks.js +302 -0
  44. package/dist/streaming/materializePersistedUIMessageChunks.js.map +1 -0
  45. package/dist/streaming/persistedUIMessageChunks.d.ts +106 -0
  46. package/dist/streaming/persistedUIMessageChunks.d.ts.map +1 -0
  47. package/dist/streaming/persistedUIMessageChunks.js +475 -0
  48. package/dist/streaming/persistedUIMessageChunks.js.map +1 -0
  49. package/dist/validators.d.ts +10026 -1055
  50. package/dist/validators.d.ts.map +1 -1
  51. package/dist/validators.js +71 -9
  52. package/dist/validators.js.map +1 -1
  53. package/dist/{UIMessages.d.ts → vercel/UIMessages.d.ts} +1 -1
  54. package/dist/vercel/UIMessages.d.ts.map +1 -0
  55. package/dist/{UIMessages.js → vercel/UIMessages.js} +63 -1
  56. package/dist/vercel/UIMessages.js.map +1 -0
  57. package/dist/{client → vercel/client}/createTool.d.ts +23 -16
  58. package/dist/vercel/client/createTool.d.ts.map +1 -0
  59. package/dist/{client → vercel/client}/createTool.js +2 -0
  60. package/dist/vercel/client/createTool.js.map +1 -0
  61. package/dist/{client → vercel/client}/definePlaygroundAPI.d.ts +593 -134
  62. package/dist/{client → vercel/client}/definePlaygroundAPI.d.ts.map +1 -1
  63. package/dist/{client → vercel/client}/definePlaygroundAPI.js +13 -9
  64. package/dist/vercel/client/definePlaygroundAPI.js.map +1 -0
  65. package/dist/{client → vercel/client}/files.d.ts +2 -2
  66. package/dist/vercel/client/files.d.ts.map +1 -0
  67. package/dist/vercel/client/files.js.map +1 -0
  68. package/dist/vercel/client/messages.d.ts +542 -0
  69. package/dist/vercel/client/messages.d.ts.map +1 -0
  70. package/dist/vercel/client/messages.js +66 -0
  71. package/dist/vercel/client/messages.js.map +1 -0
  72. package/dist/{client → vercel/client}/mockModel.d.ts +17 -17
  73. package/dist/vercel/client/mockModel.d.ts.map +1 -0
  74. package/dist/{client → vercel/client}/mockModel.js +12 -13
  75. package/dist/vercel/client/mockModel.js.map +1 -0
  76. package/dist/{client → vercel/client}/saveInputMessages.d.ts +2 -2
  77. package/dist/vercel/client/saveInputMessages.d.ts.map +1 -0
  78. package/dist/vercel/client/saveInputMessages.js.map +1 -0
  79. package/dist/{client → vercel/client}/search.d.ts +119 -22
  80. package/dist/vercel/client/search.d.ts.map +1 -0
  81. package/dist/{client → vercel/client}/search.js +2 -2
  82. package/dist/vercel/client/search.js.map +1 -0
  83. package/dist/{client → vercel/client}/start.d.ts +26 -11
  84. package/dist/vercel/client/start.d.ts.map +1 -0
  85. package/dist/{client → vercel/client}/start.js +64 -22
  86. package/dist/vercel/client/start.js.map +1 -0
  87. package/dist/{client → vercel/client}/streamText.d.ts +13 -12
  88. package/dist/vercel/client/streamText.d.ts.map +1 -0
  89. package/dist/{client → vercel/client}/streamText.js +43 -9
  90. package/dist/vercel/client/streamText.js.map +1 -0
  91. package/dist/{client → vercel/client}/streaming.d.ts +1410 -183
  92. package/dist/vercel/client/streaming.d.ts.map +1 -0
  93. package/dist/{client → vercel/client}/streaming.js +120 -52
  94. package/dist/vercel/client/streaming.js.map +1 -0
  95. package/dist/vercel/client/types.d.ts +456 -0
  96. package/dist/vercel/client/types.d.ts.map +1 -0
  97. package/dist/vercel/client/types.js +3 -0
  98. package/dist/vercel/client/types.js.map +1 -0
  99. package/dist/{client → vercel/client}/utils.d.ts +3 -2
  100. package/dist/vercel/client/utils.d.ts.map +1 -0
  101. package/dist/{client → vercel/client}/utils.js +2 -2
  102. package/dist/vercel/client/utils.js.map +1 -0
  103. package/dist/vercel/deltas.d.ts +31 -0
  104. package/dist/vercel/deltas.d.ts.map +1 -0
  105. package/dist/vercel/deltas.js +525 -0
  106. package/dist/vercel/deltas.js.map +1 -0
  107. package/dist/{client → vercel}/index.d.ts +484 -97
  108. package/dist/vercel/index.d.ts.map +1 -0
  109. package/dist/{client → vercel}/index.js +65 -38
  110. package/dist/vercel/index.js.map +1 -0
  111. package/dist/{mapping.d.ts → vercel/mapping.d.ts} +5 -13
  112. package/dist/vercel/mapping.d.ts.map +1 -0
  113. package/dist/{mapping.js → vercel/mapping.js} +411 -112
  114. package/dist/vercel/mapping.js.map +1 -0
  115. package/dist/{react → vercel/react}/optimisticallySendMessage.d.ts +2 -2
  116. package/dist/vercel/react/optimisticallySendMessage.d.ts.map +1 -0
  117. package/dist/vercel/react/optimisticallySendMessage.js.map +1 -0
  118. package/dist/{react → vercel/react}/types.d.ts +1 -1
  119. package/dist/vercel/react/types.d.ts.map +1 -0
  120. package/dist/{react → vercel/react}/types.js.map +1 -1
  121. package/dist/{react → vercel/react}/useDeltaStreams.d.ts +1 -1
  122. package/dist/vercel/react/useDeltaStreams.d.ts.map +1 -0
  123. package/dist/{react → vercel/react}/useDeltaStreams.js +1 -1
  124. package/dist/vercel/react/useDeltaStreams.js.map +1 -0
  125. package/dist/{react → vercel/react}/useStreamingUIMessages.d.ts +1 -1
  126. package/dist/vercel/react/useStreamingUIMessages.d.ts.map +1 -0
  127. package/dist/vercel/react/useStreamingUIMessages.js +112 -0
  128. package/dist/vercel/react/useStreamingUIMessages.js.map +1 -0
  129. package/dist/{react → vercel/react}/useThreadMessages.d.ts +1 -1
  130. package/dist/vercel/react/useThreadMessages.d.ts.map +1 -0
  131. package/dist/{react → vercel/react}/useThreadMessages.js +1 -1
  132. package/dist/vercel/react/useThreadMessages.js.map +1 -0
  133. package/dist/{react → vercel/react}/useUIMessages.d.ts +2 -1
  134. package/dist/vercel/react/useUIMessages.d.ts.map +1 -0
  135. package/dist/{react → vercel/react}/useUIMessages.js +8 -4
  136. package/dist/vercel/react/useUIMessages.js.map +1 -0
  137. package/package.json +30 -22
  138. package/src/client/messages.ts +5 -107
  139. package/src/client/types.ts +0 -621
  140. package/src/component/_generated/component.ts +1089 -48
  141. package/src/component/apiKeys.ts +5 -5
  142. package/src/component/files.test.ts +1 -1
  143. package/src/component/files.ts +14 -12
  144. package/src/component/messages.test.ts +273 -1
  145. package/src/component/messages.ts +99 -57
  146. package/src/component/streams.ts +80 -64
  147. package/src/component/threads.ts +12 -9
  148. package/src/component/users.ts +2 -2
  149. package/src/component/vector/index.ts +14 -7
  150. package/src/eslintConfig.test.ts +44 -0
  151. package/src/react/index.ts +8 -5
  152. package/src/shared.ts +26 -36
  153. package/src/streaming/materializePersistedUIMessageChunks.test.ts +513 -0
  154. package/src/streaming/materializePersistedUIMessageChunks.ts +398 -0
  155. package/src/streaming/persistedUIMessageChunks.test.ts +205 -0
  156. package/src/streaming/persistedUIMessageChunks.ts +658 -0
  157. package/src/validators.test.ts +4 -1
  158. package/src/validators.ts +89 -8
  159. package/src/{UIMessages.combineUIMessages.test.ts → vercel/UIMessages.combineUIMessages.test.ts} +4 -1
  160. package/src/{UIMessages.ts → vercel/UIMessages.ts} +96 -5
  161. package/src/{client → vercel/client}/approval.test.ts +48 -19
  162. package/src/{client → vercel/client}/createTool.ts +63 -23
  163. package/src/{client → vercel/client}/definePlaygroundAPI.ts +44 -29
  164. package/src/{client → vercel/client}/files.ts +2 -2
  165. package/src/{client → vercel/client}/index.test.ts +162 -3
  166. package/src/vercel/client/messages.ts +182 -0
  167. package/src/{client → vercel/client}/mockModel.ts +38 -39
  168. package/src/{client → vercel/client}/saveInputMessages.test.ts +1 -1
  169. package/src/{client → vercel/client}/saveInputMessages.ts +7 -4
  170. package/src/{client → vercel/client}/search.test.ts +3 -3
  171. package/src/{client → vercel/client}/search.ts +4 -4
  172. package/src/{client → vercel/client}/setup.test.ts +6 -3
  173. package/src/vercel/client/start.test.ts +14 -0
  174. package/src/{client → vercel/client}/start.ts +147 -36
  175. package/src/vercel/client/streamText.test.ts +223 -0
  176. package/src/{client → vercel/client}/streamText.ts +102 -31
  177. package/src/{client → vercel/client}/streaming.integration.test.ts +40 -115
  178. package/src/{client → vercel/client}/streaming.test.ts +178 -4
  179. package/src/{client → vercel/client}/streaming.ts +114 -52
  180. package/src/vercel/client/types.test.ts +13 -0
  181. package/src/vercel/client/types.ts +679 -0
  182. package/src/{client → vercel/client}/utils.ts +13 -7
  183. package/src/vercel/deltas.test.ts +898 -0
  184. package/src/vercel/deltas.ts +633 -0
  185. package/src/{fromUIMessages.test.ts → vercel/fromUIMessages.test.ts} +17 -1
  186. package/src/{client → vercel}/index.ts +169 -62
  187. package/src/vercel/mapping.test.ts +965 -0
  188. package/src/{mapping.ts → vercel/mapping.ts} +501 -131
  189. package/src/{react → vercel/react}/optimisticallySendMessage.ts +2 -2
  190. package/src/{react → vercel/react}/types.ts +1 -1
  191. package/src/{react → vercel/react}/useDeltaStreams.ts +6 -2
  192. package/src/{react → vercel/react}/useStreamingUIMessages.ts +67 -35
  193. package/src/{react → vercel/react}/useThreadMessages.ts +2 -2
  194. package/src/{react → vercel/react}/useUIMessages.test.ts +80 -1
  195. package/src/{react → vercel/react}/useUIMessages.ts +13 -5
  196. package/src/{toUIMessages.test.ts → vercel/toUIMessages.test.ts} +49 -2
  197. package/dist/UIMessages.d.ts.map +0 -1
  198. package/dist/UIMessages.js.map +0 -1
  199. package/dist/client/createTool.d.ts.map +0 -1
  200. package/dist/client/createTool.js.map +0 -1
  201. package/dist/client/definePlaygroundAPI.js.map +0 -1
  202. package/dist/client/files.d.ts.map +0 -1
  203. package/dist/client/files.js.map +0 -1
  204. package/dist/client/index.d.ts.map +0 -1
  205. package/dist/client/index.js.map +0 -1
  206. package/dist/client/mockModel.d.ts.map +0 -1
  207. package/dist/client/mockModel.js.map +0 -1
  208. package/dist/client/saveInputMessages.d.ts.map +0 -1
  209. package/dist/client/saveInputMessages.js.map +0 -1
  210. package/dist/client/search.d.ts.map +0 -1
  211. package/dist/client/search.js.map +0 -1
  212. package/dist/client/start.d.ts.map +0 -1
  213. package/dist/client/start.js.map +0 -1
  214. package/dist/client/streamText.d.ts.map +0 -1
  215. package/dist/client/streamText.js.map +0 -1
  216. package/dist/client/streaming.d.ts.map +0 -1
  217. package/dist/client/streaming.js.map +0 -1
  218. package/dist/client/utils.d.ts.map +0 -1
  219. package/dist/client/utils.js.map +0 -1
  220. package/dist/deltas.d.ts +0 -43
  221. package/dist/deltas.d.ts.map +0 -1
  222. package/dist/deltas.js +0 -446
  223. package/dist/deltas.js.map +0 -1
  224. package/dist/mapping.d.ts.map +0 -1
  225. package/dist/mapping.js.map +0 -1
  226. package/dist/react/optimisticallySendMessage.d.ts.map +0 -1
  227. package/dist/react/optimisticallySendMessage.js.map +0 -1
  228. package/dist/react/types.d.ts.map +0 -1
  229. package/dist/react/useDeltaStreams.d.ts.map +0 -1
  230. package/dist/react/useDeltaStreams.js.map +0 -1
  231. package/dist/react/useStreamingUIMessages.d.ts.map +0 -1
  232. package/dist/react/useStreamingUIMessages.js +0 -92
  233. package/dist/react/useStreamingUIMessages.js.map +0 -1
  234. package/dist/react/useThreadMessages.d.ts.map +0 -1
  235. package/dist/react/useThreadMessages.js.map +0 -1
  236. package/dist/react/useUIMessages.d.ts.map +0 -1
  237. package/dist/react/useUIMessages.js.map +0 -1
  238. package/src/client/streamText.test.ts +0 -102
  239. package/src/deltas.test.ts +0 -626
  240. package/src/deltas.ts +0 -569
  241. package/src/mapping.test.ts +0 -402
  242. /package/dist/{client → vercel/client}/files.js +0 -0
  243. /package/dist/{client → vercel/client}/saveInputMessages.js +0 -0
  244. /package/dist/{react → vercel/react}/optimisticallySendMessage.js +0 -0
  245. /package/dist/{react → vercel/react}/types.js +0 -0
  246. /package/src/{UIMessages.test.ts → vercel/UIMessages.test.ts} +0 -0
@@ -11,6 +11,7 @@ import {
11
11
  import schema from "../schema.js";
12
12
  import {
13
13
  type EmbeddingsWithoutDenormalizedFields,
14
+ getVectorIdInfo,
14
15
  getVectorTableName,
15
16
  type VectorDimension,
16
17
  vEmbeddingsWithoutDenormalizedFields,
@@ -84,7 +85,7 @@ export const deleteBatchForThread = mutation({
84
85
  numItems: args.limit,
85
86
  maximumRowsRead: 300,
86
87
  });
87
- await Promise.all(vectors.page.map((v) => ctx.db.delete(v._id)));
88
+ await Promise.all(vectors.page.map((v) => ctx.db.delete(tableName, v._id)));
88
89
  return {
89
90
  isDone: vectors.isDone,
90
91
  continueCursor: vectors.continueCursor,
@@ -108,7 +109,7 @@ export const insertBatch = mutation({
108
109
  args.vectors.map(async ({ messageId, ...v }) => {
109
110
  const embeddingId = await insertVector(ctx, args.vectorDimension, v);
110
111
  if (messageId) {
111
- await ctx.db.patch(messageId, { embeddingId });
112
+ await ctx.db.patch("messages", messageId, { embeddingId });
112
113
  }
113
114
  return embeddingId;
114
115
  }),
@@ -180,12 +181,13 @@ export const updateBatch = mutation({
180
181
  returns: v.null(),
181
182
  handler: async (ctx, args) => {
182
183
  await Promise.all(
183
- args.vectors.map((embedding) =>
184
- ctx.db.patch(embedding.id, {
184
+ args.vectors.map((embedding) => {
185
+ const { tableName } = getVectorIdInfo(ctx, embedding.id);
186
+ return ctx.db.patch(tableName, embedding.id, {
185
187
  model: embedding.model,
186
188
  vector: embedding.vector,
187
- }),
188
- ),
189
+ });
190
+ }),
189
191
  );
190
192
  },
191
193
  });
@@ -196,6 +198,11 @@ export const deleteBatch = mutation({
196
198
  },
197
199
  returns: v.null(),
198
200
  handler: async (ctx, args) => {
199
- await Promise.all(args.ids.map((id) => ctx.db.delete(id)));
201
+ await Promise.all(
202
+ args.ids.map((id) => {
203
+ const { tableName } = getVectorIdInfo(ctx, id);
204
+ return ctx.db.delete(tableName, id);
205
+ }),
206
+ );
200
207
  },
201
208
  });
@@ -0,0 +1,44 @@
1
+ import { Linter } from "eslint";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ describe("provider adapter boundary lint selectors", () => {
5
+ it("parse on Node 20 and reject every restricted dynamic import shape", async () => {
6
+ const configUrl = new URL("../eslint.config.js", import.meta.url).href;
7
+ const { default: eslintConfig } = (await import(configUrl)) as {
8
+ default: Array<{
9
+ files?: string[];
10
+ rules?: Record<string, unknown>;
11
+ }>;
12
+ };
13
+ const boundaryConfig = eslintConfig.find(
14
+ (config) =>
15
+ "files" in config &&
16
+ config.files?.some((pattern) => pattern.includes("src/streaming/")) &&
17
+ config.rules?.["no-restricted-syntax"],
18
+ );
19
+ const restrictedSyntax = boundaryConfig?.rules?.["no-restricted-syntax"];
20
+ expect(restrictedSyntax).toBeDefined();
21
+
22
+ const messages = new Linter({ configType: "flat" }).verify(
23
+ [
24
+ 'import("ai");',
25
+ 'import("ai/test");',
26
+ 'import("@ai-sdk/provider");',
27
+ 'import("vercel");',
28
+ 'import("vercel/test");',
29
+ 'import("../vercel");',
30
+ 'import("../vercel/test");',
31
+ ].join("\n"),
32
+ {
33
+ languageOptions: { ecmaVersion: 2020, sourceType: "module" },
34
+ rules: {
35
+ "no-restricted-syntax": restrictedSyntax as Linter.RuleEntry,
36
+ },
37
+ },
38
+ );
39
+
40
+ expect(messages).toHaveLength(7);
41
+ expect(messages.every((message) => message.ruleId === "no-restricted-syntax"))
42
+ .toBe(true);
43
+ });
44
+ });
@@ -1,17 +1,20 @@
1
1
  "use client";
2
2
  import { useMemo, useState } from "react";
3
- export { toUIMessages, type UIMessage } from "../UIMessages.js";
3
+ export { toUIMessages, type UIMessage } from "../vercel/UIMessages.js";
4
4
 
5
- export { optimisticallySendMessage } from "./optimisticallySendMessage.js";
5
+ export { optimisticallySendMessage } from "../vercel/react/optimisticallySendMessage.js";
6
6
  export { useSmoothText } from "./useSmoothText.js";
7
7
  export { SmoothText } from "./SmoothText.js";
8
8
  export {
9
9
  type ThreadMessagesQuery,
10
10
  useThreadMessages,
11
11
  useStreamingThreadMessages,
12
- } from "./useThreadMessages.js";
13
- export { type UIMessagesQuery, useUIMessages } from "./useUIMessages.js";
14
- export { useStreamingUIMessages } from "./useStreamingUIMessages.js";
12
+ } from "../vercel/react/useThreadMessages.js";
13
+ export {
14
+ type UIMessagesQuery,
15
+ useUIMessages,
16
+ } from "../vercel/react/useUIMessages.js";
17
+ export { useStreamingUIMessages } from "../vercel/react/useStreamingUIMessages.js";
15
18
 
16
19
  /**
17
20
  * @deprecated use useThreadMessages or useStreamingThreadMessages instead
package/src/shared.ts CHANGED
@@ -1,23 +1,19 @@
1
- import type {
2
- FilePart,
3
- ImagePart,
4
- ReasoningPart,
5
- ToolCallPart,
6
- ToolResultPart,
7
- ToolApprovalRequest,
8
- } from "@ai-sdk/provider-utils";
9
- import type {
10
- ModelMessage,
11
- TextPart,
12
- UIDataTypes,
13
- UIMessagePart,
14
- UITools,
15
- } from "ai";
16
- import type { Message, MessageContentParts } from "./validators.js";
1
+ type MessagePartLike = {
2
+ type: string;
3
+ text?: string;
4
+ };
5
+
6
+ type MessageLike =
7
+ | { role: "system"; content: string }
8
+ | {
9
+ role: "user" | "assistant";
10
+ content: string | readonly MessagePartLike[];
11
+ }
12
+ | { role: "tool"; content: readonly MessagePartLike[] };
17
13
 
18
14
  export const DEFAULT_RECENT_MESSAGES = 100;
19
15
 
20
- export function isTool(message: Message | ModelMessage) {
16
+ export function isTool(message: MessageLike) {
21
17
  return (
22
18
  message.role === "tool" ||
23
19
  (message.role === "assistant" &&
@@ -26,7 +22,7 @@ export function isTool(message: Message | ModelMessage) {
26
22
  );
27
23
  }
28
24
 
29
- export function extractText(message: Message | ModelMessage) {
25
+ export function extractText(message: MessageLike) {
30
26
  switch (message.role) {
31
27
  case "user":
32
28
  if (typeof message.content === "string") {
@@ -46,33 +42,27 @@ export function extractText(message: Message | ModelMessage) {
46
42
  return undefined;
47
43
  }
48
44
 
49
- export function joinText(
50
- parts: (
51
- | UIMessagePart<UIDataTypes, UITools>
52
- | TextPart
53
- | ImagePart
54
- | FilePart
55
- | ReasoningPart
56
- | ToolCallPart
57
- | ToolResultPart
58
- | MessageContentParts
59
- | ToolApprovalRequest
60
- )[],
61
- ) {
45
+ export function joinText(parts: readonly MessagePartLike[]) {
62
46
  return parts
63
- .filter((p) => p.type === "text")
64
- .map((p) => p.text)
47
+ .filter(
48
+ (part): part is MessagePartLike & { text: string } =>
49
+ part.type === "text" && typeof part.text === "string",
50
+ )
51
+ .map((part) => part.text)
65
52
  .filter(Boolean)
66
53
  .join(" ");
67
54
  }
68
55
 
69
- export function extractReasoning(message: Message | ModelMessage) {
56
+ export function extractReasoning(message: MessageLike) {
70
57
  if (typeof message.content === "string") {
71
58
  return undefined;
72
59
  }
73
60
  return message.content
74
- .filter((c) => c.type === "reasoning")
75
- .map((c) => c.text)
61
+ .filter(
62
+ (part): part is MessagePartLike & { text: string } =>
63
+ part.type === "reasoning" && typeof part.text === "string",
64
+ )
65
+ .map((part) => part.text)
76
66
  .join(" ");
77
67
  }
78
68