{
  "openapi": "3.1.0",
  "info": {
    "title": "Voice Creator Pro Desktop API",
    "description": "HTTP API for voice cloning, voice design, text-to-speech, transcription, audiobooks, dubbing, clips and AI Cut.\n\n## Base URL\n\nThe API runs on your computer at `http://127.0.0.1:8100`. Change the port in Settings or start the app with `--api-port`. Every route starts with `/api/v1/`, except the OpenAI-compatible `POST /v1/audio/speech`. Requests to an unknown path return the app's HTML page, not a 404.\n\n## Authentication\n\nNo key is needed unless you set one in Settings or start the app with `--api-key`. Once set, send it as `X-API-Key: <key>`, `Authorization: Bearer <key>` or `?api_key=<key>`. `GET /api/v1/health` and `GET /api/v1/system/version` never need a key.\n\n## Quick Start Workflow\n\n1. **Check health**: `GET /api/v1/health`\n2. **Pick a model**: `GET /api/v1/models` lists the models and what each supports\n3. **Generate speech** using one of:\n   - `POST /api/v1/tts/generate` to use a built-in speaker voice\n   - `POST /api/v1/generation/clone` to clone a voice from reference audio or a saved voice\n   - `POST /api/v1/generation/design` to create a voice from a text description\n   - `POST /api/v1/conversion/convert` to convert existing speech to another voice\n4. **Get audio**: Pass `?sync=true` to get audio in the response, or poll `GET /api/v1/generation/progress` then `GET /api/v1/generation/result`\n\nThe requested model loads automatically, so the first request after a model switch takes longer. `POST /api/v1/model/load` loads one ahead of time.\n\n## Sync vs Async\n\nAll generation and transcription endpoints accept `?sync=true`. In sync mode, the request blocks until completion and returns the result directly. Generation has a hard 600s cap; transcription uses a 300s inactivity timeout (resets while progress events are flowing) so long audio can finish even if it takes longer than 5 minutes wall-clock. In async mode (default), the request returns immediately and you poll for progress/results.\n\n## Streaming\n\nFor real-time audio streaming, use the `/stream` variants (e.g. `POST /api/v1/generation/clone/stream`). These return a `session_id`. Connect to `GET /api/v1/streaming/{session_id}/audio` to receive a chunked WAV stream as audio is generated. Call `POST /api/v1/streaming/{session_id}/finalize` when done to collect the complete audio as base64.\n\n## Audio Format\n\nAll audio input/output uses base64-encoded WAV unless otherwise noted. The streaming audio endpoint returns raw WAV (PCM 16-bit mono). The output audio format can be changed via `PUT /api/v1/settings/audio-format`.\n\n## Models\n\nMultiple TTS models are available, each with different capabilities.\nQuery `GET /api/v1/models` to list all models, or `GET /api/v1/models/active`\nfor the current model's capabilities.\n\nModels differ in:\n- **Supported modes**: clone, design, and/or TTS (built-in speakers)\n- **Languages**: varies by model and variant\n- **Quality tiers**: each model has its own set of variants\n- **Generation parameters**: model-specific tuning knobs (temperature, exaggeration, etc.)\n\nPass `model_family` on generation requests to target a specific model, or omit it\nto use the currently configured model.\n\n## Validation\n\nAll requests are validated against the target model's capabilities.\nInvalid languages, quality tiers, or generation parameters return\na 400 error listing the valid options.\n\n## Agents\n\n`POST /api/v1/speak` speaks text out loud in a saved voice. `POST /v1/audio/speech` accepts OpenAI text-to-speech requests, so OpenAI clients work by pointing their base URL at this server. An MCP server for AI agents runs at `/mcp`.\n\n## Live avatars\n\nConnect a WebSocket to `/api/v1/talking-head/live` (pass the key as `?api_key=` when one is set) to get a talking face back in real time. Send JSON messages and audio, and receive video frames with their audio.\n\n1. **Start**: `{\"type\": \"start\", \"avatar_id\": \"av_...\"}`, or `\"stock_id\"`, or `\"image_base64\"`. Optional: `\"model\"` (`lite` default, or `pro`), `\"size\"` (512, or 1024 with `pro`), `\"idle\"` (`loop` default, `live` or `none`), `\"pace\"` (`realtime` default, or `fast` to get frames as quickly as they render), `\"framing\"` (`face` default for a square close-up, or `photo` for the whole photo with the face blended back in, up to 1280 px on its long side; `ready` gives `width` and `height`) and `\"voice\"`, `\"language\"`, `\"tts_model\"` and `\"tts_quality\"` (a quality tier such as `higher_quality` or `faster`, the app setting if left out) as defaults for `say`. The voice model loads during start so the first `say` is quick. Send `\"warm_tts\": false` if you only send your own audio. The server answers with `loading` messages while models download and load, then `ready`.\n2. **Speak**: `{\"type\": \"say\", \"id\": \"m1\", \"text\": \"...\", \"voice\": \"Morgan\", \"language\": \"English\"}` speaks in a saved voice. `tts_model` and `tts_quality` can also be set per `say`. Or send your own speech: `{\"type\": \"audio_begin\", \"id\": \"a1\", \"sample_rate\": 24000}`, then binary messages of 16-bit mono PCM, then `{\"type\": \"audio_end\"}`.\n3. **Receive**: binary frames, plus `started` and `done` messages for each `id`. Each frame is a 20-byte little-endian header (`kind` u8 with 1 for speech and 2 for idle, `id_length` u8, reserved u16, `epoch` u32, `index` u32, `audio_offset` u32, `jpeg_length` u32), then the id, then a JPEG, then 40 ms of 16-bit mono PCM at the `sample_rate` from `ready`. Idle frames carry no audio.\n4. **Control**: `{\"type\": \"interrupt\"}` stops the current speech and drops queued speech, `{\"type\": \"clear\"}` drops only the queue, and `{\"type\": \"played\", \"samples\": N, \"epoch\": E}` reports how many speech samples you have played in the current epoch. With `realtime` pace the server stays about one second ahead of what you report, or of the clock if you never report.\n\nAfter an interrupt the server sends `interrupted` with a new `epoch`. Drop any frames with an older epoch. One live session runs at a time.",
    "version": "2.0.0"
  },
  "paths": {
    "/api/v1/speak": {
      "post": {
        "tags": [
          "Agent"
        ],
        "summary": "Speak text out loud in a saved voice",
        "description": "REST mirror of the `vcp_speak` MCP tool for non-MCP agents and scripts.\n\nStreams speech with the resolved voice/model. `deliver: play`\nplays it here (desktop UI via `GET /api/v1/events/speak` when\nsubscribed, else the default output device) and blocks until\ndone. `deliver: url` plays nothing on this machine and returns\na progressive stream URL immediately. Speech is ephemeral —\nnothing is written to history.",
        "operationId": "speak_api_v1_speak_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpeakRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpeakResponse"
                }
              }
            }
          },
          "400": {
            "description": "No voice resolved (none passed, no default configured) or unknown model."
          },
          "404": {
            "description": "The requested voice was not found."
          },
          "500": {
            "description": "Generation failed."
          },
          "504": {
            "description": "Generation timed out (600s limit)."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/v1/audio/speech": {
      "post": {
        "tags": [
          "Agent"
        ],
        "summary": "OpenAI-compatible text-to-speech",
        "description": "Drop-in for OpenAI's `POST /v1/audio/speech`, so OpenAI-compatible\nclients (OpenClaw, etc.) can point a `baseUrl` at this server. Send the\nAPI key as `Authorization: Bearer <key>`. OpenAI model/voice names fall\nback to the configured agent defaults. Speech is ephemeral — nothing is\nwritten to history, nothing plays on this machine.",
        "operationId": "openai_speech_v1_audio_speech_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpenAISpeechRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Audio bytes, streamed progressively while synthesis runs.",
            "content": {
              "application/json": {
                "schema": {}
              },
              "audio/mpeg": {},
              "audio/wav": {}
            }
          },
          "400": {
            "description": "No voice resolved, or mp3 requested without bundled ffmpeg."
          },
          "500": {
            "description": "Generation failed."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/events/speak": {
      "get": {
        "tags": [
          "Agent"
        ],
        "summary": "SSE stream of agent speak events",
        "description": "Server-sent events for agent speech. The desktop UI subscribes so\nagent-generated audio plays inside the app; while at least one\nsubscriber is connected, local fallback playback is suppressed.",
        "operationId": "speak_events_api_v1_events_speak_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/health": {
      "get": {
        "tags": [
          "Health"
        ],
        "summary": "Health check",
        "description": "Returns {status: \"ok\"} if the server is running.",
        "operationId": "health_api_v1_health_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/app/shutdown": {
      "post": {
        "tags": [
          "Health"
        ],
        "summary": "Shut down the app",
        "description": "Quit the app. In the desktop app this closes the window, the same as its close button.\nBrowser requests from other sites are refused.",
        "operationId": "shutdown_api_v1_app_shutdown_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusResponse"
                }
              }
            }
          },
          "403": {
            "description": "The request came from a web page on another site."
          },
          "409": {
            "description": "A data folder move is in progress."
          }
        }
      }
    },
    "/api/v1/system/info": {
      "get": {
        "tags": [
          "System"
        ],
        "summary": "Get system hardware info",
        "description": "Return a human-readable string of GPU name, VRAM, and driver info.",
        "operationId": "system_info_api_v1_system_info_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SystemInfoResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/youtube/download": {
      "post": {
        "tags": [
          "YouTube"
        ],
        "summary": "Download YouTube audio for trimming",
        "description": "Download a YouTube URL's audio and store it server-side as a temp WAV.\n\nReturns {temp_id, duration, title, start_time}. Then POST /api/v1/\nyoutube/slice with a desired range to get a trimmed clip as base64.",
        "operationId": "youtube_download_api_v1_youtube_download_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "type": "object",
                "title": "Body"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/youtube/slice": {
      "post": {
        "tags": [
          "YouTube"
        ],
        "summary": "Slice a range from a YouTube temp WAV",
        "description": "Cut [start, end] seconds out of the temp WAV and return base64 WAV.",
        "operationId": "youtube_slice_api_v1_youtube_slice_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "type": "object",
                "title": "Body"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/youtube/audio/{temp_id}": {
      "delete": {
        "tags": [
          "YouTube"
        ],
        "summary": "Delete a YouTube temp WAV",
        "description": "Best-effort cleanup of a temp WAV when the user closes the modal.",
        "operationId": "youtube_cleanup_api_v1_youtube_audio__temp_id__delete",
        "parameters": [
          {
            "name": "temp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Temp Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/youtube/transcribe": {
      "post": {
        "tags": [
          "YouTube"
        ],
        "summary": "Transcribe a YouTube temp WAV without round-tripping bytes",
        "description": "Start transcription on a previously-downloaded YouTube temp WAV.\nAvoids base64-encoding multi-MB audio across the JS bridge.",
        "operationId": "youtube_transcribe_api_v1_youtube_transcribe_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "type": "object",
                "title": "Body"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/system/backend": {
      "get": {
        "tags": [
          "System"
        ],
        "summary": "Get PyTorch backend",
        "description": "Return the configured PyTorch backend name (cuda, mlx, or cpu) from config.",
        "operationId": "system_backend_api_v1_system_backend_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SystemBackendResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/audio-format": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get output audio format",
        "description": "Return available output audio formats (wav, mp3, etc.) and current selection.",
        "operationId": "get_audio_format_setting_api_v1_settings_audio_format_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioFormatGetResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set output audio format",
        "description": "Set the output audio format for generated speech.",
        "operationId": "set_audio_format_setting_api_v1_settings_audio_format_put",
        "parameters": [
          {
            "name": "format",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Audio format ID (e.g. 'wav', 'mp3')",
              "title": "Format"
            },
            "description": "Audio format ID (e.g. 'wav', 'mp3')"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioFormatSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audio/convert": {
      "post": {
        "tags": [
          "Audio"
        ],
        "summary": "Convert audio format",
        "description": "Convert base64-encoded WAV audio to another format (mp3, flac). Returns the converted audio as base64.",
        "operationId": "convert_audio_api_v1_audio_convert_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudioConvertRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioConvertResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/emotional-clone-engine": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get emotional clone engine",
        "description": "Return the active emotional-clone engine and the emotions steering offers.",
        "operationId": "get_emotional_clone_engine_setting_api_v1_settings_emotional_clone_engine_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set emotional clone engine",
        "operationId": "set_emotional_clone_engine_setting_api_v1_settings_emotional_clone_engine_put",
        "parameters": [
          {
            "name": "engine",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "steering or voice_change",
              "title": "Engine"
            },
            "description": "steering or voice_change"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/model-quality": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get TTS model quality",
        "description": "Return quality presets available for the current generation mode.",
        "operationId": "get_model_quality_setting_api_v1_settings_model_quality_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelQualityGetResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set TTS model quality",
        "description": "Set TTS model quality. Unloads the current model and clears voice prompt cache if changed.",
        "operationId": "set_model_quality_setting_api_v1_settings_model_quality_put",
        "parameters": [
          {
            "name": "quality",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Quality preset ID",
              "title": "Quality"
            },
            "description": "Quality preset ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelQualitySetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/generation-mode": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get generation mode",
        "description": "Return available generation modes filtered by active model's capabilities.",
        "operationId": "get_generation_mode_setting_api_v1_settings_generation_mode_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModeOptionsResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set generation mode",
        "description": "Switch generation mode. Validates mode is supported by active model.",
        "operationId": "set_generation_mode_setting_api_v1_settings_generation_mode_put",
        "parameters": [
          {
            "name": "mode",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Mode: 'clone', 'design', 'tts', or 'stt'",
              "title": "Mode"
            },
            "description": "Mode: 'clone', 'design', 'tts', or 'stt'"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SetModeResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/preferences/{key}": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get a UI preference",
        "operationId": "get_pref_api_v1_preferences__key__get",
        "parameters": [
          {
            "name": "key",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Key"
            }
          },
          {
            "name": "default",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "title": "Default"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set a UI preference",
        "operationId": "set_pref_api_v1_preferences__key__put",
        "parameters": [
          {
            "name": "key",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Key"
            }
          },
          {
            "name": "value",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Value"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/low-vram": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get low VRAM mode",
        "description": "Return whether low VRAM mode is enabled.",
        "operationId": "get_low_vram_setting_api_v1_settings_low_vram_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LowVramGetResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set low VRAM mode",
        "description": "Toggle low VRAM mode. Unloads the current TTS model if one is loaded.",
        "operationId": "set_low_vram_setting_api_v1_settings_low_vram_put",
        "parameters": [
          {
            "name": "enabled",
            "in": "query",
            "required": true,
            "schema": {
              "type": "boolean",
              "description": "Enable or disable low VRAM mode",
              "title": "Enabled"
            },
            "description": "Enable or disable low VRAM mode"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LowVramSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/rocm-flash-attention": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get ROCm flash attention",
        "description": "Return whether AOTriton flash attention is enabled, and whether it applies here.",
        "operationId": "get_rocm_flash_attention_setting_api_v1_settings_rocm_flash_attention_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RocmFlashAttentionGetResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set ROCm flash attention",
        "description": "Toggle AOTriton flash attention. Takes effect on the next launch.",
        "operationId": "set_rocm_flash_attention_setting_api_v1_settings_rocm_flash_attention_put",
        "parameters": [
          {
            "name": "enabled",
            "in": "query",
            "required": true,
            "schema": {
              "type": "boolean",
              "description": "Enable or disable AOTriton flash attention",
              "title": "Enabled"
            },
            "description": "Enable or disable AOTriton flash attention"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RocmFlashAttentionSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/hf-endpoint": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get HuggingFace endpoint mode",
        "description": "Return the user's HuggingFace endpoint preference ('auto', 'direct', or 'mirror').",
        "operationId": "get_hf_endpoint_mode_setting_api_v1_settings_hf_endpoint_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set HuggingFace endpoint mode",
        "description": "Set the HuggingFace endpoint preference.\n\nClears the session probe cache so subsequent downloads pick up the new preference immediately.",
        "operationId": "set_hf_endpoint_mode_setting_api_v1_settings_hf_endpoint_put",
        "parameters": [
          {
            "name": "mode",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "One of 'auto', 'direct', 'mirror'",
              "title": "Mode"
            },
            "description": "One of 'auto', 'direct', 'mirror'"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/ui-language": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get UI language",
        "description": "Return the stored UI language code, or null if the user never picked one.",
        "operationId": "get_ui_language_setting_api_v1_settings_ui_language_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UiLanguageGetResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set UI language",
        "description": "Set the UI language code and switch the i18n locale immediately.",
        "operationId": "set_ui_language_setting_api_v1_settings_ui_language_put",
        "parameters": [
          {
            "name": "language",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "ISO language code (e.g. 'en', 'de', 'ja')",
              "title": "Language"
            },
            "description": "ISO language code (e.g. 'en', 'de', 'ja')"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UiLanguageSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/asr-model": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get ASR models",
        "description": "Return all selectable ASR models. Empty options list on macOS (single MLX build).",
        "operationId": "get_asr_models_setting_api_v1_settings_asr_model_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AsrModelsGetResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set ASR model",
        "description": "Set the ASR model. The new model loads on next transcription.",
        "operationId": "set_asr_model_setting_api_v1_settings_asr_model_put",
        "parameters": [
          {
            "name": "model_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Model ID",
              "title": "Model Id"
            },
            "description": "Model ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AsrModelSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/diarization-engine": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get speaker detection engines",
        "operationId": "get_diarization_engines_setting_api_v1_settings_diarization_engine_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set speaker detection engine",
        "operationId": "set_diarization_engine_setting_api_v1_settings_diarization_engine_put",
        "parameters": [
          {
            "name": "engine",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "pyannote or nemotron",
              "title": "Engine"
            },
            "description": "pyannote or nemotron"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/mic-ptt-shortcut": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get mic PTT shortcut",
        "description": "Return the configured mic push-to-talk shortcut (modifier + key).",
        "operationId": "get_mic_ptt_shortcut_setting_api_v1_settings_mic_ptt_shortcut_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MicPttShortcutResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set mic PTT shortcut",
        "description": "Set the mic PTT shortcut. Rejects values outside the allowed dropdown set.",
        "operationId": "set_mic_ptt_shortcut_setting_api_v1_settings_mic_ptt_shortcut_put",
        "parameters": [
          {
            "name": "modifier",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "PTT modifier ('Alt' or 'Ctrl')",
              "title": "Modifier"
            },
            "description": "PTT modifier ('Alt' or 'Ctrl')"
          },
          {
            "name": "key",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "PTT key",
              "title": "Key"
            },
            "description": "PTT key"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MicPttShortcutSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/http-api": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get HTTP API settings",
        "description": "Return whether the HTTP API is enabled and its configured port.",
        "operationId": "get_http_api_setting_api_v1_settings_http_api_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpApiSettingResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/http-api-enabled": {
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Enable/disable HTTP API",
        "description": "Toggle the HTTP API server on or off in config. Requires app restart to take effect.",
        "operationId": "set_http_api_enabled_api_v1_settings_http_api_enabled_put",
        "parameters": [
          {
            "name": "enabled",
            "in": "query",
            "required": true,
            "schema": {
              "type": "boolean",
              "description": "Enable or disable the HTTP API",
              "title": "Enabled"
            },
            "description": "Enable or disable the HTTP API"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpApiSettingSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/http-api-port": {
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set HTTP API port",
        "description": "Change the HTTP API port in config. Requires app restart to take effect.",
        "operationId": "set_http_api_port_api_v1_settings_http_api_port_put",
        "parameters": [
          {
            "name": "port",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Port number (1-65535)",
              "title": "Port"
            },
            "description": "Port number (1-65535)"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpApiSettingSetResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/mcp": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get MCP agent-voice settings",
        "description": "Return the default agent voice/model, the MCP endpoint URL, and the OpenAI-compatible TTS base URL.",
        "operationId": "get_mcp_settings_endpoint_api_v1_settings_mcp_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/mcp-default-voice": {
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set default agent voice",
        "operationId": "set_mcp_default_voice_endpoint_api_v1_settings_mcp_default_voice_put",
        "parameters": [
          {
            "name": "voice_id",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Saved voice ID. Omit to clear.",
              "title": "Voice Id"
            },
            "description": "Saved voice ID. Omit to clear."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/api-key": {
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set or clear the API key",
        "description": "When a key is set, every API/MCP request must present it via X-API-Key, Authorization: Bearer, or ?api_key=. Applies immediately, no restart needed. Omit `key` to clear.",
        "operationId": "set_api_key_endpoint_api_v1_settings_api_key_put",
        "parameters": [
          {
            "name": "key",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 8
                },
                {
                  "type": "null"
                }
              ],
              "description": "New API key (min 8 chars). Omit to clear.",
              "title": "Key"
            },
            "description": "New API key (min 8 chars). Omit to clear."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/mcp-default-model": {
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set default agent model",
        "operationId": "set_mcp_default_model_endpoint_api_v1_settings_mcp_default_model_put",
        "parameters": [
          {
            "name": "family",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Model family. Omit to clear.",
              "title": "Family"
            },
            "description": "Model family. Omit to clear."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/setup/status": {
      "get": {
        "tags": [
          "Setup"
        ],
        "summary": "Check if setup is required",
        "description": "Check whether first-run setup is needed (missing backend, Python upgrade, etc.).",
        "operationId": "setup_status_api_v1_setup_status_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SetupStatusResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/setup/options": {
      "get": {
        "tags": [
          "Setup"
        ],
        "summary": "Get setup options",
        "description": "Detect GPUs and return available backend installation options for the setup screen.",
        "operationId": "setup_options_api_v1_setup_options_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SetupOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/setup/start": {
      "post": {
        "tags": [
          "Setup"
        ],
        "summary": "Install backend",
        "description": "Start background installation of the chosen compute backend (mlx/cuda/cpu).",
        "operationId": "setup_start_api_v1_setup_start_post",
        "parameters": [
          {
            "name": "backend",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Backend to install: 'mlx', 'cuda', or 'cpu'",
              "title": "Backend"
            },
            "description": "Backend to install: 'mlx', 'cuda', or 'cpu'"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SetupStartResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/setup/progress": {
      "get": {
        "tags": [
          "Setup"
        ],
        "summary": "Poll setup progress",
        "description": "Return current backend installation status, message, and percentage.",
        "operationId": "setup_progress_api_v1_setup_progress_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SetupProgressResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/setup/reset": {
      "post": {
        "tags": [
          "Setup"
        ],
        "summary": "Reset setup",
        "description": "Mark setup as incomplete so the backend can be changed on next launch.",
        "operationId": "setup_reset_api_v1_setup_reset_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/system/version": {
      "get": {
        "tags": [
          "System"
        ],
        "summary": "Get app version",
        "description": "Read the app version from version.txt.",
        "operationId": "app_version_api_v1_system_version_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppVersionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/system/gpu-devices": {
      "get": {
        "tags": [
          "System"
        ],
        "summary": "List CUDA GPU devices",
        "description": "Return available CUDA devices with names/VRAM and the currently selected index.",
        "operationId": "gpu_devices_api_v1_system_gpu_devices_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GpuDevicesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/system/gpu-device": {
      "put": {
        "tags": [
          "System"
        ],
        "summary": "Select CUDA GPU device",
        "description": "Switch the active CUDA device. Unloads both TTS and ASR models for device migration.",
        "operationId": "set_gpu_device_api_v1_system_gpu_device_put",
        "parameters": [
          {
            "name": "index",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "CUDA device index",
              "title": "Index"
            },
            "description": "CUDA device index"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SetGpuDeviceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/cache/info": {
      "get": {
        "tags": [
          "Cache"
        ],
        "summary": "Get cache info",
        "description": "Return model cache size, pip cache size, and data folder paths.",
        "operationId": "cache_info_api_v1_cache_info_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CacheInfoResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/cache/clear-models": {
      "post": {
        "tags": [
          "Cache"
        ],
        "summary": "Delete model cache",
        "description": "Delete all downloaded model files and recreate the empty cache directory.",
        "operationId": "clear_model_cache_api_v1_cache_clear_models_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/cache/clear-pip": {
      "post": {
        "tags": [
          "Cache"
        ],
        "summary": "Delete pip cache",
        "description": "Delete all cached pip downloads and recreate the empty cache directory.",
        "operationId": "clear_pip_cache_api_v1_cache_clear_pip_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/gpu/install": {
      "post": {
        "tags": [
          "GPU Install"
        ],
        "summary": "Install GPU acceleration",
        "description": "Start GPU acceleration package installation in a background thread.",
        "operationId": "start_gpu_install_api_v1_gpu_install_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerationStartedResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/gpu/install/progress": {
      "get": {
        "tags": [
          "GPU Install"
        ],
        "summary": "Poll GPU install progress",
        "description": "Return current GPU acceleration installation status and percentage.",
        "operationId": "gpu_install_progress_api_v1_gpu_install_progress_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelLoadProgressResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/model/status": {
      "get": {
        "tags": [
          "Model"
        ],
        "summary": "Get loaded model info",
        "description": "Return whether a TTS model is loaded, and if so its type, quality, and name.",
        "operationId": "model_status_api_v1_model_status_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelStatusResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/model/load": {
      "post": {
        "tags": [
          "Model"
        ],
        "summary": "Load TTS model",
        "description": "Load or switch the TTS model.\n\n**A model must be loaded before any generation endpoint will work.**\nIf the requested mode/quality is already loaded, returns immediately\nwith `status: \"already_loaded\"`. Otherwise begins async loading —\npoll `GET /api/v1/model/load/progress` until `status: \"complete\"`.\n\nSwitching generation mode (clone / design / tts) requires a different\nmodel variant and triggers a reload.",
        "operationId": "model_load_api_v1_model_load_post",
        "parameters": [
          {
            "name": "sync",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Wait for loading to complete",
              "default": false,
              "title": "Sync"
            },
            "description": "Wait for loading to complete"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ModelLoadRequest",
                "default": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelLoadResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/model/load/progress": {
      "get": {
        "tags": [
          "Model"
        ],
        "summary": "Poll model load progress",
        "description": "Return current model loading status, message, and percentage.",
        "operationId": "model_load_progress_api_v1_model_load_progress_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelLoadProgressResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/models": {
      "get": {
        "tags": [
          "Model"
        ],
        "summary": "List available TTS models",
        "description": "List all available TTS model families and their capabilities.",
        "operationId": "list_models_api_v1_models_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/models/active": {
      "get": {
        "tags": [
          "Model"
        ],
        "summary": "Get active model capabilities",
        "description": "Get the active TTS model's capabilities.",
        "operationId": "get_active_model_api_v1_models_active_get",
        "parameters": [
          {
            "name": "mode",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Generation mode to resolve the per-mode model preference for",
              "title": "Mode"
            },
            "description": "Generation mode to resolve the per-mode model preference for"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelCapabilitiesResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Model"
        ],
        "summary": "Switch active TTS model",
        "description": "Save the preferred TTS model family and return its capabilities.\n\nUnloads the current model. With `auto_load` set, the new model starts\nloading right away.",
        "operationId": "switch_active_model_api_v1_models_active_put",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchModelRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelCapabilitiesResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/models/{model_family}/status": {
      "get": {
        "tags": [
          "Model"
        ],
        "summary": "Check model download status",
        "description": "Check if model weights are downloaded for each variant tier.",
        "operationId": "check_model_status_api_v1_models__model_family__status_get",
        "parameters": [
          {
            "name": "model_family",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Model Family"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/models/load-progress": {
      "get": {
        "tags": [
          "Model"
        ],
        "summary": "Poll model load/download progress",
        "description": "Return current model loading/downloading progress.",
        "operationId": "models_load_progress_api_v1_models_load_progress_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/progress": {
      "get": {
        "tags": [
          "Generation"
        ],
        "summary": "Poll generation progress",
        "description": "Return current speech generation status, message, and percentage.",
        "operationId": "generation_progress_api_v1_generation_progress_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerationProgressResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/result": {
      "get": {
        "tags": [
          "Generation"
        ],
        "summary": "Get last generation result",
        "description": "Return the most recent generation result including base64-encoded audio.",
        "operationId": "generation_result_api_v1_generation_result_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerationResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/stop": {
      "post": {
        "tags": [
          "Generation"
        ],
        "summary": "Cancel generation",
        "description": "Cancel the active generation, clear all pending queue jobs, and set cancelled flag.",
        "operationId": "generation_stop_api_v1_generation_stop_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerationStopResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/queue": {
      "get": {
        "tags": [
          "Generation"
        ],
        "summary": "Get queue status",
        "description": "Return the number of pending jobs and whether a generation is currently running.\n\nScoped per-user: callers only see their own queue depth and whether\ntheir own job is the active one.",
        "operationId": "generation_queue_status_api_v1_generation_queue_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerationQueueResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/clone": {
      "post": {
        "tags": [
          "Clone"
        ],
        "summary": "Generate cloned speech",
        "description": "Clone a voice from reference audio or a saved voice ID.\n\nProvide `ref_audio_base64` with a 3-15 second WAV clip of clear speech,\nplus `ref_text` (the transcript of that audio) for best quality.\nAlternatively, provide a `voice_id` from the voice library — the saved\naudio is used automatically, and `ref_audio_base64` can be omitted.\n\nUse `?sync=true` to block until audio is ready (up to 600s).\nOtherwise, poll `GET /api/v1/generation/progress` and `GET /api/v1/generation/result`.",
        "operationId": "start_clone_api_v1_generation_clone_post",
        "parameters": [
          {
            "name": "sync",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Wait for generation to complete and return audio directly",
              "default": false,
              "title": "Sync"
            },
            "description": "Wait for generation to complete and return audio directly"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloneRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Generation started (async) or completed result (sync).",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ],
                  "title": "Response Start Clone Api V1 Generation Clone Post",
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice_id format."
          },
          "504": {
            "description": "Sync generation timed out (600s limit)."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/clone/stream": {
      "post": {
        "tags": [
          "Clone"
        ],
        "summary": "Stream cloned speech",
        "description": "Start a streaming voice clone session.\n\nReturns a `session_id` immediately. Connect to\n`GET /api/v1/streaming/{session_id}/audio` to receive chunked WAV audio\nas it is generated. Call `POST /api/v1/streaming/{session_id}/finalize`\nwhen done to get the complete audio as base64.\n\nCancels any in-progress generation to prioritize the stream.",
        "operationId": "start_clone_stream_api_v1_generation_clone_stream_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloneRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamStartedResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/design": {
      "post": {
        "tags": [
          "Design"
        ],
        "summary": "Generate designed speech",
        "description": "Generate speech using a natural language voice description.\n\nDescribe the desired voice in `instruct_text` (e.g. 'a deep male voice\nwith an American accent, speaking confidently'). The model creates a\nnew voice matching the description each time — results vary between calls.\nTo reuse a designed voice, save it via `POST /api/v1/voices` and use\n`POST /api/v1/generation/design/saved` instead.",
        "operationId": "start_design_api_v1_generation_design_post",
        "parameters": [
          {
            "name": "sync",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Wait for generation to complete and return audio directly",
              "default": false,
              "title": "Sync"
            },
            "description": "Wait for generation to complete and return audio directly"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DesignRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Generation started (async) or completed result (sync).",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ],
                  "title": "Response Start Design Api V1 Generation Design Post",
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ]
                }
              }
            }
          },
          "504": {
            "description": "Sync generation timed out (600s limit)."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/design/saved": {
      "post": {
        "tags": [
          "Design"
        ],
        "summary": "Generate from saved design voice",
        "description": "Generate speech using a previously saved voice design. Validates voice_id exists on disk.",
        "operationId": "start_saved_design_api_v1_generation_design_saved_post",
        "parameters": [
          {
            "name": "sync",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Wait for generation to complete and return audio directly",
              "default": false,
              "title": "Sync"
            },
            "description": "Wait for generation to complete and return audio directly"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedDesignRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Generation started (async) or completed result (sync).",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ],
                  "title": "Response Start Saved Design Api V1 Generation Design Saved Post",
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice_id format."
          },
          "404": {
            "description": "Saved design voice not found."
          },
          "504": {
            "description": "Sync generation timed out (600s limit)."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/generation/design/saved/stream": {
      "post": {
        "tags": [
          "Design"
        ],
        "summary": "Stream from saved design voice",
        "description": "Start a streaming session using a saved voice design. Cancels any in-progress generation first.",
        "operationId": "start_saved_design_stream_api_v1_generation_design_saved_stream_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedDesignRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamStartedResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tts/speakers": {
      "get": {
        "tags": [
          "TTS"
        ],
        "summary": "List built-in speakers",
        "description": "Return the list of built-in TTS speaker IDs, names, and descriptions.\n\nWhen `model_family` is supplied and valid, returns speakers belonging\nto that specific model — needed so audiobook callers can list voices\ncompatible with a per-span model override, not just the globally\nactive model.",
        "operationId": "tts_speakers_api_v1_tts_speakers_get",
        "parameters": [
          {
            "name": "model_family",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Optional model family. Defaults to the active model (with fallback to any model that publishes built-in speakers).",
              "title": "Model Family"
            },
            "description": "Optional model family. Defaults to the active model (with fallback to any model that publishes built-in speakers)."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpeakersResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tts/languages": {
      "get": {
        "tags": [
          "TTS"
        ],
        "summary": "List supported languages",
        "description": "Return the list of supported TTS languages.",
        "operationId": "tts_languages_api_v1_tts_languages_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LanguagesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tts/generate": {
      "post": {
        "tags": [
          "TTS"
        ],
        "summary": "Generate speech from text",
        "description": "Generate speech using a built-in speaker voice, with optional style instruction.",
        "operationId": "start_tts_api_v1_tts_generate_post",
        "parameters": [
          {
            "name": "sync",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Wait for generation to complete and return audio directly",
              "default": false,
              "title": "Sync"
            },
            "description": "Wait for generation to complete and return audio directly"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TTSRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Generation started (async) or completed result (sync).",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ],
                  "title": "Response Start Tts Api V1 Tts Generate Post",
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Invalid speaker ID. Use `GET /api/v1/tts/speakers` to list valid IDs."
          },
          "504": {
            "description": "Sync generation timed out (600s limit)."
          }
        }
      }
    },
    "/api/v1/conversion/convert": {
      "post": {
        "tags": [
          "Conversion"
        ],
        "summary": "Convert speech to a target voice",
        "description": "Convert the speaker identity of source audio to a target voice.\n\nKeeps the words, timing, and prosody of the source recording while\nre-rendering it in the target speaker's voice (zero-shot, via the\nChatterbox S3Gen stack). Provide either `target_voice_id` (saved\nlibrary voice) or `target_audio_base64` (6-10s of clean speech).\n\nUse `?sync=true` to block until audio is ready. Otherwise poll\n`GET /api/v1/conversion/progress` and `GET /api/v1/conversion/result`.",
        "operationId": "start_voice_conversion_api_v1_conversion_convert_post",
        "parameters": [
          {
            "name": "sync",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Wait for conversion to complete and return audio directly",
              "default": false,
              "title": "Sync"
            },
            "description": "Wait for conversion to complete and return audio directly"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConvertVoiceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Conversion started (async) or completed result (sync).",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ],
                  "title": "Response Start Voice Conversion Api V1 Conversion Convert Post",
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/GenerationStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice_id format."
          },
          "504": {
            "description": "Sync conversion timed out (600s limit)."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/conversion/models": {
      "get": {
        "tags": [
          "Conversion"
        ],
        "summary": "List voice conversion models",
        "operationId": "conversion_models_api_v1_conversion_models_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/conversion/progress": {
      "get": {
        "tags": [
          "Conversion"
        ],
        "summary": "Get conversion progress",
        "operationId": "conversion_progress_api_v1_conversion_progress_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerationProgressResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/conversion/result": {
      "get": {
        "tags": [
          "Conversion"
        ],
        "summary": "Get last conversion result",
        "description": "The last conversion result, or null when there is none yet.",
        "operationId": "conversion_result_api_v1_conversion_result_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/GenerationResult"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Response Conversion Result Api V1 Conversion Result Get"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/conversion/stop": {
      "post": {
        "tags": [
          "Conversion"
        ],
        "summary": "Cancel voice conversion",
        "operationId": "conversion_stop_api_v1_conversion_stop_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/transcription/start": {
      "post": {
        "tags": [
          "Transcription"
        ],
        "summary": "Transcribe audio",
        "description": "Start a speech-to-text transcription.\n\nIn **async** mode (default), returns immediately with `{started: true}`.\nPoll `/api/v1/transcription/progress` for status and results.\n\nIn **sync** mode (`sync=true`), blocks until transcription completes and\nreturns the result directly. When `output_format=srt` and\n`return_timestamps=true`, returns an SRT subtitle file instead of JSON.",
        "operationId": "start_transcription_api_v1_transcription_start_post",
        "parameters": [
          {
            "name": "sync",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Wait for transcription to complete and return the result directly",
              "default": false,
              "title": "Sync"
            },
            "description": "Wait for transcription to complete and return the result directly"
          },
          {
            "name": "output_format",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "json",
                "srt"
              ],
              "type": "string",
              "description": "Response format when sync=true. 'srt' returns SubRip subtitles (requires return_timestamps=true)",
              "default": "json",
              "title": "Output Format"
            },
            "description": "Response format when sync=true. 'srt' returns SubRip subtitles (requires return_timestamps=true)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TranscribeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Transcription started (async) or completed (sync).",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/TranscriptionStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/TranscriptionSyncResult"
                    }
                  ],
                  "title": "Response Start Transcription Api V1 Transcription Start Post",
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/TranscriptionStartedResponse"
                    },
                    {
                      "$ref": "#/components/schemas/TranscriptionSyncResult"
                    }
                  ]
                }
              },
              "text/srt": {
                "schema": {
                  "type": "string"
                },
                "example": "1\n00:00:00,000 --> 00:00:02,500\nHello world\n"
              }
            }
          },
          "504": {
            "description": "Sync transcription stalled — no progress for 300s."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/transcription/cancel": {
      "post": {
        "tags": [
          "Transcription"
        ],
        "summary": "Cancel an in-flight transcription",
        "description": "Cancel the running transcription.\n\nTranscription stops at the end of the chunk it is working on, so it can\ntake a few seconds to stop.",
        "operationId": "transcription_cancel_api_v1_transcription_cancel_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/transcription/progress": {
      "get": {
        "tags": [
          "Transcription"
        ],
        "summary": "Poll transcription progress",
        "description": "Poll transcription status after an async `/transcription/start` call.\n\nReturns progress percentage, status, and — once complete — the\ntranscribed text, detected language, and optional word-level timestamps.",
        "operationId": "transcription_progress_api_v1_transcription_progress_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptionProgressResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/translate": {
      "post": {
        "tags": [
          "Translation"
        ],
        "summary": "Translate texts",
        "operationId": "translate_api_v1_translate_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TranslateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/streaming/{session_id}": {
      "get": {
        "tags": [
          "Streaming"
        ],
        "summary": "Get streaming session info",
        "description": "Return status, chunk count, and sample rate for a streaming session.",
        "operationId": "streaming_session_info_api_v1_streaming__session_id__get",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingSessionInfoResponse"
                }
              }
            }
          },
          "404": {
            "description": "Session not found or expired (sessions expire after 10 minutes)."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/streaming/{session_id}/audio": {
      "get": {
        "tags": [
          "Streaming"
        ],
        "summary": "Stream session audio as WAV",
        "description": "Stream generated audio progressively while synthesis runs.\n\nBoth formats are replayable and resumable: reads never consume the\nsession buffer, and `Range: bytes=N-` requests resume from byte N\n(206), so players like ExoPlayer can recover from network drops.\nMP3 is encoded once per session into a buffer all readers share.\nThe stream ends when generation completes. 10-minute hard timeout.",
        "operationId": "stream_audio_api_v1_streaming__session_id__audio_get",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "'wav' (PCM16) or 'mp3' (64kbps, transcoded once per session by the bundled ffmpeg)",
              "default": "wav",
              "title": "Format"
            },
            "description": "'wav' (PCM16) or 'mp3' (64kbps, transcoded once per session by the bundled ffmpeg)"
          }
        ],
        "responses": {
          "200": {
            "description": "Streaming WAV audio (PCM 16-bit mono).",
            "content": {
              "application/json": {
                "schema": {}
              },
              "audio/wav": {}
            }
          },
          "404": {
            "description": "Session not found."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/streaming/{session_id}/finalize": {
      "post": {
        "tags": [
          "Streaming"
        ],
        "summary": "Finalize streaming session",
        "description": "Collect all streamed audio into a complete WAV and return as base64.\n\nWaits for generation to complete, concatenates all chunks, stores the\nresult as the last generation result, and removes the session.\nCall this after the audio stream finishes to get the full audio.",
        "operationId": "finalize_streaming_session_api_v1_streaming__session_id__finalize_post",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerationResult"
                }
              }
            }
          },
          "404": {
            "description": "Session not found or expired."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/voices": {
      "get": {
        "tags": [
          "Voices"
        ],
        "summary": "List saved voices",
        "description": "Return all saved voices, optionally filtered by type (clone or design).",
        "operationId": "list_voices_api_v1_voices_get",
        "parameters": [
          {
            "name": "voice_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by voice type: 'clone' or 'design'",
              "title": "Voice Type"
            },
            "description": "Filter by voice type: 'clone' or 'design'"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceListResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Voices"
        ],
        "summary": "Save voice to library",
        "description": "Save a new voice (audio + transcript) to the voice library. Clone audio can be up to 30 seconds long. A clone longer than 15 seconds is cut to 15 seconds or less, on sentence ends where it can, and the response carries the cut voice.",
        "operationId": "save_voice_api_v1_voices_post",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveVoiceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceSaveResponse"
                }
              }
            }
          },
          "400": {
            "description": "Clone audio is longer than 30 seconds."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/voices/{voice_id}": {
      "get": {
        "tags": [
          "Voices"
        ],
        "summary": "Load voice by ID",
        "description": "Return a saved voice's audio, transcript, and metadata by ID.",
        "operationId": "load_voice_api_v1_voices__voice_id__get",
        "parameters": [
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceLoadResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice ID format."
          },
          "404": {
            "description": "Voice not found."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Voices"
        ],
        "summary": "Delete voice by ID",
        "description": "Permanently delete a saved voice and its files from disk.",
        "operationId": "delete_voice_api_v1_voices__voice_id__delete",
        "parameters": [
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice ID format."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/voices/{voice_id}/name": {
      "post": {
        "tags": [
          "Voices"
        ],
        "summary": "Rename a saved voice",
        "description": "Update a saved voice's display name.",
        "operationId": "rename_voice_api_v1_voices__voice_id__name_post",
        "parameters": [
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenameVoiceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice ID format."
          },
          "404": {
            "description": "Voice not found."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/voices/{voice_id}/transcript": {
      "post": {
        "tags": [
          "Voices"
        ],
        "summary": "Persist a transcript for a saved voice",
        "description": "Store a transcript on a saved voice and invalidate its baked clone prompt.",
        "operationId": "update_voice_transcript_api_v1_voices__voice_id__transcript_post",
        "parameters": [
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTranscriptRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice ID format."
          },
          "404": {
            "description": "Voice not found."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/voices/{voice_id}/audio": {
      "post": {
        "tags": [
          "Voices"
        ],
        "summary": "Replace a saved voice's audio",
        "description": "Replace a saved voice's audio and its transcript together. Without `text` the transcript is cleared and the next generation transcribes the new audio.",
        "operationId": "update_voice_audio_api_v1_voices__voice_id__audio_post",
        "parameters": [
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateVoiceAudioRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice ID format."
          },
          "404": {
            "description": "Voice not found."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/voices/{voice_id}/align": {
      "post": {
        "tags": [
          "Voices"
        ],
        "summary": "Align a saved voice's transcript to its audio",
        "description": "Find word timings for a saved voice's transcript, transcribing the audio when the voice has none. Waits until the voice is aligned. A voice that is already aligned, or holds no speech, returns at once unless `force` is set.",
        "operationId": "align_voice_api_v1_voices__voice_id__align_post",
        "parameters": [
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlignVoiceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlignVoiceResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid voice ID format."
          },
          "404": {
            "description": "Voice not found."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/history": {
      "get": {
        "tags": [
          "History"
        ],
        "summary": "List generation history",
        "description": "Return all past generation results with metadata, newest first.",
        "operationId": "list_history_api_v1_history_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HistoryListResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "History"
        ],
        "summary": "Save generation to history",
        "description": "Persist a generation result (audio + metadata) to the history library.",
        "operationId": "save_to_history_api_v1_history_post",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveHistoryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HistorySaveResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "History"
        ],
        "summary": "Clear all history",
        "description": "Delete all history items, optionally filtered by generation mode.",
        "operationId": "clear_history_api_v1_history_delete",
        "parameters": [
          {
            "name": "mode",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by generation mode: 'clone', 'design', or 'tts'",
              "title": "Mode"
            },
            "description": "Filter by generation mode: 'clone', 'design', or 'tts'"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/history/{item_id}": {
      "get": {
        "tags": [
          "History"
        ],
        "summary": "Load history item by ID",
        "description": "Return a history item's audio and full metadata by ID.",
        "operationId": "load_history_item_api_v1_history__item_id__get",
        "parameters": [
          {
            "name": "item_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Item Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HistoryLoadResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid item ID format."
          },
          "404": {
            "description": "History item not found."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "History"
        ],
        "summary": "Delete history item by ID",
        "description": "Permanently delete a history item and its audio file from disk.",
        "operationId": "delete_history_item_api_v1_history__item_id__delete",
        "parameters": [
          {
            "name": "item_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Item Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessMessageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid item ID format."
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "List all audiobook projects",
        "operationId": "audiobook_list_projects_api_v1_audiobook_projects_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Create a new audiobook project",
        "operationId": "audiobook_create_project_api_v1_audiobook_projects_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudiobookCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/detect-speakers": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Detect speakers in pasted script text",
        "operationId": "audiobook_detect_speakers_api_v1_audiobook_detect_speakers_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudiobookDetectSpeakersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get an audiobook project",
        "operationId": "audiobook_get_project_api_v1_audiobook_projects__project_id__get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Delete an audiobook project",
        "operationId": "audiobook_delete_project_api_v1_audiobook_projects__project_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "delete_designed_voices",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Delete Designed Voices"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/designed-voices": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Library voices this project designed",
        "operationId": "audiobook_designed_voice_ids_api_v1_audiobook_projects__project_id__designed_voices_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/name": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Rename an audiobook project",
        "operationId": "audiobook_rename_project_api_v1_audiobook_projects__project_id__name_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudiobookRenameRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/batch-status": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Lightweight live-batch progress (counts + currently-generating segment)",
        "operationId": "audiobook_batch_status_api_v1_audiobook_projects__project_id__batch_status_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/combine-progress": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Stitch/encode progress for the ongoing combine or export",
        "operationId": "audiobook_combine_progress_api_v1_audiobook_projects__project_id__combine_progress_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/ingest-progress": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "OCR ingestion progress",
        "operationId": "audiobook_ingest_progress_api_v1_audiobook_projects__project_id__ingest_progress_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/cancel-ingest": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Cancel an in-progress OCR ingestion",
        "operationId": "audiobook_cancel_ingest_api_v1_audiobook_projects__project_id__cancel_ingest_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/combine-precheck": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Would a Preview / Export actually do work?",
        "operationId": "audiobook_precheck_combine_api_v1_audiobook_projects__project_id__combine_precheck_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Format"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/combine-cancel": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Signal an in-flight combine/export to stop",
        "operationId": "audiobook_cancel_combine_api_v1_audiobook_projects__project_id__combine_cancel_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/clear-batch-flag": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Clear the persisted batch_in_progress flag",
        "operationId": "audiobook_clear_batch_in_progress_api_v1_audiobook_projects__project_id__clear_batch_flag_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/cover": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Upload a custom cover image",
        "operationId": "audiobook_upload_cover_api_v1_audiobook_projects__project_id__cover_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_audiobook_upload_cover_api_v1_audiobook_projects__project_id__cover_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get the project's cover image (custom overrides EPUB-derived)",
        "operationId": "audiobook_get_cover_api_v1_audiobook_projects__project_id__cover_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/generate": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Batch generate audio for segments",
        "operationId": "audiobook_generate_batch_api_v1_audiobook_projects__project_id__generate_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchGenerateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/generate/cancel": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Cancel an in-flight generate_batch",
        "operationId": "audiobook_cancel_batch_api_v1_audiobook_projects__project_id__generate_cancel_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/reset-stuck": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Reset segments stuck in 'generating' status",
        "operationId": "audiobook_reset_stuck_api_v1_audiobook_projects__project_id__reset_stuck_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/combine": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Combine all segment audio into a single file",
        "operationId": "audiobook_combine_audio_api_v1_audiobook_projects__project_id__combine_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/combined/audio": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get the combined audiobook file (rebuilds if stale)",
        "operationId": "audiobook_get_combined_audio_api_v1_audiobook_projects__project_id__combined_audio_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/combined/boundaries": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get segment boundaries within the combined audiobook",
        "operationId": "audiobook_get_combined_boundaries_api_v1_audiobook_projects__project_id__combined_boundaries_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/combined/url": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Resolve combined audio URL + boundaries in one call (rebuilds if stale)",
        "operationId": "audiobook_get_combined_url_api_v1_audiobook_projects__project_id__combined_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/export": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Export the audiobook project",
        "operationId": "audiobook_export_project_api_v1_audiobook_projects__project_id__export_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExportRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/export/download": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Download the previously-exported audiobook file",
        "description": "Download the file written by `POST /export` in the given format.",
        "operationId": "audiobook_export_download_api_v1_audiobook_projects__project_id__export_download_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Format"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/settings": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Update project settings",
        "operationId": "audiobook_update_project_settings_api_v1_audiobook_projects__project_id__settings_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SettingsUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/reparse": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Re-parse source file with current settings (destructive)",
        "operationId": "audiobook_reparse_project_api_v1_audiobook_projects__project_id__reparse_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Body_audiobook_reparse_project_api_v1_audiobook_projects__project_id__reparse_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/sanitize": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Sanitize every segment's text in a project",
        "operationId": "audiobook_sanitize_all_segments_api_v1_audiobook_projects__project_id__sanitize_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/reset-audio": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Invalidate all generated audio in a project (archives to history)",
        "operationId": "audiobook_reset_all_audio_api_v1_audiobook_projects__project_id__reset_audio_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/reset-audio-for-segments": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Reset audio for a specific list of segments",
        "operationId": "audiobook_reset_audio_for_segments_api_v1_audiobook_projects__project_id__reset_audio_for_segments_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetAudioForSegmentsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Append a new segment to a project",
        "operationId": "audiobook_add_segment_api_v1_audiobook_projects__project_id__segments_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SegmentCreateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Update a segment",
        "operationId": "audiobook_update_segment_api_v1_audiobook_projects__project_id__segments__segment_id__put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SegmentUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Delete a segment",
        "operationId": "audiobook_delete_segment_api_v1_audiobook_projects__project_id__segments__segment_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/move": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Reorder a segment within its scope",
        "operationId": "audiobook_move_segment_api_v1_audiobook_projects__project_id__segments__segment_id__move_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SegmentMoveRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/split": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Split a segment at offset",
        "operationId": "audiobook_split_segment_api_v1_audiobook_projects__project_id__segments__segment_id__split_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SegmentSplitRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{seg_id_a}/merge/{seg_id_b}": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Merge two adjacent segments",
        "operationId": "audiobook_merge_segments_api_v1_audiobook_projects__project_id__segments__seg_id_a__merge__seg_id_b__post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "seg_id_a",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Seg Id A"
            }
          },
          {
            "name": "seg_id_b",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Seg Id B"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/bulk-delete": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Delete multiple segments at once",
        "operationId": "audiobook_bulk_delete_segments_api_v1_audiobook_projects__project_id__segments_bulk_delete_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSegmentIdsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/bulk-merge": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Merge N adjacent segments into one",
        "operationId": "audiobook_bulk_merge_segments_api_v1_audiobook_projects__project_id__segments_bulk_merge_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSegmentIdsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/spans/{span_index}/regenerate": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Regenerate audio for a single voice_span",
        "operationId": "audiobook_regenerate_span_api_v1_audiobook_projects__project_id__segments__segment_id__spans__span_index__regenerate_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          },
          {
            "name": "span_index",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "title": "Span Index"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/generate": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Generate audio for a segment",
        "operationId": "audiobook_generate_segment_api_v1_audiobook_projects__project_id__segments__segment_id__generate_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/audio": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get segment audio file",
        "operationId": "audiobook_get_segment_audio_api_v1_audiobook_projects__project_id__segments__segment_id__audio_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/history": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get generation history for a segment",
        "operationId": "audiobook_get_segment_history_api_v1_audiobook_projects__project_id__segments__segment_id__history_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/history/{generation_id}/promote": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Promote a historical generation to current",
        "operationId": "audiobook_promote_generation_api_v1_audiobook_projects__project_id__segments__segment_id__history__generation_id__promote_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          },
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/history/{generation_id}": {
      "delete": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Delete a historical generation",
        "operationId": "audiobook_delete_generation_api_v1_audiobook_projects__project_id__segments__segment_id__history__generation_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          },
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Rename a take (set or clear its custom display name)",
        "operationId": "audiobook_rename_take_api_v1_audiobook_projects__project_id__segments__segment_id__history__generation_id__patch",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          },
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeRenameRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get a single take's audio file (no-suffix alias)",
        "operationId": "audiobook_get_take_audio_no_suffix_api_v1_audiobook_projects__project_id__segments__segment_id__history__generation_id__get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          },
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          },
          {
            "name": "download",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Download"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/history/{generation_id}/audio": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get a single take's audio file",
        "operationId": "audiobook_get_take_audio_api_v1_audiobook_projects__project_id__segments__segment_id__history__generation_id__audio_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          },
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          },
          {
            "name": "download",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Download"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/upload-take": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Upload a WAV file as a new take in segment history",
        "operationId": "audiobook_upload_take_api_v1_audiobook_projects__project_id__segments__segment_id__upload_take_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_audiobook_upload_take_api_v1_audiobook_projects__project_id__segments__segment_id__upload_take_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/sanitize": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Sanitize a single segment's text",
        "operationId": "audiobook_sanitize_segment_api_v1_audiobook_projects__project_id__segments__segment_id__sanitize_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/lexicon": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "List lexicon entries",
        "operationId": "audiobook_list_lexicon_api_v1_audiobook_projects__project_id__lexicon_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Add a lexicon entry",
        "operationId": "audiobook_add_lexicon_entry_api_v1_audiobook_projects__project_id__lexicon_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LexiconAddRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/lexicon/{entry_id}": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Update a lexicon entry",
        "operationId": "audiobook_update_lexicon_entry_api_v1_audiobook_projects__project_id__lexicon__entry_id__put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "entry_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Entry Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LexiconUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Delete a lexicon entry",
        "operationId": "audiobook_delete_lexicon_entry_api_v1_audiobook_projects__project_id__lexicon__entry_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "entry_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Entry Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/lexicon/import": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Import lexicon entries from elsewhere",
        "operationId": "audiobook_import_lexicon_entries_api_v1_audiobook_projects__project_id__lexicon_import_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LexiconImportRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/lexicon/staleness": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get lexicon staleness for generated segments",
        "operationId": "audiobook_get_lexicon_staleness_api_v1_audiobook_projects__project_id__lexicon_staleness_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/lexicon/find-sentence": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Find first sentence containing a phrase",
        "operationId": "audiobook_find_first_sentence_for_phrase_api_v1_audiobook_projects__project_id__lexicon_find_sentence_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "phrase",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Phrase"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/voices": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Add a voice to a project",
        "operationId": "audiobook_add_project_voice_api_v1_audiobook_projects__project_id__voices_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VoiceAddRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/voices/{voice_id}": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Update a project voice",
        "operationId": "audiobook_update_project_voice_api_v1_audiobook_projects__project_id__voices__voice_id__put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VoiceUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Remove a voice from a project",
        "operationId": "audiobook_remove_project_voice_api_v1_audiobook_projects__project_id__voices__voice_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/voices/{voice_id}/default": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Set the default voice for a project",
        "operationId": "audiobook_set_default_voice_api_v1_audiobook_projects__project_id__voices__voice_id__default_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "voice_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Voice Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/sections": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Create a section",
        "operationId": "audiobook_create_section_api_v1_audiobook_projects__project_id__sections_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SectionCreateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/sections/{section_id}": {
      "delete": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Delete a section (optionally with its segments)",
        "operationId": "audiobook_delete_section_api_v1_audiobook_projects__project_id__sections__section_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "section_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Section Id"
            }
          },
          {
            "name": "delete_segments",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Delete Segments"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/sections/{section_id}/name": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Rename a section",
        "operationId": "audiobook_rename_section_api_v1_audiobook_projects__project_id__sections__section_id__name_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "section_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Section Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SectionRenameRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/llm-config": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Get the audiobook LLM config (api_key masked)",
        "operationId": "audiobook_get_llm_config_api_v1_audiobook_llm_config_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Set the audiobook LLM config",
        "operationId": "audiobook_set_llm_config_api_v1_audiobook_llm_config_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudiobookLLMConfigRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/llm-model": {
      "put": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Set the model used for speaker detection",
        "operationId": "audiobook_set_llm_model_api_v1_audiobook_llm_model_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudiobookLLMModelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/llm-models": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "List available models for the configured LLM provider",
        "operationId": "audiobook_list_llm_models_api_v1_audiobook_llm_models_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/speaker-estimate": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Estimate tokens and cost for speaker detection",
        "operationId": "audiobook_speaker_estimate_api_v1_audiobook_projects__project_id__speaker_estimate_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "detect_emotions",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Detect Emotions"
            }
          },
          {
            "name": "mode",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "speakers",
              "title": "Mode"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/assign-speakers": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Start speaker detection for a project",
        "operationId": "audiobook_assign_speakers_api_v1_audiobook_projects__project_id__assign_speakers_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AudiobookAssignSpeakersRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/assign-speakers/status": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Poll speaker detection progress",
        "operationId": "audiobook_assign_speakers_status_api_v1_audiobook_projects__project_id__assign_speakers_status_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/assign-speakers/cancel": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Cancel the running speaker detection or dramatization",
        "operationId": "audiobook_cancel_assign_speakers_api_v1_audiobook_assign_speakers_cancel_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/assign-speakers/cancel": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Cancel this project's running speaker detection",
        "operationId": "audiobook_cancel_assign_speakers_project_api_v1_audiobook_projects__project_id__assign_speakers_cancel_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/segments/{segment_id}/identify": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Identify speakers and emotions for one segment",
        "operationId": "audiobook_identify_segment_api_v1_audiobook_projects__project_id__segments__segment_id__identify_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/design-cast": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Design and assign a voice for every uncast character",
        "operationId": "audiobook_design_cast_api_v1_audiobook_projects__project_id__design_cast_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AudiobookDesignCastRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/design-cast/status": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Poll voice design progress",
        "operationId": "audiobook_design_cast_status_api_v1_audiobook_projects__project_id__design_cast_status_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/design-cast/cancel": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Cancel the running voice design",
        "operationId": "audiobook_cancel_design_cast_api_v1_audiobook_design_cast_cancel_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/dramatize": {
      "post": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Start rewriting a project as a dramatized script",
        "operationId": "audiobook_dramatize_api_v1_audiobook_projects__project_id__dramatize_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudiobookDramatizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/audiobook/projects/{project_id}/dramatize/status": {
      "get": {
        "tags": [
          "Audiobook"
        ],
        "summary": "Poll dramatization progress",
        "operationId": "audiobook_dramatize_status_api_v1_audiobook_projects__project_id__dramatize_status_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "List dubbing projects",
        "operationId": "dubbing_list_projects_api_v1_dubbing_projects_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Create a dubbing project",
        "operationId": "dubbing_create_project_api_v1_dubbing_projects_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/translation-languages": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Languages a dub can translate into",
        "operationId": "dubbing_translation_languages_api_v1_dubbing_translation_languages_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Get a dubbing project",
        "operationId": "dubbing_get_project_api_v1_dubbing_projects__project_id__get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Delete a dubbing project",
        "operationId": "dubbing_delete_project_api_v1_dubbing_projects__project_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/speakers/{speaker_id}": {
      "put": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Assign a voice to a speaker",
        "operationId": "dubbing_set_speaker_voice_api_v1_dubbing_projects__project_id__speakers__speaker_id__put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "speaker_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Speaker Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingSpeakerVoiceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/speakers/{speaker_id}/label": {
      "put": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Rename a speaker",
        "operationId": "dubbing_rename_speaker_api_v1_dubbing_projects__project_id__speakers__speaker_id__label_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "speaker_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Speaker Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingRenameSpeakerRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/speakers": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Add a speaker",
        "operationId": "dubbing_add_speaker_api_v1_dubbing_projects__project_id__speakers_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingAddSpeakerRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/speakers/{speaker_id}/delete": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Remove a speaker, reassigning their segments",
        "operationId": "dubbing_delete_speaker_api_v1_dubbing_projects__project_id__speakers__speaker_id__delete_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "speaker_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Speaker Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingDeleteSpeakerRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/segments/{segment_id}": {
      "put": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Update a segment",
        "operationId": "dubbing_update_segment_api_v1_dubbing_projects__project_id__segments__segment_id__put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingSegmentUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Delete a segment",
        "description": "Remove one line from the dub. Run the project again to rebuild the mix without it.",
        "operationId": "dubbing_delete_segment_api_v1_dubbing_projects__project_id__segments__segment_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/run": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Run the auto-dub pipeline",
        "operationId": "dubbing_run_api_v1_dubbing_projects__project_id__run_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "lipsync",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Force lip sync on/off; defaults to the project's auto_lipsync setting",
              "title": "Lipsync"
            },
            "description": "Force lip sync on/off; defaults to the project's auto_lipsync setting"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/DubbingRunRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/cancel": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Stop a running dub",
        "description": "Asks the running pipeline to stop at its next stage boundary.",
        "operationId": "dubbing_cancel_api_v1_dubbing_projects__project_id__cancel_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/subtitle-params": {
      "put": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Save the subtitle style",
        "operationId": "dubbing_set_subtitle_params_api_v1_dubbing_projects__project_id__subtitle_params_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingSubtitleParamsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/glossary": {
      "put": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Save the glossary",
        "operationId": "dubbing_set_glossary_api_v1_dubbing_projects__project_id__glossary_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingGlossaryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/export-options": {
      "put": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Save the export format",
        "operationId": "dubbing_set_export_options_api_v1_dubbing_projects__project_id__export_options_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingExportOptionsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/export": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Export the dubbed video",
        "description": "Writes the finished dub (subtitles burned in when they are on) into the\nproject's output folder and returns a download link for it. The desktop app\nasks where to save instead; both share dubbing.export.export_video.",
        "operationId": "dubbing_export_api_v1_dubbing_projects__project_id__export_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/DubbingExportRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/lipsync": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Run lip sync on a finished dub",
        "operationId": "dubbing_lipsync_api_v1_dubbing_projects__project_id__lipsync_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/segments/{segment_id}/regenerate": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Regenerate one segment",
        "operationId": "dubbing_regenerate_api_v1_dubbing_projects__project_id__segments__segment_id__regenerate_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/segments/{segment_id}/source-edited": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Mark a segment's source text as edited since translation",
        "operationId": "dubbing_mark_source_edited_api_v1_dubbing_projects__project_id__segments__segment_id__source_edited_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Clear a segment's source-edited mark",
        "operationId": "dubbing_clear_source_edited_api_v1_dubbing_projects__project_id__segments__segment_id__source_edited_delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/name": {
      "put": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Rename a dubbing project",
        "operationId": "dubbing_rename_project_api_v1_dubbing_projects__project_id__name_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingRenameRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/youtube": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Create a dubbing project from a YouTube URL",
        "operationId": "dubbing_create_project_from_youtube_api_v1_dubbing_projects_youtube_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingYoutubeCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/media": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Stream a project's video, segment clip, or speaker reference",
        "description": "Range-capable media for direct <video>/<audio> src. Starlette's\nFileResponse answers Range itself, so seeking works.",
        "operationId": "dubbing_media_api_v1_dubbing_projects__project_id__media_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "file",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "File"
            }
          },
          {
            "name": "source",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Source"
            }
          },
          {
            "name": "download",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Download"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/output-url": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Playable URL for the dubbed video",
        "operationId": "dubbing_get_output_url_api_v1_dubbing_projects__project_id__output_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/audio-url": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "URL for the dubbed audio track",
        "operationId": "dubbing_get_audio_url_api_v1_dubbing_projects__project_id__audio_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/lipsync-output-url": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Playable URL for the lip-synced video",
        "operationId": "dubbing_get_lipsync_output_url_api_v1_dubbing_projects__project_id__lipsync_output_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/source-url": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Playable URL for the source video",
        "operationId": "dubbing_get_source_url_api_v1_dubbing_projects__project_id__source_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/segments/{segment_id}/audio-url": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Playable URL for a segment's clip",
        "operationId": "dubbing_get_segment_audio_url_api_v1_dubbing_projects__project_id__segments__segment_id__audio_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/speakers/{speaker_id}/ref-audio-url": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Playable URL for a speaker's clone reference",
        "operationId": "dubbing_get_speaker_ref_url_api_v1_dubbing_projects__project_id__speakers__speaker_id__ref_audio_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "speaker_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Speaker Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/segments/{segment_id}/merge": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Merge a segment with the next one",
        "operationId": "dubbing_merge_segment_api_v1_dubbing_projects__project_id__segments__segment_id__merge_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/segments/{segment_id}/split": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Split a segment before a word",
        "operationId": "dubbing_split_segment_api_v1_dubbing_projects__project_id__segments__segment_id__split_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "segment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Segment Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingSplitRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/speakers/{speaker_id}/reference": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Replace a speaker's trimmed clone reference",
        "operationId": "dubbing_set_speaker_reference_api_v1_dubbing_projects__project_id__speakers__speaker_id__reference_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "speaker_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Speaker Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingSpeakerReferenceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/speakers/{speaker_id}/reference-from-segment": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Use one of the speaker's segments as the clone reference",
        "operationId": "dubbing_set_speaker_reference_from_segment_api_v1_dubbing_projects__project_id__speakers__speaker_id__reference_from_segment_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "speaker_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Speaker Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DubbingReferenceFromSegmentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/projects/{project_id}/auto-tag-words": {
      "post": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Dubbing Auto Tag Words",
        "operationId": "dubbing_auto_tag_words_api_v1_dubbing_projects__project_id__auto_tag_words_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/custom-fonts": {
      "get": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Dubbing List Custom Fonts",
        "operationId": "dubbing_list_custom_fonts_api_v1_dubbing_custom_fonts_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/dubbing/custom-fonts/{font_id}": {
      "delete": {
        "tags": [
          "Dubbing"
        ],
        "summary": "Dubbing Delete Custom Font",
        "operationId": "dubbing_delete_custom_font_api_v1_dubbing_custom_fonts__font_id__delete",
        "parameters": [
          {
            "name": "font_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Font Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/subtitles/presets": {
      "get": {
        "tags": [
          "Subtitles"
        ],
        "summary": "List Subtitle Presets",
        "operationId": "list_subtitle_presets_api_v1_subtitles_presets_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Subtitles"
        ],
        "summary": "Save Subtitle Preset",
        "operationId": "save_subtitle_preset_api_v1_subtitles_presets_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubtitlePresetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/subtitles/presets/order": {
      "put": {
        "tags": [
          "Subtitles"
        ],
        "summary": "Reorder Subtitle Presets",
        "operationId": "reorder_subtitle_presets_api_v1_subtitles_presets_order_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubtitlePresetOrderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/subtitles/presets/{preset_id}": {
      "delete": {
        "tags": [
          "Subtitles"
        ],
        "summary": "Delete Subtitle Preset",
        "operationId": "delete_subtitle_preset_api_v1_subtitles_presets__preset_id__delete",
        "parameters": [
          {
            "name": "preset_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Preset Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "List clips projects",
        "operationId": "clips_list_projects_api_v1_clips_projects_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Create a clips project",
        "operationId": "clips_create_project_api_v1_clips_projects_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/from-youtube": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Create a clips project from a YouTube link",
        "operationId": "clips_create_project_from_youtube_api_v1_clips_projects_from_youtube_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsYoutubeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/youtube-import": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Start an async YouTube import",
        "operationId": "clips_start_youtube_import_api_v1_clips_projects_youtube_import_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsYoutubeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/youtube-preview": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Read a YouTube link's title, thumbnail and available heights",
        "operationId": "clips_youtube_preview_api_v1_clips_youtube_preview_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsYoutubeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/youtube-import/{import_id}": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Poll YouTube import progress",
        "operationId": "clips_youtube_import_progress_api_v1_clips_youtube_import__import_id__get",
        "parameters": [
          {
            "name": "import_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Import Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Get a clips project",
        "operationId": "clips_get_project_api_v1_clips_projects__project_id__get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Clips"
        ],
        "summary": "Delete a clips project",
        "operationId": "clips_delete_project_api_v1_clips_projects__project_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/source-url": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Get a playable URL for the source video",
        "operationId": "clips_get_source_url_api_v1_clips_projects__project_id__source_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/source-path": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Resolve the source video's path on disk",
        "operationId": "clips_source_path_api_v1_clips_projects__project_id__source_path_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/clips/{clip_id}/url": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Get a playable URL for a rendered clip",
        "operationId": "clips_get_clip_url_api_v1_clips_projects__project_id__clips__clip_id__url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "clip_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Clip Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/clips/{clip_id}/preview-url": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Get a playable URL for the raw reframed clip",
        "operationId": "clips_get_preview_url_api_v1_clips_projects__project_id__clips__clip_id__preview_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "clip_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Clip Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/clips/{clip_id}/dubbing-source": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Resolve the reframed clip path for a dubbing handoff",
        "operationId": "clips_dubbing_source_api_v1_clips_projects__project_id__clips__clip_id__dubbing_source_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "clip_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Clip Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/clips/{clip_id}/export": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Download a rendered clip, optionally re-encoded",
        "operationId": "clips_export_clip_api_v1_clips_projects__project_id__clips__clip_id__export_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "clip_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Clip Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ClipsExportRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/settings": {
      "put": {
        "tags": [
          "Clips"
        ],
        "summary": "Update clips project settings",
        "operationId": "clips_update_settings_api_v1_clips_projects__project_id__settings_put",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true,
                "title": "Patch"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/clips/{clip_id}": {
      "delete": {
        "tags": [
          "Clips"
        ],
        "summary": "Delete a clip",
        "operationId": "clips_delete_clip_api_v1_clips_projects__project_id__clips__clip_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "clip_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Clip Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/run": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Run the clips pipeline",
        "operationId": "clips_start_job_api_v1_clips_projects__project_id__run_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ClipsRunRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/reset": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Discard clips and return to setup",
        "operationId": "clips_reset_clips_api_v1_clips_projects__project_id__reset_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/progress": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Poll clips job progress",
        "operationId": "clips_job_progress_api_v1_clips_projects__project_id__progress_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/cancel": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Cancel a running clips job",
        "operationId": "clips_cancel_job_api_v1_clips_projects__project_id__cancel_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/clips/{clip_id}/rerender": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Rerender one clip",
        "operationId": "clips_rerender_clip_api_v1_clips_projects__project_id__clips__clip_id__rerender_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "clip_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Clip Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsRerenderRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/projects/{project_id}/bulk-rerender": {
      "post": {
        "tags": [
          "Clips"
        ],
        "summary": "Apply the current style to all done clips",
        "operationId": "clips_bulk_rerender_api_v1_clips_projects__project_id__bulk_rerender_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsRerenderRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/llm-config": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "Get the clips LLM config (api_key masked)",
        "operationId": "clips_get_llm_config_api_v1_clips_llm_config_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Clips"
        ],
        "summary": "Set the clips LLM config",
        "operationId": "clips_set_llm_config_api_v1_clips_llm_config_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsLLMConfigRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/llm-model": {
      "put": {
        "tags": [
          "Clips"
        ],
        "summary": "Set the model used by the clips feature",
        "operationId": "clips_set_llm_model_api_v1_clips_llm_model_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsLLMModelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clips/llm-models": {
      "get": {
        "tags": [
          "Clips"
        ],
        "summary": "List available models for the configured LLM provider",
        "operationId": "clips_list_llm_models_api_v1_clips_llm_models_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "List AI Cut projects",
        "operationId": "aicut_list_projects_api_v1_aicut_projects_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Create an AI Cut project",
        "operationId": "aicut_create_project_api_v1_aicut_projects_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiCutCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Get an AI Cut project and its analysis",
        "operationId": "aicut_get_project_api_v1_aicut_projects__project_id__get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Update name, settings, script or overrides",
        "operationId": "aicut_update_project_api_v1_aicut_projects__project_id__patch",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiCutUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Delete an AI Cut project",
        "operationId": "aicut_delete_project_api_v1_aicut_projects__project_id__delete",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/analyze": {
      "post": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Start analysis",
        "operationId": "aicut_analyze_api_v1_aicut_projects__project_id__analyze_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/render": {
      "post": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Render the cut list to MP4",
        "operationId": "aicut_render_api_v1_aicut_projects__project_id__render_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiCutRenderRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/overdub": {
      "post": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Re-voice selected words",
        "operationId": "aicut_overdub_api_v1_aicut_projects__project_id__overdub_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiCutOverdubRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/overdub-url": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Playable URL for an overdub",
        "operationId": "aicut_overdub_url_api_v1_aicut_projects__project_id__overdub_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "name",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "Name"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/cancel": {
      "post": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Cancel the running op",
        "operationId": "aicut_cancel_api_v1_aicut_projects__project_id__cancel_post",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/status": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Progress of the running op",
        "operationId": "aicut_status_api_v1_aicut_projects__project_id__status_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/source-url": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Playable URL for the source video",
        "operationId": "aicut_source_url_api_v1_aicut_projects__project_id__source_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/render-url": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Playable URL for the last render",
        "operationId": "aicut_render_url_api_v1_aicut_projects__project_id__render_url_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/projects/{project_id}/render-framing": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "How the last render framed the video",
        "operationId": "aicut_render_framing_api_v1_aicut_projects__project_id__render_framing_get",
        "parameters": [
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Project Id"
            }
          },
          {
            "name": "spec",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "Spec"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/llm-config": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Get the AI Cut LLM config (api_key masked)",
        "operationId": "aicut_get_llm_config_api_v1_aicut_llm_config_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Set the AI Cut LLM config",
        "operationId": "aicut_set_llm_config_api_v1_aicut_llm_config_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsLLMConfigRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/llm-model": {
      "put": {
        "tags": [
          "AI Cut"
        ],
        "summary": "Set the model used by AI Cut",
        "operationId": "aicut_set_llm_model_api_v1_aicut_llm_model_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClipsLLMModelRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/aicut/llm-models": {
      "get": {
        "tags": [
          "AI Cut"
        ],
        "summary": "List models for the AI Cut LLM",
        "operationId": "aicut_list_llm_models_api_v1_aicut_llm_models_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/capabilities": {
      "get": {
        "tags": [
          "Avatars"
        ],
        "summary": "Whether this machine can make avatar videos",
        "operationId": "th_capabilities_api_v1_talking_head_capabilities_get",
        "parameters": [
          {
            "name": "resolution",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "720p",
              "title": "Resolution"
            }
          },
          {
            "name": "engine",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Engine"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/video-models": {
      "get": {
        "tags": [
          "Avatars"
        ],
        "summary": "Video models and whether this machine can run them",
        "operationId": "video_models_api_v1_video_models_get",
        "parameters": [
          {
            "name": "resolution",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "720p",
              "title": "Resolution"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos": {
      "get": {
        "tags": [
          "Avatars"
        ],
        "summary": "List avatar videos",
        "operationId": "th_list_api_v1_talking_head_videos_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Start an avatar video",
        "operationId": "th_start_api_v1_talking_head_videos_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadStartRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/drafts": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Create an empty avatar project",
        "operationId": "th_create_draft_api_v1_talking_head_drafts_post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/photo-check": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Check that a photo shows one clear face",
        "operationId": "th_check_photo_api_v1_talking_head_photo_check_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadPhotoCheckRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}": {
      "patch": {
        "tags": [
          "Avatars"
        ],
        "summary": "Update the setup of an avatar project that has not started",
        "operationId": "th_update_draft_api_v1_talking_head_videos__video_id__patch",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadDraftPatchRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Avatars"
        ],
        "summary": "Delete an avatar video",
        "operationId": "th_delete_api_v1_talking_head_videos__video_id__delete",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/name": {
      "put": {
        "tags": [
          "Avatars"
        ],
        "summary": "Rename an avatar project",
        "operationId": "th_rename_api_v1_talking_head_videos__video_id__name_put",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadRenameRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/start": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Start generating an avatar project from its saved setup",
        "operationId": "th_start_draft_api_v1_talking_head_videos__video_id__start_post",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadStartDraftRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/regenerate": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Make a finished avatar video again with the same setup and a new seed",
        "operationId": "th_regenerate_api_v1_talking_head_videos__video_id__regenerate_post",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/TalkingHeadRegenerateRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/status": {
      "get": {
        "tags": [
          "Avatars"
        ],
        "summary": "Progress of an avatar video",
        "operationId": "th_status_api_v1_talking_head_videos__video_id__status_get",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/cancel": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Cancel an avatar video",
        "operationId": "th_cancel_api_v1_talking_head_videos__video_id__cancel_post",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/media-url": {
      "get": {
        "tags": [
          "Avatars"
        ],
        "summary": "Playable URL for an avatar video file",
        "operationId": "th_media_url_api_v1_talking_head_videos__video_id__media_url_get",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          },
          {
            "name": "name",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Name"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/subtitle-params": {
      "put": {
        "tags": [
          "Avatars"
        ],
        "summary": "Save caption style for an avatar video",
        "operationId": "th_set_subtitle_params_api_v1_talking_head_videos__video_id__subtitle_params_put",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadSubtitleParamsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/words": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Time the words of an avatar video for its subtitles",
        "operationId": "th_align_words_api_v1_talking_head_videos__video_id__words_post",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/edits": {
      "put": {
        "tags": [
          "Avatars"
        ],
        "summary": "Save the effects timeline for an avatar video",
        "operationId": "th_set_edits_api_v1_talking_head_videos__video_id__edits_put",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadEditsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/trim": {
      "put": {
        "tags": [
          "Avatars"
        ],
        "summary": "Save the start and end an avatar video exports with",
        "operationId": "th_set_trim_api_v1_talking_head_videos__video_id__trim_put",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadTrimRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/hook": {
      "put": {
        "tags": [
          "Avatars"
        ],
        "summary": "Save the hook text card for an avatar video",
        "operationId": "th_set_hook_api_v1_talking_head_videos__video_id__hook_put",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadHookRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/word-edits": {
      "put": {
        "tags": [
          "Avatars"
        ],
        "summary": "Save the caption word edits for an avatar video",
        "operationId": "th_set_word_edits_api_v1_talking_head_videos__video_id__word_edits_put",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TalkingHeadWordEditsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/export": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Start exporting an avatar video, with captions when they are on",
        "operationId": "th_export_api_v1_talking_head_videos__video_id__export_post",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/TalkingHeadExportRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/videos/{video_id}/export-check": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "What would stop an upscaled export from using the sharpest upscale",
        "operationId": "th_export_check_api_v1_talking_head_videos__video_id__export_check_post",
        "parameters": [
          {
            "name": "video_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Video Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/TalkingHeadExportRequest"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Req"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/exports/{token}": {
      "get": {
        "tags": [
          "Avatars"
        ],
        "summary": "Progress of an avatar export",
        "operationId": "th_export_progress_api_v1_talking_head_exports__token__get",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/exports/{token}/cancel": {
      "post": {
        "tags": [
          "Avatars"
        ],
        "summary": "Stop an avatar export",
        "operationId": "th_export_cancel_api_v1_talking_head_exports__token__cancel_post",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/talking-head/exports/{token}/file": {
      "get": {
        "tags": [
          "Avatars"
        ],
        "summary": "Download a finished avatar export",
        "operationId": "th_export_file_api_v1_talking_head_exports__token__file_get",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/images/models": {
      "get": {
        "tags": [
          "Images"
        ],
        "summary": "Image Models",
        "description": "List the image models with whether each is installed and fits this computer.\n\n`images` is how many images a request makes when `count` is left out, and `size` is the default width and\nheight. `steps_range` and `guidance_range` are the values a request may set, or null when the model's value is\nfixed. `download_gb` is what the first generation downloads.",
        "operationId": "image_models_api_v1_images_models_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/images": {
      "post": {
        "tags": [
          "Images"
        ],
        "summary": "Image Generate",
        "description": "Start generating images from a prompt.\n\nOne generation runs at a time. Poll `GET /api/v1/images/{generation_id}` for progress and finished images.\nReturns 409 while another generation or a GPU job is running.",
        "operationId": "image_generate_api_v1_images_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageGenerateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/images/{generation_id}": {
      "get": {
        "tags": [
          "Images"
        ],
        "summary": "Image Status",
        "description": "Get a generation's status, progress and finished images.\n\n`status` is running, done, failed or cancelled. Each image lists its seed and the URL of its PNG.",
        "operationId": "image_status_api_v1_images__generation_id__get",
        "parameters": [
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Images"
        ],
        "summary": "Image Discard",
        "description": "Stop a generation if it is running and delete its images.",
        "operationId": "image_discard_api_v1_images__generation_id__delete",
        "parameters": [
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/images/{generation_id}/files/{index}": {
      "get": {
        "tags": [
          "Images"
        ],
        "summary": "Image File",
        "description": "Download one finished image as a PNG. Images are kept for 24 hours.",
        "operationId": "image_file_api_v1_images__generation_id__files__index__get",
        "parameters": [
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          },
          {
            "name": "index",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "title": "Index"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/images/{generation_id}/cancel": {
      "post": {
        "tags": [
          "Images"
        ],
        "summary": "Image Cancel",
        "description": "Stop a running generation. Images already finished stay available.",
        "operationId": "image_cancel_api_v1_images__generation_id__cancel_post",
        "parameters": [
          {
            "name": "generation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Generation Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/uploads": {
      "post": {
        "tags": [
          "Uploads"
        ],
        "summary": "Start a chunked upload",
        "operationId": "upload_begin_api_v1_uploads_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadBeginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/uploads/{upload_id}/chunk": {
      "post": {
        "tags": [
          "Uploads"
        ],
        "summary": "Append a base64 chunk to an upload",
        "operationId": "upload_chunk_api_v1_uploads__upload_id__chunk_post",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Upload Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadChunkRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/uploads/{upload_id}/abort": {
      "post": {
        "tags": [
          "Uploads"
        ],
        "summary": "Discard an upload",
        "operationId": "upload_abort_api_v1_uploads__upload_id__abort_post",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Upload Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/uploads/{upload_id}/clips-project": {
      "post": {
        "tags": [
          "Uploads"
        ],
        "summary": "Create a Viral Clips project from an upload",
        "operationId": "upload_clips_project_api_v1_uploads__upload_id__clips_project_post",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Upload Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadClipsProjectRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/uploads/{upload_id}/aicut-project": {
      "post": {
        "tags": [
          "Uploads"
        ],
        "summary": "Create an AI Cut project from an upload",
        "operationId": "upload_aicut_project_api_v1_uploads__upload_id__aicut_project_post",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Upload Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadClipsProjectRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/uploads/{upload_id}/dubbing-project": {
      "post": {
        "tags": [
          "Uploads"
        ],
        "summary": "Create a dubbing project from an upload",
        "operationId": "upload_dubbing_project_api_v1_uploads__upload_id__dubbing_project_post",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Upload Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadDubbingProjectRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AiCutCreateRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "default": ""
          },
          "source_path": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Path"
          },
          "file_base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "File Base64"
          },
          "filename": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filename"
          }
        },
        "type": "object",
        "title": "AiCutCreateRequest"
      },
      "AiCutOverdubRequest": {
        "properties": {
          "entry": {
            "additionalProperties": true,
            "type": "object",
            "title": "Entry"
          }
        },
        "type": "object",
        "title": "AiCutOverdubRequest"
      },
      "AiCutRenderRequest": {
        "properties": {
          "cuts": {
            "items": {},
            "type": "array",
            "title": "Cuts"
          },
          "options": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Options"
          },
          "spec": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spec"
          }
        },
        "type": "object",
        "title": "AiCutRenderRequest"
      },
      "AiCutUpdateRequest": {
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "settings": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Settings"
          },
          "script": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Script"
          },
          "overrides": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Overrides"
          }
        },
        "type": "object",
        "title": "AiCutUpdateRequest"
      },
      "AlignVoiceRequest": {
        "properties": {
          "force": {
            "type": "boolean",
            "title": "Force",
            "description": "Align again even if the voice is already aligned or was found to hold no speech",
            "default": false
          }
        },
        "type": "object",
        "title": "AlignVoiceRequest"
      },
      "AlignVoiceResponse": {
        "properties": {
          "state": {
            "type": "string",
            "enum": [
              "done",
              "no_speech",
              "failed",
              "pending"
            ],
            "title": "State",
            "description": "Where the voice's alignment stands once the call returns"
          }
        },
        "type": "object",
        "required": [
          "state"
        ],
        "title": "AlignVoiceResponse"
      },
      "AppVersionResponse": {
        "properties": {
          "version": {
            "type": "string",
            "title": "Version",
            "description": "Application version string from version.txt"
          }
        },
        "type": "object",
        "required": [
          "version"
        ],
        "title": "AppVersionResponse"
      },
      "AsrModelOption": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Model ID"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Display name"
          },
          "description": {
            "type": "string",
            "title": "Description",
            "description": "Short description"
          },
          "family": {
            "type": "string",
            "title": "Family",
            "description": "Model family (e.g. 'Qwen3-ASR', 'Parakeet v3', 'Orukeet')"
          },
          "vram_mb": {
            "type": "integer",
            "title": "Vram Mb",
            "description": "Approximate VRAM requirement in MB"
          },
          "languages": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Languages",
            "description": "Supported transcription languages"
          },
          "selected": {
            "type": "boolean",
            "title": "Selected",
            "description": "Whether this model is currently active"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "description",
          "family",
          "vram_mb",
          "languages",
          "selected"
        ],
        "title": "AsrModelOption"
      },
      "AsrModelSetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Always true on 200; failures are returned as HTTP 4xx"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "True if the active model changed, false if it was already set"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "AsrModelSetResponse"
      },
      "AsrModelsGetResponse": {
        "properties": {
          "options": {
            "items": {
              "$ref": "#/components/schemas/AsrModelOption"
            },
            "type": "array",
            "title": "Options",
            "description": "Available ASR models"
          },
          "current": {
            "type": "string",
            "title": "Current",
            "description": "ID of the currently selected model"
          }
        },
        "type": "object",
        "required": [
          "options",
          "current"
        ],
        "title": "AsrModelsGetResponse"
      },
      "AudioConvertRequest": {
        "properties": {
          "audio_base64": {
            "type": "string",
            "title": "Audio Base64",
            "description": "Base64-encoded WAV audio to convert"
          },
          "format": {
            "type": "string",
            "title": "Format",
            "description": "Target format ID (e.g. 'mp3', 'flac')"
          }
        },
        "type": "object",
        "required": [
          "audio_base64",
          "format"
        ],
        "title": "AudioConvertRequest"
      },
      "AudioConvertResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether conversion succeeded"
          },
          "audio_base64": {
            "type": "string",
            "title": "Audio Base64",
            "description": "Base64-encoded converted audio"
          },
          "format": {
            "type": "string",
            "title": "Format",
            "description": "Format the audio was converted to"
          }
        },
        "type": "object",
        "required": [
          "success",
          "audio_base64",
          "format"
        ],
        "title": "AudioConvertResponse"
      },
      "AudioFormatGetResponse": {
        "properties": {
          "options": {
            "items": {
              "$ref": "#/components/schemas/AudioFormatOption"
            },
            "type": "array",
            "title": "Options",
            "description": "Available audio output formats"
          },
          "current": {
            "type": "string",
            "title": "Current",
            "description": "Currently selected format ID"
          }
        },
        "type": "object",
        "required": [
          "options",
          "current"
        ],
        "title": "AudioFormatGetResponse"
      },
      "AudioFormatOption": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Format identifier (e.g. 'wav', 'mp3')"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Display name for the format"
          },
          "extension": {
            "type": "string",
            "title": "Extension",
            "description": "File extension (e.g. '.wav', '.mp3')"
          },
          "selected": {
            "type": "boolean",
            "title": "Selected",
            "description": "Whether this format is currently selected"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "extension",
          "selected"
        ],
        "title": "AudioFormatOption"
      },
      "AudioFormatSetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the format was actually changed"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Optional status message"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "AudioFormatSetResponse"
      },
      "AudiobookAssignSpeakersRequest": {
        "properties": {
          "detect_emotions": {
            "type": "boolean",
            "title": "Detect Emotions",
            "description": "Also pick a delivery emotion for each line",
            "default": false
          },
          "mode": {
            "type": "string",
            "title": "Mode",
            "description": "'speakers' to attribute dialogue, 'emotions' to only mark narration emotion, 'both' to attribute then mark emotion in one run",
            "default": "speakers"
          }
        },
        "type": "object",
        "title": "AudiobookAssignSpeakersRequest"
      },
      "AudiobookCreateRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Project name"
          },
          "file_base64": {
            "type": "string",
            "title": "File Base64",
            "description": "Base64-encoded document file"
          },
          "filename": {
            "type": "string",
            "title": "Filename",
            "description": "Original filename for format detection"
          },
          "speaker_assignments": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Speaker Assignments",
            "description": "Optional {speaker_label: voice_spec} for script import"
          },
          "project_model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Project Model Family",
            "description": "Optional TTS model family to set on the created project"
          },
          "detect_emotions": {
            "type": "boolean",
            "title": "Detect Emotions",
            "description": "Turn on per-line emotion detection for the created project",
            "default": false
          }
        },
        "type": "object",
        "required": [
          "name",
          "file_base64",
          "filename"
        ],
        "title": "AudiobookCreateRequest"
      },
      "AudiobookDesignCastRequest": {
        "properties": {
          "labels": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Labels",
            "description": "Only design these characters; every uncast one when omitted"
          },
          "prompt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Prompt",
            "description": "Voice-design instruction to use instead of the one composed from the character's traits"
          }
        },
        "type": "object",
        "title": "AudiobookDesignCastRequest"
      },
      "AudiobookDetectSpeakersRequest": {
        "properties": {
          "text": {
            "type": "string",
            "title": "Text",
            "description": "Raw script text to scan for speakers"
          }
        },
        "type": "object",
        "required": [
          "text"
        ],
        "title": "AudiobookDetectSpeakersRequest"
      },
      "AudiobookDramatizeRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Name for the dramatized project this creates"
          },
          "review": {
            "type": "boolean",
            "title": "Review",
            "description": "Run a second pass over the generated script",
            "default": false
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "AudiobookDramatizeRequest"
      },
      "AudiobookLLMConfigRequest": {
        "properties": {
          "provider": {
            "type": "string",
            "title": "Provider",
            "default": "gemini"
          },
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Api Key",
            "description": "Omit to keep the provider's stored key"
          },
          "base_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Base Url",
            "description": "Omit to keep the provider's stored base URL"
          },
          "model": {
            "type": "string",
            "title": "Model",
            "default": ""
          },
          "disable_thinking": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Disable Thinking",
            "description": "Omit to keep the stored reasoning setting"
          },
          "provider_order": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Provider Order",
            "description": "OpenRouter provider slugs, comma-separated; omit to keep, empty to clear"
          },
          "reasoning_effort": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reasoning Effort",
            "description": "One of the model's supported efforts (low, high, max...); omit to keep, empty for the default"
          }
        },
        "type": "object",
        "title": "AudiobookLLMConfigRequest"
      },
      "AudiobookLLMModelRequest": {
        "properties": {
          "model": {
            "type": "string",
            "title": "Model",
            "description": "Model id for the audiobook feature, empty for provider default",
            "default": ""
          }
        },
        "type": "object",
        "title": "AudiobookLLMModelRequest"
      },
      "AudiobookRenameRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "New project name"
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "AudiobookRenameRequest"
      },
      "BatchGenerateRequest": {
        "properties": {
          "segment_ids": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Segment Ids"
          },
          "section_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Section Id"
          }
        },
        "type": "object",
        "title": "BatchGenerateRequest"
      },
      "Body_audiobook_reparse_project_api_v1_audiobook_projects__project_id__reparse_post": {
        "properties": {
          "include_skipped": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Include Skipped"
          }
        },
        "type": "object",
        "title": "Body_audiobook_reparse_project_api_v1_audiobook_projects__project_id__reparse_post"
      },
      "Body_audiobook_upload_cover_api_v1_audiobook_projects__project_id__cover_post": {
        "properties": {
          "file": {
            "type": "string",
            "contentMediaType": "application/octet-stream",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_audiobook_upload_cover_api_v1_audiobook_projects__project_id__cover_post"
      },
      "Body_audiobook_upload_take_api_v1_audiobook_projects__project_id__segments__segment_id__upload_take_post": {
        "properties": {
          "file": {
            "type": "string",
            "contentMediaType": "application/octet-stream",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_audiobook_upload_take_api_v1_audiobook_projects__project_id__segments__segment_id__upload_take_post"
      },
      "BulkSegmentIdsRequest": {
        "properties": {
          "segment_ids": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Segment Ids",
            "description": "Segment IDs to operate on"
          }
        },
        "type": "object",
        "required": [
          "segment_ids"
        ],
        "title": "BulkSegmentIdsRequest"
      },
      "CacheInfoResponse": {
        "properties": {
          "model_cache_size": {
            "type": "string",
            "title": "Model Cache Size",
            "description": "Human-readable model cache size (e.g. '1.2 GB')"
          },
          "pip_cache_size": {
            "type": "string",
            "title": "Pip Cache Size",
            "description": "Human-readable pip cache size (e.g. '500 MB')"
          },
          "data_folder": {
            "type": "string",
            "title": "Data Folder",
            "description": "Absolute path to the active data folder"
          },
          "is_custom_data_folder": {
            "type": "boolean",
            "title": "Is Custom Data Folder",
            "description": "Whether a custom data folder is configured"
          },
          "default_data_folder": {
            "type": "string",
            "title": "Default Data Folder",
            "description": "Absolute path to the default data folder"
          },
          "custom_data_folder_unavailable": {
            "type": "boolean",
            "title": "Custom Data Folder Unavailable",
            "description": "Whether the configured custom folder is inaccessible"
          },
          "configured_custom_path": {
            "type": "string",
            "title": "Configured Custom Path",
            "description": "Configured custom data folder path (may be empty)"
          }
        },
        "type": "object",
        "required": [
          "model_cache_size",
          "pip_cache_size",
          "data_folder",
          "is_custom_data_folder",
          "default_data_folder",
          "custom_data_folder_unavailable",
          "configured_custom_path"
        ],
        "title": "CacheInfoResponse"
      },
      "ClipsCreateRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          },
          "source_path": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Path",
            "description": "Server-local path to the source video"
          },
          "file_base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "File Base64",
            "description": "Base64-encoded source video (upload-create)"
          },
          "filename": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filename",
            "description": "Original filename of the uploaded video"
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "ClipsCreateRequest"
      },
      "ClipsExportRequest": {
        "properties": {
          "container": {
            "type": "string",
            "enum": [
              "mp4",
              "mov",
              "mkv"
            ],
            "title": "Container",
            "description": "Output container",
            "default": "mp4"
          },
          "quality": {
            "type": "string",
            "enum": [
              "original",
              "high",
              "medium",
              "small"
            ],
            "title": "Quality",
            "description": "original copies the stored clip with no re-encode",
            "default": "original"
          },
          "resolution": {
            "type": "string",
            "enum": [
              "original",
              "1080",
              "720"
            ],
            "title": "Resolution",
            "description": "Output width; original keeps the rendered size",
            "default": "original"
          }
        },
        "type": "object",
        "title": "ClipsExportRequest"
      },
      "ClipsLLMConfigRequest": {
        "properties": {
          "provider": {
            "type": "string",
            "title": "Provider",
            "default": "gemini"
          },
          "api_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Api Key",
            "description": "Omit to keep the provider's stored key"
          },
          "base_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Base Url",
            "description": "Omit to keep the provider's stored base URL"
          },
          "model": {
            "type": "string",
            "title": "Model",
            "default": ""
          },
          "disable_thinking": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Disable Thinking",
            "description": "Omit to keep the stored reasoning setting"
          },
          "provider_order": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Provider Order",
            "description": "OpenRouter provider slugs, comma-separated; omit to keep, empty to clear"
          },
          "reasoning_effort": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reasoning Effort",
            "description": "One of the model's supported efforts (low, high, max...); omit to keep, empty for the default"
          }
        },
        "type": "object",
        "title": "ClipsLLMConfigRequest"
      },
      "ClipsLLMModelRequest": {
        "properties": {
          "model": {
            "type": "string",
            "title": "Model",
            "description": "Model id for the clips feature, empty for provider default",
            "default": ""
          }
        },
        "type": "object",
        "title": "ClipsLLMModelRequest"
      },
      "ClipsRerenderRequest": {
        "properties": {
          "overrides": {
            "additionalProperties": true,
            "type": "object",
            "title": "Overrides"
          }
        },
        "type": "object",
        "title": "ClipsRerenderRequest"
      },
      "ClipsRunRequest": {
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "resume",
              "regenerate",
              "more"
            ],
            "title": "Mode",
            "description": "resume | regenerate | more",
            "default": "resume"
          }
        },
        "type": "object",
        "title": "ClipsRunRequest"
      },
      "ClipsYoutubeRequest": {
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name",
            "description": "Project name (falls back to the video title)"
          },
          "url": {
            "type": "string",
            "title": "Url",
            "description": "YouTube video URL to download"
          },
          "max_height": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Height",
            "description": "Cap video resolution (e.g. 1080); None keeps best quality"
          }
        },
        "type": "object",
        "required": [
          "url"
        ],
        "title": "ClipsYoutubeRequest"
      },
      "CloneRequest": {
        "properties": {
          "ref_audio_base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ref Audio Base64",
            "description": "Base64-encoded reference audio (WAV). Optional if voice_id is provided.",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "ref_text": {
            "type": "string",
            "title": "Ref Text",
            "description": "Transcript of the reference audio",
            "default": "",
            "examples": [
              "Hello, this is a sample of my voice."
            ]
          },
          "target_text": {
            "type": "string",
            "title": "Target Text",
            "description": "Text to generate speech for",
            "examples": [
              "Welcome to the voice cloning demo."
            ]
          },
          "language": {
            "type": "string",
            "title": "Language",
            "description": "Target language. Query GET /api/v1/models/active for supported languages per variant.",
            "default": "Auto",
            "examples": [
              "English"
            ]
          },
          "voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Id",
            "description": "Voice ID for prompt caching. If provided, saved audio is used as fallback when ref_audio_base64 is omitted.",
            "examples": [
              "a1b2c3d4"
            ]
          },
          "quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quality",
            "description": "Quality/variant tier. Query GET /api/v1/models/active for available tiers.",
            "examples": [
              "higher_quality"
            ]
          },
          "generation_params": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GenerationParamsModel"
              },
              {
                "type": "null"
              }
            ],
            "description": "Advanced sampling parameters"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family",
            "description": "TTS model to use. If omitted, uses the currently configured model. Triggers auto-load if needed.",
            "examples": [
              "qwen3-tts"
            ]
          },
          "emotion": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Emotion",
            "description": "Emotion to apply. If set and not 'neutral', uses emotional clone. Query GET /api/v1/models/active for supported emotions.",
            "examples": [
              "angry"
            ]
          },
          "intensity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Intensity",
            "description": "Emotion intensity (very_mild/mild/normal/strong/extreme). Defaults to 'normal' when emotion is set.",
            "examples": [
              "normal"
            ]
          }
        },
        "type": "object",
        "required": [
          "target_text"
        ],
        "title": "CloneRequest"
      },
      "ConvertVoiceRequest": {
        "properties": {
          "source_audio_base64": {
            "type": "string",
            "title": "Source Audio Base64",
            "description": "Base64-encoded source audio (WAV) whose speech will be converted",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "target_voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Target Voice Id",
            "description": "Saved library voice to convert to. Either this or target_audio_base64 is required.",
            "examples": [
              "a1b2c3d4"
            ]
          },
          "target_audio_base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Target Audio Base64",
            "description": "Base64-encoded target reference audio (WAV), 6-10 seconds of clean speech",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family",
            "description": "Voice conversion model. Query GET /api/v1/conversion/models for options. Defaults to chatterbox.",
            "examples": [
              "chatterbox"
            ]
          },
          "cfg_rate": {
            "anyOf": [
              {
                "type": "number",
                "maximum": 1.0,
                "minimum": 0.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Cfg Rate",
            "description": "Classifier-free guidance strength for the S3Gen flow. Higher pushes harder toward the target voice. Defaults to 0.7.",
            "examples": [
              0.7
            ]
          },
          "steps": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 50.0,
                "minimum": 1.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Steps",
            "description": "Flow-matching diffusion steps. More steps can sound smoother but take longer. Defaults to 10.",
            "examples": [
              10
            ]
          }
        },
        "type": "object",
        "required": [
          "source_audio_base64"
        ],
        "title": "ConvertVoiceRequest"
      },
      "DesignRequest": {
        "properties": {
          "instruct_text": {
            "type": "string",
            "title": "Instruct Text",
            "description": "Natural language description of the voice",
            "examples": [
              "A warm female voice with a British accent, speaking at a moderate pace"
            ]
          },
          "target_text": {
            "type": "string",
            "title": "Target Text",
            "description": "Text to generate speech for. Required for most models; for Dramabox, the instruct_text prompt contains both stage directions and spoken text.",
            "default": "",
            "examples": [
              "Welcome to our application."
            ]
          },
          "language": {
            "type": "string",
            "title": "Language",
            "description": "Target language. Query GET /api/v1/models/active for supported languages per variant.",
            "default": "Auto",
            "examples": [
              "English"
            ]
          },
          "generation_params": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GenerationParamsModel"
              },
              {
                "type": "null"
              }
            ],
            "description": "Advanced sampling parameters"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family",
            "description": "TTS model to use. If omitted, uses the currently configured model.",
            "examples": [
              "qwen3-tts"
            ]
          },
          "voice_reference_path": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Reference Path",
            "description": "Path to a reference audio file for voice conditioning (Dramabox only)."
          }
        },
        "type": "object",
        "required": [
          "instruct_text"
        ],
        "title": "DesignRequest"
      },
      "DubbingAddSpeakerRequest": {
        "properties": {
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Label"
          },
          "voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Id"
          },
          "source": {
            "type": "string",
            "title": "Source",
            "default": "library"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family"
          }
        },
        "type": "object",
        "title": "DubbingAddSpeakerRequest"
      },
      "DubbingCreateRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          },
          "source_video_path": {
            "type": "string",
            "title": "Source Video Path"
          },
          "source_lang": {
            "type": "string",
            "title": "Source Lang",
            "default": "auto"
          },
          "target_lang": {
            "type": "string",
            "title": "Target Lang"
          },
          "keep_background": {
            "type": "boolean",
            "title": "Keep Background",
            "default": true
          },
          "timing_mode": {
            "type": "string",
            "title": "Timing Mode",
            "default": "hybrid"
          },
          "default_voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Voice Id"
          },
          "default_voice_source": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Voice Source",
            "default": "library"
          },
          "default_voice_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Voice Model"
          },
          "num_speakers": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Num Speakers"
          },
          "kind": {
            "type": "string",
            "title": "Kind",
            "default": "dubbing"
          },
          "clone_voices": {
            "type": "boolean",
            "title": "Clone Voices",
            "default": false
          },
          "diarization_engine": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "pyannote",
                  "nemotron"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Diarization Engine"
          }
        },
        "type": "object",
        "required": [
          "name",
          "source_video_path",
          "target_lang"
        ],
        "title": "DubbingCreateRequest"
      },
      "DubbingDeleteSpeakerRequest": {
        "properties": {
          "reassign_to": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reassign To",
            "description": "Speaker who inherits the removed speaker's segments"
          }
        },
        "type": "object",
        "title": "DubbingDeleteSpeakerRequest"
      },
      "DubbingExportOptionsRequest": {
        "properties": {
          "options": {
            "additionalProperties": true,
            "type": "object",
            "title": "Options",
            "default": {}
          }
        },
        "type": "object",
        "title": "DubbingExportOptionsRequest"
      },
      "DubbingExportRequest": {
        "properties": {
          "lipsynced": {
            "type": "boolean",
            "title": "Lipsynced",
            "default": false
          },
          "subtitles": {
            "type": "boolean",
            "title": "Subtitles",
            "default": true
          }
        },
        "type": "object",
        "title": "DubbingExportRequest"
      },
      "DubbingGlossaryRequest": {
        "properties": {
          "entries": {
            "items": {},
            "type": "array",
            "title": "Entries",
            "default": []
          }
        },
        "type": "object",
        "title": "DubbingGlossaryRequest"
      },
      "DubbingReferenceFromSegmentRequest": {
        "properties": {
          "segment_id": {
            "type": "string",
            "title": "Segment Id",
            "description": "Segment whose audio and text become the clone reference"
          }
        },
        "type": "object",
        "required": [
          "segment_id"
        ],
        "title": "DubbingReferenceFromSegmentRequest"
      },
      "DubbingRenameRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "New project name",
            "examples": [
              "Launch video (French)"
            ]
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "DubbingRenameRequest"
      },
      "DubbingRenameSpeakerRequest": {
        "properties": {
          "label": {
            "type": "string",
            "title": "Label",
            "description": "New display name for the speaker",
            "examples": [
              "Amy"
            ]
          }
        },
        "type": "object",
        "required": [
          "label"
        ],
        "title": "DubbingRenameSpeakerRequest"
      },
      "DubbingRunRequest": {
        "properties": {
          "lipsync": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lipsync",
            "description": "Force lip sync on/off; defaults to the project's auto_lipsync setting"
          }
        },
        "type": "object",
        "title": "DubbingRunRequest"
      },
      "DubbingSegmentUpdateRequest": {
        "properties": {
          "updates": {
            "additionalProperties": true,
            "type": "object",
            "title": "Updates"
          }
        },
        "type": "object",
        "required": [
          "updates"
        ],
        "title": "DubbingSegmentUpdateRequest"
      },
      "DubbingSpeakerReferenceRequest": {
        "properties": {
          "wav_base64": {
            "type": "string",
            "title": "Wav Base64",
            "description": "Trimmed reference clip (base64 WAV)"
          },
          "ref_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ref Text",
            "description": "Client-transcribed transcript of the clip"
          }
        },
        "type": "object",
        "required": [
          "wav_base64"
        ],
        "title": "DubbingSpeakerReferenceRequest"
      },
      "DubbingSpeakerVoiceRequest": {
        "properties": {
          "voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Id"
          },
          "source": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source",
            "default": "library"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family"
          }
        },
        "type": "object",
        "title": "DubbingSpeakerVoiceRequest"
      },
      "DubbingSplitRequest": {
        "properties": {
          "word_index": {
            "type": "integer",
            "title": "Word Index",
            "description": "Split before this word index"
          }
        },
        "type": "object",
        "required": [
          "word_index"
        ],
        "title": "DubbingSplitRequest"
      },
      "DubbingSubtitleParamsRequest": {
        "properties": {
          "params": {
            "additionalProperties": true,
            "type": "object",
            "title": "Params",
            "default": {}
          }
        },
        "type": "object",
        "title": "DubbingSubtitleParamsRequest"
      },
      "DubbingYoutubeCreateRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "examples": [
              "Launch video"
            ]
          },
          "url": {
            "type": "string",
            "title": "Url",
            "description": "YouTube URL to download and dub",
            "examples": [
              "https://www.youtube.com/watch?v=abc123"
            ]
          },
          "source_lang": {
            "type": "string",
            "title": "Source Lang",
            "default": "auto",
            "examples": [
              "auto"
            ]
          },
          "target_lang": {
            "type": "string",
            "title": "Target Lang",
            "examples": [
              "fr"
            ]
          },
          "keep_background": {
            "type": "boolean",
            "title": "Keep Background",
            "default": true
          },
          "timing_mode": {
            "type": "string",
            "title": "Timing Mode",
            "default": "hybrid"
          },
          "default_voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Voice Id"
          },
          "default_voice_source": {
            "type": "string",
            "title": "Default Voice Source",
            "default": "library"
          },
          "default_voice_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Voice Model"
          },
          "clone_voices": {
            "type": "boolean",
            "title": "Clone Voices",
            "default": false
          }
        },
        "type": "object",
        "required": [
          "name",
          "url",
          "target_lang"
        ],
        "title": "DubbingYoutubeCreateRequest"
      },
      "ExportRequest": {
        "properties": {
          "format": {
            "type": "string",
            "title": "Format",
            "default": "mp3"
          },
          "options": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Options"
          },
          "allow_missing": {
            "type": "boolean",
            "title": "Allow Missing",
            "default": false
          }
        },
        "type": "object",
        "title": "ExportRequest"
      },
      "GenerationParamsModel": {
        "properties": {
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Seed",
            "description": "Random seed for reproducible generation",
            "examples": [
              42
            ]
          }
        },
        "additionalProperties": true,
        "type": "object",
        "title": "GenerationParamsModel",
        "description": "Model-specific generation parameters.\n\nAvailable parameters vary by model. Query GET /api/v1/models/active\nto discover parameter names, types, ranges, and defaults.\nUnknown parameters for the active model will be rejected."
      },
      "GenerationProgressResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "description": "Generation status (idle, generating, streaming, complete, error, cancelled)",
            "examples": [
              "generating"
            ]
          },
          "message": {
            "type": "string",
            "title": "Message",
            "description": "Human-readable progress message",
            "examples": [
              "Generating audio..."
            ]
          },
          "percent": {
            "type": "integer",
            "title": "Percent",
            "description": "Generation progress percentage (0-100)",
            "examples": [
              45
            ]
          }
        },
        "type": "object",
        "required": [
          "status",
          "message",
          "percent"
        ],
        "title": "GenerationProgressResponse"
      },
      "GenerationQueueResponse": {
        "properties": {
          "queue_size": {
            "type": "integer",
            "title": "Queue Size",
            "description": "Number of jobs waiting in the queue"
          },
          "is_generating": {
            "type": "boolean",
            "title": "Is Generating",
            "description": "Whether a generation is currently running"
          }
        },
        "type": "object",
        "required": [
          "queue_size",
          "is_generating"
        ],
        "title": "GenerationQueueResponse"
      },
      "GenerationResult": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether generation completed successfully",
            "examples": [
              true
            ]
          },
          "status": {
            "type": "string",
            "title": "Status",
            "description": "Human-readable status message",
            "examples": [
              "Generated successfully"
            ]
          },
          "audio_base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audio Base64",
            "description": "Base64-encoded audio output (WAV format)",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Code",
            "description": "Machine-readable failure code when success is false",
            "examples": [
              "language_unsupported"
            ]
          },
          "error_detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Detail",
            "description": "Extra detail for the failure code"
          }
        },
        "type": "object",
        "required": [
          "success",
          "status"
        ],
        "title": "GenerationResult"
      },
      "GenerationStartedResponse": {
        "properties": {
          "started": {
            "type": "boolean",
            "title": "Started",
            "description": "Whether the generation job was enqueued",
            "examples": [
              true
            ]
          },
          "queue_position": {
            "type": "integer",
            "title": "Queue Position",
            "description": "Position in the generation queue (0 = next to run)",
            "examples": [
              0
            ]
          }
        },
        "type": "object",
        "required": [
          "started",
          "queue_position"
        ],
        "title": "GenerationStartedResponse"
      },
      "GenerationStopResponse": {
        "properties": {
          "stopped": {
            "type": "boolean",
            "title": "Stopped",
            "description": "Whether the cancellation signal was sent"
          },
          "queue_cleared": {
            "type": "integer",
            "title": "Queue Cleared",
            "description": "Number of pending jobs removed from the queue"
          }
        },
        "type": "object",
        "required": [
          "stopped",
          "queue_cleared"
        ],
        "title": "GenerationStopResponse"
      },
      "GpuDevice": {
        "properties": {
          "index": {
            "type": "integer",
            "title": "Index",
            "description": "CUDA device index"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "GPU device name"
          },
          "vram_mb": {
            "type": "integer",
            "title": "Vram Mb",
            "description": "Available VRAM in megabytes"
          }
        },
        "type": "object",
        "required": [
          "index",
          "name",
          "vram_mb"
        ],
        "title": "GpuDevice"
      },
      "GpuDevicesResponse": {
        "properties": {
          "devices": {
            "items": {
              "$ref": "#/components/schemas/GpuDevice"
            },
            "type": "array",
            "title": "Devices",
            "description": "Available CUDA GPU devices"
          },
          "current_index": {
            "type": "integer",
            "title": "Current Index",
            "description": "Currently selected device index"
          }
        },
        "type": "object",
        "required": [
          "devices",
          "current_index"
        ],
        "title": "GpuDevicesResponse"
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
          }
        },
        "type": "object",
        "title": "HTTPValidationError"
      },
      "HistoryItem": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Unique history item identifier",
            "examples": [
              "h1b2c3d4"
            ]
          },
          "text": {
            "type": "string",
            "title": "Text",
            "description": "Truncated generated text (for display)",
            "examples": [
              "Welcome to our..."
            ]
          },
          "full_text": {
            "type": "string",
            "title": "Full Text",
            "description": "Full generated text",
            "examples": [
              "Welcome to our application."
            ]
          },
          "mode": {
            "type": "string",
            "title": "Mode",
            "description": "Generation mode used (clone, design, tts)",
            "examples": [
              "clone"
            ]
          },
          "created_at": {
            "type": "string",
            "title": "Created At",
            "description": "ISO 8601 creation timestamp",
            "examples": [
              "2026-01-15T10:30:00Z"
            ]
          },
          "duration_seconds": {
            "type": "number",
            "title": "Duration Seconds",
            "description": "Audio duration in seconds",
            "examples": [
              3.2
            ]
          },
          "file_size": {
            "type": "integer",
            "title": "File Size",
            "description": "Audio file size in bytes",
            "examples": [
              102400
            ]
          },
          "ref_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ref Text",
            "description": "Reference text (clone mode)"
          },
          "voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Id",
            "description": "Voice ID used (clone mode)"
          },
          "voice_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Name",
            "description": "Voice name used (clone mode)"
          },
          "instruct_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Instruct Text",
            "description": "Voice description (design mode)"
          },
          "design_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Design Id",
            "description": "Design voice ID (design mode)"
          },
          "design_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Design Name",
            "description": "Design voice name (design mode)"
          },
          "speaker": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Speaker",
            "description": "Speaker ID (tts mode)"
          },
          "speaker_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Speaker Name",
            "description": "Speaker name (tts mode)"
          }
        },
        "additionalProperties": true,
        "type": "object",
        "required": [
          "id",
          "text",
          "full_text",
          "mode",
          "created_at",
          "duration_seconds",
          "file_size"
        ],
        "title": "HistoryItem"
      },
      "HistoryListResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/HistoryItem"
            },
            "type": "array",
            "title": "Items",
            "description": "Generation history items, newest first"
          }
        },
        "type": "object",
        "required": [
          "items"
        ],
        "title": "HistoryListResponse"
      },
      "HistoryLoadResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the history item was loaded successfully"
          },
          "audio_base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audio Base64",
            "description": "Base64-encoded audio (WAV)"
          },
          "metadata": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HistoryItem"
              },
              {
                "type": "null"
              }
            ],
            "description": "Full history item metadata"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Error message if load failed"
          }
        },
        "type": "object",
        "required": [
          "success"
        ],
        "title": "HistoryLoadResponse"
      },
      "HistorySaveResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the history item was saved successfully"
          },
          "item": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HistoryItem"
              },
              {
                "type": "null"
              }
            ],
            "description": "Saved history item metadata"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Error message if save failed"
          }
        },
        "type": "object",
        "required": [
          "success"
        ],
        "title": "HistorySaveResponse"
      },
      "HttpApiSettingResponse": {
        "properties": {
          "enabled": {
            "type": "boolean",
            "title": "Enabled",
            "description": "Whether the HTTP API server is enabled"
          },
          "port": {
            "type": "integer",
            "title": "Port",
            "description": "Configured HTTP API port number"
          }
        },
        "type": "object",
        "required": [
          "enabled",
          "port"
        ],
        "title": "HttpApiSettingResponse"
      },
      "HttpApiSettingSetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the setting was actually changed"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Optional status message"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "HttpApiSettingSetResponse"
      },
      "ImageGenerateRequest": {
        "properties": {
          "model_id": {
            "type": "string",
            "maxLength": 64,
            "title": "Model Id",
            "description": "Image model, from GET /api/v1/images/models"
          },
          "prompt": {
            "type": "string",
            "maxLength": 2000,
            "minLength": 1,
            "title": "Prompt",
            "description": "What to draw"
          },
          "negative_prompt": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2000
              },
              {
                "type": "null"
              }
            ],
            "title": "Negative Prompt",
            "description": "What to avoid. Only for models whose negative_prompt is true"
          },
          "count": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 8.0,
                "minimum": 1.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Count",
            "description": "Number of images. Defaults to the model's images value"
          },
          "aspect": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "9:16",
                  "16:9",
                  "1:1"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Aspect",
            "description": "Image shape. Defaults to the model's size"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 2147483647.0,
                "minimum": 0.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Seed",
            "description": "Seed for the first image. Each next image uses the next seed"
          },
          "steps": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 100.0,
                "minimum": 1.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Steps",
            "description": "Sampling steps, within the model's steps_range. Defaults to the model's steps"
          },
          "guidance": {
            "anyOf": [
              {
                "type": "number",
                "maximum": 20.0,
                "minimum": 0.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Guidance",
            "description": "Prompt guidance, within the model's guidance_range. Defaults to the model's guidance"
          }
        },
        "type": "object",
        "required": [
          "model_id",
          "prompt"
        ],
        "title": "ImageGenerateRequest"
      },
      "LanguageOption": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Language identifier (e.g. 'English', 'Japanese')"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Display name for the language"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "title": "LanguageOption"
      },
      "LanguagesResponse": {
        "properties": {
          "languages": {
            "items": {
              "$ref": "#/components/schemas/LanguageOption"
            },
            "type": "array",
            "title": "Languages",
            "description": "Supported TTS languages"
          }
        },
        "type": "object",
        "required": [
          "languages"
        ],
        "title": "LanguagesResponse"
      },
      "LexiconAddRequest": {
        "properties": {
          "phrase": {
            "type": "string",
            "title": "Phrase"
          },
          "pronunciation": {
            "type": "string",
            "title": "Pronunciation"
          }
        },
        "type": "object",
        "required": [
          "phrase",
          "pronunciation"
        ],
        "title": "LexiconAddRequest"
      },
      "LexiconImportRequest": {
        "properties": {
          "entries": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array",
            "title": "Entries"
          },
          "replace_conflicts": {
            "type": "boolean",
            "title": "Replace Conflicts",
            "default": false
          }
        },
        "type": "object",
        "required": [
          "entries"
        ],
        "title": "LexiconImportRequest"
      },
      "LexiconUpdateRequest": {
        "properties": {
          "phrase": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Phrase"
          },
          "pronunciation": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pronunciation"
          }
        },
        "type": "object",
        "title": "LexiconUpdateRequest"
      },
      "LowVramGetResponse": {
        "properties": {
          "enabled": {
            "type": "boolean",
            "title": "Enabled",
            "description": "Whether low VRAM mode is currently enabled"
          }
        },
        "type": "object",
        "required": [
          "enabled"
        ],
        "title": "LowVramGetResponse"
      },
      "LowVramSetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the setting was actually changed"
          },
          "needs_reload": {
            "type": "boolean",
            "title": "Needs Reload",
            "description": "Whether the TTS model needs to be reloaded"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed",
          "needs_reload"
        ],
        "title": "LowVramSetResponse"
      },
      "MicPttShortcutResponse": {
        "properties": {
          "modifier": {
            "type": "string",
            "title": "Modifier",
            "description": "PTT modifier ('Alt' or 'Ctrl')"
          },
          "key": {
            "type": "string",
            "title": "Key",
            "description": "PTT key (e.g. 'Space', 'M', 'F2')"
          }
        },
        "type": "object",
        "required": [
          "modifier",
          "key"
        ],
        "title": "MicPttShortcutResponse"
      },
      "MicPttShortcutSetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "True on 200"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "True if either modifier or key changed"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "MicPttShortcutSetResponse"
      },
      "ModeOption": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Mode identifier (clone, design, tts, stt)"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Localized display name"
          },
          "description": {
            "type": "string",
            "title": "Description",
            "description": "Localized description of the mode"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "description"
        ],
        "title": "ModeOption"
      },
      "ModeOptionsResponse": {
        "properties": {
          "options": {
            "items": {
              "$ref": "#/components/schemas/ModeOption"
            },
            "type": "array",
            "title": "Options",
            "description": "Available generation modes"
          },
          "current": {
            "type": "string",
            "title": "Current",
            "description": "Currently selected mode ID"
          }
        },
        "type": "object",
        "required": [
          "options",
          "current"
        ],
        "title": "ModeOptionsResponse"
      },
      "ModelCapabilitiesResponse": {
        "properties": {
          "model_family": {
            "type": "string",
            "title": "Model Family",
            "description": "Model family identifier"
          },
          "display_name": {
            "type": "string",
            "title": "Display Name",
            "description": "Human-readable model name"
          },
          "supports_clone": {
            "type": "boolean",
            "title": "Supports Clone",
            "description": "Whether the model supports voice cloning"
          },
          "supports_design": {
            "type": "boolean",
            "title": "Supports Design",
            "description": "Whether the model supports voice design"
          },
          "supports_custom_voice": {
            "type": "boolean",
            "title": "Supports Custom Voice",
            "description": "Whether the model supports custom voice speakers"
          },
          "supports_streaming": {
            "type": "boolean",
            "title": "Supports Streaming",
            "description": "Whether the model supports streaming generation"
          },
          "supports_emotional_clone": {
            "type": "boolean",
            "title": "Supports Emotional Clone",
            "description": "Whether the model can clone with an emotion and intensity",
            "default": false
          },
          "supports_design_reference": {
            "type": "boolean",
            "title": "Supports Design Reference",
            "description": "Whether voice design can be conditioned on a saved reference voice",
            "default": false
          },
          "design_takes_target_text": {
            "type": "boolean",
            "title": "Design Takes Target Text",
            "description": "False when design mode has no text to speak (the model writes the words)",
            "default": true
          },
          "sample_rate": {
            "type": "integer",
            "title": "Sample Rate",
            "description": "Output audio sample rate in Hz"
          },
          "ref_min_sec": {
            "type": "number",
            "title": "Ref Min Sec",
            "description": "Shortest reference audio the model accepts, in seconds",
            "default": 1.5
          },
          "ref_min_speech_sec": {
            "type": "number",
            "title": "Ref Min Speech Sec",
            "description": "Least speech the reference must contain, in seconds",
            "default": 3.0
          },
          "ref_max_sec": {
            "type": "number",
            "title": "Ref Max Sec",
            "description": "Longest reference audio the model uses, in seconds",
            "default": 10.0
          },
          "custom_voice_speakers": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Custom Voice Speakers",
            "description": "Available predefined speakers"
          },
          "generation_params": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array",
            "title": "Generation Params",
            "description": "Available generation parameters with ranges"
          },
          "variants": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array",
            "title": "Variants",
            "description": "Available model variants/quality tiers"
          },
          "studio_only": {
            "type": "boolean",
            "title": "Studio Only",
            "description": "True if the model is only offered in the Studio audiobook tools",
            "default": false
          },
          "loading": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Loading",
            "description": "True when switching started a background model load"
          }
        },
        "type": "object",
        "required": [
          "model_family",
          "display_name",
          "supports_clone",
          "supports_design",
          "supports_custom_voice",
          "supports_streaming",
          "sample_rate",
          "custom_voice_speakers",
          "generation_params",
          "variants"
        ],
        "title": "ModelCapabilitiesResponse"
      },
      "ModelListResponse": {
        "properties": {
          "models": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array",
            "title": "Models",
            "description": "List of available model families with capabilities"
          }
        },
        "type": "object",
        "required": [
          "models"
        ],
        "title": "ModelListResponse"
      },
      "ModelLoadProgressResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "description": "Loading status (idle, loading, complete, error)"
          },
          "message": {
            "type": "string",
            "title": "Message",
            "description": "Human-readable progress message"
          },
          "percent": {
            "type": "integer",
            "title": "Percent",
            "description": "Loading progress percentage (0-100)"
          }
        },
        "type": "object",
        "required": [
          "status",
          "message",
          "percent"
        ],
        "title": "ModelLoadProgressResponse"
      },
      "ModelLoadRequest": {
        "properties": {
          "mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mode",
            "description": "Generation mode to load (clone, design, tts). Uses current if omitted.",
            "examples": [
              "clone"
            ]
          },
          "quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quality",
            "description": "Quality preset to load. Uses current if omitted.",
            "examples": [
              "higher_quality"
            ]
          }
        },
        "type": "object",
        "title": "ModelLoadRequest"
      },
      "ModelLoadResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "description": "Load status (loading, complete, already_loaded, error)",
            "examples": [
              "loading"
            ]
          },
          "mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mode",
            "description": "Generation mode being loaded",
            "examples": [
              "clone"
            ]
          },
          "quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quality",
            "description": "Quality preset being loaded",
            "examples": [
              "higher_quality"
            ]
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Error message if status is 'error'"
          }
        },
        "type": "object",
        "required": [
          "status"
        ],
        "title": "ModelLoadResponse"
      },
      "ModelQualityGetResponse": {
        "properties": {
          "options": {
            "items": {
              "$ref": "#/components/schemas/ModelQualityOption"
            },
            "type": "array",
            "title": "Options",
            "description": "Available model quality presets for the current mode"
          },
          "current": {
            "type": "string",
            "title": "Current",
            "description": "Currently selected quality preset ID"
          }
        },
        "type": "object",
        "required": [
          "options",
          "current"
        ],
        "title": "ModelQualityGetResponse"
      },
      "ModelQualityOption": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Quality preset identifier"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Display name for the quality option"
          },
          "description": {
            "type": "string",
            "title": "Description",
            "description": "Human-readable description of the quality level"
          },
          "selected": {
            "type": "boolean",
            "title": "Selected",
            "description": "Whether this option is currently selected"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "description",
          "selected"
        ],
        "title": "ModelQualityOption"
      },
      "ModelQualitySetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the quality was actually changed"
          },
          "needs_reload": {
            "type": "boolean",
            "title": "Needs Reload",
            "description": "Whether the TTS model needs to be reloaded",
            "default": false
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Optional status message"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "ModelQualitySetResponse"
      },
      "ModelStatusResponse": {
        "properties": {
          "loaded": {
            "type": "boolean",
            "title": "Loaded",
            "description": "Whether a TTS model is currently loaded",
            "examples": [
              true
            ]
          },
          "type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Type",
            "description": "Loaded model type (base, voice_design, custom_voice)",
            "examples": [
              "base"
            ]
          },
          "quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quality",
            "description": "Current quality preset (higher_quality, faster)",
            "examples": [
              "higher_quality"
            ]
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name",
            "description": "Model directory name",
            "examples": [
              "Qwen3-TTS"
            ]
          }
        },
        "type": "object",
        "required": [
          "loaded"
        ],
        "title": "ModelStatusResponse"
      },
      "OpenAISpeechRequest": {
        "properties": {
          "input": {
            "type": "string",
            "minLength": 1,
            "title": "Input",
            "description": "Text to synthesize",
            "examples": [
              "Hello from an agent."
            ]
          },
          "model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model",
            "description": "VCP model family. OpenAI model names (tts-1, gpt-4o-mini-tts, ...) are accepted and ignored — the configured default agent model is used instead.",
            "examples": [
              "qwen3-tts"
            ]
          },
          "voice": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice",
            "description": "Saved voice name or ID. Unknown names (e.g. OpenAI's 'alloy') fall back to the configured default agent voice.",
            "examples": [
              "Morgan"
            ]
          },
          "response_format": {
            "type": "string",
            "enum": [
              "mp3",
              "wav"
            ],
            "title": "Response Format",
            "description": "Audio container. mp3 (64kbps, default) or wav (PCM16).",
            "default": "mp3"
          },
          "speed": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Speed",
            "description": "Accepted for OpenAI compatibility; ignored."
          },
          "instructions": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Instructions",
            "description": "Accepted for OpenAI compatibility; ignored."
          }
        },
        "type": "object",
        "required": [
          "input"
        ],
        "title": "OpenAISpeechRequest"
      },
      "RenameVoiceRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "New display name for the voice",
            "examples": [
              "My narrator voice"
            ]
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "RenameVoiceRequest"
      },
      "ResetAudioForSegmentsRequest": {
        "properties": {
          "segment_ids": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Segment Ids"
          }
        },
        "type": "object",
        "required": [
          "segment_ids"
        ],
        "title": "ResetAudioForSegmentsRequest"
      },
      "RocmFlashAttentionGetResponse": {
        "properties": {
          "enabled": {
            "type": "boolean",
            "title": "Enabled",
            "description": "Whether AOTriton flash attention is enabled"
          },
          "supported": {
            "type": "boolean",
            "title": "Supported",
            "description": "Whether this machine runs the ROCm backend, where the setting applies"
          }
        },
        "type": "object",
        "required": [
          "enabled",
          "supported"
        ],
        "title": "RocmFlashAttentionGetResponse"
      },
      "RocmFlashAttentionSetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the setting was actually changed"
          },
          "needs_restart": {
            "type": "boolean",
            "title": "Needs Restart",
            "description": "Whether the app must restart for the change to take effect"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed",
          "needs_restart"
        ],
        "title": "RocmFlashAttentionSetResponse"
      },
      "SaveHistoryRequest": {
        "properties": {
          "audio_base64": {
            "type": "string",
            "title": "Audio Base64",
            "description": "Base64-encoded audio (WAV)",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "target_text": {
            "type": "string",
            "title": "Target Text",
            "description": "Text that was generated",
            "examples": [
              "Welcome to our application."
            ]
          },
          "mode": {
            "type": "string",
            "title": "Mode",
            "description": "Generation mode: 'clone', 'design', or 'tts'",
            "examples": [
              "clone"
            ]
          },
          "extra_metadata": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Extra Metadata",
            "description": "Additional metadata"
          }
        },
        "type": "object",
        "required": [
          "audio_base64",
          "target_text",
          "mode"
        ],
        "title": "SaveHistoryRequest"
      },
      "SaveVoiceRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Display name for the voice",
            "examples": [
              "My Custom Voice"
            ]
          },
          "audio_base64": {
            "type": "string",
            "title": "Audio Base64",
            "description": "Base64-encoded audio (WAV)",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "transcript": {
            "type": "string",
            "title": "Transcript",
            "description": "Transcript of the audio",
            "examples": [
              "Hello, this is a sample of my voice."
            ]
          },
          "voice_type": {
            "type": "string",
            "title": "Voice Type",
            "description": "Voice type: 'clone' or 'design'",
            "default": "clone",
            "examples": [
              "clone"
            ]
          },
          "ref_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ref Text",
            "description": "Reference text (for clone voices)",
            "examples": [
              "Hello, this is a sample of my voice."
            ]
          },
          "word_timestamps": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Word Timestamps",
            "description": "Word-level timestamps [{text,start_time,end_time}] for local trim slicing"
          },
          "transcript_manual": {
            "type": "boolean",
            "title": "Transcript Manual",
            "description": "True if the user wrote or corrected the transcript, so it must not be re-derived from word_timestamps",
            "default": false
          },
          "source": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VoiceSourceModel"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the audio was cut from, when it came from a public sample"
          }
        },
        "type": "object",
        "required": [
          "name",
          "audio_base64",
          "transcript"
        ],
        "title": "SaveVoiceRequest"
      },
      "SavedDesignRequest": {
        "properties": {
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "description": "ID of the saved voice design",
            "examples": [
              "a1b2c3d4"
            ]
          },
          "target_text": {
            "type": "string",
            "title": "Target Text",
            "description": "Text to generate speech for",
            "examples": [
              "This is a test of the saved voice."
            ]
          },
          "language": {
            "type": "string",
            "title": "Language",
            "description": "Target language. Query GET /api/v1/models/active for supported languages per variant.",
            "default": "Auto",
            "examples": [
              "English"
            ]
          },
          "quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quality",
            "description": "Quality/variant tier. Query GET /api/v1/models/active for available tiers.",
            "examples": [
              "higher_quality"
            ]
          },
          "generation_params": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GenerationParamsModel"
              },
              {
                "type": "null"
              }
            ],
            "description": "Advanced sampling parameters"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family",
            "description": "TTS model to use. If omitted, uses the currently configured model.",
            "examples": [
              "qwen3-tts"
            ]
          }
        },
        "type": "object",
        "required": [
          "voice_id",
          "target_text"
        ],
        "title": "SavedDesignRequest"
      },
      "SectionCreateRequest": {
        "properties": {
          "title": {
            "type": "string",
            "title": "Title"
          },
          "segment_ids": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Segment Ids"
          }
        },
        "type": "object",
        "required": [
          "title",
          "segment_ids"
        ],
        "title": "SectionCreateRequest"
      },
      "SectionRenameRequest": {
        "properties": {
          "title": {
            "type": "string",
            "title": "Title",
            "description": "New section title"
          }
        },
        "type": "object",
        "required": [
          "title"
        ],
        "title": "SectionRenameRequest"
      },
      "SegmentCreateRequest": {
        "properties": {
          "text": {
            "type": "string",
            "maxLength": 10000,
            "title": "Text",
            "description": "Text content of the new segment"
          },
          "section_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Section Id",
            "description": "Section to append the segment to; omit or null to leave ungrouped"
          }
        },
        "type": "object",
        "required": [
          "text"
        ],
        "title": "SegmentCreateRequest"
      },
      "SegmentMoveRequest": {
        "properties": {
          "target_section_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Target Section Id",
            "description": "Destination section id, or null for the ungrouped run"
          },
          "target_index": {
            "type": "integer",
            "title": "Target Index",
            "description": "Destination index within the target scope"
          }
        },
        "type": "object",
        "required": [
          "target_index"
        ],
        "title": "SegmentMoveRequest"
      },
      "SegmentSplitRequest": {
        "properties": {
          "offset": {
            "type": "integer",
            "title": "Offset",
            "description": "Character offset to split at"
          }
        },
        "type": "object",
        "required": [
          "offset"
        ],
        "title": "SegmentSplitRequest"
      },
      "SegmentUpdateRequest": {
        "properties": {
          "voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Id"
          },
          "voice_spans": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Spans"
          },
          "text": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 10000
              },
              {
                "type": "null"
              }
            ],
            "title": "Text"
          }
        },
        "type": "object",
        "title": "SegmentUpdateRequest"
      },
      "SetGpuDeviceResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the device was actually changed"
          },
          "needs_reload": {
            "type": "boolean",
            "title": "Needs Reload",
            "description": "Whether the TTS model needs to be reloaded on the new device",
            "default": false
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Optional status message"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "SetGpuDeviceResponse"
      },
      "SetModeResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the mode was actually changed"
          },
          "needs_reload": {
            "type": "boolean",
            "title": "Needs Reload",
            "description": "Whether the TTS model needs to be reloaded for the new mode",
            "default": false
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Optional status message"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "SetModeResponse"
      },
      "SettingsUpdateRequest": {
        "properties": {
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family"
          },
          "model_quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Quality"
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language"
          },
          "generation_params": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Generation Params"
          },
          "export_format": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Export Format"
          },
          "export_acx": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Export Acx"
          },
          "export_loudness": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "off",
                  "acx",
                  "podcast",
                  "youtube"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Export Loudness"
          },
          "detect_emotions": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Detect Emotions"
          },
          "silence_lead_in": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Silence Lead In"
          },
          "silence_between_segments_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Silence Between Segments Ms"
          },
          "silence_between_sections_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Silence Between Sections Ms"
          },
          "speaker_pause_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Speaker Pause Ms"
          },
          "max_segment_words": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Segment Words"
          },
          "emotion_engine": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Emotion Engine"
          },
          "takes_per_generation": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Takes Per Generation"
          },
          "design_model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Design Model Family"
          }
        },
        "type": "object",
        "title": "SettingsUpdateRequest"
      },
      "SetupOptionItem": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Backend identifier (e.g. 'cuda', 'mlx', 'cpu')"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Display name for the backend option"
          },
          "gpu_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gpu Name",
            "description": "Detected GPU name, if applicable"
          },
          "recommended": {
            "type": "boolean",
            "title": "Recommended",
            "description": "Whether this backend is recommended for the detected hardware"
          },
          "download_size": {
            "type": "string",
            "title": "Download Size",
            "description": "Estimated download size (e.g. '2.1 GB')"
          },
          "description": {
            "type": "string",
            "title": "Description",
            "description": "Human-readable description of the backend"
          }
        },
        "additionalProperties": true,
        "type": "object",
        "required": [
          "id",
          "name",
          "recommended",
          "download_size",
          "description"
        ],
        "title": "SetupOptionItem"
      },
      "SetupOptionsResponse": {
        "properties": {
          "detected_gpus": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Detected Gpus",
            "description": "Names of detected GPU devices"
          },
          "options": {
            "items": {
              "$ref": "#/components/schemas/SetupOptionItem"
            },
            "type": "array",
            "title": "Options",
            "description": "Available backend installation options"
          },
          "best_gpu": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Best Gpu",
            "description": "Name of the recommended GPU"
          },
          "pending_backend": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pending Backend",
            "description": "Backend pending installation from a previous attempt"
          }
        },
        "additionalProperties": true,
        "type": "object",
        "title": "SetupOptionsResponse"
      },
      "SetupProgressResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "description": "Installation status (downloading, complete, error, restart_required)"
          },
          "message": {
            "type": "string",
            "title": "Message",
            "description": "Human-readable progress message"
          },
          "percent": {
            "type": "integer",
            "title": "Percent",
            "description": "Installation progress percentage (0-100)"
          }
        },
        "type": "object",
        "required": [
          "status",
          "message",
          "percent"
        ],
        "title": "SetupProgressResponse"
      },
      "SetupStartResponse": {
        "properties": {
          "started": {
            "type": "boolean",
            "title": "Started",
            "description": "Whether the installation was started"
          },
          "immediate": {
            "type": "boolean",
            "title": "Immediate",
            "description": "Whether the installation completed immediately",
            "default": false
          }
        },
        "type": "object",
        "required": [
          "started"
        ],
        "title": "SetupStartResponse"
      },
      "SetupStatusResponse": {
        "properties": {
          "required": {
            "type": "boolean",
            "title": "Required",
            "description": "Whether first-run setup is required"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason",
            "description": "Why setup is needed (first_run, pytorch_missing, python_version_changed, mlx_missing)"
          }
        },
        "type": "object",
        "required": [
          "required"
        ],
        "title": "SetupStatusResponse"
      },
      "SpeakRequest": {
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1,
            "title": "Text",
            "description": "Text to speak",
            "examples": [
              "Build finished, all tests passing."
            ]
          },
          "voice": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice",
            "description": "Saved voice name or ID. If omitted, the configured default agent voice is used.",
            "examples": [
              "Morgan"
            ]
          },
          "model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model",
            "description": "Streaming-capable TTS model family. If omitted, uses the configured default agent model, then the active model (switching to a streaming model if needed).",
            "examples": [
              "qwen3-tts"
            ]
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "Target language. Defaults to Auto.",
            "examples": [
              "English"
            ]
          },
          "deliver": {
            "type": "string",
            "enum": [
              "play",
              "url"
            ],
            "title": "Deliver",
            "description": "'play' streams to this machine's speakers/app and blocks until done. 'url' plays nothing here and returns a progressive stream URL immediately for the caller to play.",
            "default": "play"
          }
        },
        "type": "object",
        "required": [
          "text"
        ],
        "title": "SpeakRequest"
      },
      "SpeakResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether speech generation was started/delivered"
          },
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "description": "Resolved voice ID"
          },
          "voice_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Name",
            "description": "Resolved voice display name"
          },
          "model": {
            "type": "string",
            "title": "Model",
            "description": "Model family used for generation"
          },
          "session_id": {
            "type": "string",
            "title": "Session Id",
            "description": "Streaming session ID (sessions expire ~10 minutes after generation)"
          },
          "streaming": {
            "type": "boolean",
            "title": "Streaming",
            "description": "Audio is streamed as it is generated",
            "default": true
          },
          "played_via": {
            "type": "string",
            "title": "Played Via",
            "description": "'app' (desktop UI played it), 'local' (speakers), or 'none' (deliver=url — caller plays)"
          },
          "stream_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stream Url",
            "description": "deliver=url only: progressive WAV URL, playable while generation runs"
          },
          "status_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status Url",
            "description": "deliver=url only: session status endpoint, to distinguish finished from failed"
          }
        },
        "type": "object",
        "required": [
          "success",
          "voice_id",
          "model",
          "session_id",
          "played_via"
        ],
        "title": "SpeakResponse"
      },
      "Speaker": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Speaker identifier (e.g. 'Ryan', 'Vivian')",
            "examples": [
              "Vivian"
            ]
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "Display name",
            "examples": [
              "Vivian"
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description",
            "description": "Voice description (e.g. 'Male, American English')",
            "examples": [
              "Female, American English"
            ]
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "Native language of the speaker",
            "examples": [
              "English"
            ]
          }
        },
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "title": "Speaker"
      },
      "SpeakersResponse": {
        "properties": {
          "speakers": {
            "items": {
              "$ref": "#/components/schemas/Speaker"
            },
            "type": "array",
            "title": "Speakers",
            "description": "Available built-in TTS speakers"
          }
        },
        "type": "object",
        "required": [
          "speakers"
        ],
        "title": "SpeakersResponse"
      },
      "StatusResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "description": "Server status string",
            "examples": [
              "ok"
            ]
          }
        },
        "type": "object",
        "required": [
          "status"
        ],
        "title": "StatusResponse"
      },
      "StreamStartedResponse": {
        "properties": {
          "started": {
            "type": "boolean",
            "title": "Started",
            "description": "Whether the streaming session was created",
            "examples": [
              true
            ]
          },
          "session_id": {
            "type": "string",
            "title": "Session Id",
            "description": "Unique session ID for streaming endpoints",
            "examples": [
              "a1b2c3d4"
            ]
          },
          "queue_position": {
            "type": "integer",
            "title": "Queue Position",
            "description": "Position in the generation queue",
            "examples": [
              0
            ]
          }
        },
        "type": "object",
        "required": [
          "started",
          "session_id",
          "queue_position"
        ],
        "title": "StreamStartedResponse"
      },
      "StreamingSessionInfoResponse": {
        "properties": {
          "exists": {
            "type": "boolean",
            "title": "Exists",
            "description": "Whether the session exists"
          },
          "is_complete": {
            "type": "boolean",
            "title": "Is Complete",
            "description": "Whether audio generation has finished"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error",
            "description": "Error message if generation failed"
          },
          "chunk_count": {
            "type": "integer",
            "title": "Chunk Count",
            "description": "Number of audio chunks generated so far"
          },
          "sample_rate": {
            "type": "integer",
            "title": "Sample Rate",
            "description": "Audio sample rate in Hz"
          }
        },
        "type": "object",
        "required": [
          "exists",
          "is_complete",
          "chunk_count",
          "sample_rate"
        ],
        "title": "StreamingSessionInfoResponse"
      },
      "SubtitlePresetOrderRequest": {
        "properties": {
          "ids": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Ids"
          }
        },
        "type": "object",
        "required": [
          "ids"
        ],
        "title": "SubtitlePresetOrderRequest"
      },
      "SubtitlePresetRequest": {
        "properties": {
          "id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "params": {
            "additionalProperties": true,
            "type": "object",
            "title": "Params"
          }
        },
        "type": "object",
        "required": [
          "name",
          "params"
        ],
        "title": "SubtitlePresetRequest"
      },
      "SuccessMessageResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "message": {
            "type": "string",
            "title": "Message",
            "description": "Human-readable result message",
            "default": ""
          }
        },
        "type": "object",
        "required": [
          "success"
        ],
        "title": "SuccessMessageResponse"
      },
      "SwitchModelRequest": {
        "properties": {
          "model_family": {
            "type": "string",
            "title": "Model Family",
            "description": "Model family to switch to",
            "examples": [
              "qwen3-tts"
            ]
          },
          "auto_load": {
            "type": "boolean",
            "title": "Auto Load",
            "description": "If true, immediately start downloading/loading the model",
            "default": false
          },
          "mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mode",
            "description": "Generation mode ('clone'/'design'/'tts') to persist this family as the preference for",
            "examples": [
              "tts"
            ]
          }
        },
        "type": "object",
        "required": [
          "model_family"
        ],
        "title": "SwitchModelRequest"
      },
      "SystemBackendResponse": {
        "properties": {
          "backend": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Backend",
            "description": "PyTorch backend name (cuda, mlx, cpu) or null if not configured"
          }
        },
        "type": "object",
        "title": "SystemBackendResponse"
      },
      "SystemInfoResponse": {
        "properties": {
          "info": {
            "type": "string",
            "title": "Info",
            "description": "Human-readable GPU and system hardware summary"
          }
        },
        "type": "object",
        "required": [
          "info"
        ],
        "title": "SystemInfoResponse"
      },
      "TTSRequest": {
        "properties": {
          "text": {
            "type": "string",
            "title": "Text",
            "description": "Text to generate speech for",
            "examples": [
              "Hello, how are you today?"
            ]
          },
          "speaker": {
            "type": "string",
            "title": "Speaker",
            "description": "Speaker ID (e.g. 'Ryan', 'Vivian')",
            "examples": [
              "Vivian"
            ]
          },
          "language": {
            "type": "string",
            "title": "Language",
            "description": "Target language. Query GET /api/v1/models/active for supported languages per variant.",
            "default": "Auto",
            "examples": [
              "English"
            ]
          },
          "instruct": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Instruct",
            "description": "Optional voice style instruction",
            "examples": [
              "Speak slowly and softly"
            ]
          },
          "quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quality",
            "description": "Quality/variant tier. Query GET /api/v1/models/active for available tiers.",
            "examples": [
              "higher_quality"
            ]
          },
          "generation_params": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GenerationParamsModel"
              },
              {
                "type": "null"
              }
            ],
            "description": "Advanced sampling parameters"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family",
            "description": "TTS model to use. If omitted, uses the currently configured model.",
            "examples": [
              "qwen3-tts"
            ]
          }
        },
        "type": "object",
        "required": [
          "text",
          "speaker"
        ],
        "title": "TTSRequest"
      },
      "TakeRenameRequest": {
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name",
            "description": "New custom display name; null/empty clears it"
          }
        },
        "type": "object",
        "title": "TakeRenameRequest"
      },
      "TalkingHeadDraftPatchRequest": {
        "properties": {
          "wizard_step": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Wizard Step",
            "description": "Setup step the draft is on, 0 to 3"
          },
          "headshot_base64": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 27962028
              },
              {
                "type": "null"
              }
            ],
            "title": "Headshot Base64",
            "description": "JPEG, PNG or WebP headshot"
          },
          "headshot_generated": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Headshot Generated",
            "description": "The headshot is an AI avatar, sent with headshot_base64"
          },
          "avatar_id": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 32
              },
              {
                "type": "null"
              }
            ],
            "title": "Avatar Id",
            "description": "Saved avatar the photo came from"
          },
          "upload_base64": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 89478488
              },
              {
                "type": "null"
              }
            ],
            "title": "Upload Base64",
            "description": "WAV speech to animate when source is upload"
          },
          "upload_name": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200
              },
              {
                "type": "null"
              }
            ],
            "title": "Upload Name",
            "description": "File name of the uploaded speech"
          },
          "source": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "history",
                  "speech",
                  "upload"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Source"
          },
          "history_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "History Id",
            "description": "Saved generation to animate when source is history"
          },
          "voice_id": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Id"
          },
          "voice_source": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "library",
                  "tts",
                  "design"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Source"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family",
            "description": "Voice model that speaks the text"
          },
          "voice_design": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 1500
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Design",
            "description": "Voice description for a designed voice, or style for a built-in one"
          },
          "speech_text": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 900
              },
              {
                "type": "null"
              }
            ],
            "title": "Speech Text",
            "description": "Text to speak when source is speech"
          },
          "language": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ],
            "title": "Language"
          },
          "scene": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 500
              },
              {
                "type": "null"
              }
            ],
            "title": "Scene"
          },
          "resolution": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "480p",
                  "720p",
                  "1080p",
                  "1440p"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolution"
          },
          "fps": {
            "anyOf": [
              {
                "type": "integer",
                "enum": [
                  24,
                  25,
                  48,
                  50
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Fps",
            "description": "Frame rate of the video"
          },
          "engine": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ltx-2.3",
                  "ltx-2.5",
                  "ltx-2.5-msr"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Engine",
            "description": "Video model"
          },
          "subtitle_params": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subtitle Params"
          },
          "params": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Params",
            "description": "Video model settings by name, from the model's params"
          }
        },
        "type": "object",
        "title": "TalkingHeadDraftPatchRequest"
      },
      "TalkingHeadEditsRequest": {
        "properties": {
          "edits": {
            "items": {},
            "type": "array",
            "maxItems": 50,
            "title": "Edits",
            "description": "Effects as {type, start, end, strength}, same types as Clips"
          }
        },
        "type": "object",
        "title": "TalkingHeadEditsRequest"
      },
      "TalkingHeadExportRequest": {
        "properties": {
          "container": {
            "type": "string",
            "enum": [
              "mp4",
              "mov",
              "mkv"
            ],
            "title": "Container",
            "description": "Output container",
            "default": "mp4"
          },
          "quality": {
            "type": "string",
            "enum": [
              "original",
              "high",
              "medium",
              "small"
            ],
            "title": "Quality",
            "description": "original copies the stored clip with no re-encode",
            "default": "original"
          },
          "resolution": {
            "type": "string",
            "enum": [
              "original",
              "2160",
              "1440",
              "1080",
              "720"
            ],
            "title": "Resolution",
            "description": "Output size. 2160 upscales to 4K and 1440 to 1440p. A video already that size or larger keeps its own size. original keeps the rendered size",
            "default": "original"
          }
        },
        "type": "object",
        "title": "TalkingHeadExportRequest"
      },
      "TalkingHeadHookRequest": {
        "properties": {
          "hook": {
            "additionalProperties": true,
            "type": "object",
            "title": "Hook",
            "description": "Hook card as {text, style, position, y, scale, duration, animation, params}, same looks as Clips; empty text draws none"
          }
        },
        "type": "object",
        "title": "TalkingHeadHookRequest"
      },
      "TalkingHeadPhotoCheckRequest": {
        "properties": {
          "image_base64": {
            "type": "string",
            "maxLength": 27962028,
            "title": "Image Base64",
            "description": "JPEG, PNG or WebP photo"
          }
        },
        "type": "object",
        "required": [
          "image_base64"
        ],
        "title": "TalkingHeadPhotoCheckRequest"
      },
      "TalkingHeadRegenerateRequest": {
        "properties": {
          "resolution": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "480p",
                  "720p",
                  "1080p",
                  "1440p"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolution",
            "description": "Resolution of the new take, the current one when left out"
          },
          "engine": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ltx-2.3",
                  "ltx-2.5",
                  "ltx-2.5-msr"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Engine",
            "description": "Video model"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 2147483647.0,
                "minimum": 0.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Seed",
            "description": "Seed for the new take. Random when left out"
          },
          "params": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Params",
            "description": "Video model settings by name, from the model's params"
          }
        },
        "type": "object",
        "title": "TalkingHeadRegenerateRequest"
      },
      "TalkingHeadRenameRequest": {
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 500,
            "title": "Name",
            "default": ""
          }
        },
        "type": "object",
        "title": "TalkingHeadRenameRequest"
      },
      "TalkingHeadStartDraftRequest": {
        "properties": {
          "consent": {
            "type": "boolean",
            "title": "Consent",
            "default": false
          }
        },
        "type": "object",
        "title": "TalkingHeadStartDraftRequest"
      },
      "TalkingHeadStartRequest": {
        "properties": {
          "headshot_base64": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 27962028
              },
              {
                "type": "null"
              }
            ],
            "title": "Headshot Base64",
            "description": "JPEG, PNG or WebP photo"
          },
          "avatar_id": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 32
              },
              {
                "type": "null"
              }
            ],
            "title": "Avatar Id",
            "description": "Saved avatar to use instead of a photo"
          },
          "stock_id": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 128
              },
              {
                "type": "null"
              }
            ],
            "title": "Stock Id",
            "description": "Stock avatar look to use instead of a photo"
          },
          "engine": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ltx-2.3",
                  "ltx-2.5",
                  "ltx-2.5-msr",
                  "flashhead-lite",
                  "flashhead-pro"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Engine",
            "description": "Video model. Leave it out to use LTX-2.5, or LTX-2.3 when only LTX-2.3 is downloaded. FlashHead makes a square close-up of the face and is much faster"
          },
          "size": {
            "type": "integer",
            "enum": [
              512,
              1024
            ],
            "title": "Size",
            "description": "FlashHead output size in pixels. 1024 needs flashhead-pro",
            "default": 512
          },
          "framing": {
            "type": "string",
            "enum": [
              "face",
              "photo"
            ],
            "title": "Framing",
            "description": "FlashHead framing: a square close-up of the face, or the whole photo with the face blended back in",
            "default": "face"
          },
          "source": {
            "type": "string",
            "enum": [
              "history",
              "speech"
            ],
            "title": "Source"
          },
          "history_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "History Id"
          },
          "voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Id"
          },
          "voice_source": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "library",
                  "tts",
                  "design"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Source"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family"
          },
          "design": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 1500
              },
              {
                "type": "null"
              }
            ],
            "title": "Design"
          },
          "text": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 900
              },
              {
                "type": "null"
              }
            ],
            "title": "Text"
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "default": "Auto"
          },
          "scene": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 500
              },
              {
                "type": "null"
              }
            ],
            "title": "Scene",
            "default": ""
          },
          "resolution": {
            "type": "string",
            "enum": [
              "480p",
              "720p",
              "1080p",
              "1440p"
            ],
            "title": "Resolution",
            "default": "720p"
          },
          "fps": {
            "type": "integer",
            "enum": [
              24,
              25,
              48,
              50
            ],
            "title": "Fps",
            "default": 24
          },
          "consent": {
            "type": "boolean",
            "title": "Consent",
            "default": false
          },
          "subtitle_params": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subtitle Params"
          },
          "params": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Params",
            "description": "Video model settings by name, from the model's params"
          }
        },
        "type": "object",
        "required": [
          "source"
        ],
        "title": "TalkingHeadStartRequest"
      },
      "TalkingHeadSubtitleParamsRequest": {
        "properties": {
          "params": {
            "additionalProperties": true,
            "type": "object",
            "title": "Params",
            "description": "Caption style, same fields as AI Cut subtitle_params"
          }
        },
        "type": "object",
        "title": "TalkingHeadSubtitleParamsRequest"
      },
      "TalkingHeadTrimRequest": {
        "properties": {
          "trim": {
            "anyOf": [
              {
                "items": {
                  "type": "number"
                },
                "type": "array",
                "maxItems": 2,
                "minItems": 2
              },
              {
                "type": "null"
              }
            ],
            "title": "Trim",
            "description": "Seconds [start, end] the export keeps; null keeps the whole video"
          }
        },
        "type": "object",
        "title": "TalkingHeadTrimRequest"
      },
      "TalkingHeadWordEditsRequest": {
        "properties": {
          "word_edits": {
            "additionalProperties": true,
            "type": "object",
            "title": "Word Edits",
            "description": "Caption edits keyed by word index, same shape as AI Cut: {word_text, word_pops, word_stickers, word_roles, caption_overrides}"
          }
        },
        "type": "object",
        "title": "TalkingHeadWordEditsRequest"
      },
      "TimestampItem": {
        "properties": {
          "text": {
            "type": "string",
            "title": "Text",
            "description": "Word or token text"
          },
          "start_time": {
            "type": "number",
            "title": "Start Time",
            "description": "Start time in seconds"
          },
          "end_time": {
            "type": "number",
            "title": "End Time",
            "description": "End time in seconds"
          },
          "speaker": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Speaker",
            "description": "Speaker label when speaker detection ran",
            "examples": [
              "SPEAKER_00"
            ]
          }
        },
        "type": "object",
        "required": [
          "text",
          "start_time",
          "end_time"
        ],
        "title": "TimestampItem"
      },
      "TranscribeRequest": {
        "properties": {
          "audio_base64": {
            "type": "string",
            "title": "Audio Base64",
            "description": "Base64-encoded audio (WAV)",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "Force language (auto-detect if null)",
            "examples": [
              "en"
            ]
          },
          "return_timestamps": {
            "type": "boolean",
            "title": "Return Timestamps",
            "description": "Return word-level timestamps via forced aligner",
            "default": false,
            "examples": [
              true
            ]
          },
          "reference_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reference Text",
            "description": "Original text for punctuation restoration (e.g. from history)",
            "examples": [
              "Hello world, this is a test."
            ]
          },
          "asr_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Asr Family",
            "description": "ASR model family (e.g. 'Qwen3-ASR', 'Parakeet v3', 'Orukeet'). Used for routing; mostly informational on Modal-direct path.",
            "examples": [
              "Qwen3-ASR"
            ]
          },
          "asr_quality": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Asr Quality",
            "description": "ASR variant id within the family (e.g. 'standard', 'higher_quality', 'parakeet_v3', 'orukeet'). Subprocess loads this variant on demand if it differs from the currently-loaded one.",
            "examples": [
              "higher_quality"
            ]
          },
          "num_speakers": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 10.0,
                "minimum": 1.0
              },
              {
                "type": "null"
              }
            ],
            "title": "Num Speakers",
            "description": "Pin the exact diarization speaker count. Auto-detect (with trivial-cluster merging) if null.",
            "examples": [
              2
            ]
          },
          "diarization_engine": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "pyannote",
                  "nemotron"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Diarization Engine",
            "description": "Speaker detection engine. The saved preference is used if null.",
            "examples": [
              "nemotron"
            ]
          }
        },
        "type": "object",
        "required": [
          "audio_base64"
        ],
        "title": "TranscribeRequest"
      },
      "TranscriptionProgressResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "description": "Transcription status (idle, transcribing, complete, error)"
          },
          "message": {
            "type": "string",
            "title": "Message",
            "description": "Human-readable progress message"
          },
          "percent": {
            "type": "integer",
            "title": "Percent",
            "description": "Transcription progress percentage (0-100)"
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Text",
            "description": "Transcribed text (available when complete)"
          },
          "timestamps": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TimestampItem"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Timestamps",
            "description": "Word-level timestamps (available when complete, if requested)"
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "Detected language (available when complete)"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Code",
            "description": "Machine-readable failure code (e.g. aligner_unavailable) when status is error"
          }
        },
        "type": "object",
        "required": [
          "status",
          "message",
          "percent"
        ],
        "title": "TranscriptionProgressResponse"
      },
      "TranscriptionStartedResponse": {
        "properties": {
          "started": {
            "type": "boolean",
            "title": "Started",
            "description": "Whether the transcription was started"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason",
            "description": "Reason if transcription could not start"
          }
        },
        "type": "object",
        "required": [
          "started"
        ],
        "title": "TranscriptionStartedResponse"
      },
      "TranscriptionSyncResult": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether transcription completed successfully"
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Text",
            "description": "Transcribed text"
          },
          "timestamps": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TimestampItem"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Timestamps",
            "description": "Word-level timestamps if requested"
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "Detected language of the audio"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error",
            "description": "Error message if transcription failed"
          },
          "cancelled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cancelled",
            "description": "True if the transcription was cancelled"
          }
        },
        "type": "object",
        "required": [
          "success"
        ],
        "title": "TranscriptionSyncResult"
      },
      "TranslateRequest": {
        "properties": {
          "texts": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Texts",
            "description": "Texts to translate, one result returned per input in input order",
            "examples": [
              [
                "Hello there."
              ]
            ]
          },
          "target_lang": {
            "type": "string",
            "title": "Target Lang",
            "description": "Target language code or English name",
            "examples": [
              "fr"
            ]
          },
          "source_lang": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Lang",
            "description": "Source language, when known. Inferred if omitted.",
            "examples": [
              "en"
            ]
          },
          "glossary": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Glossary",
            "description": "Terminology entries: {source, target, keep}"
          },
          "fit_seconds": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fit Seconds",
            "description": "Per-text time slot in seconds. Requires candidates > 1."
          },
          "candidates": {
            "type": "integer",
            "title": "Candidates",
            "description": "Phrasings to sample per text. 1 returns a plain translation.",
            "default": 1,
            "examples": [
              16
            ]
          }
        },
        "type": "object",
        "required": [
          "texts",
          "target_lang"
        ],
        "title": "TranslateRequest"
      },
      "UiLanguageGetResponse": {
        "properties": {
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "Stored UI language code (e.g. 'en', 'de'), or null if unset"
          }
        },
        "type": "object",
        "title": "UiLanguageGetResponse"
      },
      "UiLanguageSetResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the operation succeeded"
          },
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the language was actually changed"
          }
        },
        "type": "object",
        "required": [
          "success",
          "changed"
        ],
        "title": "UiLanguageSetResponse"
      },
      "UpdateTranscriptRequest": {
        "properties": {
          "text": {
            "type": "string",
            "title": "Text",
            "description": "Transcript text to persist",
            "examples": [
              "Hello, this is a sample of my voice."
            ]
          },
          "word_timestamps": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Word Timestamps",
            "description": "Word-level timestamps to persist alongside the transcript"
          },
          "transcript_manual": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Transcript Manual",
            "description": "True if the user wrote or corrected the transcript. Null keeps the voice's current value."
          }
        },
        "type": "object",
        "required": [
          "text"
        ],
        "title": "UpdateTranscriptRequest"
      },
      "UpdateVoiceAudioRequest": {
        "properties": {
          "audio_base64": {
            "type": "string",
            "title": "Audio Base64",
            "description": "Base64-encoded replacement audio (WAV)",
            "examples": [
              "UklGRi4AAABXQVZFZm10IBAAAA..."
            ]
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Text",
            "description": "Transcript of the new audio. Omit it to clear the transcript. The next generation then transcribes the new audio.",
            "examples": [
              "Hello, this is a sample of my voice."
            ]
          },
          "word_timestamps": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Word Timestamps",
            "description": "Word-level timestamps for text"
          },
          "transcript_manual": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Transcript Manual",
            "description": "True if the user wrote or corrected text"
          }
        },
        "type": "object",
        "required": [
          "audio_base64"
        ],
        "title": "UpdateVoiceAudioRequest"
      },
      "UploadBeginRequest": {
        "properties": {
          "filename": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filename"
          },
          "total_bytes": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Total Bytes"
          }
        },
        "type": "object",
        "title": "UploadBeginRequest"
      },
      "UploadChunkRequest": {
        "properties": {
          "chunk_base64": {
            "type": "string",
            "title": "Chunk Base64"
          }
        },
        "type": "object",
        "required": [
          "chunk_base64"
        ],
        "title": "UploadChunkRequest"
      },
      "UploadClipsProjectRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "UploadClipsProjectRequest"
      },
      "UploadDubbingProjectRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          },
          "filename": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filename"
          },
          "source_lang": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Lang"
          },
          "target_lang": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Target Lang"
          },
          "keep_background": {
            "type": "boolean",
            "title": "Keep Background",
            "default": true
          },
          "timing_mode": {
            "type": "string",
            "title": "Timing Mode",
            "default": "hybrid"
          },
          "default_voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Voice Id"
          },
          "default_voice_source": {
            "type": "string",
            "title": "Default Voice Source",
            "default": "library"
          },
          "default_voice_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Voice Model"
          },
          "num_speakers": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Num Speakers"
          },
          "kind": {
            "type": "string",
            "title": "Kind",
            "default": "dubbing"
          },
          "clone_voices": {
            "type": "boolean",
            "title": "Clone Voices",
            "default": false
          },
          "diarization_engine": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Diarization Engine"
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "UploadDubbingProjectRequest"
      },
      "ValidationError": {
        "properties": {
          "loc": {
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "type": "array",
            "title": "Location"
          },
          "msg": {
            "type": "string",
            "title": "Message"
          },
          "type": {
            "type": "string",
            "title": "Error Type"
          },
          "input": {
            "title": "Input"
          },
          "ctx": {
            "type": "object",
            "title": "Context"
          }
        },
        "type": "object",
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "title": "ValidationError"
      },
      "VoiceAddRequest": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          },
          "color": {
            "type": "string",
            "title": "Color"
          },
          "library_voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Library Voice Id"
          },
          "speaker_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Speaker Id"
          },
          "model_family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Family"
          },
          "source": {
            "type": "string",
            "title": "Source",
            "default": "library"
          }
        },
        "type": "object",
        "required": [
          "name",
          "color"
        ],
        "title": "VoiceAddRequest"
      },
      "VoiceItem": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id",
            "description": "Unique voice identifier",
            "examples": [
              "a1b2c3d4"
            ]
          },
          "name": {
            "type": "string",
            "title": "Name",
            "description": "User-assigned voice name",
            "examples": [
              "My Custom Voice"
            ]
          },
          "transcript": {
            "type": "string",
            "title": "Transcript",
            "description": "Transcript of the reference audio",
            "examples": [
              "Hello, this is a sample of my voice."
            ]
          },
          "ref_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ref Text",
            "description": "Reference text used during cloning"
          },
          "voice_type": {
            "type": "string",
            "title": "Voice Type",
            "description": "Voice type: 'clone' or 'design'",
            "default": "clone",
            "examples": [
              "clone"
            ]
          },
          "created_at": {
            "type": "string",
            "title": "Created At",
            "description": "ISO 8601 creation timestamp",
            "examples": [
              "2026-01-15T10:30:00Z"
            ]
          },
          "duration_seconds": {
            "type": "number",
            "title": "Duration Seconds",
            "description": "Duration of the reference audio in seconds",
            "examples": [
              8.5
            ]
          },
          "has_voice_clone_prompt": {
            "type": "boolean",
            "title": "Has Voice Clone Prompt",
            "description": "Whether a precomputed voice prompt cache exists",
            "default": false
          },
          "word_timestamps": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Word Timestamps",
            "description": "Word-level timestamps if persisted"
          },
          "transcript_manual": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Transcript Manual",
            "description": "True if the transcript was written or corrected by the user"
          },
          "created_with_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created With Model",
            "description": "Model family the voice was created with"
          },
          "starter_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Starter Key",
            "description": "Starter voice key when the voice came from the starter set"
          },
          "source": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VoiceSourceModel"
              },
              {
                "type": "null"
              }
            ],
            "description": "Public sample the audio was cut from, when imported"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "transcript",
          "created_at",
          "duration_seconds"
        ],
        "title": "VoiceItem"
      },
      "VoiceListResponse": {
        "properties": {
          "voices": {
            "items": {
              "$ref": "#/components/schemas/VoiceItem"
            },
            "type": "array",
            "title": "Voices",
            "description": "List of saved voices"
          }
        },
        "type": "object",
        "required": [
          "voices"
        ],
        "title": "VoiceListResponse"
      },
      "VoiceLoadResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the voice was loaded successfully"
          },
          "audio_base64": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audio Base64",
            "description": "Base64-encoded reference audio (WAV)"
          },
          "transcript": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Transcript",
            "description": "Transcript of the reference audio. For design voices this is the natural-language voice description, not the spoken text."
          },
          "ref_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ref Text",
            "description": "The actual spoken text in the reference audio. Set for design voices; empty string for clone voices."
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name",
            "description": "Voice display name"
          },
          "voice_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Voice Type",
            "description": "'clone' or 'design'"
          },
          "has_voice_clone_prompt": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Has Voice Clone Prompt",
            "description": "Whether a precomputed voice prompt cache exists"
          },
          "word_timestamps": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Word Timestamps",
            "description": "Word-level timestamps [{text,start_time,end_time}] if persisted"
          },
          "transcript_manual": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Transcript Manual",
            "description": "True if the transcript was written or corrected by the user"
          },
          "align_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "done",
                  "no_speech",
                  "failed"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Align Status",
            "description": "Outcome of the last alignment of this voice's current audio, or null if it has not been aligned"
          },
          "source": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VoiceSourceModel"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the audio was cut from, when it came from a public sample"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Error message if load failed"
          }
        },
        "type": "object",
        "required": [
          "success"
        ],
        "title": "VoiceLoadResponse"
      },
      "VoiceSaveResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "title": "Success",
            "description": "Whether the voice was saved successfully"
          },
          "voice": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VoiceItem"
              },
              {
                "type": "null"
              }
            ],
            "description": "Saved voice metadata"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message",
            "description": "Error message if save failed"
          }
        },
        "type": "object",
        "required": [
          "success"
        ],
        "title": "VoiceSaveResponse"
      },
      "VoiceSourceModel": {
        "properties": {
          "task_id": {
            "type": "string",
            "title": "Task Id",
            "description": "Id of the public sample the audio was cut from"
          },
          "start": {
            "type": "number",
            "minimum": 0.0,
            "title": "Start",
            "description": "Start of the saved audio within the sample, in seconds"
          },
          "end": {
            "type": "number",
            "exclusiveMinimum": 0.0,
            "title": "End",
            "description": "End of the saved audio within the sample, in seconds"
          }
        },
        "type": "object",
        "required": [
          "task_id",
          "start",
          "end"
        ],
        "title": "VoiceSourceModel"
      },
      "VoiceUpdateRequest": {
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "color": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Color"
          },
          "library_voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Library Voice Id"
          },
          "linked_voice_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linked Voice Id"
          }
        },
        "type": "object",
        "title": "VoiceUpdateRequest"
      }
    }
  },
  "tags": [
    {
      "name": "Health",
      "description": "Server health check and graceful shutdown."
    },
    {
      "name": "System",
      "description": "Hardware info, GPU device selection, backend detection, and dev mode. Use `GET /api/v1/system/backend` to determine if CUDA/MLX/CPU is configured."
    },
    {
      "name": "Setup",
      "description": "First-run setup flow. Check `GET /api/v1/setup/status` to see if setup is required, then `GET /api/v1/setup/options` for available backends, `POST /api/v1/setup/start` to install, and `GET /api/v1/setup/progress` to poll."
    },
    {
      "name": "Settings",
      "description": "App configuration: VRAM mode, UI language, transcription model, speaker detection engine, audio output format, TTS model quality, generation mode, HTTP API and MCP settings. Most settings take effect immediately; some (model quality, low VRAM, generation mode) require a model reload."
    },
    {
      "name": "Model",
      "description": "TTS model lifecycle. **You must load a model before generating speech.** Use `POST /api/v1/model/load` to load, `GET /api/v1/model/load/progress` to poll, and `GET /api/v1/model/status` to check what's loaded. The model auto-switches when you change generation mode or quality."
    },
    {
      "name": "Generation",
      "description": "Shared generation infrastructure: progress polling, result retrieval, cancellation, and queue status. These endpoints work across all generation modes (clone, design, TTS). Only one generation runs at a time."
    },
    {
      "name": "Clone",
      "description": "Voice cloning from reference audio. Provide 3-15 seconds of clear speech as `ref_audio_base64`, or reference a saved `voice_id`. Supports sync, async, and streaming modes."
    },
    {
      "name": "Design",
      "description": "Voice creation from natural language descriptions. Describe the voice you want in `instruct_text`. Designed voices vary between calls — save via `POST /api/v1/voices` and use the saved design endpoints to reuse a voice."
    },
    {
      "name": "TTS",
      "description": "Text-to-speech with built-in speaker voices. List available speakers with `GET /api/v1/tts/speakers`, then generate with `POST /api/v1/tts/generate`. Supports optional `instruct` parameter for style control (e.g. 'speak slowly and softly')."
    },
    {
      "name": "Transcription",
      "description": "Speech-to-text (ASR). Supports sync and async modes, optional word-level timestamps, SRT subtitle output, and punctuation restoration from reference text. Only one transcription runs at a time."
    },
    {
      "name": "Streaming",
      "description": "Real-time audio streaming sessions. After starting a stream via a `/stream` endpoint, use `GET /api/v1/streaming/{session_id}/audio` for chunked WAV playback, `GET /api/v1/streaming/{session_id}` for session status, and `POST /api/v1/streaming/{session_id}/finalize` to collect the complete audio. Sessions expire after 10 minutes."
    },
    {
      "name": "Voices",
      "description": "Saved voice library (CRUD). Voices are either cloned (from audio) or designed (from descriptions). Use the `voice_id` from saved voices in clone and design generation requests."
    },
    {
      "name": "History",
      "description": "Generation history (CRUD). Stores past generation results with audio and metadata, newest first. Filterable by generation mode."
    },
    {
      "name": "Cache",
      "description": "Model and pip cache management. View cache sizes and clear caches to free disk space."
    },
    {
      "name": "GPU Install",
      "description": "Legacy GPU acceleration installation. Prefer the Setup endpoints for new installations."
    },
    {
      "name": "Conversion",
      "description": "Voice conversion. `POST /api/v1/conversion/convert` turns existing speech into a target voice. Poll `GET /api/v1/conversion/progress`, then collect `GET /api/v1/conversion/result`."
    },
    {
      "name": "Audio",
      "description": "Audio file format conversion."
    },
    {
      "name": "Translation",
      "description": "Text translation."
    },
    {
      "name": "YouTube",
      "description": "Download audio from a YouTube link to use as reference audio, slice a range from it, or transcribe it."
    },
    {
      "name": "Audiobook",
      "description": "Audiobook projects. Import a script or document, assign voices to speakers, generate audio segment by segment or in batches, and combine or export the finished book. Each segment keeps every take in its history."
    },
    {
      "name": "Dubbing",
      "description": "Video dubbing projects. Transcribe a video, assign a voice to each speaker, generate the dubbed audio, and optionally run lip sync."
    },
    {
      "name": "Clips",
      "description": "Clips projects. Find short clips in a long video or YouTube link, reframe them, add captions and render them."
    },
    {
      "name": "AI Cut",
      "description": "AI Cut projects. Analyse a recording against an optional script, cut retakes and filler, and render the result to MP4."
    },
    {
      "name": "Subtitles",
      "description": "Saved subtitle style presets."
    },
    {
      "name": "Images",
      "description": "Generate images from a prompt with the image models on this computer."
    },
    {
      "name": "Agent",
      "description": "Speech for AI agents. Speak text in a saved voice, use the OpenAI-compatible speech endpoint, or follow speak events over SSE."
    }
  ],
  "servers": [
    {
      "url": "http://127.0.0.1:8100",
      "description": "Voice Creator Pro on this computer"
    }
  ]
}
