ottoport 1.13.2 → 1.14.0
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/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -0
- package/cli/ottoport.mjs +11 -2
- package/commands/speech.md +4 -2
- package/mcp/server.mjs +8 -7
- package/package.json +1 -1
- package/skills/ottoport/SKILL.md +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ottoport",
|
|
3
3
|
"description": "One API for every model. Call chat, image, video, speech and music models through the OttoPort gateway — as MCP tools, slash commands, or the bundled CLI.",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.14.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "LITBOX LLC",
|
|
7
7
|
"email": "support@ottoport.ai"
|
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ ottoport video "<prompt>" [--model kling-3.0] [--duration 5] [--resolution 1080p
|
|
|
30
30
|
ottoport webhook status|retry <job-id> # delivery attempts / redeliver now
|
|
31
31
|
ottoport speech "<text>" [--model gpt-4o-mini-tts] [--voice alloy] [--out speech.mp3]
|
|
32
32
|
ottoport music "<prompt>" [--model suno-v5] [--duration 15] [--out song.mp3]
|
|
33
|
+
ottoport music --model mirelo-sfx-2.0 --video <url> [--duration 8] # soundtrack for a video
|
|
33
34
|
|
|
34
35
|
ottoport install <host> # wire the MCP server into an agent
|
|
35
36
|
ottoport mcp # run the MCP server on stdio
|
package/cli/ottoport.mjs
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
// ottoport video "prompt" [--model kling-3.0] [--duration 5] [--out clip.mp4]
|
|
11
11
|
// ottoport speech "text" [--model gpt-4o-mini-tts] [--voice alloy] [--out speech.mp3]
|
|
12
12
|
// ottoport music "prompt" [--model suno-v5] [--duration 15] [--out song.mp3]
|
|
13
|
+
// ottoport music --model mirelo-sfx-2.0 --video <url> [--duration 8]
|
|
13
14
|
// ottoport collections [list | create "name"]
|
|
14
15
|
// ottoport mcp
|
|
15
16
|
// ottoport install <codex|claude|hermes|cursor|windsurf|claude-desktop>
|
|
@@ -394,11 +395,14 @@ async function cmdWebhook(action, jobId, flags) {
|
|
|
394
395
|
}
|
|
395
396
|
|
|
396
397
|
async function cmdAudio(kind, prompt, flags) {
|
|
397
|
-
|
|
398
|
+
// A sound-effects model scores a video, so the prompt is optional with one.
|
|
399
|
+
const video = kind === "music" ? last(flags.video) : undefined;
|
|
400
|
+
if (!prompt && !video) die(`${kind} requires a prompt: ottoport ${kind} "hello"`);
|
|
398
401
|
const { baseUrl, apiKey } = config(flags);
|
|
399
402
|
const body = {
|
|
400
403
|
model: last(flags.model) || (kind === "speech" ? "gpt-4o-mini-tts" : "suno-v5"),
|
|
401
|
-
prompt,
|
|
404
|
+
...(prompt ? { prompt } : {}),
|
|
405
|
+
...(video ? { video_url: video } : {}),
|
|
402
406
|
...(last(flags.voice) ? { voice: last(flags.voice) } : {}),
|
|
403
407
|
...(last(flags.duration) ? { duration: Number(last(flags.duration)) } : {}),
|
|
404
408
|
...(last(flags.format) ? { format: last(flags.format) } : {}),
|
|
@@ -499,6 +503,9 @@ Usage:
|
|
|
499
503
|
ottoport webhook retry <job-id> [--json] redeliver a finished job's webhook now
|
|
500
504
|
ottoport speech "<text>" [--model gpt-4o-mini-tts] [--voice alloy] [--format mp3] [--out speech.mp3]
|
|
501
505
|
ottoport music "<prompt>" [--model suno-v5] [--duration 15] [--format mp3] [--out song.mp3]
|
|
506
|
+
ottoport music ["<prompt>"] --model mirelo-sfx-2.0 --video <url> [--duration 8] [--out sfx.wav]
|
|
507
|
+
a soundtrack synced to the video, dialogue kept;
|
|
508
|
+
set --duration to the clip's length (it bills)
|
|
502
509
|
ottoport collections [list] [--json] collections in the key's project
|
|
503
510
|
ottoport collections create "<name>" [--description "..."] [--external-id <id>]
|
|
504
511
|
ottoport mcp
|
|
@@ -528,6 +535,8 @@ Examples:
|
|
|
528
535
|
ottoport image --model seedream-5.0-layers --image https://…/poster.png
|
|
529
536
|
ottoport speech "Welcome to OttoPort" --voice alloy --out welcome.mp3
|
|
530
537
|
ottoport music "lo-fi focus beat" --duration 20 --out focus.mp3
|
|
538
|
+
ottoport music "rain on a tin roof" --model mirelo-sfx-2.0 --duration 10 --format mp3 --out rain.mp3
|
|
539
|
+
ottoport music --model mirelo-sfx-2.0 --video https://example.com/chase.mp4 --duration 8 --out chase.wav
|
|
531
540
|
ottoport collections create "Spring campaign"
|
|
532
541
|
ottoport image "spring hero banner" --collection <collection-id>
|
|
533
542
|
ottoport mcp
|
package/commands/speech.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Turn text into speech, or a prompt into music, through the OttoPort gateway
|
|
2
|
+
description: Turn text into speech, or a prompt into music or sound effects, through the OttoPort gateway
|
|
3
3
|
argument-hint: "<text> [--voice alloy] [--music]"
|
|
4
4
|
allowed-tools: mcp__ottoport__ottoport_generate_speech, mcp__ottoport__ottoport_generate_music, Bash(curl:*)
|
|
5
5
|
---
|
|
@@ -7,7 +7,9 @@ allowed-tools: mcp__ottoport__ottoport_generate_speech, mcp__ottoport__ottoport_
|
|
|
7
7
|
Request: $ARGUMENTS
|
|
8
8
|
|
|
9
9
|
Use `ottoport_generate_music` when the request is for music, a song, or a
|
|
10
|
-
backing track
|
|
10
|
+
backing track — or for sound effects, ambience or a soundtrack for a video, with
|
|
11
|
+
`model` `mirelo-sfx-2.0` (pass the video as `video_url`, and `duration` as its
|
|
12
|
+
length); otherwise use `ottoport_generate_speech` to read the text aloud.
|
|
11
13
|
Pass `voice` and `format` only when named — speech defaults to `gpt-4o-mini-tts`
|
|
12
14
|
with the `alloy` voice, music to `suno-v5`.
|
|
13
15
|
|
package/mcp/server.mjs
CHANGED
|
@@ -375,15 +375,16 @@ async function videoWebhook({ job_id, action = "status" }) {
|
|
|
375
375
|
return JSON.stringify({ id: body.id, status: body.status, webhook: body.webhook ?? null }, null, 2);
|
|
376
376
|
}
|
|
377
377
|
|
|
378
|
-
async function generateAudio(kind, { prompt, model, voice, duration, format, collection }) {
|
|
379
|
-
if (!prompt) throw new Error("`prompt` is required");
|
|
378
|
+
async function generateAudio(kind, { prompt, model, voice, duration, format, video_url, collection }) {
|
|
379
|
+
if (!prompt && !video_url) throw new Error("`prompt` is required");
|
|
380
380
|
const res = await fetch(`${BASE}/api/v1/audio/${kind === "tts" ? "speech" : "music"}`, {
|
|
381
381
|
method: "POST",
|
|
382
382
|
headers: headers(),
|
|
383
383
|
body: JSON.stringify({
|
|
384
384
|
model: model || (kind === "tts" ? "gpt-4o-mini-tts" : "suno-v5"),
|
|
385
|
-
prompt,
|
|
385
|
+
...(prompt ? { prompt } : {}),
|
|
386
386
|
...(voice ? { voice } : {}),
|
|
387
|
+
...(video_url ? { video_url } : {}),
|
|
387
388
|
...(duration ? { duration } : {}),
|
|
388
389
|
...(format ? { format } : {}),
|
|
389
390
|
...withCollection(await collectionId(collection)),
|
|
@@ -522,17 +523,17 @@ const TOOLS = [
|
|
|
522
523
|
},
|
|
523
524
|
{
|
|
524
525
|
name: "ottoport_generate_music",
|
|
525
|
-
description: "Generate music from a prompt through an OttoPort music model. Returns an audio URL or data URL.",
|
|
526
|
+
description: "Generate music or sound effects from a prompt through an OttoPort music model — or, with mirelo-sfx-2.0 and a video_url, a soundtrack synced to that video. Returns an audio URL or data URL.",
|
|
526
527
|
inputSchema: {
|
|
527
528
|
type: "object",
|
|
528
529
|
properties: {
|
|
529
|
-
prompt: { type: "string", description: "Music-generation prompt." },
|
|
530
|
-
model: { type: "string", description: "Music model id. Default suno-v5." },
|
|
530
|
+
prompt: { type: "string", description: "Music-generation prompt, or the sounds to make. Optional with video_url." },
|
|
531
|
+
model: { type: "string", description: "Music model id. Default suno-v5; mirelo-sfx-2.0 for sound effects." },
|
|
531
532
|
duration: { type: "number", description: "Requested duration in seconds." },
|
|
533
|
+
video_url: { type: "string", description: "mirelo-sfx-2.0 only: an http(s) video to score. Set duration to its length — duration is what bills." },
|
|
532
534
|
format: { type: "string", description: 'e.g. "mp3" or "wav".' },
|
|
533
535
|
collection: { type: "string", description: "Save the result for good into this collection — its id or exact name (see ottoport_list_collections). Without it the file expires after a few days. Needs collections unlocked on the account. Defaults to OTTOPORT_COLLECTION when set." },
|
|
534
536
|
},
|
|
535
|
-
required: ["prompt"],
|
|
536
537
|
},
|
|
537
538
|
handler: (args) => generateAudio("music", args),
|
|
538
539
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ottoport",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "Claude Code plugin, CLI and MCP server for OttoPort — one OpenAI-compatible API for every LLM, image, video, and speech model.",
|
|
5
5
|
"homepage": "https://ottoport.ai",
|
|
6
6
|
"repository": {
|
package/skills/ottoport/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ottoport
|
|
3
|
-
description: Generate text, images, video, speech, and music through OttoPort — one gateway for every model (GPT, Claude, Gemini, GPT Image, Nano Banana, Veo, Kling, Seedance, Suno). Use when the user wants to call an LLM or generate an image, video, or
|
|
3
|
+
description: Generate text, images, video, speech, and music through OttoPort — one gateway for every model (GPT, Claude, Gemini, GPT Image, Nano Banana, Veo, Kling, Seedance, Suno, Mirelo). Use when the user wants to call an LLM or generate an image, video, audio or sound effects and has OttoPort configured, or asks to "use OttoPort".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# OttoPort
|
|
@@ -20,7 +20,7 @@ and do not call the HTTP API, when a tool covers the job:
|
|
|
20
20
|
| `ottoport_generate_video` | `prompt`, plus optional `model`, `duration`, `resolution`, `aspect_ratio`, `seed`, `image_url` (first frame), `last_frame_url`, `reference_image_urls`, `reference_video_urls` / `reference_audio_urls` (models listing `referenceMedia`), `video_url` (edit / extend, or the movement for motion control), `character_orientation` / `keep_original_sound` (motion control), `draft` / `draft_id` (Seedance 2.5: a 480p preview, then the same shot at 1080p from the preview's job id; the model `seedance-2.5-draft` drafts on every request without `draft`), `webhook_url` (returns the job id at once and POSTs the result there; the secret comes from `webhook_secret` or the server's `OTTOPORT_WEBHOOK_SECRET`). |
|
|
21
21
|
| `ottoport_video_webhook` | `job_id`, plus `action` `status` (every delivery attempt and the endpoint's response) or `retry` (redeliver a finished job's webhook now). |
|
|
22
22
|
| `ottoport_generate_speech` | `prompt` (the text), plus optional `model`, `voice`, `format`. |
|
|
23
|
-
| `ottoport_generate_music` | `prompt`, plus optional `model`, `duration`, `format`. |
|
|
23
|
+
| `ottoport_generate_music` | `prompt`, plus optional `model`, `duration`, `format`. Sound effects too: `model` `mirelo-sfx-2.0` makes them from the prompt, or with `video_url` a soundtrack synced to that video, dialogue kept (prompt then optional). It bills per requested second, so set `duration` to the clip's length. |
|
|
24
24
|
| `ottoport_list_collections` | The project's collections (ids, asset counts) and whether this account may save. Read it to find the collection the user means. |
|
|
25
25
|
| `ottoport_create_collection` | `name`, plus optional `description`, `external_id`. |
|
|
26
26
|
| `ottoport_list_assets` | Saved files, optionally by `collection` and `kind`. |
|
|
@@ -90,7 +90,7 @@ sensible default.
|
|
|
90
90
|
| image | `gpt-image-2` | `nano-banana-2.1` (fast generation and edits), `nano-banana-pro` (high fidelity) |
|
|
91
91
|
| video | `kling-3.0` | `seedance-2.0-fast` (cheap), `veo-3.1` (with audio) |
|
|
92
92
|
| speech | `gpt-4o-mini-tts` | `eleven-v3` |
|
|
93
|
-
| music | `suno-v5` | `lyria-2` |
|
|
93
|
+
| music | `suno-v5` | `lyria-2`, `mirelo-sfx-2.0` (sound effects, or a soundtrack for a video) |
|
|
94
94
|
|
|
95
95
|
Never invent a model id. Call `ottoport_list_models` when unsure — the catalog
|
|
96
96
|
changes, and a wrong id is a failed billable call. Rates come back in credits (the unit the ledger
|