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.
@@ -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.13.2",
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
- if (!prompt) die(`${kind} requires a prompt: ottoport ${kind} "hello"`);
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
@@ -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; otherwise use `ottoport_generate_speech` to read the text aloud.
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.13.2",
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": {
@@ -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 audio and has OttoPort configured, or asks to "use 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, 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