@convex-dev/agent 0.1.1-alpha.0 → 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.
- package/README.md +9 -3
- package/dist/commonjs/client/createTool.d.ts +49 -0
- package/dist/commonjs/client/createTool.d.ts.map +1 -0
- package/dist/commonjs/client/createTool.js +45 -0
- package/dist/commonjs/client/createTool.js.map +1 -0
- package/dist/commonjs/client/index.d.ts +101 -322
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js +142 -194
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/client/streaming.d.ts +54 -0
- package/dist/commonjs/client/streaming.d.ts.map +1 -0
- package/dist/commonjs/client/streaming.js +121 -0
- package/dist/commonjs/client/streaming.js.map +1 -0
- package/dist/commonjs/client/types.d.ts +290 -2
- package/dist/commonjs/client/types.d.ts.map +1 -1
- package/dist/commonjs/component/messages.d.ts +109 -143
- package/dist/commonjs/component/messages.d.ts.map +1 -1
- package/dist/commonjs/component/messages.js +15 -14
- package/dist/commonjs/component/messages.js.map +1 -1
- package/dist/commonjs/component/schema.d.ts +1026 -52
- package/dist/commonjs/component/schema.d.ts.map +1 -1
- package/dist/commonjs/component/schema.js +39 -1
- package/dist/commonjs/component/schema.js.map +1 -1
- package/dist/commonjs/component/streams.d.ts +191 -0
- package/dist/commonjs/component/streams.d.ts.map +1 -0
- package/dist/commonjs/component/streams.js +169 -0
- package/dist/commonjs/component/streams.js.map +1 -0
- package/dist/commonjs/component/threads.d.ts +1 -1
- package/dist/commonjs/component/threads.js +3 -3
- package/dist/commonjs/component/threads.js.map +1 -1
- package/dist/commonjs/component/users.js +2 -2
- package/dist/commonjs/component/users.js.map +1 -1
- package/dist/commonjs/component/vector/index.d.ts +8 -8
- package/dist/commonjs/component/vector/index.d.ts.map +1 -1
- package/dist/commonjs/component/vector/tables.d.ts +5 -5
- package/dist/commonjs/component/vector/tables.d.ts.map +1 -1
- package/dist/commonjs/component/vector/tables.js +1 -1
- package/dist/commonjs/component/vector/tables.js.map +1 -1
- package/dist/commonjs/mapping.d.ts.map +1 -1
- package/dist/commonjs/mapping.js +3 -1
- package/dist/commonjs/mapping.js.map +1 -1
- package/dist/commonjs/react/index.d.ts +99 -0
- package/dist/commonjs/react/index.d.ts.map +1 -1
- package/dist/commonjs/react/index.js +505 -1
- package/dist/commonjs/react/index.js.map +1 -1
- package/dist/commonjs/react/toUIMessages.d.ts +8 -0
- package/dist/commonjs/react/toUIMessages.d.ts.map +1 -0
- package/dist/commonjs/react/toUIMessages.js +134 -0
- package/dist/commonjs/react/toUIMessages.js.map +1 -0
- package/dist/commonjs/validators.d.ts +513 -11
- package/dist/commonjs/validators.d.ts.map +1 -1
- package/dist/commonjs/validators.js +49 -2
- package/dist/commonjs/validators.js.map +1 -1
- package/dist/esm/client/createTool.d.ts +49 -0
- package/dist/esm/client/createTool.d.ts.map +1 -0
- package/dist/esm/client/createTool.js +45 -0
- package/dist/esm/client/createTool.js.map +1 -0
- package/dist/esm/client/index.d.ts +101 -322
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +142 -194
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/client/streaming.d.ts +54 -0
- package/dist/esm/client/streaming.d.ts.map +1 -0
- package/dist/esm/client/streaming.js +121 -0
- package/dist/esm/client/streaming.js.map +1 -0
- package/dist/esm/client/types.d.ts +290 -2
- package/dist/esm/client/types.d.ts.map +1 -1
- package/dist/esm/component/messages.d.ts +109 -143
- package/dist/esm/component/messages.d.ts.map +1 -1
- package/dist/esm/component/messages.js +15 -14
- package/dist/esm/component/messages.js.map +1 -1
- package/dist/esm/component/schema.d.ts +1026 -52
- package/dist/esm/component/schema.d.ts.map +1 -1
- package/dist/esm/component/schema.js +39 -1
- package/dist/esm/component/schema.js.map +1 -1
- package/dist/esm/component/streams.d.ts +191 -0
- package/dist/esm/component/streams.d.ts.map +1 -0
- package/dist/esm/component/streams.js +169 -0
- package/dist/esm/component/streams.js.map +1 -0
- package/dist/esm/component/threads.d.ts +1 -1
- package/dist/esm/component/threads.js +3 -3
- package/dist/esm/component/threads.js.map +1 -1
- package/dist/esm/component/users.js +2 -2
- package/dist/esm/component/users.js.map +1 -1
- package/dist/esm/component/vector/index.d.ts +8 -8
- package/dist/esm/component/vector/index.d.ts.map +1 -1
- package/dist/esm/component/vector/tables.d.ts +5 -5
- package/dist/esm/component/vector/tables.d.ts.map +1 -1
- package/dist/esm/component/vector/tables.js +1 -1
- package/dist/esm/component/vector/tables.js.map +1 -1
- package/dist/esm/mapping.d.ts.map +1 -1
- package/dist/esm/mapping.js +3 -1
- package/dist/esm/mapping.js.map +1 -1
- package/dist/esm/react/index.d.ts +99 -0
- package/dist/esm/react/index.d.ts.map +1 -1
- package/dist/esm/react/index.js +505 -1
- package/dist/esm/react/index.js.map +1 -1
- package/dist/esm/react/toUIMessages.d.ts +8 -0
- package/dist/esm/react/toUIMessages.d.ts.map +1 -0
- package/dist/esm/react/toUIMessages.js +134 -0
- package/dist/esm/react/toUIMessages.js.map +1 -0
- package/dist/esm/validators.d.ts +513 -11
- package/dist/esm/validators.d.ts.map +1 -1
- package/dist/esm/validators.js +49 -2
- package/dist/esm/validators.js.map +1 -1
- package/package.json +6 -2
- package/src/client/createTool.ts +108 -0
- package/src/client/index.ts +270 -689
- package/src/client/streaming.ts +166 -0
- package/src/client/types.ts +430 -5
- package/src/component/_generated/api.d.ts +367 -190
- package/src/component/messages.ts +15 -14
- package/src/component/schema.ts +46 -0
- package/src/component/streams.ts +206 -0
- package/src/component/threads.ts +3 -3
- package/src/component/users.ts +2 -2
- package/src/component/vector/tables.ts +1 -1
- package/src/mapping.ts +3 -1
- package/src/react/index.ts +687 -1
- package/src/react/toUIMessages.ts +153 -0
- package/src/validators.test.ts +18 -0
- package/src/validators.ts +72 -2
- package/dist/commonjs/deltaStreaming.d.ts +0 -2
- package/dist/commonjs/deltaStreaming.d.ts.map +0 -1
- package/dist/commonjs/deltaStreaming.js +0 -2
- package/dist/commonjs/deltaStreaming.js.map +0 -1
- package/dist/esm/deltaStreaming.d.ts +0 -2
- package/dist/esm/deltaStreaming.d.ts.map +0 -1
- package/dist/esm/deltaStreaming.js +0 -2
- package/dist/esm/deltaStreaming.js.map +0 -1
- package/src/deltaStreaming.ts +0 -1
|
@@ -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
|
+
}
|
package/src/validators.test.ts
CHANGED
|
@@ -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
|
|
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>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deltaStreaming.d.ts","sourceRoot":"","sources":["../../src/deltaStreaming.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deltaStreaming.js","sourceRoot":"","sources":["../../src/deltaStreaming.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deltaStreaming.d.ts","sourceRoot":"","sources":["../../src/deltaStreaming.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deltaStreaming.js","sourceRoot":"","sources":["../../src/deltaStreaming.ts"],"names":[],"mappings":""}
|
package/src/deltaStreaming.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import { v } from "convex/values";
|