@aexol/spectral 0.9.231 → 0.9.234
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/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +89 -14
- package/dist/backend/generated-images.d.ts +1 -1
- package/dist/backend/generated-images.d.ts.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +12 -1
- package/dist/extensions/logic-trace.d.ts +1 -1
- package/dist/extensions/logic-trace.d.ts.map +1 -1
- package/dist/extensions/logic-trace.js +199 -70
- package/dist/extensions/video-generation/index.d.ts +3 -0
- package/dist/extensions/video-generation/index.d.ts.map +1 -0
- package/dist/extensions/video-generation/index.js +299 -0
- package/dist/generated/zeus/const.d.ts.map +1 -1
- package/dist/generated/zeus/const.js +30 -0
- package/dist/generated/zeus/index.d.ts +140 -0
- package/dist/generated/zeus/index.d.ts.map +1 -1
- package/dist/generated/zeus/index.js +5 -0
- package/dist/relay/dispatcher.d.ts +13 -1
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +11 -0
- package/dist/sdk/agent-core/agent-loop.js +13 -3
- package/dist/sdk/agent-core/agent.d.ts +11 -4
- package/dist/sdk/agent-core/agent.d.ts.map +1 -1
- package/dist/sdk/agent-core/agent.js +16 -4
- package/dist/sdk/agent-core/tool-call-registry.d.ts +75 -0
- package/dist/sdk/agent-core/tool-call-registry.d.ts.map +1 -0
- package/dist/sdk/agent-core/tool-call-registry.js +131 -0
- package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -1
- package/dist/sdk/agent-core/tool-execution.js +103 -4
- package/dist/sdk/agent-core/types.d.ts +15 -4
- package/dist/sdk/agent-core/types.d.ts.map +1 -1
- package/dist/sdk/ai/index.d.ts +3 -0
- package/dist/sdk/ai/index.d.ts.map +1 -1
- package/dist/sdk/ai/index.js +3 -0
- package/dist/sdk/ai/providers/faux.d.ts.map +1 -1
- package/dist/sdk/ai/providers/faux.js +3 -0
- package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts +39 -6
- package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts.map +1 -1
- package/dist/sdk/ai/providers/leaked-tool-call-parser.js +159 -18
- package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openai-completions.js +22 -8
- package/dist/sdk/ai/providers/openrouter-videos.d.ts +3 -0
- package/dist/sdk/ai/providers/openrouter-videos.d.ts.map +1 -0
- package/dist/sdk/ai/providers/openrouter-videos.js +412 -0
- package/dist/sdk/ai/providers/register-builtins.d.ts.map +1 -1
- package/dist/sdk/ai/providers/register-builtins.js +6 -0
- package/dist/sdk/ai/providers/simple-options.d.ts +1 -6
- package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
- package/dist/sdk/ai/providers/simple-options.js +0 -22
- package/dist/sdk/ai/providers/transform-messages.d.ts.map +1 -1
- package/dist/sdk/ai/providers/transform-messages.js +52 -1
- package/dist/sdk/ai/types.d.ts +91 -10
- package/dist/sdk/ai/types.d.ts.map +1 -1
- package/dist/sdk/ai/video-models.d.ts +10 -0
- package/dist/sdk/ai/video-models.d.ts.map +1 -0
- package/dist/sdk/ai/video-models.generated.d.ts +440 -0
- package/dist/sdk/ai/video-models.generated.d.ts.map +1 -0
- package/dist/sdk/ai/video-models.generated.js +441 -0
- package/dist/sdk/ai/video-models.js +22 -0
- package/dist/sdk/ai/videos-api-registry.d.ts +14 -0
- package/dist/sdk/ai/videos-api-registry.d.ts.map +1 -0
- package/dist/sdk/ai/videos-api-registry.js +21 -0
- package/dist/sdk/ai/videos.d.ts +4 -0
- package/dist/sdk/ai/videos.d.ts.map +1 -0
- package/dist/sdk/ai/videos.js +13 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts +8 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/agent-session.js +11 -0
- package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/loader.js +14 -0
- package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts +26 -0
- package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/native-extensions.js +23 -0
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +2 -2
- package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +4 -2
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/messages.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/messages.js +42 -2
- package/dist/sdk/coding-agent/core/resource-loader.d.ts +11 -0
- package/dist/sdk/coding-agent/core/resource-loader.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/resource-loader.js +23 -6
- package/dist/sdk/coding-agent/core/sdk.d.ts +24 -2
- package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/sdk.js +15 -3
- package/dist/sdk/coding-agent/core/settings-manager.d.ts +0 -8
- package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/settings-manager.js +3 -3
- package/dist/sdk/coding-agent/index.d.ts +2 -2
- package/dist/sdk/coding-agent/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/index.js +1 -1
- package/dist/sdk-public.d.ts +96 -0
- package/dist/sdk-public.d.ts.map +1 -0
- package/dist/sdk-public.js +109 -0
- package/dist/server/agent-bridge/rehydrate.d.ts +2 -2
- package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -1
- package/dist/server/agent-bridge/rehydrate.js +14 -0
- package/dist/server/agent-bridge.d.ts +8 -2
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +25 -2
- package/dist/server/session-stream.d.ts +19 -0
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +35 -0
- package/dist/server/wire.d.ts +13 -0
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +7 -1
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { extname, join, resolve } from "node:path";
|
|
4
|
+
import { generateVideos, getVideoModel, getVideoModels } from "../../sdk/ai/index.js";
|
|
5
|
+
import { base64FromImageData } from "../../sdk/ai/utils/image-source.js";
|
|
6
|
+
import { uploadImage } from "../../backend/generated-images.js";
|
|
7
|
+
// Backend routing (backendUrl + machineJwt) is resolved the same way the
|
|
8
|
+
// image tool gets it, so video generation routes through the backend proxy
|
|
9
|
+
// (POST /video/generation) using the backend's own OPENROUTER_API_KEY and
|
|
10
|
+
// falls back to direct OpenRouter when the proxy is unavailable or the CLI
|
|
11
|
+
// is not logged in.
|
|
12
|
+
import { resolveBackendRouting } from "../../backend/machine-routing.js";
|
|
13
|
+
const frameImageSchema = Type.Union([
|
|
14
|
+
Type.String({
|
|
15
|
+
description: "Path to a frame image file (relative to the project working directory or absolute).",
|
|
16
|
+
}),
|
|
17
|
+
Type.Object({
|
|
18
|
+
data: Type.String({ description: "Frame image as raw base64 or data URL." }),
|
|
19
|
+
mimeType: Type.Optional(Type.String({ default: "image/png", description: "Frame image MIME type." })),
|
|
20
|
+
}, { description: "Frame image provided inline as base64 data." }),
|
|
21
|
+
Type.Object({
|
|
22
|
+
path: Type.String({ description: "Path to a frame image file (relative to the project working directory or absolute)." }),
|
|
23
|
+
mimeType: Type.Optional(Type.String({ description: "Frame image MIME type. Defaults to the type detected from the file extension." })),
|
|
24
|
+
}, { description: "Frame image provided as a file path." }),
|
|
25
|
+
]);
|
|
26
|
+
const videoGenerateSchema = Type.Object({
|
|
27
|
+
prompt: Type.String({ description: "Text prompt describing the video to generate." }),
|
|
28
|
+
model: Type.Optional(Type.String({ default: "google/veo-3.1", description: "OpenRouter video model id." })),
|
|
29
|
+
duration: Type.Optional(Type.Number({ description: "Clip duration in seconds (model-dependent, e.g. 4-10 for Veo)." })),
|
|
30
|
+
resolution: Type.Optional(Type.String({ description: "Resolution tier, e.g. 480p, 720p, 768p, 1080p." })),
|
|
31
|
+
aspect_ratio: Type.Optional(Type.String({ description: "Aspect ratio, e.g. 16:9, 9:16, 1:1." })),
|
|
32
|
+
size: Type.Optional(Type.String({ description: "OpenRouter size shorthand, e.g. 1280x720." })),
|
|
33
|
+
generate_audio: Type.Optional(Type.Boolean({ default: true, description: "Whether to generate audio with the video (model-dependent)." })),
|
|
34
|
+
seed: Type.Optional(Type.Number()),
|
|
35
|
+
frame_images: Type.Optional(Type.Array(frameImageSchema, { description: "Optional frame images for image-to-video generation. Each element may be a file path string, an object { data: <base64 or data URL>, mimeType?: string }, or an object { path: <file path>, mimeType?: string }." })),
|
|
36
|
+
});
|
|
37
|
+
function videoModel(modelId) {
|
|
38
|
+
const exact = getVideoModel("openrouter", modelId);
|
|
39
|
+
if (exact)
|
|
40
|
+
return exact;
|
|
41
|
+
return getVideoModels("openrouter").find((model) => model.id === modelId);
|
|
42
|
+
}
|
|
43
|
+
const GENERATED_VIDEOS_DIR = ".generated_videos";
|
|
44
|
+
const VIDEO_MIME_TYPE = "video/mp4";
|
|
45
|
+
function mimeTypeForPath(filePath) {
|
|
46
|
+
switch (extname(filePath).toLowerCase()) {
|
|
47
|
+
case ".png":
|
|
48
|
+
return "image/png";
|
|
49
|
+
case ".jpg":
|
|
50
|
+
case ".jpeg":
|
|
51
|
+
return "image/jpeg";
|
|
52
|
+
case ".webp":
|
|
53
|
+
return "image/webp";
|
|
54
|
+
case ".gif":
|
|
55
|
+
return "image/gif";
|
|
56
|
+
default:
|
|
57
|
+
return "image/png";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function readFrameImageFromPath(filePath, mimeType) {
|
|
61
|
+
let data;
|
|
62
|
+
try {
|
|
63
|
+
data = readFileSync(filePath).toString("base64");
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const code = error?.code;
|
|
67
|
+
if (code === "ENOENT") {
|
|
68
|
+
throw new Error(`Frame image file does not exist: ${filePath}`);
|
|
69
|
+
}
|
|
70
|
+
if (code === "EACCES" || code === "EPERM") {
|
|
71
|
+
throw new Error(`Permission denied while reading frame image: ${filePath}`);
|
|
72
|
+
}
|
|
73
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
74
|
+
throw new Error(`Failed to read frame image: ${filePath} (${detail})`);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
type: "image",
|
|
78
|
+
data,
|
|
79
|
+
mimeType: mimeType ?? mimeTypeForPath(filePath),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function normalizeFrameImages(frames, cwd) {
|
|
83
|
+
if (!frames)
|
|
84
|
+
return [];
|
|
85
|
+
return frames.map((frame, index) => {
|
|
86
|
+
if (typeof frame === "string") {
|
|
87
|
+
return readFrameImageFromPath(resolve(cwd, frame), undefined);
|
|
88
|
+
}
|
|
89
|
+
if (typeof frame !== "object" || frame === null) {
|
|
90
|
+
throw new Error(`Invalid frame image at index ${index}: expected a file path string or an object with "data" or "path".`);
|
|
91
|
+
}
|
|
92
|
+
const reference = frame;
|
|
93
|
+
if (typeof reference.data === "string" && typeof reference.path === "string") {
|
|
94
|
+
throw new Error(`Invalid frame image at index ${index}: provide only one of "data" (inline base64) or "path" (file path), not both.`);
|
|
95
|
+
}
|
|
96
|
+
if (typeof reference.data === "string") {
|
|
97
|
+
return {
|
|
98
|
+
type: "image",
|
|
99
|
+
data: reference.data,
|
|
100
|
+
mimeType: reference.mimeType ?? "image/png",
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (typeof reference.path === "string") {
|
|
104
|
+
return readFrameImageFromPath(resolve(cwd, reference.path), reference.mimeType);
|
|
105
|
+
}
|
|
106
|
+
throw new Error(`Invalid frame image at index ${index}: expected a file path string or an object with "data" or "path".`);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function slugFromPrompt(prompt) {
|
|
110
|
+
const slug = prompt
|
|
111
|
+
.normalize("NFKD")
|
|
112
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
113
|
+
.toLowerCase()
|
|
114
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
115
|
+
.replace(/^-+|-+$/g, "")
|
|
116
|
+
.slice(0, 40);
|
|
117
|
+
return slug || "video";
|
|
118
|
+
}
|
|
119
|
+
function timestamp() {
|
|
120
|
+
return new Date().toISOString().replace(/[-:.TZ]/g, "").slice(0, 14);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Save a locally-downloaded video (direct OpenRouter path) under
|
|
124
|
+
* `.generated_videos/`. Proxy-path videos have no inline bytes here — the
|
|
125
|
+
* backend stores them and reports the hosted url instead.
|
|
126
|
+
*/
|
|
127
|
+
function saveGeneratedVideo(video, prompt, cwd) {
|
|
128
|
+
if (!video.data)
|
|
129
|
+
return undefined;
|
|
130
|
+
const dir = join(cwd, GENERATED_VIDEOS_DIR);
|
|
131
|
+
mkdirSync(dir, { recursive: true });
|
|
132
|
+
const filename = `${slugFromPrompt(prompt)}-${timestamp()}.mp4`;
|
|
133
|
+
const filepath = join(dir, filename);
|
|
134
|
+
writeFileSync(filepath, Buffer.from(base64FromImageData(video.data), "base64"));
|
|
135
|
+
return filepath;
|
|
136
|
+
}
|
|
137
|
+
function bytesFromVideoData(data) {
|
|
138
|
+
return new Uint8Array(Buffer.from(base64FromImageData(data), "base64"));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Make the generated video reachable through a backend URL so the session can
|
|
142
|
+
* carry a url instead of megabytes of base64. Only applies to videos that
|
|
143
|
+
* came back as inline bytes (direct OpenRouter fallback path) — proxy-path
|
|
144
|
+
* videos are already stored server-side. Best effort by design: an upload
|
|
145
|
+
* failure must not fail video generation; the caller falls back to the local
|
|
146
|
+
* file + inline bytes and annotates the result text.
|
|
147
|
+
*/
|
|
148
|
+
async function hostGeneratedVideo(video, routing, signal) {
|
|
149
|
+
if (video.url && video.videoId)
|
|
150
|
+
return { hosted: { url: video.url, videoId: video.videoId } };
|
|
151
|
+
if (!routing)
|
|
152
|
+
return { error: "not routed through the backend (video kept local)" };
|
|
153
|
+
if (!video.data)
|
|
154
|
+
return { error: "video has no inline bytes (kept local)" };
|
|
155
|
+
try {
|
|
156
|
+
const result = await uploadImage({
|
|
157
|
+
backendUrl: routing.backendUrl,
|
|
158
|
+
token: routing.machineJwt,
|
|
159
|
+
bytes: bytesFromVideoData(video.data),
|
|
160
|
+
contentType: video.mimeType || VIDEO_MIME_TYPE,
|
|
161
|
+
kind: "video",
|
|
162
|
+
signal,
|
|
163
|
+
});
|
|
164
|
+
return { result };
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function isHosted(outcome) {
|
|
171
|
+
return Boolean(outcome.hosted ?? outcome.result);
|
|
172
|
+
}
|
|
173
|
+
function hostedUrl(outcome) {
|
|
174
|
+
return outcome.hosted?.url ?? outcome.result.url;
|
|
175
|
+
}
|
|
176
|
+
function hostedId(outcome) {
|
|
177
|
+
return outcome.hosted?.videoId ?? outcome.result.imageId;
|
|
178
|
+
}
|
|
179
|
+
function resultText(model, credits, savedPath, outcome) {
|
|
180
|
+
const lines = ["✓ Generated 1 video", `Model: ${model}`];
|
|
181
|
+
lines.push(`Cost: ${credits ?? 0} credits`);
|
|
182
|
+
if (savedPath)
|
|
183
|
+
lines.push(`Saved: ${savedPath}`);
|
|
184
|
+
else if (!isHosted(outcome))
|
|
185
|
+
lines.push("Saved: (no local copy — see errors below)");
|
|
186
|
+
if (isHosted(outcome)) {
|
|
187
|
+
lines.push(`Hosted: ${hostedUrl(outcome)}`);
|
|
188
|
+
}
|
|
189
|
+
if (!isHosted(outcome) && outcome.error) {
|
|
190
|
+
// Explicit annotation: the video bytes were NOT uploaded, so the video
|
|
191
|
+
// exists only as the local file (path above); remote URL unavailable.
|
|
192
|
+
lines.push(`⚠️ The video could not be uploaded to cloud storage and exists only locally; remote URL unavailable.`);
|
|
193
|
+
lines.push(`- ${outcome.error}`);
|
|
194
|
+
}
|
|
195
|
+
return lines.join("\n");
|
|
196
|
+
}
|
|
197
|
+
export default async function videoGenerationExtension(ext) {
|
|
198
|
+
const tool = {
|
|
199
|
+
name: "video_generate",
|
|
200
|
+
label: "Generate Video",
|
|
201
|
+
description: "Generate videos through OpenRouter's Videos API and save them to .generated_videos/ in the project. " +
|
|
202
|
+
"Returns the saved file path and hosted URL so the user can view the generated video. " +
|
|
203
|
+
"Supports text-to-video and image-to-video via optional frame images. " +
|
|
204
|
+
"Models cannot read video — the result carries a text summary; the video block is for the user's UI.",
|
|
205
|
+
promptSnippet: "`video_generate { prompt, model?, duration?, aspect_ratio?, resolution?, frame_images? }` — generate video content (mp4, saved to .generated_videos/)",
|
|
206
|
+
parameters: videoGenerateSchema,
|
|
207
|
+
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
208
|
+
const input = params;
|
|
209
|
+
const modelId = input.model ?? "google/veo-3.1";
|
|
210
|
+
const model = videoModel(modelId);
|
|
211
|
+
if (!model) {
|
|
212
|
+
return {
|
|
213
|
+
content: [{ type: "text", text: `❌ Unknown OpenRouter video model: ${modelId}` }],
|
|
214
|
+
details: { isError: true, model: modelId },
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const context = {
|
|
218
|
+
input: [
|
|
219
|
+
{ type: "text", text: input.prompt },
|
|
220
|
+
...normalizeFrameImages(input.frame_images, ctx.cwd),
|
|
221
|
+
],
|
|
222
|
+
};
|
|
223
|
+
// Route through the backend video proxy (POST /video/generation)
|
|
224
|
+
// using the machine JWT, mirroring image generation. Falls back to
|
|
225
|
+
// direct OpenRouter (submit + poll + download with the local
|
|
226
|
+
// OPENROUTER_API_KEY) when routing cannot be resolved or the proxy
|
|
227
|
+
// is unavailable.
|
|
228
|
+
const routing = await resolveBackendRouting();
|
|
229
|
+
const response = await generateVideos(model, context, {
|
|
230
|
+
...input,
|
|
231
|
+
signal,
|
|
232
|
+
...(routing ? { backendUrl: routing.backendUrl, apiKey: routing.machineJwt } : {}),
|
|
233
|
+
// Surface long-poll progress to the UI as partial tool results.
|
|
234
|
+
onProgress: (message) => {
|
|
235
|
+
try {
|
|
236
|
+
onUpdate?.({
|
|
237
|
+
content: [{ type: "text", text: message }],
|
|
238
|
+
details: { progress: message, model: model.id },
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Progress callbacks must never break generation.
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
if (response.stopReason !== "stop") {
|
|
247
|
+
const message = response.errorMessage ?? "Video generation failed";
|
|
248
|
+
return {
|
|
249
|
+
content: [{ type: "text", text: `❌ ${message}` }],
|
|
250
|
+
details: { isError: true, model: model.id, stopReason: response.stopReason, errorMessage: message },
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const video = response.output.find((item) => item.type === "video");
|
|
254
|
+
if (!video) {
|
|
255
|
+
return {
|
|
256
|
+
content: [{ type: "text", text: "❌ Video generation returned no video" }],
|
|
257
|
+
details: { isError: true, model: model.id },
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// Local copy first — for videos that actually came back as bytes
|
|
261
|
+
// (direct OpenRouter fallback). Proxy-path videos have no `data`
|
|
262
|
+
// here, so nothing is written and the hosted url is reported.
|
|
263
|
+
const savedPath = saveGeneratedVideo(video, input.prompt, ctx.cwd);
|
|
264
|
+
const outcome = await hostGeneratedVideo(video, routing, signal);
|
|
265
|
+
// Swap base64 for the hosted URL when possible: the session keeps
|
|
266
|
+
// `{ url, videoId }` and avoids megabytes of base64. Videos that
|
|
267
|
+
// failed to upload keep their inline bytes (fallback, annotated in
|
|
268
|
+
// the result text).
|
|
269
|
+
const block = isHosted(outcome)
|
|
270
|
+
? {
|
|
271
|
+
type: "video",
|
|
272
|
+
url: hostedUrl(outcome),
|
|
273
|
+
videoId: hostedId(outcome),
|
|
274
|
+
mimeType: video.mimeType,
|
|
275
|
+
}
|
|
276
|
+
: video;
|
|
277
|
+
return {
|
|
278
|
+
content: [
|
|
279
|
+
{
|
|
280
|
+
type: "text",
|
|
281
|
+
text: resultText(response.model, response.usage?.credits, savedPath, outcome),
|
|
282
|
+
},
|
|
283
|
+
block,
|
|
284
|
+
],
|
|
285
|
+
details: {
|
|
286
|
+
isError: false,
|
|
287
|
+
model: response.model,
|
|
288
|
+
count: 1,
|
|
289
|
+
usage: response.usage,
|
|
290
|
+
savedPath,
|
|
291
|
+
videoId: isHosted(outcome) ? hostedId(outcome) : undefined,
|
|
292
|
+
url: isHosted(outcome) ? hostedUrl(outcome) : undefined,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
ext.registerTool(tool);
|
|
298
|
+
process.stderr.write("[video-generation] Registered video_generate tool.\n");
|
|
299
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../src/generated/zeus/const.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../src/generated/zeus/const.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAC,GAAG,CAm0B5C,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAC,GAAG,CA4nC1C,CAAA;AAED,eAAO,MAAM,GAAG;;;;CAIf,CAAA"}
|
|
@@ -41,12 +41,17 @@ export const AllTypesProps = {
|
|
|
41
41
|
RiskLevel: "enum",
|
|
42
42
|
LanguageTag: "enum",
|
|
43
43
|
PresetSource: "enum",
|
|
44
|
+
FollowUpMode: "enum",
|
|
45
|
+
PresetFollowUpMessageInput: {
|
|
46
|
+
mode: "FollowUpMode"
|
|
47
|
+
},
|
|
44
48
|
CreatePresetInput: {
|
|
45
49
|
category: "PresetCategory",
|
|
46
50
|
costTier: "CostTier",
|
|
47
51
|
riskLevel: "RiskLevel",
|
|
48
52
|
source: "PresetSource",
|
|
49
53
|
languageTags: "LanguageTag",
|
|
54
|
+
followUpMessages: "PresetFollowUpMessageInput",
|
|
50
55
|
scope: "PresetScope"
|
|
51
56
|
},
|
|
52
57
|
UpdatePresetInput: {
|
|
@@ -54,6 +59,7 @@ export const AllTypesProps = {
|
|
|
54
59
|
costTier: "CostTier",
|
|
55
60
|
riskLevel: "RiskLevel",
|
|
56
61
|
languageTags: "LanguageTag",
|
|
62
|
+
followUpMessages: "PresetFollowUpMessageInput",
|
|
57
63
|
scope: "PresetScope"
|
|
58
64
|
},
|
|
59
65
|
AgentMode: "enum",
|
|
@@ -399,6 +405,9 @@ export const AllTypesProps = {
|
|
|
399
405
|
adminCreateImageBaseModel: {
|
|
400
406
|
input: "BaseModelCreateInput"
|
|
401
407
|
},
|
|
408
|
+
adminCreateVideoBaseModel: {
|
|
409
|
+
input: "BaseModelCreateInput"
|
|
410
|
+
},
|
|
402
411
|
submitLead: {
|
|
403
412
|
input: "SubmitLeadInput"
|
|
404
413
|
},
|
|
@@ -760,6 +769,10 @@ export const ReturnTypes = {
|
|
|
760
769
|
createdAt: "DateTime",
|
|
761
770
|
updatedAt: "DateTime"
|
|
762
771
|
},
|
|
772
|
+
PresetFollowUpMessage: {
|
|
773
|
+
content: "String",
|
|
774
|
+
mode: "FollowUpMode"
|
|
775
|
+
},
|
|
763
776
|
Preset: {
|
|
764
777
|
id: "ID",
|
|
765
778
|
teamId: "ID",
|
|
@@ -778,6 +791,7 @@ export const ReturnTypes = {
|
|
|
778
791
|
goal: "String",
|
|
779
792
|
intervalMinutes: "Int",
|
|
780
793
|
languageTags: "LanguageTag",
|
|
794
|
+
followUpMessages: "PresetFollowUpMessage",
|
|
781
795
|
scope: "PresetScope",
|
|
782
796
|
createdAt: "DateTime",
|
|
783
797
|
updatedAt: "DateTime"
|
|
@@ -1005,8 +1019,10 @@ export const ReturnTypes = {
|
|
|
1005
1019
|
adminBuiltInModels: "UserModel",
|
|
1006
1020
|
adminBaseModels: "BaseModel",
|
|
1007
1021
|
adminImageBaseModels: "BaseModel",
|
|
1022
|
+
adminVideoBaseModels: "BaseModel",
|
|
1008
1023
|
adminOpenRouterCatalog: "OpenRouterModel",
|
|
1009
1024
|
adminOpenRouterImageCatalog: "OpenRouterModel",
|
|
1025
|
+
adminOpenRouterVideoCatalog: "OpenRouterVideoModel",
|
|
1010
1026
|
adminOpenRouterModelProviders: "OpenRouterModelProvider",
|
|
1011
1027
|
adminBillingPlans: "AdminBillingPlan",
|
|
1012
1028
|
adminBillingPlanCount: "Int",
|
|
@@ -1141,6 +1157,7 @@ export const ReturnTypes = {
|
|
|
1141
1157
|
adminUpdateBaseModel: "BaseModel",
|
|
1142
1158
|
adminCreateBaseModel: "BaseModel",
|
|
1143
1159
|
adminCreateImageBaseModel: "BaseModel",
|
|
1160
|
+
adminCreateVideoBaseModel: "BaseModel",
|
|
1144
1161
|
submitLead: "Lead",
|
|
1145
1162
|
adminCreateLead: "Lead",
|
|
1146
1163
|
adminUpdateLead: "Lead",
|
|
@@ -1530,6 +1547,7 @@ export const ReturnTypes = {
|
|
|
1530
1547
|
creditCacheReadPer1M: "Int",
|
|
1531
1548
|
creditCacheWritePer1M: "Int",
|
|
1532
1549
|
creditPerImage: "Float",
|
|
1550
|
+
creditPerVideoSecond: "Float",
|
|
1533
1551
|
capabilities: "JSON",
|
|
1534
1552
|
family: "String",
|
|
1535
1553
|
enabled: "Boolean",
|
|
@@ -1561,6 +1579,18 @@ export const ReturnTypes = {
|
|
|
1561
1579
|
outputModalities: "String",
|
|
1562
1580
|
supportedParameters: "String"
|
|
1563
1581
|
},
|
|
1582
|
+
OpenRouterVideoModel: {
|
|
1583
|
+
id: "String",
|
|
1584
|
+
name: "String",
|
|
1585
|
+
description: "String",
|
|
1586
|
+
supportedDurations: "Int",
|
|
1587
|
+
supportedResolutions: "String",
|
|
1588
|
+
supportedAspectRatios: "String",
|
|
1589
|
+
supportedSizes: "String",
|
|
1590
|
+
supportedFrameImages: "String",
|
|
1591
|
+
generateAudio: "Boolean",
|
|
1592
|
+
pricingSkus: "JSON"
|
|
1593
|
+
},
|
|
1564
1594
|
ReleaseAsset: {
|
|
1565
1595
|
name: "String",
|
|
1566
1596
|
url: "String"
|