@nodetool-ai/runtime 0.7.0-rc.11

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 (198) hide show
  1. package/dist/bridge-protocol.d.ts +39 -0
  2. package/dist/bridge-protocol.d.ts.map +1 -0
  3. package/dist/bridge-protocol.js +39 -0
  4. package/dist/bridge-protocol.js.map +1 -0
  5. package/dist/comfy-executor.d.ts +41 -0
  6. package/dist/comfy-executor.d.ts.map +1 -0
  7. package/dist/comfy-executor.js +305 -0
  8. package/dist/comfy-executor.js.map +1 -0
  9. package/dist/context-packer.d.ts +22 -0
  10. package/dist/context-packer.d.ts.map +1 -0
  11. package/dist/context-packer.js +66 -0
  12. package/dist/context-packer.js.map +1 -0
  13. package/dist/context.d.ts +405 -0
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/context.js +1455 -0
  16. package/dist/context.js.map +1 -0
  17. package/dist/index.d.ts +18 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +15 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/node-executor.d.ts +53 -0
  22. package/dist/node-executor.d.ts.map +1 -0
  23. package/dist/node-executor.js +9 -0
  24. package/dist/node-executor.js.map +1 -0
  25. package/dist/providers/aki-manifest.json +34 -0
  26. package/dist/providers/aki-provider.d.ts +65 -0
  27. package/dist/providers/aki-provider.d.ts.map +1 -0
  28. package/dist/providers/aki-provider.js +517 -0
  29. package/dist/providers/aki-provider.js.map +1 -0
  30. package/dist/providers/anthropic-provider.d.ts +55 -0
  31. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  32. package/dist/providers/anthropic-provider.js +563 -0
  33. package/dist/providers/anthropic-provider.js.map +1 -0
  34. package/dist/providers/base-provider.d.ts +194 -0
  35. package/dist/providers/base-provider.d.ts.map +1 -0
  36. package/dist/providers/base-provider.js +515 -0
  37. package/dist/providers/base-provider.js.map +1 -0
  38. package/dist/providers/cerebras-provider.d.ts +20 -0
  39. package/dist/providers/cerebras-provider.d.ts.map +1 -0
  40. package/dist/providers/cerebras-provider.js +52 -0
  41. package/dist/providers/cerebras-provider.js.map +1 -0
  42. package/dist/providers/claude-agent-provider.d.ts +107 -0
  43. package/dist/providers/claude-agent-provider.d.ts.map +1 -0
  44. package/dist/providers/claude-agent-provider.js +586 -0
  45. package/dist/providers/claude-agent-provider.js.map +1 -0
  46. package/dist/providers/cohere-provider.d.ts +36 -0
  47. package/dist/providers/cohere-provider.d.ts.map +1 -0
  48. package/dist/providers/cohere-provider.js +116 -0
  49. package/dist/providers/cohere-provider.js.map +1 -0
  50. package/dist/providers/cost-calculator.d.ts +109 -0
  51. package/dist/providers/cost-calculator.d.ts.map +1 -0
  52. package/dist/providers/cost-calculator.js +475 -0
  53. package/dist/providers/cost-calculator.js.map +1 -0
  54. package/dist/providers/deepseek-provider.d.ts +25 -0
  55. package/dist/providers/deepseek-provider.d.ts.map +1 -0
  56. package/dist/providers/deepseek-provider.js +58 -0
  57. package/dist/providers/deepseek-provider.js.map +1 -0
  58. package/dist/providers/fake-provider.d.ts +52 -0
  59. package/dist/providers/fake-provider.d.ts.map +1 -0
  60. package/dist/providers/fake-provider.js +107 -0
  61. package/dist/providers/fake-provider.js.map +1 -0
  62. package/dist/providers/fal-provider.d.ts +32 -0
  63. package/dist/providers/fal-provider.d.ts.map +1 -0
  64. package/dist/providers/fal-provider.js +445 -0
  65. package/dist/providers/fal-provider.js.map +1 -0
  66. package/dist/providers/gemini-provider.d.ts +109 -0
  67. package/dist/providers/gemini-provider.d.ts.map +1 -0
  68. package/dist/providers/gemini-provider.js +943 -0
  69. package/dist/providers/gemini-provider.js.map +1 -0
  70. package/dist/providers/groq-provider.d.ts +20 -0
  71. package/dist/providers/groq-provider.d.ts.map +1 -0
  72. package/dist/providers/groq-provider.js +52 -0
  73. package/dist/providers/groq-provider.js.map +1 -0
  74. package/dist/providers/huggingface-provider.d.ts +59 -0
  75. package/dist/providers/huggingface-provider.d.ts.map +1 -0
  76. package/dist/providers/huggingface-provider.js +305 -0
  77. package/dist/providers/huggingface-provider.js.map +1 -0
  78. package/dist/providers/index.d.ts +69 -0
  79. package/dist/providers/index.d.ts.map +1 -0
  80. package/dist/providers/index.js +137 -0
  81. package/dist/providers/index.js.map +1 -0
  82. package/dist/providers/jina-provider.d.ts +37 -0
  83. package/dist/providers/jina-provider.d.ts.map +1 -0
  84. package/dist/providers/jina-provider.js +118 -0
  85. package/dist/providers/jina-provider.js.map +1 -0
  86. package/dist/providers/kie-provider.d.ts +19 -0
  87. package/dist/providers/kie-provider.d.ts.map +1 -0
  88. package/dist/providers/kie-provider.js +118 -0
  89. package/dist/providers/kie-provider.js.map +1 -0
  90. package/dist/providers/llama-provider.d.ts +49 -0
  91. package/dist/providers/llama-provider.d.ts.map +1 -0
  92. package/dist/providers/llama-provider.js +381 -0
  93. package/dist/providers/llama-provider.js.map +1 -0
  94. package/dist/providers/lmstudio-provider.d.ts +22 -0
  95. package/dist/providers/lmstudio-provider.d.ts.map +1 -0
  96. package/dist/providers/lmstudio-provider.js +63 -0
  97. package/dist/providers/lmstudio-provider.js.map +1 -0
  98. package/dist/providers/manifest-models.d.ts +12 -0
  99. package/dist/providers/manifest-models.d.ts.map +1 -0
  100. package/dist/providers/manifest-models.js +96 -0
  101. package/dist/providers/manifest-models.js.map +1 -0
  102. package/dist/providers/meshy-provider.d.ts +53 -0
  103. package/dist/providers/meshy-provider.d.ts.map +1 -0
  104. package/dist/providers/meshy-provider.js +230 -0
  105. package/dist/providers/meshy-provider.js.map +1 -0
  106. package/dist/providers/minimax-provider.d.ts +66 -0
  107. package/dist/providers/minimax-provider.d.ts.map +1 -0
  108. package/dist/providers/minimax-provider.js +531 -0
  109. package/dist/providers/minimax-provider.js.map +1 -0
  110. package/dist/providers/mistral-provider.d.ts +26 -0
  111. package/dist/providers/mistral-provider.d.ts.map +1 -0
  112. package/dist/providers/mistral-provider.js +74 -0
  113. package/dist/providers/mistral-provider.js.map +1 -0
  114. package/dist/providers/moonshot-provider.d.ts +24 -0
  115. package/dist/providers/moonshot-provider.d.ts.map +1 -0
  116. package/dist/providers/moonshot-provider.js +43 -0
  117. package/dist/providers/moonshot-provider.js.map +1 -0
  118. package/dist/providers/ollama-provider.d.ts +71 -0
  119. package/dist/providers/ollama-provider.d.ts.map +1 -0
  120. package/dist/providers/ollama-provider.js +480 -0
  121. package/dist/providers/ollama-provider.js.map +1 -0
  122. package/dist/providers/openai-provider.d.ts +103 -0
  123. package/dist/providers/openai-provider.d.ts.map +1 -0
  124. package/dist/providers/openai-provider.js +917 -0
  125. package/dist/providers/openai-provider.js.map +1 -0
  126. package/dist/providers/openrouter-provider.d.ts +49 -0
  127. package/dist/providers/openrouter-provider.d.ts.map +1 -0
  128. package/dist/providers/openrouter-provider.js +147 -0
  129. package/dist/providers/openrouter-provider.js.map +1 -0
  130. package/dist/providers/provider-registry.d.ts +24 -0
  131. package/dist/providers/provider-registry.d.ts.map +1 -0
  132. package/dist/providers/provider-registry.js +124 -0
  133. package/dist/providers/provider-registry.js.map +1 -0
  134. package/dist/providers/python-provider.d.ts +75 -0
  135. package/dist/providers/python-provider.d.ts.map +1 -0
  136. package/dist/providers/python-provider.js +157 -0
  137. package/dist/providers/python-provider.js.map +1 -0
  138. package/dist/providers/replicate-provider.d.ts +73 -0
  139. package/dist/providers/replicate-provider.d.ts.map +1 -0
  140. package/dist/providers/replicate-provider.js +484 -0
  141. package/dist/providers/replicate-provider.js.map +1 -0
  142. package/dist/providers/rodin-provider.d.ts +41 -0
  143. package/dist/providers/rodin-provider.d.ts.map +1 -0
  144. package/dist/providers/rodin-provider.js +236 -0
  145. package/dist/providers/rodin-provider.js.map +1 -0
  146. package/dist/providers/scripted-provider.d.ts +141 -0
  147. package/dist/providers/scripted-provider.d.ts.map +1 -0
  148. package/dist/providers/scripted-provider.js +246 -0
  149. package/dist/providers/scripted-provider.js.map +1 -0
  150. package/dist/providers/together-provider.d.ts +20 -0
  151. package/dist/providers/together-provider.d.ts.map +1 -0
  152. package/dist/providers/together-provider.js +56 -0
  153. package/dist/providers/together-provider.js.map +1 -0
  154. package/dist/providers/types.d.ts +202 -0
  155. package/dist/providers/types.d.ts.map +1 -0
  156. package/dist/providers/types.js +2 -0
  157. package/dist/providers/types.js.map +1 -0
  158. package/dist/providers/vllm-provider.d.ts +22 -0
  159. package/dist/providers/vllm-provider.d.ts.map +1 -0
  160. package/dist/providers/vllm-provider.js +66 -0
  161. package/dist/providers/vllm-provider.js.map +1 -0
  162. package/dist/providers/voyage-provider.d.ts +37 -0
  163. package/dist/providers/voyage-provider.d.ts.map +1 -0
  164. package/dist/providers/voyage-provider.js +124 -0
  165. package/dist/providers/voyage-provider.js.map +1 -0
  166. package/dist/providers/xai-provider.d.ts +24 -0
  167. package/dist/providers/xai-provider.d.ts.map +1 -0
  168. package/dist/providers/xai-provider.js +57 -0
  169. package/dist/providers/xai-provider.js.map +1 -0
  170. package/dist/python-bridge-types.d.ts +70 -0
  171. package/dist/python-bridge-types.d.ts.map +1 -0
  172. package/dist/python-bridge-types.js +2 -0
  173. package/dist/python-bridge-types.js.map +1 -0
  174. package/dist/python-node-executor.d.ts +20 -0
  175. package/dist/python-node-executor.d.ts.map +1 -0
  176. package/dist/python-node-executor.js +219 -0
  177. package/dist/python-node-executor.js.map +1 -0
  178. package/dist/python-stdio-bridge.d.ts +67 -0
  179. package/dist/python-stdio-bridge.d.ts.map +1 -0
  180. package/dist/python-stdio-bridge.js +704 -0
  181. package/dist/python-stdio-bridge.js.map +1 -0
  182. package/dist/recommended-models.d.ts +17 -0
  183. package/dist/recommended-models.d.ts.map +1 -0
  184. package/dist/recommended-models.js +139 -0
  185. package/dist/recommended-models.js.map +1 -0
  186. package/dist/telemetry.d.ts +61 -0
  187. package/dist/telemetry.d.ts.map +1 -0
  188. package/dist/telemetry.js +128 -0
  189. package/dist/telemetry.js.map +1 -0
  190. package/dist/trace-exporters.d.ts +72 -0
  191. package/dist/trace-exporters.d.ts.map +1 -0
  192. package/dist/trace-exporters.js +216 -0
  193. package/dist/trace-exporters.js.map +1 -0
  194. package/dist/tracing-helpers.d.ts +99 -0
  195. package/dist/tracing-helpers.d.ts.map +1 -0
  196. package/dist/tracing-helpers.js +217 -0
  197. package/dist/tracing-helpers.js.map +1 -0
  198. package/package.json +64 -0
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Rodin AI Provider — wraps the Rodin AI (Hyperhuman) 3D generation API to
3
+ * expose `textTo3D` and `imageTo3D` through the standard {@link BaseProvider}
4
+ * interface.
5
+ *
6
+ * Rodin's primary capability is image-to-3D, but the same `/v2/rodin`
7
+ * endpoint accepts a text prompt for text-to-3D generation.
8
+ *
9
+ * API docs: https://hyperhuman.deemos.com/api
10
+ *
11
+ * Ported from the historical Python implementation at
12
+ * `nodetool-core@25e60910:src/nodetool/providers/rodin_provider.py`. The
13
+ * Python `image_to_3d` accidentally submitted the task twice to fetch the
14
+ * subscription key — fixed here by reading both `uuids` and
15
+ * `subscription_key` from a single submit response.
16
+ */
17
+ import { BaseProvider } from "./base-provider.js";
18
+ import { createLogger } from "@nodetool-ai/config";
19
+ const log = createLogger("nodetool.runtime.providers.rodin");
20
+ const RODIN_API_BASE_URL = "https://hyperhuman.deemos.com/api";
21
+ const DEFAULT_POLL_INTERVAL_MS = 5000;
22
+ const DEFAULT_MAX_POLL_ATTEMPTS = 120;
23
+ const DEFAULT_OUTPUT_FORMAT = "glb";
24
+ export const RODIN_3D_MODELS = [
25
+ {
26
+ id: "rodin-gen-1",
27
+ name: "Rodin Gen-1 Image-to-3D",
28
+ provider: "rodin",
29
+ supportedTasks: ["image_to_3d"],
30
+ outputFormats: ["glb", "fbx", "obj", "usdz"]
31
+ },
32
+ {
33
+ id: "rodin-gen-1-turbo",
34
+ name: "Rodin Gen-1 Turbo Image-to-3D",
35
+ provider: "rodin",
36
+ supportedTasks: ["image_to_3d"],
37
+ outputFormats: ["glb", "fbx", "obj", "usdz"]
38
+ },
39
+ {
40
+ id: "rodin-sketch",
41
+ name: "Rodin Sketch Text-to-3D",
42
+ provider: "rodin",
43
+ supportedTasks: ["text_to_3d"],
44
+ outputFormats: ["glb", "fbx", "obj", "usdz"]
45
+ }
46
+ ];
47
+ function detectImageType(image) {
48
+ if (image.length >= 8 &&
49
+ image[0] === 0x89 &&
50
+ image[1] === 0x50 &&
51
+ image[2] === 0x4e &&
52
+ image[3] === 0x47 &&
53
+ image[4] === 0x0d &&
54
+ image[5] === 0x0a &&
55
+ image[6] === 0x1a &&
56
+ image[7] === 0x0a) {
57
+ return "png";
58
+ }
59
+ if (image.length >= 3 &&
60
+ image[0] === 0xff &&
61
+ image[1] === 0xd8 &&
62
+ image[2] === 0xff) {
63
+ return "jpeg";
64
+ }
65
+ return "png"; // Match Python default
66
+ }
67
+ function encodeImageForRodin(image) {
68
+ return {
69
+ type: detectImageType(image),
70
+ data: Buffer.from(image).toString("base64")
71
+ };
72
+ }
73
+ export class RodinProvider extends BaseProvider {
74
+ apiKey;
75
+ pollIntervalMs;
76
+ maxPollAttempts;
77
+ constructor(secrets = {}, options = {}) {
78
+ super("rodin");
79
+ this.apiKey = secrets["RODIN_API_KEY"] ?? "";
80
+ this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
81
+ this.maxPollAttempts = options.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS;
82
+ if (!this.apiKey) {
83
+ log.warn("Rodin API key not configured");
84
+ }
85
+ }
86
+ static requiredSecrets() {
87
+ return ["RODIN_API_KEY"];
88
+ }
89
+ async generateMessage(_args) {
90
+ throw new Error("rodin does not support chat generation");
91
+ }
92
+ async *generateMessages(_args) {
93
+ throw new Error("rodin does not support chat generation");
94
+ }
95
+ async getAvailable3DModels() {
96
+ if (!this.apiKey) {
97
+ log.debug("No Rodin API key configured, returning empty 3D model list");
98
+ return [];
99
+ }
100
+ return RODIN_3D_MODELS;
101
+ }
102
+ async textTo3D(params) {
103
+ if (!params.prompt)
104
+ throw new Error("prompt must not be empty");
105
+ if (!this.apiKey)
106
+ throw new Error("Rodin API key is not configured");
107
+ const maxAttempts = this.computeMaxAttempts(params.timeoutSeconds);
108
+ const format = (params.outputFormat ?? DEFAULT_OUTPUT_FORMAT).toUpperCase();
109
+ const payload = {
110
+ prompt: params.prompt,
111
+ geometry_file_format: format
112
+ };
113
+ if (params.seed != null && params.seed >= 0)
114
+ payload.seed = params.seed;
115
+ const submit = await this.submitTask(payload);
116
+ log.debug(`Rodin text-to-3D task submitted: ${submit.uuid}`);
117
+ await this.pollTaskStatus(submit.subscriptionKey, maxAttempts);
118
+ return this.downloadResult(submit.uuid);
119
+ }
120
+ async imageTo3D(image, params) {
121
+ if (!image || image.length === 0)
122
+ throw new Error("image must not be empty");
123
+ if (!this.apiKey)
124
+ throw new Error("Rodin API key is not configured");
125
+ const maxAttempts = this.computeMaxAttempts(params.timeoutSeconds);
126
+ const format = (params.outputFormat ?? DEFAULT_OUTPUT_FORMAT).toUpperCase();
127
+ const encoded = encodeImageForRodin(image);
128
+ const payload = {
129
+ images: [encoded],
130
+ geometry_file_format: format
131
+ };
132
+ if (params.prompt)
133
+ payload.prompt = params.prompt;
134
+ if (params.seed != null && params.seed >= 0)
135
+ payload.seed = params.seed;
136
+ const submit = await this.submitTask(payload);
137
+ log.debug(`Rodin image-to-3D task submitted: ${submit.uuid}`);
138
+ await this.pollTaskStatus(submit.subscriptionKey, maxAttempts);
139
+ return this.downloadResult(submit.uuid);
140
+ }
141
+ // --- internals ---
142
+ headers() {
143
+ return {
144
+ Authorization: `Bearer ${this.apiKey}`,
145
+ "Content-Type": "application/json"
146
+ };
147
+ }
148
+ computeMaxAttempts(timeoutSeconds) {
149
+ if (!timeoutSeconds || timeoutSeconds <= 0) {
150
+ return this.maxPollAttempts;
151
+ }
152
+ return Math.max(1, Math.floor((timeoutSeconds * 1000) / this.pollIntervalMs));
153
+ }
154
+ async submitTask(payload) {
155
+ const url = `${RODIN_API_BASE_URL}/v2/rodin`;
156
+ const res = await fetch(url, {
157
+ method: "POST",
158
+ headers: this.headers(),
159
+ body: JSON.stringify(payload)
160
+ });
161
+ if (res.status !== 200 && res.status !== 202) {
162
+ const errText = await res.text();
163
+ throw new Error(`Rodin API error (${res.status}): ${errText}`);
164
+ }
165
+ const data = (await res.json());
166
+ const uuids = data.uuids;
167
+ const subscriptionKey = data.subscription_key;
168
+ const uuid = uuids?.[0];
169
+ if (!uuid) {
170
+ throw new Error(`Rodin submit returned no task uuid: ${JSON.stringify(data)}`);
171
+ }
172
+ if (!subscriptionKey) {
173
+ throw new Error(`Rodin submit returned no subscription_key: ${JSON.stringify(data)}`);
174
+ }
175
+ return { uuid, subscriptionKey };
176
+ }
177
+ async pollTaskStatus(subscriptionKey, maxAttempts) {
178
+ const url = `${RODIN_API_BASE_URL}/v2/status`;
179
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
180
+ const res = await fetch(url, {
181
+ method: "POST",
182
+ headers: this.headers(),
183
+ body: JSON.stringify({ subscription_key: subscriptionKey })
184
+ });
185
+ if (res.status !== 200) {
186
+ const errText = await res.text();
187
+ throw new Error(`Rodin API poll error (${res.status}): ${errText}`);
188
+ }
189
+ const data = (await res.json());
190
+ const jobs = data.jobs ?? [];
191
+ const job = jobs[0];
192
+ if (!job) {
193
+ log.debug(`Rodin task: no jobs yet (attempt ${attempt + 1}/${maxAttempts})`);
194
+ await new Promise((r) => setTimeout(r, this.pollIntervalMs));
195
+ continue;
196
+ }
197
+ const status = String(job.status ?? "").toUpperCase();
198
+ if (status === "DONE")
199
+ return job;
200
+ if (status === "FAILED" ||
201
+ status === "ERROR" ||
202
+ status === "CANCELLED") {
203
+ const errMsg = job.error ?? "Unknown error";
204
+ throw new Error(`Rodin task failed: ${errMsg}`);
205
+ }
206
+ log.debug(`Rodin task status: ${status} (attempt ${attempt + 1}/${maxAttempts})`);
207
+ await new Promise((r) => setTimeout(r, this.pollIntervalMs));
208
+ }
209
+ throw new Error(`Rodin task timed out after ${(maxAttempts * this.pollIntervalMs) / 1000}s`);
210
+ }
211
+ async downloadResult(taskUuid) {
212
+ const downloadInfoRes = await fetch(`${RODIN_API_BASE_URL}/v2/download`, {
213
+ method: "POST",
214
+ headers: this.headers(),
215
+ body: JSON.stringify({ task_uuid: taskUuid })
216
+ });
217
+ if (downloadInfoRes.status !== 200) {
218
+ const errText = await downloadInfoRes.text();
219
+ throw new Error(`Failed to get Rodin download URL (${downloadInfoRes.status}): ${errText}`);
220
+ }
221
+ const info = (await downloadInfoRes.json());
222
+ const downloadUrl = info.model_url ?? info.url;
223
+ if (!downloadUrl) {
224
+ throw new Error(`No download URL in Rodin response: ${JSON.stringify(info)}`);
225
+ }
226
+ const dlRes = await fetch(downloadUrl);
227
+ if (!dlRes.ok) {
228
+ const errText = await dlRes.text().catch(() => "");
229
+ throw new Error(`Failed to download Rodin result (${dlRes.status}): ${errText}`);
230
+ }
231
+ const bytes = new Uint8Array(await dlRes.arrayBuffer());
232
+ log.debug(`Downloaded ${bytes.length} bytes of 3D model data from Rodin`);
233
+ return bytes;
234
+ }
235
+ }
236
+ //# sourceMappingURL=rodin-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rodin-provider.js","sourceRoot":"","sources":["../../src/providers/rodin-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * ScriptedProvider -- a deterministic fake provider for agent E2E tests.
3
+ *
4
+ * Instead of a single fixed response, each generateMessages call dispatches
5
+ * to the next script function in the sequence. Scripts can inspect the full
6
+ * messages and tools list to decide what to yield, making it possible to
7
+ * simulate a real LLM that responds to context.
8
+ *
9
+ * Usage:
10
+ * const provider = new ScriptedProvider([
11
+ * planScript({ title: "My Plan", steps: [...] }), // call 0: planning
12
+ * stepScript({ answer: "42" }), // call 1: step 1
13
+ * stepScript({ summary: "done" }), // call 2: step 2
14
+ * ]);
15
+ */
16
+ import { BaseProvider } from "./base-provider.js";
17
+ import type { Message, ProviderStreamItem, ProviderTool } from "./types.js";
18
+ export type ScriptItem = {
19
+ type: "chunk";
20
+ content: string;
21
+ done?: boolean;
22
+ } | {
23
+ type: "tool_call";
24
+ name: string;
25
+ args: Record<string, unknown>;
26
+ id?: string;
27
+ };
28
+ /**
29
+ * A script function is called with the current messages and tools for a
30
+ * generateMessages invocation, and returns an array of items to yield.
31
+ */
32
+ export type ScriptFn = (messages: Message[], tools: ProviderTool[]) => ScriptItem[];
33
+ export declare class ScriptedProvider extends BaseProvider {
34
+ private readonly scripts;
35
+ private callIdx;
36
+ /** Full log of all generateMessages calls (messages + tools per call). */
37
+ readonly callLog: Array<{
38
+ messages: Message[];
39
+ tools: ProviderTool[];
40
+ }>;
41
+ constructor(scripts: ScriptFn[]);
42
+ /** Reset call index and log (useful between test cases). */
43
+ reset(): void;
44
+ generateMessage(args: {
45
+ messages: Message[];
46
+ model: string;
47
+ tools?: ProviderTool[];
48
+ maxTokens?: number;
49
+ }): Promise<Message>;
50
+ generateMessages(args: {
51
+ messages: Message[];
52
+ model: string;
53
+ tools?: ProviderTool[];
54
+ maxTokens?: number;
55
+ }): AsyncGenerator<ProviderStreamItem>;
56
+ }
57
+ export interface TaskPlanSpec {
58
+ title: string;
59
+ steps: Array<{
60
+ id: string;
61
+ instructions: string;
62
+ depends_on?: string[];
63
+ output_schema?: string;
64
+ tools?: string[];
65
+ }>;
66
+ }
67
+ /**
68
+ * Spec for a multi-task plan where each task runs as an independent sub-agent.
69
+ */
70
+ export interface MultiTaskPlanSpec {
71
+ title: string;
72
+ tasks: Array<{
73
+ id: string;
74
+ title: string;
75
+ depends_on?: string[];
76
+ steps: Array<{
77
+ id: string;
78
+ instructions: string;
79
+ depends_on?: string[];
80
+ output_schema?: string;
81
+ tools?: string[];
82
+ }>;
83
+ }>;
84
+ }
85
+ /**
86
+ * Script that calls the `create_task` tool with the provided plan.
87
+ * Use this for the planning phase of agent execution (single-task mode).
88
+ */
89
+ export declare function planScript(taskSpec: TaskPlanSpec): ScriptFn;
90
+ /**
91
+ * Script that calls the `create_plan` tool with a multi-task plan.
92
+ * Use this for the planning phase of agent execution (multi-task mode).
93
+ */
94
+ export declare function multiTaskPlanScript(planSpec: MultiTaskPlanSpec): ScriptFn;
95
+ /**
96
+ * Script that calls `finish_step` with the provided result.
97
+ * Use this for step execution phases.
98
+ */
99
+ export declare function stepScript(result: unknown): ScriptFn;
100
+ /**
101
+ * Script that emits a plain text chunk (no tool call).
102
+ * Useful for unstructured steps or testing fallback behavior.
103
+ */
104
+ export declare function textScript(content: string): ScriptFn;
105
+ /**
106
+ * Script that calls an arbitrary tool by name.
107
+ */
108
+ export declare function toolCallScript(name: string, args: Record<string, unknown>): ScriptFn;
109
+ /**
110
+ * Auto-detecting script: inspects the `tools` list for each call and decides:
111
+ * - If `create_plan` is available → call it with `opts.multiTaskPlan` or auto-wrap `opts.plan`
112
+ * - If `create_task` is available → call it with `opts.plan`
113
+ * - If `finish_step` is available → call it with `opts.result`
114
+ * - Otherwise → emit `opts.text` as a chunk
115
+ *
116
+ * This mimics a "smart" LLM that knows what tools are available.
117
+ */
118
+ export declare function autoScript(opts: {
119
+ plan?: TaskPlanSpec;
120
+ multiTaskPlan?: MultiTaskPlanSpec;
121
+ result?: unknown;
122
+ text?: string;
123
+ }): ScriptFn;
124
+ /**
125
+ * Sequence of tool calls followed by a finish_step.
126
+ * Models a step where the LLM first uses tools, then completes.
127
+ *
128
+ * Example:
129
+ * toolThenFinishScript(
130
+ * [{ name: "calculator", args: { expression: "2+2" } }],
131
+ * { answer: 4 }
132
+ * )
133
+ *
134
+ * The provider will yield the tool call on the first iteration, and on the
135
+ * next iteration (after tool results are fed back) it will yield finish_step.
136
+ */
137
+ export declare function toolThenFinishScript(toolCalls: Array<{
138
+ name: string;
139
+ args: Record<string, unknown>;
140
+ }>, finalResult: unknown): ScriptFn[];
141
+ //# sourceMappingURL=scripted-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripted-provider.d.ts","sourceRoot":"","sources":["../../src/providers/scripted-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * ScriptedProvider -- a deterministic fake provider for agent E2E tests.
3
+ *
4
+ * Instead of a single fixed response, each generateMessages call dispatches
5
+ * to the next script function in the sequence. Scripts can inspect the full
6
+ * messages and tools list to decide what to yield, making it possible to
7
+ * simulate a real LLM that responds to context.
8
+ *
9
+ * Usage:
10
+ * const provider = new ScriptedProvider([
11
+ * planScript({ title: "My Plan", steps: [...] }), // call 0: planning
12
+ * stepScript({ answer: "42" }), // call 1: step 1
13
+ * stepScript({ summary: "done" }), // call 2: step 2
14
+ * ]);
15
+ */
16
+ import { randomUUID } from "node:crypto";
17
+ import { BaseProvider } from "./base-provider.js";
18
+ // ---------------------------------------------------------------------------
19
+ // ScriptedProvider
20
+ // ---------------------------------------------------------------------------
21
+ export class ScriptedProvider extends BaseProvider {
22
+ scripts;
23
+ callIdx = 0;
24
+ /** Full log of all generateMessages calls (messages + tools per call). */
25
+ callLog = [];
26
+ constructor(scripts) {
27
+ super("fake");
28
+ if (scripts.length === 0)
29
+ throw new Error("ScriptedProvider requires at least one script");
30
+ this.scripts = scripts;
31
+ }
32
+ /** Reset call index and log (useful between test cases). */
33
+ reset() {
34
+ this.callIdx = 0;
35
+ this.callLog.length = 0;
36
+ }
37
+ async generateMessage(args) {
38
+ let content = "";
39
+ for await (const item of this.generateMessages(args)) {
40
+ if ("type" in item && item.type === "chunk") {
41
+ content += item.content ?? "";
42
+ }
43
+ }
44
+ return { role: "assistant", content: content || "Done." };
45
+ }
46
+ async *generateMessages(args) {
47
+ const tools = args.tools ?? [];
48
+ this.callLog.push({ messages: args.messages, tools });
49
+ // Use the next script; if exhausted, repeat the last one
50
+ const idx = Math.min(this.callIdx, this.scripts.length - 1);
51
+ this.callIdx++;
52
+ const script = this.scripts[idx];
53
+ const items = script(args.messages, tools);
54
+ for (const item of items) {
55
+ if (item.type === "chunk") {
56
+ yield {
57
+ type: "chunk",
58
+ content: item.content,
59
+ done: item.done ?? true,
60
+ content_type: "text"
61
+ };
62
+ }
63
+ else {
64
+ // tool_call
65
+ yield {
66
+ id: item.id ?? randomUUID(),
67
+ name: item.name,
68
+ args: item.args
69
+ };
70
+ }
71
+ }
72
+ }
73
+ }
74
+ /**
75
+ * Script that calls the `create_task` tool with the provided plan.
76
+ * Use this for the planning phase of agent execution (single-task mode).
77
+ */
78
+ export function planScript(taskSpec) {
79
+ return (_messages, _tools) => [
80
+ {
81
+ type: "tool_call",
82
+ name: "create_task",
83
+ args: taskSpec
84
+ }
85
+ ];
86
+ }
87
+ /**
88
+ * Script that calls the `create_plan` tool with a multi-task plan.
89
+ * Use this for the planning phase of agent execution (multi-task mode).
90
+ */
91
+ export function multiTaskPlanScript(planSpec) {
92
+ return (_messages, _tools) => [
93
+ {
94
+ type: "tool_call",
95
+ name: "create_plan",
96
+ args: planSpec
97
+ }
98
+ ];
99
+ }
100
+ /**
101
+ * Script that calls `finish_step` with the provided result.
102
+ * Use this for step execution phases.
103
+ */
104
+ export function stepScript(result) {
105
+ return (_messages, _tools) => [
106
+ { type: "tool_call", name: "finish_step", args: { result } }
107
+ ];
108
+ }
109
+ /**
110
+ * Script that emits a plain text chunk (no tool call).
111
+ * Useful for unstructured steps or testing fallback behavior.
112
+ */
113
+ export function textScript(content) {
114
+ return (_messages, _tools) => [{ type: "chunk", content, done: true }];
115
+ }
116
+ /**
117
+ * Script that calls an arbitrary tool by name.
118
+ */
119
+ export function toolCallScript(name, args) {
120
+ return (_messages, _tools) => [{ type: "tool_call", name, args }];
121
+ }
122
+ /**
123
+ * Auto-detecting script: inspects the `tools` list for each call and decides:
124
+ * - If `create_plan` is available → call it with `opts.multiTaskPlan` or auto-wrap `opts.plan`
125
+ * - If `create_task` is available → call it with `opts.plan`
126
+ * - If `finish_step` is available → call it with `opts.result`
127
+ * - Otherwise → emit `opts.text` as a chunk
128
+ *
129
+ * This mimics a "smart" LLM that knows what tools are available.
130
+ */
131
+ export function autoScript(opts) {
132
+ return (messages, tools) => {
133
+ const toolNames = new Set(tools.map((t) => t.name));
134
+ // Incremental planner: add_task + finish_plan
135
+ if (toolNames.has("add_task") &&
136
+ toolNames.has("finish_plan") &&
137
+ (opts.multiTaskPlan || opts.plan)) {
138
+ const planSpec = opts.multiTaskPlan ?? {
139
+ title: opts.plan.title,
140
+ tasks: [
141
+ {
142
+ id: "task_1",
143
+ title: opts.plan.title,
144
+ depends_on: [],
145
+ steps: opts.plan.steps
146
+ }
147
+ ]
148
+ };
149
+ // Count add_task tool results already in history to decide next step.
150
+ let addedCount = 0;
151
+ for (const m of messages) {
152
+ if (m.role !== "tool")
153
+ continue;
154
+ const content = typeof m.content === "string" ? m.content : "";
155
+ if (content.includes('"status":"task_added"'))
156
+ addedCount++;
157
+ }
158
+ if (addedCount < planSpec.tasks.length) {
159
+ const task = planSpec.tasks[addedCount];
160
+ return [
161
+ {
162
+ type: "tool_call",
163
+ name: "add_task",
164
+ args: task
165
+ }
166
+ ];
167
+ }
168
+ return [
169
+ {
170
+ type: "tool_call",
171
+ name: "finish_plan",
172
+ args: { title: planSpec.title }
173
+ }
174
+ ];
175
+ }
176
+ if (toolNames.has("create_plan") && (opts.multiTaskPlan || opts.plan)) {
177
+ // Legacy one-shot multi-task plan tool.
178
+ const planArgs = opts.multiTaskPlan ?? {
179
+ title: opts.plan.title,
180
+ tasks: [
181
+ {
182
+ id: "task_1",
183
+ title: opts.plan.title,
184
+ depends_on: [],
185
+ steps: opts.plan.steps
186
+ }
187
+ ]
188
+ };
189
+ return [
190
+ {
191
+ type: "tool_call",
192
+ name: "create_plan",
193
+ args: planArgs
194
+ }
195
+ ];
196
+ }
197
+ if (toolNames.has("create_task") && opts.plan) {
198
+ return [
199
+ {
200
+ type: "tool_call",
201
+ name: "create_task",
202
+ args: opts.plan
203
+ }
204
+ ];
205
+ }
206
+ if (toolNames.has("finish_step")) {
207
+ return [
208
+ {
209
+ type: "tool_call",
210
+ name: "finish_step",
211
+ args: { result: opts.result ?? {} }
212
+ }
213
+ ];
214
+ }
215
+ return [
216
+ { type: "chunk", content: opts.text ?? "Task completed.", done: true }
217
+ ];
218
+ };
219
+ }
220
+ /**
221
+ * Sequence of tool calls followed by a finish_step.
222
+ * Models a step where the LLM first uses tools, then completes.
223
+ *
224
+ * Example:
225
+ * toolThenFinishScript(
226
+ * [{ name: "calculator", args: { expression: "2+2" } }],
227
+ * { answer: 4 }
228
+ * )
229
+ *
230
+ * The provider will yield the tool call on the first iteration, and on the
231
+ * next iteration (after tool results are fed back) it will yield finish_step.
232
+ */
233
+ export function toolThenFinishScript(toolCalls, finalResult) {
234
+ const scripts = [
235
+ // First call: yield the tool calls
236
+ (_messages, _tools) => toolCalls.map((tc) => ({
237
+ type: "tool_call",
238
+ name: tc.name,
239
+ args: tc.args
240
+ })),
241
+ // Second call (after tool results): yield finish_step
242
+ stepScript(finalResult)
243
+ ];
244
+ return scripts;
245
+ }
246
+ //# sourceMappingURL=scripted-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripted-provider.js","sourceRoot":"","sources":["../../src/providers/scripted-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import OpenAI from "openai";
2
+ import { OpenAIProvider } from "./openai-provider.js";
3
+ import type { LanguageModel } from "./types.js";
4
+ interface TogetherProviderOptions {
5
+ client?: OpenAI;
6
+ clientFactory?: (apiKey: string) => OpenAI;
7
+ fetchFn?: typeof fetch;
8
+ }
9
+ export declare class TogetherProvider extends OpenAIProvider {
10
+ static requiredSecrets(): string[];
11
+ private _togetherFetch;
12
+ constructor(secrets: {
13
+ TOGETHER_API_KEY?: string;
14
+ }, options?: TogetherProviderOptions);
15
+ getContainerEnv(): Record<string, string>;
16
+ hasToolSupport(_model: string): Promise<boolean>;
17
+ getAvailableLanguageModels(): Promise<LanguageModel[]>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=together-provider.d.ts.map