freebeat-mcp 0.1.1 → 0.1.3
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/CHANGELOG.md +17 -0
- package/README.md +102 -3
- package/dist/capabilities/media/register.d.ts +3 -0
- package/dist/capabilities/media/register.js +13 -0
- package/dist/capabilities/media/register.js.map +1 -0
- package/dist/capabilities/media/tools/edit-image.d.ts +3 -0
- package/dist/capabilities/media/tools/edit-image.js +53 -0
- package/dist/capabilities/media/tools/edit-image.js.map +1 -0
- package/dist/capabilities/media/tools/generate-image.d.ts +3 -0
- package/dist/capabilities/media/tools/generate-image.js +53 -0
- package/dist/capabilities/media/tools/generate-image.js.map +1 -0
- package/dist/capabilities/media/tools/generate-video.d.ts +3 -0
- package/dist/capabilities/media/tools/generate-video.js +58 -0
- package/dist/capabilities/media/tools/generate-video.js.map +1 -0
- package/dist/capabilities/media/tools/get-model-help.d.ts +2 -0
- package/dist/capabilities/media/tools/get-model-help.js +26 -0
- package/dist/capabilities/media/tools/get-model-help.js.map +1 -0
- package/dist/capabilities/media/tools/list-models.d.ts +2 -0
- package/dist/capabilities/media/tools/list-models.js +32 -0
- package/dist/capabilities/media/tools/list-models.js.map +1 -0
- package/dist/capabilities/media/tools/shared.d.ts +42 -0
- package/dist/capabilities/media/tools/shared.js +72 -0
- package/dist/capabilities/media/tools/shared.js.map +1 -0
- package/dist/capabilities/tasks/tools/get-task-status.d.ts +1 -1
- package/dist/capabilities/tasks/tools/get-task-status.js +78 -2
- package/dist/capabilities/tasks/tools/get-task-status.js.map +1 -1
- package/dist/core/model-catalog.d.ts +48 -0
- package/dist/core/model-catalog.js +291 -0
- package/dist/core/model-catalog.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/freebeat-api.d.ts +110 -0
- package/dist/services/freebeat-api.js +96 -0
- package/dist/services/freebeat-api.js.map +1 -1
- package/package.json +3 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on Keep a Changelog, and this project follows Semantic Versioning.
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.1.3] - 2026-06-18
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- Added Open RPC model discovery with `list_models` and `get_model_help`.
|
|
13
|
+
- Added image generation, single-image editing, and text-to-video MCP tools.
|
|
14
|
+
- Added Open RPC batch status support through `get_task_status`.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- Documented image/video generation workflows and batch result handling in the README.
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ MCP server for Freebeat creative workflows.
|
|
|
4
4
|
|
|
5
5
|
Use it from MCP clients such as Claude Desktop and Cursor through `npx freebeat-mcp`.
|
|
6
6
|
|
|
7
|
-
It currently supports audio and image upload, effect template discovery, AI effect generation, AI music video generation, and async task polling.
|
|
7
|
+
It currently supports audio and image upload, effect template discovery, AI effect generation, AI music video generation, Open RPC image/video generation, model discovery, and async task polling.
|
|
8
8
|
|
|
9
9
|
## Features
|
|
10
10
|
|
|
@@ -13,6 +13,9 @@ It currently supports audio and image upload, effect template discovery, AI effe
|
|
|
13
13
|
- Supported effect template listing
|
|
14
14
|
- AI effect generation
|
|
15
15
|
- AI music video generation
|
|
16
|
+
- Supported image and video model discovery
|
|
17
|
+
- AI image generation and single-image editing
|
|
18
|
+
- AI text-to-video generation
|
|
16
19
|
- Generic task polling and result retrieval
|
|
17
20
|
|
|
18
21
|
## Installation
|
|
@@ -176,11 +179,106 @@ Returns a task envelope with:
|
|
|
176
179
|
- `task_type` currently `music_video_generation`
|
|
177
180
|
- `status`
|
|
178
181
|
|
|
182
|
+
### `list_models`
|
|
183
|
+
|
|
184
|
+
List supported Open RPC models for either `image` or `video`.
|
|
185
|
+
|
|
186
|
+
Recommended flow:
|
|
187
|
+
|
|
188
|
+
- `list_models` with `type: "image"` before `generate_image` or `edit_image`
|
|
189
|
+
- `list_models` with `type: "video"` before `generate_video`
|
|
190
|
+
- optional `get_model_help` for model-specific examples and constraints
|
|
191
|
+
|
|
192
|
+
Each model entry includes:
|
|
193
|
+
|
|
194
|
+
- `model_id`
|
|
195
|
+
- `model`, the API model key when one is available
|
|
196
|
+
- `display_name`
|
|
197
|
+
- `commands`
|
|
198
|
+
- `constraints`
|
|
199
|
+
|
|
200
|
+
### `get_model_help`
|
|
201
|
+
|
|
202
|
+
Show detailed usage guidance for one Open RPC model.
|
|
203
|
+
|
|
204
|
+
Parameters:
|
|
205
|
+
|
|
206
|
+
- `model` required, using either a numeric `model_id` or API model key from `list_models`
|
|
207
|
+
|
|
208
|
+
Use this before video generation to confirm required `duration`, `resolution`, supported `aspect_ratio`, and whether `generate_audio` is supported.
|
|
209
|
+
|
|
210
|
+
### `generate_image`
|
|
211
|
+
|
|
212
|
+
Create an async Open RPC image generation batch.
|
|
213
|
+
|
|
214
|
+
Recommended flow:
|
|
215
|
+
|
|
216
|
+
- `list_models` with `type: "image"`
|
|
217
|
+
- optional `get_model_help`
|
|
218
|
+
- `generate_image`
|
|
219
|
+
- `get_task_status` with the returned `batch_id`
|
|
220
|
+
|
|
221
|
+
Parameters:
|
|
222
|
+
|
|
223
|
+
- `model` required, from `list_models`
|
|
224
|
+
- `prompt` required, trimmed length must be `1` to `2000`
|
|
225
|
+
- `size` optional
|
|
226
|
+
- `resolution` optional
|
|
227
|
+
- `quality` optional
|
|
228
|
+
- `count` optional, default `1`
|
|
229
|
+
|
|
230
|
+
For GPT-Image 2 (`model_id` `108`), the MCP server sends `quality: "medium"` and `resolution: "1024x1024"` by default when omitted. If `resolution` is omitted but `size` is provided, that `size` is also sent as `resolution` for compatibility.
|
|
231
|
+
|
|
232
|
+
### `edit_image`
|
|
233
|
+
|
|
234
|
+
Create an async Open RPC single-image edit batch.
|
|
235
|
+
|
|
236
|
+
Recommended flow:
|
|
237
|
+
|
|
238
|
+
- `upload_image` or provide an existing image URL
|
|
239
|
+
- `list_models` with `type: "image"`
|
|
240
|
+
- optional `get_model_help`
|
|
241
|
+
- `edit_image`
|
|
242
|
+
- `get_task_status` with the returned `batch_id`
|
|
243
|
+
|
|
244
|
+
Parameters:
|
|
245
|
+
|
|
246
|
+
- `model` required, from `list_models`
|
|
247
|
+
- `image` required, a single image URL
|
|
248
|
+
- `prompt` required, trimmed length must be `1` to `2000`
|
|
249
|
+
- `resolution` optional
|
|
250
|
+
- `quality` optional
|
|
251
|
+
- `count` optional, default `1`
|
|
252
|
+
|
|
253
|
+
### `generate_video`
|
|
254
|
+
|
|
255
|
+
Create an async Open RPC text-to-video batch.
|
|
256
|
+
|
|
257
|
+
Recommended flow:
|
|
258
|
+
|
|
259
|
+
- `list_models` with `type: "video"`
|
|
260
|
+
- `get_model_help`
|
|
261
|
+
- `generate_video`
|
|
262
|
+
- `get_task_status` with the returned `batch_id`
|
|
263
|
+
|
|
264
|
+
Parameters:
|
|
265
|
+
|
|
266
|
+
- `model` required, from `list_models`
|
|
267
|
+
- `prompt` required, trimmed length must be `1` to `2000`
|
|
268
|
+
- `duration` required when the selected model declares supported durations
|
|
269
|
+
- `resolution` required when the selected model declares supported resolutions
|
|
270
|
+
- `aspect_ratio` optional, validated when the selected model declares supported ratios
|
|
271
|
+
- `generate_audio` optional, only accepted for models that support generated audio
|
|
272
|
+
|
|
273
|
+
Video model constraints are validated locally before a request is sent.
|
|
274
|
+
|
|
179
275
|
### `get_task_status`
|
|
180
276
|
|
|
181
|
-
Poll a Freebeat async task until it reaches a terminal status. Current MCP endpoints return lowercase status values such as `pending`, `completed`, and `failed`; older backends may still return uppercase variants.
|
|
277
|
+
Poll a Freebeat async task or Open RPC batch until it reaches a terminal status. Current MCP endpoints return lowercase status values such as `pending`, `completed`, and `failed`; older backends may still return uppercase variants.
|
|
278
|
+
|
|
279
|
+
For legacy MV/effect tasks, continue polling while the status is still in progress. Only call `get_task_result` after the status is `completed`.
|
|
182
280
|
|
|
183
|
-
|
|
281
|
+
For Open RPC image/video batches, pass the returned `batch_id` as `task_id`. You can also pass `serial_no` to query a single batch item. Completed batch items include result URLs directly in `get_task_status`, so `get_task_result` is not used for Open RPC batches.
|
|
184
282
|
|
|
185
283
|
Returns a stable task envelope including:
|
|
186
284
|
|
|
@@ -190,6 +288,7 @@ Returns a stable task envelope including:
|
|
|
190
288
|
- `error_message` optional, present when backend reports a failed task
|
|
191
289
|
- `error_code` optional, present when backend reports a failed task
|
|
192
290
|
- `message` optional, present when status is `completed` or `failed`
|
|
291
|
+
- `items` optional, present for Open RPC batches and containing `image_url`, `video_url`, or `edit_images` when available
|
|
193
292
|
|
|
194
293
|
### `get_task_result`
|
|
195
294
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { registerEditImageTool } from "./tools/edit-image.js";
|
|
2
|
+
import { registerGenerateImageTool } from "./tools/generate-image.js";
|
|
3
|
+
import { registerGenerateVideoTool } from "./tools/generate-video.js";
|
|
4
|
+
import { registerGetModelHelpTool } from "./tools/get-model-help.js";
|
|
5
|
+
import { registerListModelsTool } from "./tools/list-models.js";
|
|
6
|
+
export function registerMediaTools(server, client) {
|
|
7
|
+
registerListModelsTool(server);
|
|
8
|
+
registerGetModelHelpTool(server);
|
|
9
|
+
registerGenerateImageTool(server, client);
|
|
10
|
+
registerEditImageTool(server, client);
|
|
11
|
+
registerGenerateVideoTool(server, client);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/capabilities/media/register.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAyB;IAEzB,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveImageQuality, resolveImageResolution, resolveModelForCommand, } from "../../../core/model-catalog.js";
|
|
3
|
+
import { normalizeGenerationPrompt } from "../../../core/prompt.js";
|
|
4
|
+
import { formatToolError, jsonContent } from "../../../core/response.js";
|
|
5
|
+
import { batchCreateOutputSchema, normalizeBatchCreate } from "./shared.js";
|
|
6
|
+
export function registerEditImageTool(server, client) {
|
|
7
|
+
server.registerTool("edit_image", {
|
|
8
|
+
description: "Create an Open RPC single-image edit batch. Use an image URL, usually from upload_image, then query progress with get_task_status using the returned batch_id.",
|
|
9
|
+
outputSchema: batchCreateOutputSchema,
|
|
10
|
+
inputSchema: {
|
|
11
|
+
model: z.string().min(1).describe("Image edit model id or API model key."),
|
|
12
|
+
image: z.string().min(1).describe("Single image URL to edit."),
|
|
13
|
+
prompt: z
|
|
14
|
+
.string()
|
|
15
|
+
.trim()
|
|
16
|
+
.min(1, "prompt must not be empty or whitespace only")
|
|
17
|
+
.max(2000, "prompt must be at most 2000 characters after trimming")
|
|
18
|
+
.describe("Image edit prompt."),
|
|
19
|
+
resolution: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Image resolution for supported models. GPT-Image 2 defaults to 1024x1024."),
|
|
23
|
+
quality: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Image quality for supported models. GPT-Image 2 supports low, medium, high."),
|
|
27
|
+
count: z.number().int().positive().optional().default(1).describe("Number of edits."),
|
|
28
|
+
},
|
|
29
|
+
}, async ({ model, image, prompt, resolution, quality, count }) => {
|
|
30
|
+
try {
|
|
31
|
+
const resolvedModel = resolveModelForCommand("image_edit", model);
|
|
32
|
+
const response = await client.createImageBatch({
|
|
33
|
+
items: [
|
|
34
|
+
{
|
|
35
|
+
businessType: 11,
|
|
36
|
+
modelId: String(resolvedModel.modelId),
|
|
37
|
+
generationType: 8,
|
|
38
|
+
prompt: normalizeGenerationPrompt(prompt),
|
|
39
|
+
images: [image],
|
|
40
|
+
resolution: resolveImageResolution(resolvedModel, resolution),
|
|
41
|
+
quality: resolveImageQuality(resolvedModel, quality),
|
|
42
|
+
count,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
});
|
|
46
|
+
return jsonContent(normalizeBatchCreate(response, "Image edit"));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return formatToolError(error);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=edit-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-image.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/edit-image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,MAAmD;IAEnD,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,WAAW,EACT,gKAAgK;QAClK,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC9D,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,EAAE,6CAA6C,CAAC;iBACrD,GAAG,CAAC,IAAI,EAAE,uDAAuD,CAAC;iBAClE,QAAQ,CAAC,oBAAoB,CAAC;YACjC,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2EAA2E,CAAC;YACxF,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6EAA6E,CAAC;YAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SACtF;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;gBAC7C,KAAK,EAAE;oBACL;wBACE,YAAY,EAAE,EAAE;wBAChB,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;wBACtC,cAAc,EAAE,CAAC;wBACjB,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC;wBACzC,MAAM,EAAE,CAAC,KAAK,CAAC;wBACf,UAAU,EAAE,sBAAsB,CAAC,aAAa,EAAE,UAAU,CAAC;wBAC7D,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC;wBACpD,KAAK;qBACN;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveImageQuality, resolveImageResolution, resolveModelForCommand, } from "../../../core/model-catalog.js";
|
|
3
|
+
import { normalizeGenerationPrompt } from "../../../core/prompt.js";
|
|
4
|
+
import { formatToolError, jsonContent } from "../../../core/response.js";
|
|
5
|
+
import { batchCreateOutputSchema, normalizeBatchCreate } from "./shared.js";
|
|
6
|
+
export function registerGenerateImageTool(server, client) {
|
|
7
|
+
server.registerTool("generate_image", {
|
|
8
|
+
description: "Create an Open RPC image generation batch. Recommended flow: list_models(type=image) -> generate_image -> get_task_status using the returned batch_id.",
|
|
9
|
+
outputSchema: batchCreateOutputSchema,
|
|
10
|
+
inputSchema: {
|
|
11
|
+
model: z.string().min(1).describe("Image model id or API model key."),
|
|
12
|
+
prompt: z
|
|
13
|
+
.string()
|
|
14
|
+
.trim()
|
|
15
|
+
.min(1, "prompt must not be empty or whitespace only")
|
|
16
|
+
.max(2000, "prompt must be at most 2000 characters after trimming")
|
|
17
|
+
.describe("Image generation prompt."),
|
|
18
|
+
size: z.string().optional().describe("Image size for supported models, for example 1024x1024."),
|
|
19
|
+
resolution: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Image resolution for supported models. GPT-Image 2 defaults to 1024x1024."),
|
|
23
|
+
quality: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Image quality for supported models. GPT-Image 2 supports low, medium, high."),
|
|
27
|
+
count: z.number().int().positive().optional().default(1).describe("Number of images."),
|
|
28
|
+
},
|
|
29
|
+
}, async ({ model, prompt, size, resolution, quality, count }) => {
|
|
30
|
+
try {
|
|
31
|
+
const resolvedModel = resolveModelForCommand("image_generate", model);
|
|
32
|
+
const response = await client.createImageBatch({
|
|
33
|
+
items: [
|
|
34
|
+
{
|
|
35
|
+
businessType: 9,
|
|
36
|
+
modelId: String(resolvedModel.modelId),
|
|
37
|
+
generationType: 6,
|
|
38
|
+
prompt: normalizeGenerationPrompt(prompt),
|
|
39
|
+
size,
|
|
40
|
+
resolution: resolveImageResolution(resolvedModel, resolution, size),
|
|
41
|
+
quality: resolveImageQuality(resolvedModel, quality),
|
|
42
|
+
count,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
});
|
|
46
|
+
return jsonContent(normalizeBatchCreate(response, "Image generation"));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return formatToolError(error);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=generate-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-image.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/generate-image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,MAAmD;IAEnD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,wJAAwJ;QAC1J,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACrE,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,EAAE,6CAA6C,CAAC;iBACrD,GAAG,CAAC,IAAI,EAAE,uDAAuD,CAAC;iBAClE,QAAQ,CAAC,0BAA0B,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YAC/F,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2EAA2E,CAAC;YACxF,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6EAA6E,CAAC;YAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACvF;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,sBAAsB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;gBAC7C,KAAK,EAAE;oBACL;wBACE,YAAY,EAAE,CAAC;wBACf,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;wBACtC,cAAc,EAAE,CAAC;wBACjB,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC;wBACzC,IAAI;wBACJ,UAAU,EAAE,sBAAsB,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC;wBACnE,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC;wBACpD,KAAK;qBACN;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveGenerateAudioValue, resolveModelForCommand, validateVideoGenerateOptions, } from "../../../core/model-catalog.js";
|
|
3
|
+
import { normalizeGenerationPrompt } from "../../../core/prompt.js";
|
|
4
|
+
import { formatToolError, jsonContent } from "../../../core/response.js";
|
|
5
|
+
import { batchCreateOutputSchema, normalizeBatchCreate } from "./shared.js";
|
|
6
|
+
export function registerGenerateVideoTool(server, client) {
|
|
7
|
+
server.registerTool("generate_video", {
|
|
8
|
+
description: "Create an Open RPC text-to-video batch. Recommended flow: list_models(type=video) -> get_model_help -> generate_video -> get_task_status using the returned batch_id.",
|
|
9
|
+
outputSchema: batchCreateOutputSchema,
|
|
10
|
+
inputSchema: {
|
|
11
|
+
model: z.string().min(1).describe("Video model id or API model key."),
|
|
12
|
+
prompt: z
|
|
13
|
+
.string()
|
|
14
|
+
.trim()
|
|
15
|
+
.min(1, "prompt must not be empty or whitespace only")
|
|
16
|
+
.max(2000, "prompt must be at most 2000 characters after trimming")
|
|
17
|
+
.describe("Video generation prompt."),
|
|
18
|
+
duration: z.number().int().positive().optional().describe("Video duration in seconds."),
|
|
19
|
+
resolution: z.string().optional().describe("Video resolution, for example 720p."),
|
|
20
|
+
aspect_ratio: z.string().optional().describe("Video aspect ratio, for example 16:9."),
|
|
21
|
+
generate_audio: z
|
|
22
|
+
.boolean()
|
|
23
|
+
.optional()
|
|
24
|
+
.default(false)
|
|
25
|
+
.describe("Generate video audio when the selected model supports it."),
|
|
26
|
+
},
|
|
27
|
+
}, async ({ model, prompt, duration, resolution, aspect_ratio, generate_audio }) => {
|
|
28
|
+
try {
|
|
29
|
+
const resolvedModel = resolveModelForCommand("video_generate", model);
|
|
30
|
+
validateVideoGenerateOptions(resolvedModel, {
|
|
31
|
+
duration,
|
|
32
|
+
resolution,
|
|
33
|
+
aspectRatio: aspect_ratio,
|
|
34
|
+
generateAudio: generate_audio,
|
|
35
|
+
});
|
|
36
|
+
const audio = resolveGenerateAudioValue(resolvedModel, Boolean(generate_audio));
|
|
37
|
+
const response = await client.createVideoBatch({
|
|
38
|
+
items: [
|
|
39
|
+
{
|
|
40
|
+
modelId: String(resolvedModel.modelId),
|
|
41
|
+
generationType: 1,
|
|
42
|
+
prompt: normalizeGenerationPrompt(prompt),
|
|
43
|
+
duration,
|
|
44
|
+
resolution,
|
|
45
|
+
aspectRatio: aspect_ratio,
|
|
46
|
+
audio,
|
|
47
|
+
generateAudio: audio,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
});
|
|
51
|
+
return jsonContent(normalizeBatchCreate(response, "Video generation"));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return formatToolError(error);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=generate-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-video.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/generate-video.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,MAAmD;IAEnD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,uKAAuK;QACzK,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACrE,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,EAAE,6CAA6C,CAAC;iBACrD,GAAG,CAAC,IAAI,EAAE,uDAAuD,CAAC;iBAClE,QAAQ,CAAC,0BAA0B,CAAC;YACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACvF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACjF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACrF,cAAc,EAAE,CAAC;iBACd,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,2DAA2D,CAAC;SACzE;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,EAAE;QAC9E,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,sBAAsB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtE,4BAA4B,CAAC,aAAa,EAAE;gBAC1C,QAAQ;gBACR,UAAU;gBACV,WAAW,EAAE,YAAY;gBACzB,aAAa,EAAE,cAAc;aAC9B,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,yBAAyB,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;YAEhF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;gBAC7C,KAAK,EAAE;oBACL;wBACE,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;wBACtC,cAAc,EAAE,CAAC;wBACjB,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC;wBACzC,QAAQ;wBACR,UAAU;wBACV,WAAW,EAAE,YAAY;wBACzB,KAAK;wBACL,aAAa,EAAE,KAAK;qBACrB;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatToolError, jsonContent } from "../../../core/response.js";
|
|
3
|
+
import { getModelHelp } from "../../../core/model-catalog.js";
|
|
4
|
+
export function registerGetModelHelpTool(server) {
|
|
5
|
+
server.registerTool("get_model_help", {
|
|
6
|
+
description: "Show detailed usage guidance for one Open RPC image or video model. Use the returned help to set required duration, resolution, aspect_ratio, quality, and audio options.",
|
|
7
|
+
outputSchema: {
|
|
8
|
+
success: z.literal(true).describe("Whether model help was retrieved successfully."),
|
|
9
|
+
help: z.string().describe("Model-specific usage and constraints."),
|
|
10
|
+
},
|
|
11
|
+
inputSchema: {
|
|
12
|
+
model: z.string().min(1).describe("Model id or API model key to inspect."),
|
|
13
|
+
},
|
|
14
|
+
}, async ({ model }) => {
|
|
15
|
+
try {
|
|
16
|
+
return jsonContent({
|
|
17
|
+
success: true,
|
|
18
|
+
help: getModelHelp(model),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return formatToolError(error);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=get-model-help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-model-help.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/get-model-help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,2KAA2K;QAC7K,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YACnF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;SACnE;QACD,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;SAC3E;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,OAAO,WAAW,CAAC;gBACjB,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatToolError, jsonContent } from "../../../core/response.js";
|
|
3
|
+
import { listModels } from "../../../core/model-catalog.js";
|
|
4
|
+
import { modelListMessage, normalizeModel } from "./shared.js";
|
|
5
|
+
export function registerListModelsTool(server) {
|
|
6
|
+
server.registerTool("list_models", {
|
|
7
|
+
description: "List supported Open RPC image or video models. Use this before generate_image, edit_image, or generate_video to choose the model value and inspect constraints.",
|
|
8
|
+
outputSchema: {
|
|
9
|
+
success: z.literal(true).describe("Whether model discovery completed successfully."),
|
|
10
|
+
models: z
|
|
11
|
+
.array(z.record(z.unknown()))
|
|
12
|
+
.describe("Supported models with model IDs, model keys, commands, and constraints."),
|
|
13
|
+
message: z.string().describe("Human-readable summary."),
|
|
14
|
+
},
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: z.enum(["image", "video"]).describe("Model type to list."),
|
|
17
|
+
},
|
|
18
|
+
}, async ({ type }) => {
|
|
19
|
+
try {
|
|
20
|
+
const models = listModels(type);
|
|
21
|
+
return jsonContent({
|
|
22
|
+
success: true,
|
|
23
|
+
models: models.map(normalizeModel),
|
|
24
|
+
message: modelListMessage(type, models.length),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return formatToolError(error);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=list-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/list-models.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EACT,iKAAiK;QACnK,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;YACpF,MAAM,EAAE,CAAC;iBACN,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;iBAC5B,QAAQ,CAAC,yEAAyE,CAAC;YACtF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SACxD;QACD,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;SACjE;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAEhC,OAAO,WAAW,CAAC;gBACjB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;gBAClC,OAAO,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { OpenRpcBatchCreateResponse } from "../../../services/freebeat-api.js";
|
|
3
|
+
import { ModelKind, StaticModelCatalogItem as CatalogModel } from "../../../core/model-catalog.js";
|
|
4
|
+
export declare const batchCreateOutputSchema: {
|
|
5
|
+
success: z.ZodLiteral<true>;
|
|
6
|
+
batch_id: z.ZodString;
|
|
7
|
+
batch_status: z.ZodString;
|
|
8
|
+
total_count: z.ZodNumber;
|
|
9
|
+
accepted_count: z.ZodNumber;
|
|
10
|
+
failed_count: z.ZodNumber;
|
|
11
|
+
accepted_credits: z.ZodNumber;
|
|
12
|
+
estimated_failed_credits: z.ZodNumber;
|
|
13
|
+
items: z.ZodArray<z.ZodObject<{
|
|
14
|
+
business_type: z.ZodNumber;
|
|
15
|
+
accepted: z.ZodBoolean;
|
|
16
|
+
serial_no: z.ZodNullable<z.ZodString>;
|
|
17
|
+
need_credits: z.ZodNumber;
|
|
18
|
+
status: z.ZodString;
|
|
19
|
+
code: z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>;
|
|
20
|
+
message: z.ZodNullable<z.ZodString>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
code: string | number | null;
|
|
23
|
+
message: string | null;
|
|
24
|
+
status: string;
|
|
25
|
+
accepted: boolean;
|
|
26
|
+
business_type: number;
|
|
27
|
+
serial_no: string | null;
|
|
28
|
+
need_credits: number;
|
|
29
|
+
}, {
|
|
30
|
+
code: string | number | null;
|
|
31
|
+
message: string | null;
|
|
32
|
+
status: string;
|
|
33
|
+
accepted: boolean;
|
|
34
|
+
business_type: number;
|
|
35
|
+
serial_no: string | null;
|
|
36
|
+
need_credits: number;
|
|
37
|
+
}>, "many">;
|
|
38
|
+
message: z.ZodString;
|
|
39
|
+
};
|
|
40
|
+
export declare function normalizeBatchCreate(response: OpenRpcBatchCreateResponse, noun: string): Record<string, unknown>;
|
|
41
|
+
export declare function normalizeModel(model: CatalogModel): Record<string, unknown>;
|
|
42
|
+
export declare function modelListMessage(kind: ModelKind, count: number): string;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const batchCreateOutputSchema = {
|
|
3
|
+
success: z.literal(true).describe("Whether the batch request was accepted by Freebeat."),
|
|
4
|
+
batch_id: z.string().describe("Open RPC batch ID for get_task_status."),
|
|
5
|
+
batch_status: z.string().describe("Initial batch status."),
|
|
6
|
+
total_count: z.number().describe("Total number of submitted items."),
|
|
7
|
+
accepted_count: z.number().describe("Number of accepted items."),
|
|
8
|
+
failed_count: z.number().describe("Number of rejected items."),
|
|
9
|
+
accepted_credits: z.number().describe("Credits accepted by the batch."),
|
|
10
|
+
estimated_failed_credits: z.number().describe("Estimated credits for rejected items."),
|
|
11
|
+
items: z
|
|
12
|
+
.array(z.object({
|
|
13
|
+
business_type: z.number(),
|
|
14
|
+
accepted: z.boolean(),
|
|
15
|
+
serial_no: z.string().nullable(),
|
|
16
|
+
need_credits: z.number(),
|
|
17
|
+
status: z.string(),
|
|
18
|
+
code: z.union([z.number(), z.string()]).nullable(),
|
|
19
|
+
message: z.string().nullable(),
|
|
20
|
+
}))
|
|
21
|
+
.describe("Per-item batch acceptance details."),
|
|
22
|
+
message: z.string().describe("Human-readable next-step guidance."),
|
|
23
|
+
};
|
|
24
|
+
export function normalizeBatchCreate(response, noun) {
|
|
25
|
+
return {
|
|
26
|
+
success: true,
|
|
27
|
+
batch_id: response.batchId,
|
|
28
|
+
batch_status: response.batchStatus,
|
|
29
|
+
total_count: response.totalCount,
|
|
30
|
+
accepted_count: response.acceptedCount,
|
|
31
|
+
failed_count: response.failedCount,
|
|
32
|
+
accepted_credits: response.acceptedCredits,
|
|
33
|
+
estimated_failed_credits: response.estimatedFailedCredits,
|
|
34
|
+
items: response.items.map((item) => ({
|
|
35
|
+
business_type: item.businessType,
|
|
36
|
+
accepted: item.accepted,
|
|
37
|
+
serial_no: item.serialNo,
|
|
38
|
+
need_credits: item.needCredits,
|
|
39
|
+
status: item.status,
|
|
40
|
+
code: item.code,
|
|
41
|
+
message: item.message,
|
|
42
|
+
})),
|
|
43
|
+
message: `${noun} batch queued. Use get_task_status with task_id="${response.batchId}" to check status.`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function normalizeModel(model) {
|
|
47
|
+
return {
|
|
48
|
+
type: model.kind,
|
|
49
|
+
provider: model.provider,
|
|
50
|
+
model_id: model.modelId,
|
|
51
|
+
model: model.apiModelKey ?? String(model.modelId),
|
|
52
|
+
display_name: model.displayName,
|
|
53
|
+
available: model.available,
|
|
54
|
+
commands: model.commands,
|
|
55
|
+
generation_types: model.generationTypes,
|
|
56
|
+
tags: model.tags,
|
|
57
|
+
description: model.description,
|
|
58
|
+
constraints: {
|
|
59
|
+
aspect_ratios: model.constraints.aspectRatios,
|
|
60
|
+
resolutions: model.constraints.resolutions,
|
|
61
|
+
durations: model.constraints.durations,
|
|
62
|
+
styles: model.constraints.styles,
|
|
63
|
+
generate_audio: model.constraints.generateAudio,
|
|
64
|
+
credits: model.constraints.credits,
|
|
65
|
+
credit_options: model.constraints.creditOptions,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function modelListMessage(kind, count) {
|
|
70
|
+
return `Retrieved ${count} ${kind} model(s).`;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/capabilities/media/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { FreebeatApiClient } from "../../../services/freebeat-api.js";
|
|
3
|
-
export declare function registerGetTaskStatusTool(server: McpServer, client: Pick<FreebeatApiClient, "getTaskStatus">): void;
|
|
3
|
+
export declare function registerGetTaskStatusTool(server: McpServer, client: Pick<FreebeatApiClient, "getTaskStatus" | "queryBatch">): void;
|