@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,9 +1,17 @@
1
- import { type CallSettings, type GenerateObjectResult, type IdGenerator, type LanguageModel, type ModelMessage, type StepResult, type StopCondition, type ToolSet } from "ai";
2
- import type { ActionCtx, AgentComponent, Config, Options } from "./types.js";
3
- import type { Message, MessageDoc } from "../validators.js";
4
- import { type ModelOrMetadata } from "../shared.js";
5
- import type { Agent } from "./index.js";
6
- export declare function startGeneration<T, Tools extends ToolSet = ToolSet, CustomCtx extends object = object>(ctx: ActionCtx & CustomCtx, component: AgentComponent,
1
+ import { type GenerateObjectResult, type IdGenerator, type LanguageModel, type Instructions, type ModelMessage, type StepResult, type StopCondition, type ToolSet } from "ai";
2
+ import type { Context } from "@ai-sdk/provider-utils";
3
+ import type { ActionCtx, AgentCallSettings, AgentComponent, Config, Options } from "./types.js";
4
+ import type { Message, MessageDoc } from "../../validators.js";
5
+ import { type ModelOrMetadata } from "../../shared.js";
6
+ import type { Agent } from "../index.js";
7
+ export declare function resolveUsageModel(toSave: {
8
+ step: {
9
+ model?: ModelOrMetadata;
10
+ };
11
+ } | {
12
+ object: unknown;
13
+ }, activeModel: ModelOrMetadata): ModelOrMetadata;
14
+ export declare function startGeneration<T, Tools extends ToolSet = ToolSet, CustomCtx extends object = object, RUNTIME_CONTEXT extends Context = Context>(ctx: ActionCtx & CustomCtx, component: AgentComponent,
7
15
  /**
8
16
  * These are the arguments you'll pass to the LLM call such as
9
17
  * `generateText` or `streamText`. This function will look up the context
@@ -44,13 +52,18 @@ args: T & {
44
52
  * the promptMessageId message, if provided.
45
53
  */
46
54
  messages?: (ModelMessage | Message)[];
55
+ instructions?: Instructions;
56
+ /** @deprecated Use instructions. */
57
+ system?: Instructions;
58
+ allowSystemInMessages?: boolean;
47
59
  /**
48
60
  * The abort signal to be passed to the LLM call. If triggered, it will
49
61
  * mark the pending message as failed. If the generation is asynchronously
50
62
  * aborted, it will trigger this signal when detected.
51
63
  */
52
64
  abortSignal?: AbortSignal;
53
- stopWhen?: StopCondition<Tools> | Array<StopCondition<Tools>>;
65
+ runtimeContext?: RUNTIME_CONTEXT;
66
+ stopWhen?: StopCondition<Tools, RUNTIME_CONTEXT> | Array<StopCondition<Tools, RUNTIME_CONTEXT>>;
54
67
  _internal?: {
55
68
  generateId?: IdGenerator;
56
69
  };
@@ -60,21 +73,23 @@ args: T & {
60
73
  languageModel?: LanguageModel;
61
74
  agentName: string;
62
75
  agentForToolCtx?: Agent;
63
- }): Promise<{
76
+ }, _operation?: "generateText" | "streamText" | "generateObject" | "streamObject"): Promise<{
64
77
  args: T & {
65
- system?: string;
78
+ instructions?: Instructions;
66
79
  model: LanguageModel;
67
80
  messages: ModelMessage[];
68
81
  prompt?: never;
69
82
  tools?: Tools;
70
- } & CallSettings;
83
+ runtimeContext?: RUNTIME_CONTEXT;
84
+ } & AgentCallSettings;
71
85
  order: number;
72
86
  stepOrder: number;
73
87
  userId: string | undefined;
74
88
  promptMessageId: string | undefined;
75
89
  updateModel: (model: ModelOrMetadata | undefined) => void;
76
90
  save: <TOOLS extends ToolSet>(toSave: {
77
- step: StepResult<TOOLS>;
91
+ step: StepResult<TOOLS, RUNTIME_CONTEXT>;
92
+ responseMessages?: ModelMessage[];
78
93
  } | {
79
94
  object: GenerateObjectResult<unknown>;
80
95
  }, createPendingMessage?: boolean, finishStreamId?: string) => Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/vercel/client/start.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,32 @@
1
- import { stepCountIs, } from "ai";
1
+ import { isStepCount, } from "ai";
2
2
  import { serializeResponseMessages, serializeObjectResult, } from "../mapping.js";
3
3
  import { embedMessages, fetchContextWithPrompt } from "./search.js";
4
- import { getModelName, getProviderName, } from "../shared.js";
4
+ import { getModelName, getProviderName, } from "../../shared.js";
5
5
  import { wrapTools } from "./createTool.js";
6
6
  import { assert, omit } from "convex-helpers";
7
7
  import { saveInputMessages } from "./saveInputMessages.js";
8
+ export function resolveUsageModel(toSave, activeModel) {
9
+ return "step" in toSave ? (toSave.step.model ?? activeModel) : activeModel;
10
+ }
11
+ /**
12
+ * The raw handler promises request and, for non-streaming calls, response
13
+ * bodies. Preserve explicit caller choices while opting in to those bodies.
14
+ */
15
+ function rawRequestResponseInclude(args, enabled, operation) {
16
+ if (!enabled)
17
+ return undefined;
18
+ const requested = {
19
+ ...args.experimental_include,
20
+ ...args.include,
21
+ };
22
+ return {
23
+ ...requested,
24
+ requestBody: requested.requestBody ?? true,
25
+ ...((operation === "generateText" || operation === "generateObject")
26
+ ? { responseBody: requested.responseBody ?? true }
27
+ : {}),
28
+ };
29
+ }
8
30
  export async function startGeneration(ctx, component,
9
31
  /**
10
32
  * These are the arguments you'll pass to the LLM call such as
@@ -13,7 +35,7 @@ export async function startGeneration(ctx, component,
13
35
  * The type of the arguments returned infers from the type of the arguments
14
36
  * you pass here.
15
37
  */
16
- args, { threadId, ...opts }) {
38
+ args, { threadId, ...opts }, _operation) {
17
39
  const userId = opts.userId ??
18
40
  (threadId &&
19
41
  (await ctx.runQuery(component.threads.getThread, { threadId }))
@@ -27,6 +49,11 @@ args, { threadId, ...opts }) {
27
49
  prompt: args.prompt,
28
50
  promptMessageId: args.promptMessageId,
29
51
  });
52
+ const allowSystemInMessages = args.allowSystemInMessages ?? true;
53
+ if (!allowSystemInMessages &&
54
+ context.messages.some((message) => message.role === "system")) {
55
+ throw new Error("System messages in assembled message history require allowSystemInMessages: true. Use instructions for top-level system guidance.");
56
+ }
30
57
  const saveMessages = opts.storageOptions?.saveMessages ?? "promptAndOutput";
31
58
  const { promptMessageId, pendingMessage, savedMessages } = threadId && saveMessages !== "none"
32
59
  ? await saveInputMessages(ctx, component, {
@@ -49,13 +76,23 @@ args, { threadId, ...opts }) {
49
76
  const model = args.model ?? opts.languageModel;
50
77
  assert(model, "model is required");
51
78
  let activeModel = model;
52
- const fail = async (reason) => {
53
- if (pendingMessageId) {
54
- await ctx.runMutation(component.messages.finalizeMessage, {
55
- messageId: pendingMessageId,
79
+ // Both the caller's AbortSignal listener and AI SDK's onAbort can report
80
+ // the same cancellation. Share the one finalization instead of racing two
81
+ // mutations for the pending message.
82
+ let pendingMessageFailure;
83
+ const fail = (reason) => {
84
+ if (!pendingMessageId)
85
+ return Promise.resolve();
86
+ if (!pendingMessageFailure) {
87
+ const messageId = pendingMessageId;
88
+ pendingMessageFailure = ctx
89
+ .runMutation(component.messages.finalizeMessage, {
90
+ messageId,
56
91
  result: { status: "failed", error: reason },
57
- });
92
+ })
93
+ .then(() => undefined);
58
94
  }
95
+ return pendingMessageFailure;
59
96
  };
60
97
  if (args.abortSignal) {
61
98
  const abortSignal = args.abortSignal;
@@ -71,26 +108,26 @@ args, { threadId, ...opts }) {
71
108
  agent: opts.agentForToolCtx,
72
109
  };
73
110
  const tools = wrapTools(toolCtx, args.tools);
111
+ const argsWithoutSystem = omit(args, ["system"]);
112
+ const { promptMessageId: _promptMessageId, messages: _messages, prompt: _prompt, instructions: _instructions, onStepFinish: _onStepFinish, ...aiCallArgs } = argsWithoutSystem;
113
+ const include = rawRequestResponseInclude(aiCallArgs, Boolean(opts.rawRequestResponseHandler), _operation);
74
114
  const aiArgs = {
75
115
  ...opts.callSettings,
76
116
  providerOptions: opts.providerOptions,
77
- ...omit(args, ["promptMessageId", "messages", "prompt"]),
117
+ ...aiCallArgs,
78
118
  model,
79
119
  messages: context.messages,
80
- stopWhen: args.stopWhen ?? (opts.maxSteps ? stepCountIs(opts.maxSteps) : undefined),
120
+ instructions: args.instructions ?? args.system,
121
+ allowSystemInMessages,
122
+ stopWhen: args.stopWhen ?? (opts.maxSteps ? isStepCount(opts.maxSteps) : undefined),
81
123
  tools,
124
+ ...(include ? { include } : {}),
82
125
  };
83
126
  // NOTE: We intentionally do NOT override _internal.generateId here.
84
127
  // The AI SDK uses generateId() for many internal IDs (approval IDs,
85
128
  // tool execution IDs, message IDs, etc.) and they must be unique.
86
129
  // The pending message is linked via the explicit `pendingMessageId`
87
130
  // parameter passed to addMessages in the save closure.
88
- // Track how many response messages we've already saved across steps.
89
- // step.response.messages is cumulative — each step appends to it.
90
- // We need to know which messages are new in each step to serialize
91
- // only the new ones (important for tool approval flows where the SDK
92
- // may add extra messages like approval tool-results).
93
- let previousResponseMessageCount = 0;
94
131
  return {
95
132
  args: aiArgs,
96
133
  order: order ?? 0,
@@ -116,10 +153,13 @@ args, { threadId, ...opts }) {
116
153
  serialized = await serializeObjectResult(ctx, component, toSave.object, activeModel);
117
154
  }
118
155
  else {
119
- const allResponseMessages = toSave.step.response.messages;
120
- const newResponseMessages = allResponseMessages.slice(previousResponseMessageCount);
121
- previousResponseMessageCount = allResponseMessages.length;
122
- serialized = await serializeResponseMessages(ctx, component, toSave.step, activeModel, newResponseMessages);
156
+ const newResponseMessages = toSave.responseMessages ?? toSave.step.response.messages;
157
+ // Even an empty completed step needs a durable assistant result so
158
+ // the pending message can be finalized at the storage boundary.
159
+ const responseMessagesToSave = newResponseMessages.length > 0
160
+ ? newResponseMessages
161
+ : [{ role: "assistant", content: [] }];
162
+ serialized = await serializeResponseMessages(ctx, component, toSave.step, activeModel, responseMessagesToSave);
123
163
  }
124
164
  const embeddings = await embedMessages(ctx, { threadId, ...opts, userId }, serialized.messages.map((m) => m.message));
125
165
  if (createPendingMessage) {
@@ -150,6 +190,7 @@ args, { threadId, ...opts }) {
150
190
  }
151
191
  else {
152
192
  pendingMessageId = lastMessage._id;
193
+ pendingMessageFailure = undefined;
153
194
  savedMessages.push(...saved.messages.slice(0, -1));
154
195
  }
155
196
  }
@@ -169,12 +210,13 @@ args, { threadId, ...opts }) {
169
210
  });
170
211
  }
171
212
  if (opts.usageHandler && output.usage) {
213
+ const usageModel = resolveUsageModel(toSave, activeModel);
172
214
  await opts.usageHandler(ctx, {
173
215
  userId,
174
216
  threadId,
175
217
  agentName: opts.agentName,
176
- model: getModelName(activeModel),
177
- provider: getProviderName(activeModel),
218
+ model: getModelName(usageModel),
219
+ provider: getProviderName(usageModel),
178
220
  usage: output.usage,
179
221
  providerMetadata: output.providerMetadata,
180
222
  });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/vercel/client/start.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
1
  import type { StreamTextResult, ToolSet } from "ai";
2
- import { streamText as streamTextAi } from "ai";
2
+ import type { Context } from "@ai-sdk/provider-utils";
3
3
  import { type StreamingOptions } from "./streaming.js";
4
- import type { ActionCtx, AgentComponent, AgentPrompt, GenerationOutputMetadata, Options, Output } from "./types.js";
5
- import type { Agent } from "./index.js";
4
+ import type { ActionCtx, AgentComponent, GenerationOutputMetadata, Options, StreamingTextArgs } from "./types.js";
5
+ import type { Output as AISDKOutput } from "ai";
6
+ import type { Agent } from "../index.js";
7
+ /** Finish every abort cleanup path before surfacing an internal failure. */
8
+ export declare function runAbortCleanup(cleanup: {
9
+ failCall: () => Promise<void>;
10
+ failStreamer: () => Promise<void>;
11
+ onAbort?: () => PromiseLike<void> | void;
12
+ }): Promise<void>;
6
13
  /**
7
14
  * This behaves like {@link streamText} from the "ai" package except that
8
15
  * it add context based on the userId and threadId and saves the input and
@@ -10,18 +17,12 @@ import type { Agent } from "./index.js";
10
17
  * Use {@link continueThread} to get a version of this function already scoped
11
18
  * to a thread (and optionally userId).
12
19
  */
13
- export declare function streamText<TOOLS extends ToolSet, OUTPUT extends Output<any, any, any> = never>(ctx: ActionCtx, component: AgentComponent,
20
+ export declare function streamText<AgentTools extends ToolSet, TOOLS extends ToolSet | undefined = undefined, OUTPUT extends AISDKOutput.Output<any, any, any> = AISDKOutput.Output<string, string, never>, RUNTIME_CONTEXT extends Context = Context>(ctx: ActionCtx, component: AgentComponent,
14
21
  /**
15
22
  * The arguments to the streamText function, similar to the ai sdk's
16
23
  * {@link streamText} function, along with Agent prompt options.
17
24
  */
18
- streamTextArgs: AgentPrompt & Omit<Parameters<typeof streamTextAi<TOOLS, OUTPUT>>[0], "model" | "prompt" | "messages"> & {
19
- /**
20
- * The tools to use for the tool calls. This will override tools specified
21
- * in the Agent constructor or createThread / continueThread.
22
- */
23
- tools?: TOOLS;
24
- },
25
+ streamTextArgs: StreamingTextArgs<AgentTools, TOOLS, OUTPUT, RUNTIME_CONTEXT>,
25
26
  /**
26
27
  * The {@link ContextOptions} and {@link StorageOptions}
27
28
  * options to use for fetching contextual messages and saving input/output messages.
@@ -42,5 +43,5 @@ options: Options & {
42
43
  */
43
44
  saveStreamDeltas?: boolean | StreamingOptions;
44
45
  agentForToolCtx?: Agent;
45
- }): Promise<StreamTextResult<TOOLS, OUTPUT> & GenerationOutputMetadata>;
46
+ }): Promise<StreamTextResult<TOOLS extends undefined ? AgentTools : TOOLS, RUNTIME_CONTEXT, OUTPUT> & GenerationOutputMetadata>;
46
47
  //# sourceMappingURL=streamText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamText.d.ts","sourceRoot":"","sources":["../../../src/vercel/client/streamText.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,OAAO,EAER,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,wBAAwB,EACxB,OAAO,EACP,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,4EAA4E;AAC5E,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1C,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,UAAU,SAAS,OAAO,EAC1B,KAAK,SAAS,OAAO,GAAG,SAAS,GAAG,SAAS,EAC7C,MAAM,SAAS,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CACnE,MAAM,EACN,MAAM,EACN,KAAK,CACN,EACD,eAAe,SAAS,OAAO,GAAG,OAAO,EAEzC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,cAAc;AACzB;;;GAGG;AACH,cAAc,EAAE,iBAAiB,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC;AAC7E;;;GAGG;AACH,OAAO,EAAE,OAAO,GAAG;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC9C,eAAe,CAAC,EAAE,KAAK,CAAC;CACzB,GACA,OAAO,CACR,gBAAgB,CACd,KAAK,SAAS,SAAS,GAAG,UAAU,GAAG,KAAK,EAC5C,eAAe,EACf,MAAM,CACP,GACC,wBAAwB,CAC3B,CA4LA"}
@@ -1,8 +1,19 @@
1
1
  import { streamText as streamTextAi } from "ai";
2
2
  import { compressUIMessageChunks, DeltaStreamer, mergeTransforms, } from "./streaming.js";
3
3
  import { startGeneration } from "./start.js";
4
- import { getModelName, getProviderName } from "../shared.js";
4
+ import { getModelName, getProviderName } from "../../shared.js";
5
5
  import { errorToString, willContinue } from "./utils.js";
6
+ /** Finish every abort cleanup path before surfacing an internal failure. */
7
+ export async function runAbortCleanup(cleanup) {
8
+ const results = await Promise.allSettled([
9
+ cleanup.failCall(),
10
+ cleanup.failStreamer(),
11
+ ]);
12
+ await cleanup.onAbort?.();
13
+ const failure = results.find((result) => result.status === "rejected");
14
+ if (failure)
15
+ throw failure.reason;
16
+ }
6
17
  /**
7
18
  * This behaves like {@link streamText} from the "ai" package except that
8
19
  * it add context based on the userId and threadId and saves the input and
@@ -22,8 +33,14 @@ streamTextArgs,
22
33
  */
23
34
  options) {
24
35
  const { threadId } = options ?? {};
25
- const { args, userId, order, stepOrder, promptMessageId, ...call } = await startGeneration(ctx, component, streamTextArgs, options);
36
+ const { args, userId, order, stepOrder, promptMessageId, ...call } = await startGeneration(ctx, component, streamTextArgs, options, "streamText");
26
37
  const steps = [];
38
+ let initialResponseMessages = [];
39
+ let initialResponseMessagesSaved = false;
40
+ const responseMessagesForStep = (step) => [
41
+ ...(initialResponseMessagesSaved ? [] : initialResponseMessages),
42
+ ...step.response.messages,
43
+ ];
27
44
  // Track the final step for atomic save with stream finish (issue #181).
28
45
  // Only used when streamText awaits stream consumption itself; the
29
46
  // `returnImmediately` path saves inline instead (see onStepFinish below).
@@ -66,7 +83,19 @@ options) {
66
83
  await streamer?.fail(errorToString(error.error));
67
84
  return streamTextArgs.onError?.(error);
68
85
  },
86
+ onAbort: async (event) => {
87
+ const reason = args.abortSignal?.reason
88
+ ? errorToString(args.abortSignal.reason)
89
+ : "streamText aborted";
90
+ await runAbortCleanup({
91
+ failCall: () => call.fail(reason),
92
+ failStreamer: async () => streamer?.fail(reason),
93
+ onAbort: () => streamTextArgs.onAbort?.(event),
94
+ });
95
+ },
69
96
  prepareStep: async (options) => {
97
+ if (options.stepNumber === 0)
98
+ initialResponseMessages = [...options.responseMessages];
70
99
  const result = await streamTextArgs.prepareStep?.(options);
71
100
  if (result) {
72
101
  const model = result.model ?? options.model;
@@ -80,7 +109,7 @@ options) {
80
109
  }
81
110
  return undefined;
82
111
  },
83
- onStepFinish: async (step) => {
112
+ onStepEnd: async (step) => {
84
113
  steps.push(step);
85
114
  const createPendingMessage = await willContinue(steps, args.stopWhen);
86
115
  if (!createPendingMessage && streamer) {
@@ -89,20 +118,25 @@ options) {
89
118
  if (willAwaitStream) {
90
119
  // We're about to `await stream` below — defer the save so it
91
120
  // happens atomically with stream finish (issue #181).
92
- pendingFinalStep = step;
121
+ pendingFinalStep = {
122
+ step,
123
+ responseMessages: responseMessagesForStep(step),
124
+ };
93
125
  }
94
126
  else {
95
127
  // returnImmediately path: streamText is about to return without
96
128
  // awaiting consumption, so the deferred-save block below won't
97
129
  // see this step. Save inline now (issue #265).
98
130
  const finishStreamId = await streamer.getOrCreateStreamId();
99
- await call.save({ step }, false, finishStreamId);
131
+ await call.save({ step, responseMessages: responseMessagesForStep(step) }, false, finishStreamId);
132
+ initialResponseMessagesSaved = true;
100
133
  }
101
134
  }
102
135
  else {
103
- await call.save({ step }, createPendingMessage);
136
+ await call.save({ step, responseMessages: responseMessagesForStep(step) }, createPendingMessage);
137
+ initialResponseMessagesSaved = true;
104
138
  }
105
- return args.onStepFinish?.(step);
139
+ return (streamTextArgs.onStepEnd ?? streamTextArgs.onStepFinish)?.(step);
106
140
  },
107
141
  });
108
142
  const stream = streamer?.consumeStream(result.toUIMessageStream());
@@ -119,7 +153,7 @@ options) {
119
153
  // Save the deferred final step if it was already generated but not yet persisted
120
154
  if (pendingFinalStep) {
121
155
  try {
122
- await call.save({ step: pendingFinalStep }, false);
156
+ await call.save(pendingFinalStep, false);
123
157
  }
124
158
  catch (saveError) {
125
159
  console.error("Failed to save deferred final step:", saveError);
@@ -132,7 +166,7 @@ options) {
132
166
  // If we deferred the final step save, do it now with atomic stream finish.
133
167
  if (pendingFinalStep && streamer) {
134
168
  const finishStreamId = await streamer.getOrCreateStreamId();
135
- await call.save({ step: pendingFinalStep }, false, finishStreamId);
169
+ await call.save(pendingFinalStep, false, finishStreamId);
136
170
  }
137
171
  const metadata = {
138
172
  promptMessageId,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamText.js","sourceRoot":"","sources":["../../../src/vercel/client/streamText.ts"],"names":[],"mappings":"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"}