@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
@@ -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),
@@ -1182,7 +1268,8 @@ export class Agent<
1182
1268
  }
1183
1269
 
1184
1270
  /**
1185
- * Explicitly save a "step" created by the AI SDK.
1271
+ * Explicitly save a "step" created by the AI SDK. For multi-step generation
1272
+ * loops, each SDK 7 step already owns its response messages.
1186
1273
  * @param ctx The ctx argument to a mutation or action.
1187
1274
  * @param args The Step generated by the AI SDK.
1188
1275
  */
@@ -1199,6 +1286,8 @@ export class Agent<
1199
1286
  * The step to save, possibly including multiple tool calls.
1200
1287
  */
1201
1288
  step: StepResult<TOOLS>;
1289
+ /** @deprecated SDK 7 response messages are step-local. */
1290
+ previousStep?: StepResult<TOOLS>;
1202
1291
  /**
1203
1292
  * The model used to generate the step.
1204
1293
  * Defaults to the chat model for the Agent.
@@ -1211,7 +1300,7 @@ export class Agent<
1211
1300
  provider?: string;
1212
1301
  },
1213
1302
  ): Promise<{ messages: MessageDoc[] }> {
1214
- const { messages } = await serializeNewMessagesInStep(
1303
+ const { messages } = await serializeResponseMessages(
1215
1304
  ctx,
1216
1305
  this.component,
1217
1306
  args.step,
@@ -1219,6 +1308,9 @@ export class Agent<
1219
1308
  provider: args.provider ?? getProviderName(this.options.languageModel),
1220
1309
  model: args.model ?? getModelName(this.options.languageModel),
1221
1310
  },
1311
+ args.step.response.messages.length > 0
1312
+ ? args.step.response.messages
1313
+ : [{ role: "assistant", content: [] }],
1222
1314
  );
1223
1315
  const embeddings = await this.generateEmbeddings(
1224
1316
  ctx,
@@ -1533,25 +1625,34 @@ export class Agent<
1533
1625
  */
1534
1626
  stopWhen?: StopCondition<AgentTools> | Array<StopCondition<AgentTools>>;
1535
1627
  } & Options,
1536
- overrides?: CallSettings,
1628
+ overrides?: AgentCallSettings,
1537
1629
  ) {
1538
1630
  return internalActionGeneric({
1539
1631
  args: vTextArgs,
1540
1632
  handler: async (ctx_, args) => {
1541
1633
  const stream =
1542
1634
  args.stream === true ? spec?.stream || true : (spec?.stream ?? false);
1543
- 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;
1544
1644
  const targetArgs = { userId, threadId };
1545
1645
  const llmArgs = {
1546
1646
  stopWhen: spec?.stopWhen,
1547
1647
  ...overrides,
1548
1648
  ...omit(rest, ["storageOptions", "contextOptions", "stream"]),
1649
+ instructions: system,
1549
1650
  messages: messages?.map(toModelMessage),
1550
1651
  prompt: Array.isArray(prompt) ? prompt.map(toModelMessage) : prompt,
1551
1652
  toolChoice: args.toolChoice as ToolChoice<AgentTools>,
1552
- } satisfies StreamingTextArgs<AgentTools>;
1653
+ } as any;
1553
1654
  if (maxSteps) {
1554
- llmArgs.stopWhen = stepCountIs(maxSteps);
1655
+ llmArgs.stopWhen = isStepCount(maxSteps);
1555
1656
  }
1556
1657
  const opts = {
1557
1658
  ...pick(spec, ["contextOptions", "storageOptions"]),
@@ -1612,13 +1713,19 @@ export class Agent<
1612
1713
  return internalActionGeneric({
1613
1714
  args: vSafeObjectArgs,
1614
1715
  handler: async (ctx_, args) => {
1615
- 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;
1616
1722
  const overrides = pick(rest, ["contextOptions", "storageOptions"]);
1617
1723
  const targetArgs = { userId, threadId };
1618
1724
  const llmArgs = {
1619
- ...objectArgs,
1725
+ ...configuredObjectArgs,
1620
1726
  ...callSettings,
1621
1727
  ...omit(rest, ["storageOptions", "contextOptions"]),
1728
+ instructions: system ?? configuredInstructions ?? configuredSystem,
1622
1729
  messages: args.messages?.map(toModelMessage),
1623
1730
  prompt: Array.isArray(args.prompt)
1624
1731
  ? args.prompt.map(toModelMessage)