@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.
- package/README.md +26 -0
- package/dist/commonjs/client/index.d.ts +788 -79
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js +117 -154
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/component/messages.d.ts +11 -3
- package/dist/commonjs/component/messages.d.ts.map +1 -1
- package/dist/commonjs/component/messages.js +2 -1
- package/dist/commonjs/component/messages.js.map +1 -1
- package/dist/commonjs/component/schema.d.ts +18 -12
- package/dist/commonjs/component/schema.d.ts.map +1 -1
- package/dist/commonjs/component/schema.js +1 -0
- package/dist/commonjs/component/schema.js.map +1 -1
- package/dist/commonjs/component/vector/index.d.ts.map +1 -1
- package/dist/commonjs/component/vector/index.js +1 -1
- package/dist/commonjs/component/vector/index.js.map +1 -1
- package/dist/commonjs/mapping.d.ts +3 -2
- package/dist/commonjs/mapping.d.ts.map +1 -1
- package/dist/commonjs/mapping.js +45 -13
- package/dist/commonjs/mapping.js.map +1 -1
- package/dist/commonjs/validators.d.ts +2736 -76
- package/dist/commonjs/validators.d.ts.map +1 -1
- package/dist/commonjs/validators.js +72 -7
- package/dist/commonjs/validators.js.map +1 -1
- package/dist/esm/client/index.d.ts +788 -79
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +117 -154
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/component/messages.d.ts +11 -3
- package/dist/esm/component/messages.d.ts.map +1 -1
- package/dist/esm/component/messages.js +2 -1
- package/dist/esm/component/messages.js.map +1 -1
- package/dist/esm/component/schema.d.ts +18 -12
- package/dist/esm/component/schema.d.ts.map +1 -1
- package/dist/esm/component/schema.js +1 -0
- package/dist/esm/component/schema.js.map +1 -1
- package/dist/esm/component/vector/index.d.ts.map +1 -1
- package/dist/esm/component/vector/index.js +1 -1
- package/dist/esm/component/vector/index.js.map +1 -1
- package/dist/esm/mapping.d.ts +3 -2
- package/dist/esm/mapping.d.ts.map +1 -1
- package/dist/esm/mapping.js +45 -13
- package/dist/esm/mapping.js.map +1 -1
- package/dist/esm/validators.d.ts +2736 -76
- package/dist/esm/validators.d.ts.map +1 -1
- package/dist/esm/validators.js +72 -7
- package/dist/esm/validators.js.map +1 -1
- package/package.json +7 -7
- package/src/client/index.ts +269 -191
- package/src/component/_generated/api.d.ts +5 -0
- package/src/component/messages.ts +2 -1
- package/src/component/schema.ts +1 -0
- package/src/component/vector/index.ts +1 -7
- package/src/mapping.ts +60 -19
- 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
|
-
|
|
598
|
+
error: error,
|
|
598
599
|
});
|
|
599
600
|
},
|
|
600
601
|
});
|
package/src/component/schema.ts
CHANGED
|
@@ -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
|
-
|
|
176
|
-
|
|
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
|
-
|
|
283
|
-
|
|
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
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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())),
|