@convex-dev/agent 0.1.9-alpha.5 → 0.1.9-alpha.6
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/dist/commonjs/client/index.d.ts +71 -72
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js +0 -2
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/client/streaming.d.ts.map +1 -1
- package/dist/commonjs/client/streaming.js +1 -7
- package/dist/commonjs/client/streaming.js.map +1 -1
- package/dist/commonjs/component/_generated/api.d.ts +1 -12
- package/dist/commonjs/component/messages.d.ts +210 -210
- package/dist/commonjs/component/schema.d.ts +583 -583
- package/dist/commonjs/component/schema.d.ts.map +1 -1
- package/dist/commonjs/component/schema.js +2 -2
- package/dist/commonjs/component/schema.js.map +1 -1
- package/dist/commonjs/component/streams.d.ts +10 -17
- package/dist/commonjs/component/streams.d.ts.map +1 -1
- package/dist/commonjs/component/streams.js +12 -42
- package/dist/commonjs/component/streams.js.map +1 -1
- package/dist/commonjs/component/threads.d.ts +18 -18
- package/dist/commonjs/component/vector/index.d.ts +3 -3
- package/dist/commonjs/component/vector/tables.d.ts +2 -2
- package/dist/commonjs/react/deltas.d.ts.map +1 -1
- package/dist/commonjs/react/deltas.js +3 -2
- package/dist/commonjs/react/deltas.js.map +1 -1
- package/dist/commonjs/react/index.d.ts +1 -3
- package/dist/commonjs/react/index.d.ts.map +1 -1
- package/dist/commonjs/react/index.js +3 -14
- package/dist/commonjs/react/index.js.map +1 -1
- package/dist/commonjs/validators.d.ts +162 -167
- package/dist/commonjs/validators.d.ts.map +1 -1
- package/dist/commonjs/validators.js +0 -2
- package/dist/commonjs/validators.js.map +1 -1
- package/dist/commonjs.tsbuildinfo +1 -1
- package/dist/esm/client/index.d.ts +19 -20
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +0 -2
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/client/streaming.d.ts.map +1 -1
- package/dist/esm/client/streaming.js +1 -7
- package/dist/esm/client/streaming.js.map +1 -1
- package/dist/esm/component/_generated/api.d.ts +1 -12
- package/dist/esm/component/messages.d.ts +37 -37
- package/dist/esm/component/schema.d.ts +583 -583
- package/dist/esm/component/schema.d.ts.map +1 -1
- package/dist/esm/component/schema.js +2 -2
- package/dist/esm/component/schema.js.map +1 -1
- package/dist/esm/component/streams.d.ts +0 -7
- package/dist/esm/component/streams.d.ts.map +1 -1
- package/dist/esm/component/streams.js +12 -42
- package/dist/esm/component/streams.js.map +1 -1
- package/dist/esm/component/threads.d.ts +15 -15
- package/dist/esm/component/vector/index.d.ts +3 -3
- package/dist/esm/component/vector/tables.d.ts +2 -2
- package/dist/esm/react/deltas.d.ts.map +1 -1
- package/dist/esm/react/deltas.js +3 -2
- package/dist/esm/react/deltas.js.map +1 -1
- package/dist/esm/react/index.d.ts +1 -3
- package/dist/esm/react/index.d.ts.map +1 -1
- package/dist/esm/react/index.js +3 -14
- package/dist/esm/react/index.js.map +1 -1
- package/dist/esm/validators.d.ts +162 -167
- package/dist/esm/validators.d.ts.map +1 -1
- package/dist/esm/validators.js +0 -2
- package/dist/esm/validators.js.map +1 -1
- package/dist/esm.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/client/index.ts +0 -4
- package/src/client/streaming.ts +1 -7
- package/src/component/_generated/api.d.ts +1 -12
- package/src/component/schema.ts +2 -2
- package/src/component/streams.ts +27 -76
- package/src/react/deltas.ts +3 -4
- package/src/react/index.ts +4 -15
- package/src/validators.ts +0 -6
package/src/client/index.ts
CHANGED
|
@@ -994,8 +994,6 @@ export class Agent<AgentTools extends ToolSet> {
|
|
|
994
994
|
args: {
|
|
995
995
|
threadId: string;
|
|
996
996
|
streamArgs: StreamArgs | undefined;
|
|
997
|
-
// By default, only streaming messages are included.
|
|
998
|
-
includeStatuses?: ("streaming" | "finished" | "aborted")[];
|
|
999
997
|
}
|
|
1000
998
|
): Promise<SyncStreamsReturnValue | undefined> {
|
|
1001
999
|
if (!args.streamArgs) return undefined;
|
|
@@ -1004,8 +1002,6 @@ export class Agent<AgentTools extends ToolSet> {
|
|
|
1004
1002
|
kind: "list",
|
|
1005
1003
|
messages: await ctx.runQuery(this.component.streams.list, {
|
|
1006
1004
|
threadId: args.threadId,
|
|
1007
|
-
startOrder: args.streamArgs.startOrder,
|
|
1008
|
-
statuses: args.includeStatuses,
|
|
1009
1005
|
}),
|
|
1010
1006
|
};
|
|
1011
1007
|
} else {
|
package/src/client/streaming.ts
CHANGED
|
@@ -96,13 +96,7 @@ export class DeltaStreamer {
|
|
|
96
96
|
this.#nextStepOrder = (metadata.stepOrder ?? 0) + 1;
|
|
97
97
|
this.abortController = new AbortController();
|
|
98
98
|
if (metadata.abortSignal) {
|
|
99
|
-
metadata.abortSignal.addEventListener("abort",
|
|
100
|
-
if (this.streamId) {
|
|
101
|
-
await this.ctx.runMutation(this.component.streams.abort, {
|
|
102
|
-
streamId: this.streamId,
|
|
103
|
-
reason: "abortSignal",
|
|
104
|
-
});
|
|
105
|
-
}
|
|
99
|
+
metadata.abortSignal.addEventListener("abort", () => {
|
|
106
100
|
this.abortController.abort();
|
|
107
101
|
});
|
|
108
102
|
}
|
|
@@ -1414,12 +1414,6 @@ export type Mounts = {
|
|
|
1414
1414
|
>;
|
|
1415
1415
|
};
|
|
1416
1416
|
streams: {
|
|
1417
|
-
abort: FunctionReference<
|
|
1418
|
-
"mutation",
|
|
1419
|
-
"public",
|
|
1420
|
-
{ reason: string; streamId: string },
|
|
1421
|
-
null
|
|
1422
|
-
>;
|
|
1423
1417
|
addDelta: FunctionReference<
|
|
1424
1418
|
"mutation",
|
|
1425
1419
|
"public",
|
|
@@ -1575,18 +1569,13 @@ export type Mounts = {
|
|
|
1575
1569
|
list: FunctionReference<
|
|
1576
1570
|
"query",
|
|
1577
1571
|
"public",
|
|
1578
|
-
{
|
|
1579
|
-
startOrder?: number;
|
|
1580
|
-
statuses?: Array<"streaming" | "finished" | "aborted">;
|
|
1581
|
-
threadId: string;
|
|
1582
|
-
},
|
|
1572
|
+
{ threadId: string },
|
|
1583
1573
|
Array<{
|
|
1584
1574
|
agentName?: string;
|
|
1585
1575
|
model?: string;
|
|
1586
1576
|
order: number;
|
|
1587
1577
|
provider?: string;
|
|
1588
1578
|
providerOptions?: Record<string, Record<string, any>>;
|
|
1589
|
-
status: "streaming" | "finished" | "aborted";
|
|
1590
1579
|
stepOrder: number;
|
|
1591
1580
|
streamId: string;
|
|
1592
1581
|
userId?: string;
|
package/src/component/schema.ts
CHANGED
package/src/component/streams.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
vStreamMessage,
|
|
7
7
|
} from "../validators.js";
|
|
8
8
|
import { api, internal } from "./_generated/api.js";
|
|
9
|
-
import type {
|
|
9
|
+
import type { Id } from "./_generated/dataModel.js";
|
|
10
10
|
import {
|
|
11
11
|
internalMutation,
|
|
12
12
|
mutation,
|
|
@@ -102,87 +102,33 @@ export const create = mutation({
|
|
|
102
102
|
export const list = query({
|
|
103
103
|
args: {
|
|
104
104
|
threadId: v.id("threads"),
|
|
105
|
-
startOrder: v.optional(v.number()),
|
|
106
|
-
statuses: v.optional(
|
|
107
|
-
v.array(
|
|
108
|
-
v.union(
|
|
109
|
-
v.literal("streaming"),
|
|
110
|
-
v.literal("finished"),
|
|
111
|
-
v.literal("aborted")
|
|
112
|
-
)
|
|
113
|
-
)
|
|
114
|
-
),
|
|
115
105
|
},
|
|
116
106
|
returns: v.array(vStreamMessage),
|
|
117
107
|
handler: async (ctx, args) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
"order",
|
|
139
|
-
"stepOrder",
|
|
140
|
-
"userId",
|
|
141
|
-
"agentName",
|
|
142
|
-
"model",
|
|
143
|
-
"provider",
|
|
144
|
-
"providerOptions",
|
|
145
|
-
]),
|
|
146
|
-
}));
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
export const abort = mutation({
|
|
151
|
-
args: {
|
|
152
|
-
streamId: v.id("streamingMessages"),
|
|
153
|
-
reason: v.string(),
|
|
154
|
-
},
|
|
155
|
-
returns: v.null(),
|
|
156
|
-
handler: async (ctx, args) => {
|
|
157
|
-
const stream = await ctx.db.get(args.streamId);
|
|
158
|
-
if (!stream) {
|
|
159
|
-
throw new Error(`Stream not found: ${args.streamId}`);
|
|
160
|
-
}
|
|
161
|
-
if (stream.state.kind !== "streaming") {
|
|
162
|
-
console.warn(
|
|
163
|
-
`Stream trying to abort but not currently streaming (${stream.state.kind}): ${args.streamId}`
|
|
108
|
+
return ctx.db
|
|
109
|
+
.query("streamingMessages")
|
|
110
|
+
.withIndex("threadId_state_order_stepOrder", (q) =>
|
|
111
|
+
q.eq("threadId", args.threadId).eq("state.kind", "streaming")
|
|
112
|
+
)
|
|
113
|
+
.order("desc")
|
|
114
|
+
.take(100)
|
|
115
|
+
.then((msgs) =>
|
|
116
|
+
msgs.map((m) => ({
|
|
117
|
+
streamId: m._id,
|
|
118
|
+
...pick(m, [
|
|
119
|
+
"order",
|
|
120
|
+
"stepOrder",
|
|
121
|
+
"userId",
|
|
122
|
+
"agentName",
|
|
123
|
+
"model",
|
|
124
|
+
"provider",
|
|
125
|
+
"providerOptions",
|
|
126
|
+
]),
|
|
127
|
+
}))
|
|
164
128
|
);
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
await cleanupTimeoutFn(ctx, stream);
|
|
168
|
-
await ctx.db.patch(args.streamId, {
|
|
169
|
-
state: { kind: "aborted", reason: args.reason },
|
|
170
|
-
});
|
|
171
129
|
},
|
|
172
130
|
});
|
|
173
131
|
|
|
174
|
-
async function cleanupTimeoutFn(
|
|
175
|
-
ctx: MutationCtx,
|
|
176
|
-
stream: Doc<"streamingMessages">
|
|
177
|
-
) {
|
|
178
|
-
if (stream.state.kind === "streaming" && stream.state.timeoutFnId) {
|
|
179
|
-
const timeoutFn = await ctx.db.system.get(stream.state.timeoutFnId);
|
|
180
|
-
if (timeoutFn?.state.kind === "pending") {
|
|
181
|
-
await ctx.scheduler.cancel(stream.state.timeoutFnId);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
132
|
export const finish = mutation({
|
|
187
133
|
args: {
|
|
188
134
|
streamId: v.id("streamingMessages"),
|
|
@@ -203,7 +149,12 @@ export const finish = mutation({
|
|
|
203
149
|
);
|
|
204
150
|
return;
|
|
205
151
|
}
|
|
206
|
-
|
|
152
|
+
if (stream.state.timeoutFnId) {
|
|
153
|
+
const timeoutFn = await ctx.db.system.get(stream.state.timeoutFnId);
|
|
154
|
+
if (timeoutFn?.state.kind === "pending") {
|
|
155
|
+
await ctx.scheduler.cancel(stream.state.timeoutFnId);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
207
158
|
await ctx.db.patch(args.streamId, {
|
|
208
159
|
state: { kind: "finished", endedAt: Date.now() },
|
|
209
160
|
});
|
package/src/react/deltas.ts
CHANGED
|
@@ -189,6 +189,7 @@ export function applyDeltasToStreamMessage(
|
|
|
189
189
|
contentToAdd = part;
|
|
190
190
|
break;
|
|
191
191
|
case "reasoning":
|
|
192
|
+
currentMessage.reasoning += part.textDelta;
|
|
192
193
|
if (lastContent?.type === "reasoning") {
|
|
193
194
|
lastContent.text += part.textDelta;
|
|
194
195
|
} else {
|
|
@@ -255,14 +256,12 @@ export function createStreamingMessage(
|
|
|
255
256
|
): MessageDoc {
|
|
256
257
|
const { streamId, ...rest } = message;
|
|
257
258
|
const metadata: MessageDoc = {
|
|
258
|
-
...rest,
|
|
259
259
|
_id: `${streamId}-${index}`,
|
|
260
260
|
_creationTime: Date.now(),
|
|
261
|
-
status:
|
|
262
|
-
{ streaming: "pending", finished: "success", aborted: "failed" } as const
|
|
263
|
-
)[message.status],
|
|
261
|
+
status: "pending",
|
|
264
262
|
threadId,
|
|
265
263
|
tool: false,
|
|
264
|
+
...rest,
|
|
266
265
|
};
|
|
267
266
|
switch (part.type) {
|
|
268
267
|
case "text-delta":
|
package/src/react/index.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "convex/react";
|
|
8
8
|
import { usePaginatedQuery } from "convex-helpers/react";
|
|
9
9
|
import type { FunctionArgs } from "convex/server";
|
|
10
|
-
import { useMemo,
|
|
10
|
+
import { useMemo, useState } from "react";
|
|
11
11
|
import type { MessageDoc } from "../client/index.js";
|
|
12
12
|
import type { SyncStreamsReturnValue } from "../client/types.js";
|
|
13
13
|
import type { StreamArgs } from "../validators.js";
|
|
@@ -103,11 +103,7 @@ export function useThreadMessages<
|
|
|
103
103
|
ThreadMessagesArgs<Query>,
|
|
104
104
|
ThreadMessagesResult<Query>
|
|
105
105
|
>,
|
|
106
|
-
!options.stream
|
|
107
|
-
args === "skip" ||
|
|
108
|
-
paginated.status === "LoadingFirstPage"
|
|
109
|
-
? "skip"
|
|
110
|
-
: { ...args, startOrder: paginated.results.at(0)?.order }
|
|
106
|
+
!options.stream ? "skip" : args
|
|
111
107
|
);
|
|
112
108
|
|
|
113
109
|
const merged = useMemo(() => {
|
|
@@ -154,7 +150,7 @@ export function useStreamingThreadMessages<
|
|
|
154
150
|
Query extends ThreadStreamQuery<any, any>,
|
|
155
151
|
>(
|
|
156
152
|
query: Query,
|
|
157
|
-
args:
|
|
153
|
+
args: ThreadMessagesArgs<Query> | "skip"
|
|
158
154
|
): Array<ThreadMessagesResult<Query>> | undefined {
|
|
159
155
|
// Invariant: streamMessages[streamId] is comprised of all deltas up to the
|
|
160
156
|
// cursor. There can be multiple messages in the same stream, e.g. for tool
|
|
@@ -162,10 +158,6 @@ export function useStreamingThreadMessages<
|
|
|
162
158
|
const [streams, setStreams] = useState<
|
|
163
159
|
Array<{ streamId: string; cursor: number; messages: MessageDoc[] }>
|
|
164
160
|
>([]);
|
|
165
|
-
const startOrderRef = useRef<number>(0);
|
|
166
|
-
if (args !== "skip" && !startOrderRef.current && args.startOrder) {
|
|
167
|
-
startOrderRef.current = args.startOrder;
|
|
168
|
-
}
|
|
169
161
|
// Get all the active streams
|
|
170
162
|
const streamList = useQuery(
|
|
171
163
|
query,
|
|
@@ -174,10 +166,7 @@ export function useStreamingThreadMessages<
|
|
|
174
166
|
: ({
|
|
175
167
|
...args,
|
|
176
168
|
paginationOpts: { cursor: null, numItems: 0 },
|
|
177
|
-
streamArgs: {
|
|
178
|
-
kind: "list",
|
|
179
|
-
startOrder: startOrderRef.current,
|
|
180
|
-
} as StreamArgs,
|
|
169
|
+
streamArgs: { kind: "list" } as StreamArgs,
|
|
181
170
|
} as FunctionArgs<Query>)
|
|
182
171
|
) as
|
|
183
172
|
| { streams: Extract<SyncStreamsReturnValue, { kind: "list" }> }
|
package/src/validators.ts
CHANGED
|
@@ -460,7 +460,6 @@ export const vStreamArgs = v.optional(
|
|
|
460
460
|
v.union(
|
|
461
461
|
v.object({
|
|
462
462
|
kind: v.literal("list"),
|
|
463
|
-
startOrder: v.optional(v.number()),
|
|
464
463
|
}),
|
|
465
464
|
v.object({
|
|
466
465
|
kind: v.literal("deltas"),
|
|
@@ -472,11 +471,6 @@ export type StreamArgs = Infer<typeof vStreamArgs>;
|
|
|
472
471
|
|
|
473
472
|
export const vStreamMessage = v.object({
|
|
474
473
|
streamId: v.string(),
|
|
475
|
-
status: v.union(
|
|
476
|
-
v.literal("streaming"),
|
|
477
|
-
v.literal("finished"),
|
|
478
|
-
v.literal("aborted")
|
|
479
|
-
),
|
|
480
474
|
order: v.number(),
|
|
481
475
|
stepOrder: v.number(),
|
|
482
476
|
// metadata
|