@convex-dev/agent 0.1.1 → 0.1.2-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 (109) hide show
  1. package/README.md +9 -3
  2. package/dist/commonjs/client/createTool.d.ts +49 -0
  3. package/dist/commonjs/client/createTool.d.ts.map +1 -0
  4. package/dist/commonjs/client/createTool.js +45 -0
  5. package/dist/commonjs/client/createTool.js.map +1 -0
  6. package/dist/commonjs/client/index.d.ts +101 -322
  7. package/dist/commonjs/client/index.d.ts.map +1 -1
  8. package/dist/commonjs/client/index.js +142 -194
  9. package/dist/commonjs/client/index.js.map +1 -1
  10. package/dist/commonjs/client/streaming.d.ts +54 -0
  11. package/dist/commonjs/client/streaming.d.ts.map +1 -0
  12. package/dist/commonjs/client/streaming.js +121 -0
  13. package/dist/commonjs/client/streaming.js.map +1 -0
  14. package/dist/commonjs/client/types.d.ts +290 -2
  15. package/dist/commonjs/client/types.d.ts.map +1 -1
  16. package/dist/commonjs/component/messages.d.ts +104 -138
  17. package/dist/commonjs/component/messages.d.ts.map +1 -1
  18. package/dist/commonjs/component/messages.js +15 -14
  19. package/dist/commonjs/component/messages.js.map +1 -1
  20. package/dist/commonjs/component/schema.d.ts +873 -3
  21. package/dist/commonjs/component/schema.d.ts.map +1 -1
  22. package/dist/commonjs/component/schema.js +39 -1
  23. package/dist/commonjs/component/schema.js.map +1 -1
  24. package/dist/commonjs/component/streams.d.ts +191 -0
  25. package/dist/commonjs/component/streams.d.ts.map +1 -0
  26. package/dist/commonjs/component/streams.js +169 -0
  27. package/dist/commonjs/component/streams.js.map +1 -0
  28. package/dist/commonjs/component/threads.d.ts +1 -1
  29. package/dist/commonjs/component/threads.js +3 -3
  30. package/dist/commonjs/component/threads.js.map +1 -1
  31. package/dist/commonjs/component/users.js +2 -2
  32. package/dist/commonjs/component/users.js.map +1 -1
  33. package/dist/commonjs/mapping.d.ts.map +1 -1
  34. package/dist/commonjs/mapping.js +3 -1
  35. package/dist/commonjs/mapping.js.map +1 -1
  36. package/dist/commonjs/react/index.d.ts +99 -0
  37. package/dist/commonjs/react/index.d.ts.map +1 -1
  38. package/dist/commonjs/react/index.js +505 -1
  39. package/dist/commonjs/react/index.js.map +1 -1
  40. package/dist/commonjs/react/toUIMessages.d.ts +8 -0
  41. package/dist/commonjs/react/toUIMessages.d.ts.map +1 -0
  42. package/dist/commonjs/react/toUIMessages.js +134 -0
  43. package/dist/commonjs/react/toUIMessages.js.map +1 -0
  44. package/dist/commonjs/validators.d.ts +506 -4
  45. package/dist/commonjs/validators.d.ts.map +1 -1
  46. package/dist/commonjs/validators.js +49 -2
  47. package/dist/commonjs/validators.js.map +1 -1
  48. package/dist/esm/client/createTool.d.ts +49 -0
  49. package/dist/esm/client/createTool.d.ts.map +1 -0
  50. package/dist/esm/client/createTool.js +45 -0
  51. package/dist/esm/client/createTool.js.map +1 -0
  52. package/dist/esm/client/index.d.ts +101 -322
  53. package/dist/esm/client/index.d.ts.map +1 -1
  54. package/dist/esm/client/index.js +142 -194
  55. package/dist/esm/client/index.js.map +1 -1
  56. package/dist/esm/client/streaming.d.ts +54 -0
  57. package/dist/esm/client/streaming.d.ts.map +1 -0
  58. package/dist/esm/client/streaming.js +121 -0
  59. package/dist/esm/client/streaming.js.map +1 -0
  60. package/dist/esm/client/types.d.ts +290 -2
  61. package/dist/esm/client/types.d.ts.map +1 -1
  62. package/dist/esm/component/messages.d.ts +104 -138
  63. package/dist/esm/component/messages.d.ts.map +1 -1
  64. package/dist/esm/component/messages.js +15 -14
  65. package/dist/esm/component/messages.js.map +1 -1
  66. package/dist/esm/component/schema.d.ts +873 -3
  67. package/dist/esm/component/schema.d.ts.map +1 -1
  68. package/dist/esm/component/schema.js +39 -1
  69. package/dist/esm/component/schema.js.map +1 -1
  70. package/dist/esm/component/streams.d.ts +191 -0
  71. package/dist/esm/component/streams.d.ts.map +1 -0
  72. package/dist/esm/component/streams.js +169 -0
  73. package/dist/esm/component/streams.js.map +1 -0
  74. package/dist/esm/component/threads.d.ts +1 -1
  75. package/dist/esm/component/threads.js +3 -3
  76. package/dist/esm/component/threads.js.map +1 -1
  77. package/dist/esm/component/users.js +2 -2
  78. package/dist/esm/component/users.js.map +1 -1
  79. package/dist/esm/mapping.d.ts.map +1 -1
  80. package/dist/esm/mapping.js +3 -1
  81. package/dist/esm/mapping.js.map +1 -1
  82. package/dist/esm/react/index.d.ts +99 -0
  83. package/dist/esm/react/index.d.ts.map +1 -1
  84. package/dist/esm/react/index.js +505 -1
  85. package/dist/esm/react/index.js.map +1 -1
  86. package/dist/esm/react/toUIMessages.d.ts +8 -0
  87. package/dist/esm/react/toUIMessages.d.ts.map +1 -0
  88. package/dist/esm/react/toUIMessages.js +134 -0
  89. package/dist/esm/react/toUIMessages.js.map +1 -0
  90. package/dist/esm/validators.d.ts +506 -4
  91. package/dist/esm/validators.d.ts.map +1 -1
  92. package/dist/esm/validators.js +49 -2
  93. package/dist/esm/validators.js.map +1 -1
  94. package/package.json +5 -1
  95. package/src/client/createTool.ts +108 -0
  96. package/src/client/index.ts +270 -689
  97. package/src/client/streaming.ts +166 -0
  98. package/src/client/types.ts +430 -5
  99. package/src/component/_generated/api.d.ts +339 -188
  100. package/src/component/messages.ts +15 -14
  101. package/src/component/schema.ts +46 -0
  102. package/src/component/streams.ts +206 -0
  103. package/src/component/threads.ts +3 -3
  104. package/src/component/users.ts +2 -2
  105. package/src/mapping.ts +3 -1
  106. package/src/react/index.ts +687 -1
  107. package/src/react/toUIMessages.ts +153 -0
  108. package/src/validators.test.ts +18 -0
  109. package/src/validators.ts +72 -2
@@ -0,0 +1,153 @@
1
+ import { UIMessage } from "ai";
2
+ import type { ToolInvocationUIPart } from "@ai-sdk/ui-utils";
3
+ import { MessageDoc } from "../client";
4
+ import { deserializeMessage, toUIFilePart } from "../mapping";
5
+
6
+ export type UIMessageOrdered = UIMessage & {
7
+ order: number;
8
+ stepOrder: number;
9
+ };
10
+
11
+ export function toUIMessages(messages: MessageDoc[]): UIMessageOrdered[] {
12
+ const uiMessages: UIMessageOrdered[] = [];
13
+ let assistantMessage: UIMessageOrdered | undefined;
14
+ for (const message of messages) {
15
+ const coreMessage = message.message && deserializeMessage(message.message);
16
+ const text = message.text ?? "";
17
+ const content = coreMessage?.content;
18
+ const nonStringContent =
19
+ content && typeof content !== "string" ? content : [];
20
+ if (!coreMessage) continue;
21
+ if (coreMessage.role === "system") {
22
+ uiMessages.push({
23
+ id: message.id ?? message._id,
24
+ createdAt: new Date(message._creationTime),
25
+ role: "system",
26
+ content: text,
27
+ parts: [{ type: "text", text }],
28
+ order: message.order,
29
+ stepOrder: message.stepOrder,
30
+ });
31
+ } else if (coreMessage.role === "user") {
32
+ const parts: UIMessage["parts"] = [];
33
+ if (text) {
34
+ parts.push({ type: "text", text });
35
+ }
36
+ if (message.files) {
37
+ parts.push(...message.files.map(toUIFilePart));
38
+ }
39
+ uiMessages.push({
40
+ id: message.id ?? message._id,
41
+ createdAt: new Date(message._creationTime),
42
+ role: "user",
43
+ content: message.text ?? "",
44
+ parts,
45
+ order: message.order,
46
+ stepOrder: message.stepOrder,
47
+ });
48
+ } else {
49
+ if (coreMessage.role === "tool" && !assistantMessage) {
50
+ console.warn(
51
+ "Tool message without preceding assistant message.. skipping",
52
+ message
53
+ );
54
+ continue;
55
+ }
56
+ if (!assistantMessage) {
57
+ assistantMessage = {
58
+ id: message.id ?? message._id,
59
+ createdAt: new Date(message._creationTime),
60
+ role: "assistant",
61
+ content: message.text ?? "",
62
+ parts: [],
63
+ order: message.order,
64
+ stepOrder: message.stepOrder,
65
+ };
66
+ uiMessages.push(assistantMessage);
67
+ }
68
+ // update it to the last message's id
69
+ assistantMessage.id = message.id ?? message._id;
70
+ if (message.text) {
71
+ assistantMessage.parts.push({
72
+ type: "text",
73
+ text: message.text,
74
+ });
75
+ assistantMessage.content += message.text;
76
+ }
77
+ if (message.reasoning) {
78
+ assistantMessage.parts.push({
79
+ type: "reasoning",
80
+ reasoning: message.reasoning,
81
+ details: message.reasoningDetails ?? [],
82
+ });
83
+ }
84
+ for (const source of message.sources ?? []) {
85
+ assistantMessage.parts.push({
86
+ type: "source",
87
+ source,
88
+ });
89
+ }
90
+ for (const file of message.files ?? []) {
91
+ assistantMessage.parts.push(toUIFilePart(file));
92
+ }
93
+ for (const contentPart of nonStringContent) {
94
+ switch (contentPart.type) {
95
+ case "tool-call":
96
+ assistantMessage.parts.push({
97
+ type: "step-start",
98
+ });
99
+ assistantMessage.parts.push({
100
+ type: "tool-invocation",
101
+ toolInvocation: {
102
+ state: "call",
103
+ step: assistantMessage.parts.filter(
104
+ (part) => part.type === "tool-invocation"
105
+ ).length,
106
+ toolCallId: contentPart.toolCallId,
107
+ toolName: contentPart.toolName,
108
+ args: contentPart.args,
109
+ },
110
+ });
111
+ break;
112
+ case "tool-result": {
113
+ const call = assistantMessage.parts.find(
114
+ (part) =>
115
+ part.type === "tool-invocation" &&
116
+ part.toolInvocation.toolCallId === contentPart.toolCallId
117
+ ) as ToolInvocationUIPart | undefined;
118
+ const toolInvocation: ToolInvocationUIPart["toolInvocation"] = {
119
+ state: "result",
120
+ toolCallId: contentPart.toolCallId,
121
+ toolName: contentPart.toolName,
122
+ args: call?.toolInvocation.args,
123
+ result: contentPart.result,
124
+ step:
125
+ call?.toolInvocation.step ??
126
+ assistantMessage.parts.filter(
127
+ (part) => part.type === "tool-invocation"
128
+ ).length,
129
+ };
130
+ if (call) {
131
+ (call as ToolInvocationUIPart).toolInvocation = toolInvocation;
132
+ } else {
133
+ console.warn(
134
+ "Tool result without preceding tool call.. adding anyways",
135
+ contentPart
136
+ );
137
+ assistantMessage.parts.push({
138
+ type: "tool-invocation",
139
+ toolInvocation,
140
+ });
141
+ }
142
+ break;
143
+ }
144
+ }
145
+ }
146
+ }
147
+ if (!message.tool) {
148
+ // Reset it so the next set of tool calls will create a new assistant message
149
+ assistantMessage = undefined;
150
+ }
151
+ }
152
+ return uiMessages;
153
+ }
@@ -18,6 +18,7 @@ import {
18
18
  vUserMessage,
19
19
  } from "./validators";
20
20
  import { vUserContent } from "./validators";
21
+ import type { TextStreamPart } from "./validators";
21
22
  import {
22
23
  AssistantContent,
23
24
  CoreAssistantMessage,
@@ -28,8 +29,10 @@ import {
28
29
  FilePart,
29
30
  ImagePart,
30
31
  TextPart,
32
+ TextStreamPart as AITextStreamPart,
31
33
  ToolCallPart,
32
34
  ToolContent,
35
+ ToolSet,
33
36
  UserContent,
34
37
  } from "ai";
35
38
  import { SerializeUrlsAndUint8Arrays } from "./mapping";
@@ -107,4 +110,19 @@ expectTypeOf<ContextOptions>().toExtend<Infer<typeof vContextOptions>>();
107
110
  expectTypeOf<Infer<typeof vStorageOptions>>().toExtend<StorageOptions>();
108
111
  expectTypeOf<StorageOptions>().toExtend<Infer<typeof vStorageOptions>>();
109
112
 
113
+ type StreamPart = Extract<
114
+ AITextStreamPart<ToolSet>,
115
+ {
116
+ type:
117
+ | "text-delta"
118
+ | "reasoning"
119
+ | "source"
120
+ | "tool-call"
121
+ | "tool-call-streaming-start"
122
+ | "tool-call-delta"
123
+ | "tool-result";
124
+ }
125
+ >;
126
+ expectTypeOf<StreamPart>().toExtend<TextStreamPart>();
127
+
110
128
  test("noop", () => { });
package/src/validators.ts CHANGED
@@ -355,6 +355,7 @@ const vPromptFields = {
355
355
  system: v.optional(v.string()),
356
356
  prompt: v.optional(v.string()),
357
357
  messages: v.optional(v.array(vMessage)),
358
+ promptMessageId: v.optional(v.string()),
358
359
  };
359
360
 
360
361
  export const vCallSettingsFields = {
@@ -382,6 +383,7 @@ const vCommonArgs = {
382
383
 
383
384
  export const vTextArgs = v.object({
384
385
  ...vCommonArgs,
386
+ stream: v.optional(v.boolean()),
385
387
  toolChoice: v.optional(
386
388
  v.union(
387
389
  v.literal("auto"),
@@ -395,7 +397,6 @@ export const vTextArgs = v.object({
395
397
  ),
396
398
  maxSteps: v.optional(v.number()),
397
399
  experimental_continueSteps: v.optional(v.boolean()),
398
- providerOptions,
399
400
  });
400
401
  export type TextArgs = Infer<typeof vTextArgs>;
401
402
 
@@ -409,7 +410,7 @@ export const vEmbeddingsWithMetadata = v.object({
409
410
  });
410
411
  export type EmbeddingsWithMetadata = Infer<typeof vEmbeddingsWithMetadata>;
411
412
 
412
- export function paginationResultValidator<
413
+ export function vPaginationResult<
413
414
  T extends Validator<Value, "required", string>,
414
415
  >(itemValidator: T) {
415
416
  return v.object({
@@ -426,3 +427,72 @@ export function paginationResultValidator<
426
427
  ),
427
428
  });
428
429
  }
430
+
431
+ export const vTextStreamPart = v.union(
432
+ v.object({
433
+ type: v.literal("text-delta"),
434
+ textDelta: v.string(),
435
+ }),
436
+ v.object({
437
+ type: v.literal("reasoning"),
438
+ textDelta: v.string(),
439
+ }),
440
+ v.object({
441
+ type: v.literal("source"),
442
+ source: vSource,
443
+ }),
444
+ vToolCallPart,
445
+ v.object({
446
+ type: v.literal("tool-call-streaming-start"),
447
+ toolCallId: v.string(),
448
+ toolName: v.string(),
449
+ }),
450
+ v.object({
451
+ type: v.literal("tool-call-delta"),
452
+ toolCallId: v.string(),
453
+ toolName: v.string(),
454
+ argsTextDelta: v.string(),
455
+ }),
456
+ vToolResultPart
457
+ );
458
+ export type TextStreamPart = Infer<typeof vTextStreamPart>;
459
+
460
+ export const vStreamCursor = v.object({
461
+ streamId: v.string(),
462
+ cursor: v.number(),
463
+ });
464
+ export type StreamCursor = Infer<typeof vStreamCursor>;
465
+
466
+ export const vStreamArgs = v.optional(
467
+ v.union(
468
+ v.object({
469
+ kind: v.literal("list"),
470
+ }),
471
+ v.object({
472
+ kind: v.literal("deltas"),
473
+ cursors: v.array(vStreamCursor),
474
+ })
475
+ )
476
+ );
477
+ export type StreamArgs = Infer<typeof vStreamArgs>;
478
+
479
+ export const vStreamMessage = v.object({
480
+ streamId: v.string(),
481
+ order: v.number(),
482
+ stepOrder: v.number(),
483
+ // metadata
484
+ userId: v.optional(v.string()),
485
+ agentName: v.optional(v.string()),
486
+ model: v.optional(v.string()),
487
+ provider: v.optional(v.string()),
488
+ providerOptions: v.optional(vProviderOptions), // Sent to model
489
+ });
490
+ export type StreamMessage = Infer<typeof vStreamMessage>;
491
+
492
+ export const vStreamDelta = v.object({
493
+ streamId: v.string(),
494
+ start: v.number(), // inclusive
495
+ end: v.number(), // exclusive
496
+ parts: v.array(vTextStreamPart),
497
+ });
498
+ export type StreamDelta = Infer<typeof vStreamDelta>;