@convex-dev/agent 0.2.6-alpha.1 → 0.2.7

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 (101) hide show
  1. package/dist/client/createTool.js +1 -1
  2. package/dist/client/createTool.js.map +1 -1
  3. package/dist/client/definePlaygroundAPI.d.ts +6 -4
  4. package/dist/client/definePlaygroundAPI.d.ts.map +1 -1
  5. package/dist/client/definePlaygroundAPI.js +15 -6
  6. package/dist/client/definePlaygroundAPI.js.map +1 -1
  7. package/dist/client/index.d.ts +55 -122
  8. package/dist/client/index.d.ts.map +1 -1
  9. package/dist/client/index.js +47 -371
  10. package/dist/client/index.js.map +1 -1
  11. package/dist/client/messages.d.ts +1 -1
  12. package/dist/client/messages.d.ts.map +1 -1
  13. package/dist/client/mockModel.d.ts +5 -3
  14. package/dist/client/mockModel.d.ts.map +1 -1
  15. package/dist/client/mockModel.js +33 -24
  16. package/dist/client/mockModel.js.map +1 -1
  17. package/dist/client/saveInputMessages.d.ts +20 -0
  18. package/dist/client/saveInputMessages.d.ts.map +1 -0
  19. package/dist/client/saveInputMessages.js +57 -0
  20. package/dist/client/saveInputMessages.js.map +1 -0
  21. package/dist/client/search.d.ts +110 -9
  22. package/dist/client/search.d.ts.map +1 -1
  23. package/dist/client/search.js +271 -39
  24. package/dist/client/search.js.map +1 -1
  25. package/dist/client/start.d.ts +84 -0
  26. package/dist/client/start.d.ts.map +1 -0
  27. package/dist/client/start.js +171 -0
  28. package/dist/client/start.js.map +1 -0
  29. package/dist/client/streaming.d.ts +8 -8
  30. package/dist/client/streaming.d.ts.map +1 -1
  31. package/dist/client/streaming.js +2 -1
  32. package/dist/client/streaming.js.map +1 -1
  33. package/dist/client/textStreamParts.d.ts.map +1 -1
  34. package/dist/client/textStreamParts.js +2 -9
  35. package/dist/client/textStreamParts.js.map +1 -1
  36. package/dist/client/threads.d.ts +1 -1
  37. package/dist/client/threads.d.ts.map +1 -1
  38. package/dist/client/types.d.ts +147 -17
  39. package/dist/client/types.d.ts.map +1 -1
  40. package/dist/component/_generated/api.d.ts +11 -3
  41. package/dist/component/messages.d.ts +13 -4
  42. package/dist/component/messages.d.ts.map +1 -1
  43. package/dist/component/messages.js +67 -25
  44. package/dist/component/messages.js.map +1 -1
  45. package/dist/component/schema.d.ts +2 -1643
  46. package/dist/component/schema.d.ts.map +1 -1
  47. package/dist/component/schema.js +0 -24
  48. package/dist/component/schema.js.map +1 -1
  49. package/dist/mapping.d.ts +5 -8
  50. package/dist/mapping.d.ts.map +1 -1
  51. package/dist/mapping.js +72 -6
  52. package/dist/mapping.js.map +1 -1
  53. package/dist/react/deltas.d.ts.map +1 -1
  54. package/dist/react/deltas.js +1 -0
  55. package/dist/react/deltas.js.map +1 -1
  56. package/dist/react/fromUIMessages.d.ts +13 -0
  57. package/dist/react/fromUIMessages.d.ts.map +1 -0
  58. package/dist/react/fromUIMessages.js +75 -0
  59. package/dist/react/fromUIMessages.js.map +1 -0
  60. package/dist/react/toUIMessages.d.ts +5 -2
  61. package/dist/react/toUIMessages.d.ts.map +1 -1
  62. package/dist/react/toUIMessages.js +3 -0
  63. package/dist/react/toUIMessages.js.map +1 -1
  64. package/dist/shared.d.ts +10 -0
  65. package/dist/shared.d.ts.map +1 -1
  66. package/dist/shared.js +26 -0
  67. package/dist/shared.js.map +1 -1
  68. package/dist/validators.d.ts +1640 -0
  69. package/dist/validators.d.ts.map +1 -1
  70. package/dist/validators.js +41 -0
  71. package/dist/validators.js.map +1 -1
  72. package/package.json +4 -4
  73. package/src/client/createTool.ts +1 -1
  74. package/src/client/definePlaygroundAPI.ts +16 -7
  75. package/src/client/index.test.ts +11 -46
  76. package/src/client/index.ts +128 -573
  77. package/src/client/messages.ts +1 -1
  78. package/src/client/mock.json +68 -0
  79. package/src/client/mockModel.ts +47 -31
  80. package/src/client/saveInputMessages.test.ts +576 -0
  81. package/src/client/saveInputMessages.ts +100 -0
  82. package/src/client/search.test.ts +1017 -0
  83. package/src/client/search.ts +446 -68
  84. package/src/client/start.ts +315 -0
  85. package/src/client/stream.json +48 -0
  86. package/src/client/streaming.ts +3 -3
  87. package/src/client/textStreamParts.ts +2 -11
  88. package/src/client/threads.ts +1 -1
  89. package/src/client/types.ts +153 -22
  90. package/src/component/_generated/api.d.ts +11 -3
  91. package/src/component/messages.ts +73 -27
  92. package/src/component/schema.ts +1 -29
  93. package/src/mapping.ts +83 -6
  94. package/src/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  95. package/src/react/deltas.ts +1 -0
  96. package/src/react/fromUIMessages.test.ts +467 -0
  97. package/src/react/fromUIMessages.ts +90 -0
  98. package/src/react/toUIMessages.ts +21 -13
  99. package/src/shared.ts +33 -0
  100. package/src/validators.test.ts +13 -2
  101. package/src/validators.ts +48 -0
@@ -1,6 +1,6 @@
1
1
  import type { ModelMessage } from "ai";
2
2
  import type { PaginationOptions, PaginationResult } from "convex/server";
3
- import type { MessageDoc } from "../component/schema.js";
3
+ import type { MessageDoc } from "../validators.js";
4
4
  import { validateVectorDimension } from "../component/vector/tables.js";
5
5
  import {
6
6
  vMessageWithMetadata,
@@ -0,0 +1,68 @@
1
+ [
2
+ { "type": "start" },
3
+ { "type": "start-step" },
4
+ { "type": "reasoning-start", "id": "0-reasoning" },
5
+ {
6
+ "type": "reasoning-delta",
7
+ "id": "0-reasoning",
8
+ "delta": "I'm",
9
+ "providerMetadata": {
10
+ "mockProvider": { "mock": { "reasoningDetails": null } }
11
+ }
12
+ },
13
+ {
14
+ "type": "reasoning-delta",
15
+ "id": "0-reasoning",
16
+ "delta": " thinking",
17
+ "providerMetadata": {
18
+ "mockProvider": { "mock": { "reasoningDetails": null } }
19
+ }
20
+ },
21
+ { "type": "reasoning-end", "id": "0-reasoning" },
22
+ {
23
+ "type": "tool-input-available",
24
+ "toolCallId": "1",
25
+ "toolName": "say",
26
+ "input": { "question": "What is the best flavor of ice cream?" }
27
+ },
28
+ {
29
+ "type": "tool-output-available",
30
+ "toolCallId": "1",
31
+ "output": "I'm sorry I can't help you. Stop asking me questions."
32
+ },
33
+ {
34
+ "type": "tool-output-available",
35
+ "toolCallId": "1",
36
+ "output": "I'm sorry I can't help you. Stop asking me questions."
37
+ },
38
+ { "type": "reasoning-start", "id": "3-reasoning" },
39
+ {
40
+ "type": "reasoning-delta",
41
+ "id": "3-reasoning",
42
+ "delta": "I'm",
43
+ "providerMetadata": {
44
+ "mockProvider": { "mock": { "reasoningDetails": null } }
45
+ }
46
+ },
47
+ {
48
+ "type": "reasoning-delta",
49
+ "id": "3-reasoning",
50
+ "delta": " thinking",
51
+ "providerMetadata": {
52
+ "mockProvider": { "mock": { "reasoningDetails": null } }
53
+ }
54
+ },
55
+ { "type": "reasoning-end", "id": "3-reasoning" },
56
+ { "type": "text-start", "id": "4-text" },
57
+ { "type": "text-delta", "id": "4-text", "delta": "The" },
58
+ { "type": "text-delta", "id": "4-text", "delta": " best" },
59
+ { "type": "text-delta", "id": "4-text", "delta": " flavor" },
60
+ { "type": "text-delta", "id": "4-text", "delta": " of" },
61
+ { "type": "text-delta", "id": "4-text", "delta": " ice" },
62
+ { "type": "text-delta", "id": "4-text", "delta": " cream" },
63
+ { "type": "text-delta", "id": "4-text", "delta": " is" },
64
+ { "type": "text-delta", "id": "4-text", "delta": " vanilla." },
65
+ { "type": "text-end", "id": "4-text" },
66
+ { "type": "finish-step" },
67
+ { "type": "finish" }
68
+ ]
@@ -1,17 +1,18 @@
1
1
  import type {
2
2
  LanguageModelV2,
3
+ LanguageModelV2Content,
3
4
  LanguageModelV2StreamPart,
4
5
  } from "@ai-sdk/provider";
5
- import type { ReasoningPart, TextPart } from "@ai-sdk/provider-utils";
6
- import { simulateReadableStream } from "ai";
6
+ import { simulateReadableStream, type ProviderMetadata } from "ai";
7
+ import { pick } from "convex-helpers";
7
8
 
8
- const longDefaultText = `
9
+ export const DEFAULT_TEXT = `
9
10
  A A A A A A A A A A A A A A A
10
11
  B B B B B B B B B B B B B B B
11
12
  C C C C C C C C C C C C C C C
12
13
  D D D D D D D D D D D D D D D
13
14
  `;
14
- const defaultUsage = { outputTokens: 10, inputTokens: 3, totalTokens: 13 };
15
+ const DEFAULT_USAGE = { outputTokens: 10, inputTokens: 3, totalTokens: 13 };
15
16
 
16
17
  export type MockModelArgs = {
17
18
  provider?: LanguageModelV2["provider"];
@@ -22,9 +23,10 @@ export type MockModelArgs = {
22
23
  chunkDelayInMs?: number;
23
24
  initialDelayInMs?: number;
24
25
  // provide either content or doGenerate & doStream
25
- content?: (TextPart | ReasoningPart)[];
26
+ content?: LanguageModelV2Content[];
26
27
  doGenerate?: LanguageModelV2["doGenerate"];
27
28
  doStream?: LanguageModelV2["doStream"];
29
+ providerMetadata?: ProviderMetadata;
28
30
  fail?:
29
31
  | boolean
30
32
  | {
@@ -55,9 +57,9 @@ export class MockLanguageModel implements LanguageModelV2 {
55
57
  this.provider = args.provider || "mock-provider";
56
58
  this.modelId = args.modelId || "mock-model-id";
57
59
  const {
58
- content = [{ type: "text", text: longDefaultText }],
59
- chunkDelayInMs = 200,
60
- initialDelayInMs = 1000,
60
+ content = [{ type: "text", text: DEFAULT_TEXT }],
61
+ chunkDelayInMs = 0,
62
+ initialDelayInMs = 0,
61
63
  supportedUrls = {},
62
64
  } = args;
63
65
  const fail =
@@ -68,49 +70,62 @@ export class MockLanguageModel implements LanguageModelV2 {
68
70
  const error =
69
71
  (typeof args.fail === "object" && args.fail.error) ||
70
72
  "Mock error message";
73
+ const metadata = pick(args, ["providerMetadata"]);
71
74
 
72
75
  const chunks: LanguageModelV2StreamPart[] = [
73
76
  { type: "stream-start", warnings: [] },
74
77
  ];
75
78
  chunks.push(
76
- ...content.flatMap((c, ci) => {
79
+ ...content.flatMap((c, ci): LanguageModelV2StreamPart[] => {
80
+ if (c.type !== "text" && c.type !== "reasoning") {
81
+ return [c];
82
+ }
83
+ const metadata = pick(c, ["providerMetadata"]);
77
84
  const deltas = c.text.split(" ");
78
- let parts: LanguageModelV2StreamPart[] = [];
85
+ const parts: LanguageModelV2StreamPart[] = [];
79
86
  if (c.type === "reasoning") {
80
87
  parts.push({
81
88
  type: "reasoning-start",
82
- id: `${ci}-reasoning-start`,
89
+ id: `reasoning-${ci}`,
90
+ ...metadata,
83
91
  });
84
92
  parts.push(
85
93
  ...deltas.map(
86
94
  (delta, di) =>
87
95
  ({
88
96
  type: "reasoning-delta",
89
- delta,
90
- id: `${ci}-reasoning-${di}`,
91
- providerMetadata: {
92
- mockProvider: { mock: { reasoningDetails: null } },
93
- },
97
+ delta: (di ? " " : "") + delta,
98
+ id: `reasoning-${ci}`,
99
+ ...metadata,
94
100
  }) satisfies LanguageModelV2StreamPart,
95
101
  ),
96
102
  );
97
103
  parts.push({
98
104
  type: "reasoning-end",
99
- id: `${ci}-reasoning-end`,
105
+ id: `reasoning-${ci}`,
106
+ ...metadata,
100
107
  });
101
108
  } else if (c.type === "text") {
102
109
  parts.push({
103
110
  type: "text-start",
104
- id: `${ci}-text-start`,
111
+ id: `txt-${ci}`,
112
+ ...metadata,
105
113
  });
106
- parts = deltas.map((delta, di) => ({
107
- type: "text-delta",
108
- delta,
109
- id: `${ci}-text-${di}`,
110
- }));
114
+ parts.push(
115
+ ...deltas.map(
116
+ (delta, di) =>
117
+ ({
118
+ type: "text-delta",
119
+ delta: (di ? " " : "") + delta,
120
+ id: `txt-${ci}`,
121
+ ...metadata,
122
+ }) satisfies LanguageModelV2StreamPart,
123
+ ),
124
+ );
111
125
  parts.push({
112
126
  type: "text-end",
113
- id: `${ci}-text-end`,
127
+ id: `txt-${ci}`,
128
+ ...metadata,
114
129
  });
115
130
  }
116
131
  return parts;
@@ -125,10 +140,8 @@ export class MockLanguageModel implements LanguageModelV2 {
125
140
  chunks.push({
126
141
  type: "finish",
127
142
  finishReason: fail ? "error" : "stop",
128
- usage: defaultUsage,
129
- providerMetadata: {
130
- mockProvider: { mock: "mock metadata" },
131
- },
143
+ usage: DEFAULT_USAGE,
144
+ ...metadata,
132
145
  });
133
146
  this.doGenerate = async (options) => {
134
147
  this.doGenerateCalls.push(options);
@@ -144,8 +157,8 @@ export class MockLanguageModel implements LanguageModelV2 {
144
157
  return {
145
158
  content,
146
159
  finishReason: "stop",
147
- usage: defaultUsage,
148
- providerMetadata: { mockProvider: { mock: "mock metadata" } },
160
+ usage: DEFAULT_USAGE,
161
+ ...metadata,
149
162
  warnings: [],
150
163
  };
151
164
  } else {
@@ -169,8 +182,11 @@ export class MockLanguageModel implements LanguageModelV2 {
169
182
  initialDelayInMs,
170
183
  chunkDelayInMs,
171
184
  });
185
+
172
186
  if (options.abortSignal) {
173
- throw new Error("abortSignal in mock model");
187
+ options.abortSignal.addEventListener("abort", () => {
188
+ console.warn("abortSignal in mock model not supported");
189
+ });
174
190
  }
175
191
  return {
176
192
  stream,