@convex-dev/agent 0.6.4 → 0.7.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 (225) 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/messages.d.ts +1252 -201
  11. package/dist/component/messages.d.ts.map +1 -1
  12. package/dist/component/messages.js +49 -23
  13. package/dist/component/messages.js.map +1 -1
  14. package/dist/component/schema.d.ts +2593 -332
  15. package/dist/component/schema.d.ts.map +1 -1
  16. package/dist/component/streams.d.ts +7 -1
  17. package/dist/component/streams.d.ts.map +1 -1
  18. package/dist/component/streams.js +24 -30
  19. package/dist/component/streams.js.map +1 -1
  20. package/dist/component/threads.d.ts.map +1 -1
  21. package/dist/component/threads.js +1 -2
  22. package/dist/component/threads.js.map +1 -1
  23. package/dist/react/index.d.ts +5 -5
  24. package/dist/react/index.d.ts.map +1 -1
  25. package/dist/react/index.js +5 -5
  26. package/dist/react/index.js.map +1 -1
  27. package/dist/shared.d.ts +19 -7
  28. package/dist/shared.d.ts.map +1 -1
  29. package/dist/shared.js +4 -4
  30. package/dist/shared.js.map +1 -1
  31. package/dist/streaming/materializePersistedUIMessageChunks.d.ts +16 -0
  32. package/dist/streaming/materializePersistedUIMessageChunks.d.ts.map +1 -0
  33. package/dist/streaming/materializePersistedUIMessageChunks.js +302 -0
  34. package/dist/streaming/materializePersistedUIMessageChunks.js.map +1 -0
  35. package/dist/streaming/persistedUIMessageChunks.d.ts +106 -0
  36. package/dist/streaming/persistedUIMessageChunks.d.ts.map +1 -0
  37. package/dist/streaming/persistedUIMessageChunks.js +475 -0
  38. package/dist/streaming/persistedUIMessageChunks.js.map +1 -0
  39. package/dist/validators.d.ts +10026 -1055
  40. package/dist/validators.d.ts.map +1 -1
  41. package/dist/validators.js +71 -9
  42. package/dist/validators.js.map +1 -1
  43. package/dist/{UIMessages.d.ts → vercel/UIMessages.d.ts} +1 -1
  44. package/dist/vercel/UIMessages.d.ts.map +1 -0
  45. package/dist/{UIMessages.js → vercel/UIMessages.js} +63 -1
  46. package/dist/vercel/UIMessages.js.map +1 -0
  47. package/dist/{client → vercel/client}/createTool.d.ts +23 -16
  48. package/dist/vercel/client/createTool.d.ts.map +1 -0
  49. package/dist/{client → vercel/client}/createTool.js +2 -0
  50. package/dist/vercel/client/createTool.js.map +1 -0
  51. package/dist/{client → vercel/client}/definePlaygroundAPI.d.ts +533 -79
  52. package/dist/{client → vercel/client}/definePlaygroundAPI.d.ts.map +1 -1
  53. package/dist/{client → vercel/client}/definePlaygroundAPI.js +8 -7
  54. package/dist/vercel/client/definePlaygroundAPI.js.map +1 -0
  55. package/dist/{client → vercel/client}/files.d.ts +2 -2
  56. package/dist/vercel/client/files.d.ts.map +1 -0
  57. package/dist/vercel/client/files.js.map +1 -0
  58. package/dist/vercel/client/messages.d.ts +542 -0
  59. package/dist/vercel/client/messages.d.ts.map +1 -0
  60. package/dist/vercel/client/messages.js +66 -0
  61. package/dist/vercel/client/messages.js.map +1 -0
  62. package/dist/{client → vercel/client}/mockModel.d.ts +17 -17
  63. package/dist/vercel/client/mockModel.d.ts.map +1 -0
  64. package/dist/{client → vercel/client}/mockModel.js +12 -13
  65. package/dist/vercel/client/mockModel.js.map +1 -0
  66. package/dist/{client → vercel/client}/saveInputMessages.d.ts +2 -2
  67. package/dist/vercel/client/saveInputMessages.d.ts.map +1 -0
  68. package/dist/vercel/client/saveInputMessages.js.map +1 -0
  69. package/dist/{client → vercel/client}/search.d.ts +119 -22
  70. package/dist/vercel/client/search.d.ts.map +1 -0
  71. package/dist/{client → vercel/client}/search.js +2 -2
  72. package/dist/vercel/client/search.js.map +1 -0
  73. package/dist/{client → vercel/client}/start.d.ts +26 -11
  74. package/dist/vercel/client/start.d.ts.map +1 -0
  75. package/dist/{client → vercel/client}/start.js +64 -22
  76. package/dist/vercel/client/start.js.map +1 -0
  77. package/dist/{client → vercel/client}/streamText.d.ts +13 -12
  78. package/dist/vercel/client/streamText.d.ts.map +1 -0
  79. package/dist/{client → vercel/client}/streamText.js +43 -9
  80. package/dist/vercel/client/streamText.js.map +1 -0
  81. package/dist/{client → vercel/client}/streaming.d.ts +1410 -183
  82. package/dist/vercel/client/streaming.d.ts.map +1 -0
  83. package/dist/{client → vercel/client}/streaming.js +120 -52
  84. package/dist/vercel/client/streaming.js.map +1 -0
  85. package/dist/vercel/client/types.d.ts +456 -0
  86. package/dist/vercel/client/types.d.ts.map +1 -0
  87. package/dist/vercel/client/types.js +3 -0
  88. package/dist/vercel/client/types.js.map +1 -0
  89. package/dist/{client → vercel/client}/utils.d.ts +3 -2
  90. package/dist/vercel/client/utils.d.ts.map +1 -0
  91. package/dist/{client → vercel/client}/utils.js +2 -2
  92. package/dist/vercel/client/utils.js.map +1 -0
  93. package/dist/{deltas.d.ts → vercel/deltas.d.ts} +3 -4
  94. package/dist/vercel/deltas.d.ts.map +1 -0
  95. package/dist/{deltas.js → vercel/deltas.js} +195 -99
  96. package/dist/vercel/deltas.js.map +1 -0
  97. package/dist/{client → vercel}/index.d.ts +482 -106
  98. package/dist/vercel/index.d.ts.map +1 -0
  99. package/dist/{client → vercel}/index.js +64 -46
  100. package/dist/vercel/index.js.map +1 -0
  101. package/dist/{mapping.d.ts → vercel/mapping.d.ts} +5 -19
  102. package/dist/vercel/mapping.d.ts.map +1 -0
  103. package/dist/{mapping.js → vercel/mapping.js} +411 -114
  104. package/dist/vercel/mapping.js.map +1 -0
  105. package/dist/{react → vercel/react}/optimisticallySendMessage.d.ts +2 -2
  106. package/dist/vercel/react/optimisticallySendMessage.d.ts.map +1 -0
  107. package/dist/vercel/react/optimisticallySendMessage.js.map +1 -0
  108. package/dist/{react → vercel/react}/types.d.ts +1 -1
  109. package/dist/vercel/react/types.d.ts.map +1 -0
  110. package/dist/{react → vercel/react}/types.js.map +1 -1
  111. package/dist/{react → vercel/react}/useDeltaStreams.d.ts +1 -1
  112. package/dist/vercel/react/useDeltaStreams.d.ts.map +1 -0
  113. package/dist/{react → vercel/react}/useDeltaStreams.js +1 -1
  114. package/dist/vercel/react/useDeltaStreams.js.map +1 -0
  115. package/dist/{react → vercel/react}/useStreamingUIMessages.d.ts +1 -1
  116. package/dist/vercel/react/useStreamingUIMessages.d.ts.map +1 -0
  117. package/dist/{react → vercel/react}/useStreamingUIMessages.js +7 -3
  118. package/dist/vercel/react/useStreamingUIMessages.js.map +1 -0
  119. package/dist/{react → vercel/react}/useThreadMessages.d.ts +1 -1
  120. package/dist/vercel/react/useThreadMessages.d.ts.map +1 -0
  121. package/dist/{react → vercel/react}/useThreadMessages.js +1 -1
  122. package/dist/vercel/react/useThreadMessages.js.map +1 -0
  123. package/dist/{react → vercel/react}/useUIMessages.d.ts +1 -1
  124. package/dist/vercel/react/useUIMessages.d.ts.map +1 -0
  125. package/dist/{react → vercel/react}/useUIMessages.js +1 -1
  126. package/dist/vercel/react/useUIMessages.js.map +1 -0
  127. package/package.json +31 -24
  128. package/src/client/messages.ts +5 -107
  129. package/src/client/types.ts +0 -608
  130. package/src/component/_generated/component.ts +1089 -48
  131. package/src/component/messages.test.ts +273 -1
  132. package/src/component/messages.ts +62 -32
  133. package/src/component/streams.ts +47 -47
  134. package/src/component/threads.ts +5 -2
  135. package/src/eslintConfig.test.ts +44 -0
  136. package/src/react/index.ts +8 -5
  137. package/src/shared.ts +26 -36
  138. package/src/streaming/materializePersistedUIMessageChunks.test.ts +513 -0
  139. package/src/streaming/materializePersistedUIMessageChunks.ts +398 -0
  140. package/src/streaming/persistedUIMessageChunks.test.ts +205 -0
  141. package/src/streaming/persistedUIMessageChunks.ts +658 -0
  142. package/src/validators.test.ts +4 -1
  143. package/src/validators.ts +89 -8
  144. package/src/{UIMessages.combineUIMessages.test.ts → vercel/UIMessages.combineUIMessages.test.ts} +4 -1
  145. package/src/{UIMessages.ts → vercel/UIMessages.ts} +95 -3
  146. package/src/{client → vercel/client}/approval.test.ts +23 -13
  147. package/src/{client → vercel/client}/createTool.ts +62 -22
  148. package/src/{client → vercel/client}/definePlaygroundAPI.ts +15 -16
  149. package/src/{client → vercel/client}/files.ts +2 -2
  150. package/src/{client → vercel/client}/index.test.ts +99 -31
  151. package/src/vercel/client/messages.ts +182 -0
  152. package/src/{client → vercel/client}/mockModel.ts +38 -39
  153. package/src/{client → vercel/client}/saveInputMessages.test.ts +1 -1
  154. package/src/{client → vercel/client}/saveInputMessages.ts +3 -3
  155. package/src/{client → vercel/client}/search.test.ts +3 -3
  156. package/src/{client → vercel/client}/search.ts +4 -4
  157. package/src/{client → vercel/client}/setup.test.ts +6 -3
  158. package/src/vercel/client/start.test.ts +14 -0
  159. package/src/{client → vercel/client}/start.ts +147 -36
  160. package/src/vercel/client/streamText.test.ts +223 -0
  161. package/src/{client → vercel/client}/streamText.ts +102 -31
  162. package/src/{client → vercel/client}/streaming.integration.test.ts +6 -3
  163. package/src/{client → vercel/client}/streaming.test.ts +178 -4
  164. package/src/{client → vercel/client}/streaming.ts +114 -52
  165. package/src/vercel/client/types.test.ts +13 -0
  166. package/src/vercel/client/types.ts +679 -0
  167. package/src/{client → vercel/client}/utils.ts +13 -7
  168. package/src/{deltas.test.ts → vercel/deltas.test.ts} +384 -93
  169. package/src/{deltas.ts → vercel/deltas.ts} +218 -115
  170. package/src/{fromUIMessages.test.ts → vercel/fromUIMessages.test.ts} +17 -1
  171. package/src/{client → vercel}/index.ts +167 -84
  172. package/src/{mapping.test.ts → vercel/mapping.test.ts} +377 -92
  173. package/src/{mapping.ts → vercel/mapping.ts} +501 -137
  174. package/src/{react → vercel/react}/optimisticallySendMessage.ts +2 -2
  175. package/src/{react → vercel/react}/types.ts +1 -1
  176. package/src/{react → vercel/react}/useDeltaStreams.ts +6 -2
  177. package/src/{react → vercel/react}/useStreamingUIMessages.ts +7 -3
  178. package/src/{react → vercel/react}/useThreadMessages.ts +2 -2
  179. package/src/{react → vercel/react}/useUIMessages.ts +2 -2
  180. package/src/{toUIMessages.test.ts → vercel/toUIMessages.test.ts} +49 -2
  181. package/dist/UIMessages.d.ts.map +0 -1
  182. package/dist/UIMessages.js.map +0 -1
  183. package/dist/client/createTool.d.ts.map +0 -1
  184. package/dist/client/createTool.js.map +0 -1
  185. package/dist/client/definePlaygroundAPI.js.map +0 -1
  186. package/dist/client/files.d.ts.map +0 -1
  187. package/dist/client/files.js.map +0 -1
  188. package/dist/client/index.d.ts.map +0 -1
  189. package/dist/client/index.js.map +0 -1
  190. package/dist/client/mockModel.d.ts.map +0 -1
  191. package/dist/client/mockModel.js.map +0 -1
  192. package/dist/client/saveInputMessages.d.ts.map +0 -1
  193. package/dist/client/saveInputMessages.js.map +0 -1
  194. package/dist/client/search.d.ts.map +0 -1
  195. package/dist/client/search.js.map +0 -1
  196. package/dist/client/start.d.ts.map +0 -1
  197. package/dist/client/start.js.map +0 -1
  198. package/dist/client/streamText.d.ts.map +0 -1
  199. package/dist/client/streamText.js.map +0 -1
  200. package/dist/client/streaming.d.ts.map +0 -1
  201. package/dist/client/streaming.js.map +0 -1
  202. package/dist/client/utils.d.ts.map +0 -1
  203. package/dist/client/utils.js.map +0 -1
  204. package/dist/deltas.d.ts.map +0 -1
  205. package/dist/deltas.js.map +0 -1
  206. package/dist/mapping.d.ts.map +0 -1
  207. package/dist/mapping.js.map +0 -1
  208. package/dist/react/optimisticallySendMessage.d.ts.map +0 -1
  209. package/dist/react/optimisticallySendMessage.js.map +0 -1
  210. package/dist/react/types.d.ts.map +0 -1
  211. package/dist/react/useDeltaStreams.d.ts.map +0 -1
  212. package/dist/react/useDeltaStreams.js.map +0 -1
  213. package/dist/react/useStreamingUIMessages.d.ts.map +0 -1
  214. package/dist/react/useStreamingUIMessages.js.map +0 -1
  215. package/dist/react/useThreadMessages.d.ts.map +0 -1
  216. package/dist/react/useThreadMessages.js.map +0 -1
  217. package/dist/react/useUIMessages.d.ts.map +0 -1
  218. package/dist/react/useUIMessages.js.map +0 -1
  219. package/src/client/streamText.test.ts +0 -102
  220. /package/dist/{client → vercel/client}/files.js +0 -0
  221. /package/dist/{client → vercel/client}/saveInputMessages.js +0 -0
  222. /package/dist/{react → vercel/react}/optimisticallySendMessage.js +0 -0
  223. /package/dist/{react → vercel/react}/types.js +0 -0
  224. /package/src/{UIMessages.test.ts → vercel/UIMessages.test.ts} +0 -0
  225. /package/src/{react → vercel/react}/useUIMessages.test.ts +0 -0
@@ -1,23 +1,33 @@
1
+ /**
2
+ * Internal AI SDK implementation for the Agent API.
3
+ *
4
+ * Consumers continue to import this API from `@convex-dev/agent`. A public
5
+ * `@convex-dev/agent/vercel` entry point is intentionally deferred until its
6
+ * provider-adapter API is defined.
7
+ */
8
+
1
9
  import type { JSONValue } from "@ai-sdk/provider";
2
10
  import type {
11
+ Context,
3
12
  FlexibleSchema,
4
13
  IdGenerator,
5
14
  InferSchema,
6
15
  } from "@ai-sdk/provider-utils";
7
16
  import type {
8
- CallSettings,
9
17
  EmbeddingModel,
10
18
  GenerateObjectResult,
11
19
  GenerateTextResult,
12
20
  LanguageModel,
21
+ Instructions,
13
22
  ModelMessage,
23
+ Output as AISDKOutput,
14
24
  StepResult,
15
25
  StopCondition,
16
26
  StreamTextResult,
17
27
  ToolChoice,
18
28
  ToolSet,
19
29
  } from "ai";
20
- import { generateObject, generateText, stepCountIs, streamObject } from "ai";
30
+ import { generateObject, generateText, isStepCount, streamObject } from "ai";
21
31
 
22
32
  const MIGRATION_URL = "node_modules/@convex-dev/agent/MIGRATION.md";
23
33
  const warnedDeprecations = new Set<string>();
@@ -43,9 +53,9 @@ import { type VectorDimension } from "../component/vector/tables.js";
43
53
  import {
44
54
  toModelMessage,
45
55
  serializeMessage,
46
- serializeNewMessagesInStep,
56
+ serializeResponseMessages,
47
57
  serializeObjectResult,
48
- } from "../mapping.js";
58
+ } from "./mapping.js";
49
59
  import { getModelName, getProviderName } from "../shared.js";
50
60
  import {
51
61
  vMessageEmbeddings,
@@ -65,16 +75,16 @@ import {
65
75
  saveMessages,
66
76
  type SaveMessageArgs,
67
77
  type SaveMessagesArgs,
68
- } from "./messages.js";
78
+ } from "./client/messages.js";
69
79
  import {
70
80
  embedMany,
71
81
  embedMessages,
72
82
  fetchContextMessages,
73
83
  generateAndSaveEmbeddings,
74
- } from "./search.js";
75
- import { startGeneration } from "./start.js";
76
- import { syncStreams, type StreamingOptions } from "./streaming.js";
77
- import { createThread, getThreadMetadata } from "./threads.js";
84
+ } from "./client/search.js";
85
+ import { startGeneration } from "./client/start.js";
86
+ import { syncStreams, type StreamingOptions } from "./client/streaming.js";
87
+ import { createThread, getThreadMetadata } from "../client/threads.js";
78
88
  import type {
79
89
  ActionCtx,
80
90
  AgentComponent,
@@ -96,12 +106,16 @@ import type {
96
106
  UsageHandler,
97
107
  QueryCtx,
98
108
  AgentPrompt,
99
- Output,
100
- } from "./types.js";
101
- import { streamText } from "./streamText.js";
102
- import { errorToString, hasSuccessfulToolCall, willContinue } from "./utils.js";
109
+ AgentCallSettings,
110
+ } from "./client/types.js";
111
+ import { streamText } from "./client/streamText.js";
112
+ import {
113
+ errorToString,
114
+ hasSuccessfulToolCall,
115
+ willContinue,
116
+ } from "./client/utils.js";
103
117
 
104
- export { stepCountIs } from "ai";
118
+ export { isStepCount, stepCountIs } from "ai";
105
119
  export { hasSuccessfulToolCall };
106
120
  export {
107
121
  docsToModelMessages,
@@ -112,7 +126,7 @@ export {
112
126
  serializeDataOrUrl,
113
127
  serializeMessage,
114
128
  toUIFilePart,
115
- } from "../mapping.js";
129
+ } from "./mapping.js";
116
130
  // NOTE: these are also exported via @convex-dev/agent/validators
117
131
  // a future version may put them all here or move these over there
118
132
  export { extractText, isTool, sorted } from "../shared.js";
@@ -138,13 +152,13 @@ export {
138
152
  type ThreadDoc,
139
153
  type Usage,
140
154
  } from "../validators.js";
141
- export { createTool, type ToolCtx } from "./createTool.js";
155
+ export { createTool, type ToolCtx } from "./client/createTool.js";
142
156
  export {
143
157
  definePlaygroundAPI,
144
158
  type AgentsFn,
145
159
  type PlaygroundAPI,
146
- } from "./definePlaygroundAPI.js";
147
- export { getFile, storeFile } from "./files.js";
160
+ } from "./client/definePlaygroundAPI.js";
161
+ export { getFile, storeFile } from "./client/files.js";
148
162
  export {
149
163
  listMessages,
150
164
  listUIMessages,
@@ -152,8 +166,8 @@ export {
152
166
  saveMessages,
153
167
  type SaveMessageArgs,
154
168
  type SaveMessagesArgs,
155
- } from "./messages.js";
156
- export { mockModel } from "./mockModel.js";
169
+ } from "./client/messages.js";
170
+ export { mockModel } from "./client/mockModel.js";
157
171
  export {
158
172
  fetchContextMessages,
159
173
  filterOutOrphanedToolMessages,
@@ -161,8 +175,8 @@ export {
161
175
  generateAndSaveEmbeddings,
162
176
  embedMessages,
163
177
  embedMany,
164
- } from "./search.js";
165
- export { startGeneration } from "./start.js";
178
+ } from "./client/search.js";
179
+ export { startGeneration } from "./client/start.js";
166
180
  export {
167
181
  DEFAULT_STREAMING_OPTIONS,
168
182
  DeltaStreamer,
@@ -171,16 +185,15 @@ export {
171
185
  listStreams,
172
186
  syncStreams,
173
187
  vStreamMessagesReturnValue,
174
- } from "./streaming.js";
188
+ } from "./client/streaming.js";
175
189
  export {
176
190
  createThread,
177
191
  getThreadMetadata,
178
192
  searchThreadTitles,
179
193
  updateThreadMetadata,
180
- } from "./threads.js";
181
- export type { ContextHandler } from "./types.js";
182
- export { toUIMessages, fromUIMessages, type UIMessage } from "../UIMessages.js";
183
-
194
+ } from "../client/threads.js";
195
+ export type { ContextHandler } from "./client/types.js";
196
+ export { toUIMessages, fromUIMessages, type UIMessage } from "./UIMessages.js";
184
197
  export type {
185
198
  AgentComponent,
186
199
  Config,
@@ -237,7 +250,7 @@ export class Agent<
237
250
  * The default system prompt to put in each request.
238
251
  * Override per-prompt by passing the "system" parameter.
239
252
  */
240
- instructions?: string;
253
+ instructions?: Instructions;
241
254
  /**
242
255
  * Tools that the agent can call out to and get responses from.
243
256
  * They can be AI SDK tools (import {tool} from "ai")
@@ -386,6 +399,7 @@ export class Agent<
386
399
  T extends {
387
400
  _internal?: { generateId?: IdGenerator };
388
401
  },
402
+ RUNTIME_CONTEXT extends Context = Context,
389
403
  >(
390
404
  ctx: ActionCtx & CustomCtx,
391
405
  /**
@@ -408,19 +422,34 @@ export class Agent<
408
422
  * aborted, it will trigger this signal when detected.
409
423
  */
410
424
  abortSignal?: AbortSignal;
425
+ runtimeContext?: RUNTIME_CONTEXT;
411
426
  stopWhen?:
412
- | StopCondition<TOOLS extends undefined ? AgentTools : TOOLS>
413
- | Array<StopCondition<TOOLS extends undefined ? AgentTools : TOOLS>>;
427
+ | StopCondition<
428
+ TOOLS extends undefined ? AgentTools : TOOLS,
429
+ RUNTIME_CONTEXT
430
+ >
431
+ | Array<
432
+ StopCondition<
433
+ TOOLS extends undefined ? AgentTools : TOOLS,
434
+ RUNTIME_CONTEXT
435
+ >
436
+ >;
414
437
  },
415
438
  options?: Options & { userId?: string | null; threadId?: string },
439
+ operation?:
440
+ | "generateText"
441
+ | "streamText"
442
+ | "generateObject"
443
+ | "streamObject",
416
444
  ): Promise<{
417
445
  args: T & {
418
- system?: string;
446
+ instructions?: Instructions;
419
447
  model: LanguageModel;
420
448
  prompt?: never;
421
449
  messages: ModelMessage[];
450
+ runtimeContext?: RUNTIME_CONTEXT;
422
451
  tools?: TOOLS extends undefined ? AgentTools : TOOLS;
423
- } & CallSettings;
452
+ } & AgentCallSettings;
424
453
  order: number;
425
454
  stepOrder: number;
426
455
  userId: string | undefined;
@@ -428,7 +457,10 @@ export class Agent<
428
457
  updateModel: (model: LanguageModel | undefined) => void;
429
458
  save: <TOOLS extends ToolSet>(
430
459
  toSave:
431
- | { step: StepResult<TOOLS> }
460
+ | {
461
+ step: StepResult<TOOLS, RUNTIME_CONTEXT>;
462
+ responseMessages?: ModelMessage[];
463
+ }
432
464
  | { object: GenerateObjectResult<unknown> },
433
465
  createPendingMessage?: boolean,
434
466
  ) => Promise<void>;
@@ -436,13 +468,14 @@ export class Agent<
436
468
  getSavedMessages: () => MessageDoc[];
437
469
  }> {
438
470
  type Tools = TOOLS extends undefined ? AgentTools : TOOLS;
439
- return startGeneration<T, Tools, CustomCtx>(
471
+ return startGeneration<T, Tools, CustomCtx, RUNTIME_CONTEXT>(
440
472
  ctx,
441
473
  this.component,
442
474
  {
443
475
  ...args,
444
476
  tools: (args.tools ?? this.options.tools) as Tools,
445
- system: args.system ?? this.options.instructions,
477
+ instructions:
478
+ args.instructions ?? args.system ?? this.options.instructions,
446
479
  stopWhen: (args.stopWhen ?? this.options.stopWhen) as any,
447
480
  },
448
481
  {
@@ -451,6 +484,7 @@ export class Agent<
451
484
  agentName: this.options.name,
452
485
  agentForToolCtx: this,
453
486
  },
487
+ operation,
454
488
  );
455
489
  }
456
490
 
@@ -469,7 +503,11 @@ export class Agent<
469
503
  */
470
504
  async generateText<
471
505
  TOOLS extends ToolSet | undefined = undefined,
472
- OUTPUT extends Output<any, any, any> = never,
506
+ OUTPUT extends AISDKOutput.Output<any, any, any> = AISDKOutput.Output<
507
+ string,
508
+ string
509
+ >,
510
+ RUNTIME_CONTEXT extends Context = Context,
473
511
  >(
474
512
  ctx: ActionCtx & CustomCtx,
475
513
  threadOpts: { userId?: string | null; threadId?: string },
@@ -477,34 +515,56 @@ export class Agent<
477
515
  * The arguments to the generateText function, similar to the ai sdk's
478
516
  * {@link generateText} function, along with Agent prompt options.
479
517
  */
480
- generateTextArgs: AgentPrompt & TextArgs<AgentTools, TOOLS, OUTPUT>,
518
+ generateTextArgs: TextArgs<AgentTools, TOOLS, OUTPUT, RUNTIME_CONTEXT>,
481
519
  options?: Options,
482
520
  ): Promise<
483
- GenerateTextResult<TOOLS extends undefined ? AgentTools : TOOLS, OUTPUT> &
521
+ GenerateTextResult<
522
+ TOOLS extends undefined ? AgentTools : TOOLS,
523
+ RUNTIME_CONTEXT,
524
+ OUTPUT
525
+ > &
484
526
  GenerationOutputMetadata
485
527
  > {
486
528
  const { args, promptMessageId, order, ...call } = await this.start(
487
529
  ctx,
488
530
  generateTextArgs,
489
531
  { ...threadOpts, ...options },
532
+ "generateText",
490
533
  );
491
534
 
492
535
  type Tools = TOOLS extends undefined ? AgentTools : TOOLS;
493
- const steps: StepResult<Tools>[] = [];
536
+ const steps: StepResult<Tools, RUNTIME_CONTEXT>[] = [];
537
+ let initialResponseMessages: ModelMessage[] = [];
538
+ let initialResponseMessagesSaved = false;
494
539
  try {
495
- const result = (await generateText<Tools, OUTPUT>({
540
+ const result = (await generateText<Tools, RUNTIME_CONTEXT, OUTPUT>({
496
541
  ...args,
497
542
  prepareStep: async (options) => {
543
+ if (options.stepNumber === 0) {
544
+ initialResponseMessages = [...options.responseMessages];
545
+ }
498
546
  const result = await generateTextArgs.prepareStep?.(options);
499
547
  call.updateModel(result?.model ?? options.model);
500
548
  return result;
501
549
  },
502
- onStepFinish: async (step) => {
550
+ onStepEnd: async (step) => {
503
551
  steps.push(step);
504
- await call.save({ step }, await willContinue(steps, args.stopWhen));
505
- return generateTextArgs.onStepFinish?.(step);
552
+ await call.save(
553
+ {
554
+ step,
555
+ responseMessages: [
556
+ ...(initialResponseMessagesSaved ? [] : initialResponseMessages),
557
+ ...step.response.messages,
558
+ ],
559
+ },
560
+ await willContinue(steps, args.stopWhen),
561
+ );
562
+ initialResponseMessagesSaved = true;
563
+ return (
564
+ generateTextArgs.onStepEnd ?? generateTextArgs.onStepFinish
565
+ )?.(step);
506
566
  },
507
- })) as GenerateTextResult<Tools, OUTPUT>;
567
+ })) as GenerateTextResult<Tools, RUNTIME_CONTEXT, OUTPUT>;
508
568
  const metadata: GenerationOutputMetadata = {
509
569
  promptMessageId,
510
570
  order,
@@ -527,7 +587,12 @@ export class Agent<
527
587
  */
528
588
  async streamText<
529
589
  TOOLS extends ToolSet | undefined = undefined,
530
- OUTPUT extends Output<any, any, any> = never,
590
+ OUTPUT extends AISDKOutput.Output<any, any, any> = AISDKOutput.Output<
591
+ string,
592
+ string,
593
+ never
594
+ >,
595
+ RUNTIME_CONTEXT extends Context = Context,
531
596
  >(
532
597
  ctx: ActionCtx & CustomCtx,
533
598
  threadOpts: { userId?: string | null; threadId?: string },
@@ -535,7 +600,12 @@ export class Agent<
535
600
  * The arguments to the streamText function, similar to the ai sdk's
536
601
  * {@link streamText} function, along with Agent prompt options.
537
602
  */
538
- streamTextArgs: AgentPrompt & StreamingTextArgs<AgentTools, TOOLS, OUTPUT>,
603
+ streamTextArgs: StreamingTextArgs<
604
+ AgentTools,
605
+ TOOLS,
606
+ OUTPUT,
607
+ RUNTIME_CONTEXT
608
+ >,
539
609
  /**
540
610
  * The {@link ContextOptions} and {@link StorageOptions}
541
611
  * options to use for fetching contextual messages and saving input/output messages.
@@ -554,18 +624,25 @@ export class Agent<
554
624
  saveStreamDeltas?: boolean | StreamingOptions;
555
625
  },
556
626
  ): Promise<
557
- StreamTextResult<TOOLS extends undefined ? AgentTools : TOOLS, OUTPUT> &
627
+ StreamTextResult<
628
+ TOOLS extends undefined ? AgentTools : TOOLS,
629
+ RUNTIME_CONTEXT,
630
+ OUTPUT
631
+ > &
558
632
  GenerationOutputMetadata
559
633
  > {
560
634
  type Tools = TOOLS extends undefined ? AgentTools : TOOLS;
561
- return streamText<Tools, OUTPUT>(
635
+ return streamText<AgentTools, TOOLS, OUTPUT, RUNTIME_CONTEXT>(
562
636
  ctx,
563
637
  this.component,
564
638
  {
565
639
  ...streamTextArgs,
566
640
  model: streamTextArgs.model ?? this.options.languageModel,
567
641
  tools: (streamTextArgs.tools ?? this.options.tools) as Tools,
568
- system: streamTextArgs.system ?? this.options.instructions,
642
+ instructions:
643
+ streamTextArgs.instructions ??
644
+ streamTextArgs.system ??
645
+ this.options.instructions,
569
646
  stopWhen: (streamTextArgs.stopWhen ?? this.options.stopWhen) as any,
570
647
  },
571
648
  {
@@ -600,8 +677,7 @@ export class Agent<
600
677
  * The arguments to the generateObject function, similar to the ai sdk's
601
678
  * {@link generateObject} function, along with Agent prompt options.
602
679
  */
603
- generateObjectArgs: AgentPrompt &
604
- GenerateObjectArgs<SCHEMA, OUTPUT, RESULT>,
680
+ generateObjectArgs: GenerateObjectArgs<SCHEMA, OUTPUT, RESULT>,
605
681
  /**
606
682
  * The {@link ContextOptions} and {@link StorageOptions}
607
683
  * options to use for fetching contextual messages and saving input/output messages.
@@ -609,7 +685,12 @@ export class Agent<
609
685
  options?: Options,
610
686
  ): Promise<GenerateObjectResult<RESULT> & GenerationOutputMetadata> {
611
687
  const { args, promptMessageId, order, fail, save, getSavedMessages } =
612
- await this.start(ctx, generateObjectArgs, { ...threadOpts, ...options });
688
+ await this.start(
689
+ ctx,
690
+ generateObjectArgs,
691
+ { ...threadOpts, ...options },
692
+ "generateObject",
693
+ );
613
694
 
614
695
  try {
615
696
  const result = (await generateObject(
@@ -652,7 +733,7 @@ export class Agent<
652
733
  * The arguments to the streamObject function, similar to the ai sdk's
653
734
  * {@link streamObject} function, along with Agent prompt options.
654
735
  */
655
- streamObjectArgs: AgentPrompt & StreamObjectArgs<SCHEMA, OUTPUT, RESULT>,
736
+ streamObjectArgs: StreamObjectArgs<SCHEMA, OUTPUT, RESULT>,
656
737
  /**
657
738
  * The {@link ContextOptions} and {@link StorageOptions}
658
739
  * options to use for fetching contextual messages and saving input/output messages.
@@ -663,7 +744,12 @@ export class Agent<
663
744
  GenerationOutputMetadata
664
745
  > {
665
746
  const { args, promptMessageId, order, fail, save, getSavedMessages } =
666
- await this.start(ctx, streamObjectArgs, { ...threadOpts, ...options });
747
+ await this.start(
748
+ ctx,
749
+ streamObjectArgs,
750
+ { ...threadOpts, ...options },
751
+ "streamObject",
752
+ );
667
753
 
668
754
  const stream = streamObject<SCHEMA, OUTPUT, RESULT>({
669
755
  ...(args as any),
@@ -1183,8 +1269,7 @@ export class Agent<
1183
1269
 
1184
1270
  /**
1185
1271
  * Explicitly save a "step" created by the AI SDK. For multi-step generation
1186
- * loops, pass `previousStep` so we save only the new response messages
1187
- * see the arg JSDoc for why.
1272
+ * loops, each SDK 7 step already owns its response messages.
1188
1273
  * @param ctx The ctx argument to a mutation or action.
1189
1274
  * @param args The Step generated by the AI SDK.
1190
1275
  */
@@ -1201,14 +1286,7 @@ export class Agent<
1201
1286
  * The step to save, possibly including multiple tool calls.
1202
1287
  */
1203
1288
  step: StepResult<TOOLS>;
1204
- /**
1205
- * The previous step in the same generation loop, if any. Pass it so we
1206
- * can compute how many of `step.response.messages` are already saved.
1207
- * Omit for the first step. AI SDK v6's `step.response.messages` is
1208
- * cumulative across steps; without this, multi-step callers duplicate
1209
- * every prior message on every save — the exact failure mode this fix
1210
- * addresses, just at the public-API layer.
1211
- */
1289
+ /** @deprecated SDK 7 response messages are step-local. */
1212
1290
  previousStep?: StepResult<TOOLS>;
1213
1291
  /**
1214
1292
  * The model used to generate the step.
@@ -1222,19 +1300,7 @@ export class Agent<
1222
1300
  provider?: string;
1223
1301
  },
1224
1302
  ): Promise<{ messages: MessageDoc[] }> {
1225
- const previousResponseMessageCount =
1226
- args.previousStep?.response.messages.length ?? 0;
1227
- if (
1228
- args.previousStep !== undefined &&
1229
- args.step.response.messages.length < previousResponseMessageCount
1230
- ) {
1231
- throw new Error(
1232
- `saveStep: step.response.messages length (${args.step.response.messages.length}) is less than ` +
1233
- `previousStep.response.messages length (${previousResponseMessageCount}). ` +
1234
- `Ensure previousStep is from the immediately preceding step in the same generation loop.`,
1235
- );
1236
- }
1237
- const { messages } = await serializeNewMessagesInStep(
1303
+ const { messages } = await serializeResponseMessages(
1238
1304
  ctx,
1239
1305
  this.component,
1240
1306
  args.step,
@@ -1242,7 +1308,9 @@ export class Agent<
1242
1308
  provider: args.provider ?? getProviderName(this.options.languageModel),
1243
1309
  model: args.model ?? getModelName(this.options.languageModel),
1244
1310
  },
1245
- previousResponseMessageCount,
1311
+ args.step.response.messages.length > 0
1312
+ ? args.step.response.messages
1313
+ : [{ role: "assistant", content: [] }],
1246
1314
  );
1247
1315
  const embeddings = await this.generateEmbeddings(
1248
1316
  ctx,
@@ -1557,25 +1625,34 @@ export class Agent<
1557
1625
  */
1558
1626
  stopWhen?: StopCondition<AgentTools> | Array<StopCondition<AgentTools>>;
1559
1627
  } & Options,
1560
- overrides?: CallSettings,
1628
+ overrides?: AgentCallSettings,
1561
1629
  ) {
1562
1630
  return internalActionGeneric({
1563
1631
  args: vTextArgs,
1564
1632
  handler: async (ctx_, args) => {
1565
1633
  const stream =
1566
1634
  args.stream === true ? spec?.stream || true : (spec?.stream ?? false);
1567
- const { userId, threadId, prompt, messages, maxSteps, ...rest } = args;
1635
+ const {
1636
+ userId,
1637
+ threadId,
1638
+ prompt,
1639
+ messages,
1640
+ maxSteps,
1641
+ system,
1642
+ ...rest
1643
+ } = args;
1568
1644
  const targetArgs = { userId, threadId };
1569
1645
  const llmArgs = {
1570
1646
  stopWhen: spec?.stopWhen,
1571
1647
  ...overrides,
1572
1648
  ...omit(rest, ["storageOptions", "contextOptions", "stream"]),
1649
+ instructions: system,
1573
1650
  messages: messages?.map(toModelMessage),
1574
1651
  prompt: Array.isArray(prompt) ? prompt.map(toModelMessage) : prompt,
1575
1652
  toolChoice: args.toolChoice as ToolChoice<AgentTools>,
1576
- } satisfies StreamingTextArgs<AgentTools>;
1653
+ } as any;
1577
1654
  if (maxSteps) {
1578
- llmArgs.stopWhen = stepCountIs(maxSteps);
1655
+ llmArgs.stopWhen = isStepCount(maxSteps);
1579
1656
  }
1580
1657
  const opts = {
1581
1658
  ...pick(spec, ["contextOptions", "storageOptions"]),
@@ -1636,13 +1713,19 @@ export class Agent<
1636
1713
  return internalActionGeneric({
1637
1714
  args: vSafeObjectArgs,
1638
1715
  handler: async (ctx_, args) => {
1639
- const { userId, threadId, callSettings, ...rest } = args;
1716
+ const { userId, threadId, callSettings, system, ...rest } = args;
1717
+ const {
1718
+ instructions: configuredInstructions,
1719
+ system: configuredSystem,
1720
+ ...configuredObjectArgs
1721
+ } = objectArgs;
1640
1722
  const overrides = pick(rest, ["contextOptions", "storageOptions"]);
1641
1723
  const targetArgs = { userId, threadId };
1642
1724
  const llmArgs = {
1643
- ...objectArgs,
1725
+ ...configuredObjectArgs,
1644
1726
  ...callSettings,
1645
1727
  ...omit(rest, ["storageOptions", "contextOptions"]),
1728
+ instructions: system ?? configuredInstructions ?? configuredSystem,
1646
1729
  messages: args.messages?.map(toModelMessage),
1647
1730
  prompt: Array.isArray(args.prompt)
1648
1731
  ? args.prompt.map(toModelMessage)