@convex-dev/agent 0.0.1 → 0.0.2

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 (55) hide show
  1. package/README.md +26 -0
  2. package/dist/commonjs/client/index.d.ts +788 -79
  3. package/dist/commonjs/client/index.d.ts.map +1 -1
  4. package/dist/commonjs/client/index.js +117 -154
  5. package/dist/commonjs/client/index.js.map +1 -1
  6. package/dist/commonjs/component/messages.d.ts +11 -3
  7. package/dist/commonjs/component/messages.d.ts.map +1 -1
  8. package/dist/commonjs/component/messages.js +2 -1
  9. package/dist/commonjs/component/messages.js.map +1 -1
  10. package/dist/commonjs/component/schema.d.ts +18 -12
  11. package/dist/commonjs/component/schema.d.ts.map +1 -1
  12. package/dist/commonjs/component/schema.js +1 -0
  13. package/dist/commonjs/component/schema.js.map +1 -1
  14. package/dist/commonjs/component/vector/index.d.ts.map +1 -1
  15. package/dist/commonjs/component/vector/index.js +1 -1
  16. package/dist/commonjs/component/vector/index.js.map +1 -1
  17. package/dist/commonjs/mapping.d.ts +3 -2
  18. package/dist/commonjs/mapping.d.ts.map +1 -1
  19. package/dist/commonjs/mapping.js +45 -13
  20. package/dist/commonjs/mapping.js.map +1 -1
  21. package/dist/commonjs/validators.d.ts +2736 -76
  22. package/dist/commonjs/validators.d.ts.map +1 -1
  23. package/dist/commonjs/validators.js +72 -7
  24. package/dist/commonjs/validators.js.map +1 -1
  25. package/dist/esm/client/index.d.ts +788 -79
  26. package/dist/esm/client/index.d.ts.map +1 -1
  27. package/dist/esm/client/index.js +117 -154
  28. package/dist/esm/client/index.js.map +1 -1
  29. package/dist/esm/component/messages.d.ts +11 -3
  30. package/dist/esm/component/messages.d.ts.map +1 -1
  31. package/dist/esm/component/messages.js +2 -1
  32. package/dist/esm/component/messages.js.map +1 -1
  33. package/dist/esm/component/schema.d.ts +18 -12
  34. package/dist/esm/component/schema.d.ts.map +1 -1
  35. package/dist/esm/component/schema.js +1 -0
  36. package/dist/esm/component/schema.js.map +1 -1
  37. package/dist/esm/component/vector/index.d.ts.map +1 -1
  38. package/dist/esm/component/vector/index.js +1 -1
  39. package/dist/esm/component/vector/index.js.map +1 -1
  40. package/dist/esm/mapping.d.ts +3 -2
  41. package/dist/esm/mapping.d.ts.map +1 -1
  42. package/dist/esm/mapping.js +45 -13
  43. package/dist/esm/mapping.js.map +1 -1
  44. package/dist/esm/validators.d.ts +2736 -76
  45. package/dist/esm/validators.d.ts.map +1 -1
  46. package/dist/esm/validators.js +72 -7
  47. package/dist/esm/validators.js.map +1 -1
  48. package/package.json +7 -7
  49. package/src/client/index.ts +269 -191
  50. package/src/component/_generated/api.d.ts +5 -0
  51. package/src/component/messages.ts +2 -1
  52. package/src/component/schema.ts +1 -0
  53. package/src/component/vector/index.ts +1 -7
  54. package/src/mapping.ts +60 -19
  55. package/src/validators.ts +102 -9
@@ -401,6 +401,7 @@ async function addMessagesHandler(
401
401
  ...rest
402
402
  } = args;
403
403
  const parent = parentMessageId && (await ctx.db.get(parentMessageId));
404
+ // TODO: I think this is a bug - parent will be pending always?
404
405
  if (failPendingSteps && parent?.status !== "pending") {
405
406
  assert(args.threadId, "threadId is required to fail pending steps");
406
407
  const pendingMessages = await ctx.db
@@ -594,7 +595,7 @@ export const rollbackMessage = mutation({
594
595
  }
595
596
  await ctx.db.patch(messageId, {
596
597
  status: "failed",
597
- text: error ?? message.text,
598
+ error: error,
598
599
  });
599
600
  },
600
601
  });
@@ -27,6 +27,7 @@ export const schema = defineSchema({
27
27
  stepId: v.optional(v.id("steps")),
28
28
  agentName: v.optional(v.string()),
29
29
  message: v.optional(vMessage),
30
+ error: v.optional(v.string()),
30
31
  model: v.optional(v.string()),
31
32
  text: v.optional(v.string()),
32
33
  embeddingId: v.optional(vVectorId),
@@ -1,12 +1,6 @@
1
1
  import { paginator } from "convex-helpers/server/pagination";
2
2
  import { v } from "convex/values";
3
- import {
4
- ActionCtx,
5
- mutation,
6
- MutationCtx,
7
- query,
8
- QueryCtx,
9
- } from "../_generated/server";
3
+ import { ActionCtx, mutation, MutationCtx, query } from "../_generated/server";
10
4
  import {
11
5
  EmbeddingsWithoutDenormalizedFields,
12
6
  getVectorTableName,
package/src/mapping.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import {
2
2
  convertToCoreMessages,
3
3
  coreMessageSchema,
4
+ GenerateObjectResult,
4
5
  type AssistantContent,
5
- type CoreAssistantMessage,
6
6
  type CoreMessage,
7
- type CoreToolMessage,
8
7
  type DataContent,
9
8
  type GenerateTextResult,
10
9
  type StepResult,
@@ -13,8 +12,12 @@ import {
13
12
  type Message as UIMessage,
14
13
  type UserContent,
15
14
  } from "ai";
16
- import { MessageWithFileAndId, Step } from "./validators";
17
15
  import { assert } from "convex-helpers";
16
+ import {
17
+ MessageWithFileAndId,
18
+ Step,
19
+ StepWithMessagesWithFileAndId,
20
+ } from "./validators";
18
21
 
19
22
  export type SerializeUrlsAndUint8Arrays<T> = T extends URL
20
23
  ? string
@@ -115,6 +118,41 @@ export function serializeNewMessagesInStep<TOOLS extends ToolSet>(
115
118
  return messages;
116
119
  }
117
120
 
121
+ export function serializeObjectResult(
122
+ result: GenerateObjectResult<unknown>
123
+ ): StepWithMessagesWithFileAndId {
124
+ const text = JSON.stringify(result.object);
125
+ const serializedMessage = serializeMessageWithId({
126
+ role: "assistant" as const,
127
+ content: text,
128
+ id: result.response.id,
129
+ });
130
+
131
+ const messages = [serializedMessage];
132
+
133
+ return {
134
+ messages,
135
+ step: {
136
+ text,
137
+ isContinued: false,
138
+ stepType: "initial",
139
+ toolCalls: [],
140
+ toolResults: [],
141
+ usage: result.usage,
142
+ warnings: result.warnings,
143
+ finishReason: result.finishReason,
144
+ request: result.request,
145
+ response: {
146
+ ...result.response,
147
+ timestamp: result.response.timestamp.getTime(),
148
+ messages,
149
+ },
150
+ providerMetadata: result.providerMetadata,
151
+ experimental_providerMetadata: result.experimental_providerMetadata,
152
+ },
153
+ };
154
+ }
155
+
118
156
  export function deserializeContent(content: SerializedContent): Content {
119
157
  if (typeof content === "string") {
120
158
  return content;
@@ -172,23 +210,26 @@ export function promptOrMessagesToCoreMessages(args: {
172
210
  if (args.system) {
173
211
  messages.push({ role: "system", content: args.system });
174
212
  }
175
- if (!args.messages) {
176
- assert(args.prompt, "messages or prompt is required");
213
+ assert(args.prompt || args.messages, "messages or prompt is required");
214
+ if (args.messages) {
215
+ if (
216
+ args.messages.some(
217
+ (m) =>
218
+ typeof m === "object" &&
219
+ m !== null &&
220
+ (m.role === "data" || // UI-only role
221
+ "toolInvocations" in m || // UI-specific field
222
+ "parts" in m || // UI-specific field
223
+ "experimental_attachments" in m)
224
+ )
225
+ ) {
226
+ messages.push(...convertToCoreMessages(args.messages as UIMessage[]));
227
+ } else {
228
+ messages.push(...coreMessageSchema.array().parse(args.messages));
229
+ }
230
+ }
231
+ if (args.prompt) {
177
232
  messages.push({ role: "user", content: args.prompt });
178
- } else if (
179
- args.messages.some(
180
- (m) =>
181
- typeof m === "object" &&
182
- m !== null &&
183
- (m.role === "data" || // UI-only role
184
- "toolInvocations" in m || // UI-specific field
185
- "parts" in m || // UI-specific field
186
- "experimental_attachments" in m)
187
- )
188
- ) {
189
- messages.push(...convertToCoreMessages(args.messages as UIMessage[]));
190
- } else {
191
- messages.push(...coreMessageSchema.array().parse(args.messages));
192
233
  }
193
234
  assert(messages.length > 0, "Messages must contain at least one message");
194
235
  return messages;
package/src/validators.ts CHANGED
@@ -1,10 +1,12 @@
1
- import { Infer, v } from "convex/values";
1
+ import { Infer, ObjectType, v } from "convex/values";
2
2
  import { vVectorDimension } from "./component/vector/tables";
3
3
 
4
4
  // const deprecated = v.optional(v.any()) as unknown as VNull<unknown, "optional">;
5
5
 
6
6
  const providerOptions = v.optional(v.record(v.string(), v.any()));
7
+ export type ProviderOptions = Infer<typeof providerOptions>;
7
8
  const experimental_providerMetadata = providerOptions;
9
+ export type ProviderMetadata = Infer<typeof experimental_providerMetadata>;
8
10
 
9
11
  export const vThreadStatus = v.union(
10
12
  v.literal("active"),
@@ -186,6 +188,14 @@ export const vResponse = v.object({
186
188
  body: v.optional(v.any()),
187
189
  });
188
190
 
191
+ export const vResponseWithoutMessages = v.object({
192
+ id: v.string(),
193
+ timestamp: v.number(),
194
+ modelId: v.string(),
195
+ headers: v.optional(v.record(v.string(), v.string())), // clear these?
196
+ body: v.optional(v.any()),
197
+ });
198
+
189
199
  export const vFinishReason = v.union(
190
200
  v.literal("stop"),
191
201
  v.literal("length"),
@@ -250,6 +260,18 @@ export const vStepWithMessages = v.object({
250
260
  });
251
261
  export type StepWithMessagesWithFileAndId = Infer<typeof vStepWithMessages>;
252
262
 
263
+ export const vObjectResult = v.object({
264
+ request: vRequest,
265
+ response: vResponseWithoutMessages,
266
+ finishReason: vFinishReason,
267
+ usage: v.optional(v.any()),
268
+ object: v.any(),
269
+ error: v.optional(v.string()),
270
+ warnings: v.optional(v.array(vLanguageModelV1CallWarning)),
271
+ providerMetadata: providerOptions,
272
+ experimental_providerMetadata,
273
+ });
274
+ export type ObjectResult = Infer<typeof vObjectResult>;
253
275
  export const vSearchOptions = v.object({
254
276
  vector: v.optional(v.array(v.number())),
255
277
  vectorModel: v.optional(v.string()),
@@ -279,18 +301,89 @@ export const vStorageOptions = v.object({
279
301
  saveAllOutputMessages: v.optional(v.boolean()),
280
302
  });
281
303
 
282
- export const vThreadArgs = v.object({
283
- maxSteps: v.optional(v.number()),
304
+ const vPromptFields = {
305
+ system: v.optional(v.string()),
284
306
  prompt: v.optional(v.string()),
285
307
  messages: v.optional(v.array(vMessage)),
286
- });
308
+ };
309
+
310
+ export const vCallSettingsFields = {
311
+ maxTokens: v.optional(v.number()),
312
+ temperature: v.optional(v.number()),
313
+ topP: v.optional(v.number()),
314
+ topK: v.optional(v.number()),
315
+ presencePenalty: v.optional(v.number()),
316
+ frequencyPenalty: v.optional(v.number()),
317
+ seed: v.optional(v.number()),
318
+ maxRetries: v.optional(v.number()),
319
+ headers: v.optional(v.record(v.string(), v.string())),
320
+ };
321
+ export type CallSettings = ObjectType<typeof vCallSettingsFields>;
287
322
 
288
- export const vObjectArgs = v.object({
289
- output: v.optional(v.any()),
290
- mode: v.optional(v.literal("json")),
291
- prompt: v.optional(v.string()),
292
- messages: v.optional(v.array(vMessage)),
323
+ export const vTextArgs = v.object({
324
+ ...vCallSettingsFields,
325
+ ...vPromptFields,
326
+ toolChoice: v.optional(
327
+ v.union(
328
+ v.literal("auto"),
329
+ v.literal("none"),
330
+ v.literal("required"),
331
+ v.object({
332
+ type: v.literal("tool"),
333
+ toolName: v.string(),
334
+ })
335
+ )
336
+ ),
337
+ maxSteps: v.optional(v.number()),
338
+ experimental_continueSteps: v.optional(v.boolean()),
339
+ providerOptions,
340
+ experimental_providerMetadata,
293
341
  });
342
+ export type TextArgs = Infer<typeof vTextArgs>;
343
+
344
+ const objectArgsCommonFields = {
345
+ ...vCallSettingsFields,
346
+ ...vPromptFields,
347
+ providerOptions,
348
+ experimental_providerMetadata,
349
+ };
350
+
351
+ export const vSafeObjectArgs = v.union(
352
+ v.object({
353
+ ...objectArgsCommonFields,
354
+ output: v.optional(v.literal("object")),
355
+ schema: v.any(), // JSON schema
356
+ schemaName: v.optional(v.string()),
357
+ schemaDescription: v.optional(v.string()),
358
+ mode: v.optional(
359
+ v.union(v.literal("auto"), v.literal("json"), v.literal("tool"))
360
+ ),
361
+ }),
362
+ v.object({
363
+ ...objectArgsCommonFields,
364
+ output: v.optional(v.literal("array")),
365
+ schema: v.any(), // JSON schema
366
+ schemaName: v.optional(v.string()),
367
+ schemaDescription: v.optional(v.string()),
368
+ mode: v.optional(
369
+ v.union(v.literal("auto"), v.literal("json"), v.literal("tool"))
370
+ ),
371
+ }),
372
+ v.object({
373
+ ...objectArgsCommonFields,
374
+ output: v.optional(v.literal("enum")),
375
+ enum: v.array(v.string()),
376
+ mode: v.optional(
377
+ v.union(v.literal("auto"), v.literal("json"), v.literal("tool"))
378
+ ),
379
+ }),
380
+ v.object({
381
+ ...objectArgsCommonFields,
382
+ output: v.literal("no-schema"),
383
+ mode: v.optional(v.literal("json")),
384
+ })
385
+ );
386
+ export type SafeObjectArgs = Infer<typeof vSafeObjectArgs>;
294
387
 
295
388
  export const vEmbeddingsWithMetadata = v.object({
296
389
  vectors: v.array(v.union(v.array(v.number()), v.null())),