Multi-Modality Through One Endpoint: What OpenRouter's Architecture Tells Every AI Gateway Operator
OpenRouter unified chat, image gen, video, TTS, transcription, and embeddings under a single base URL and routing policy layer. Here's the architectural decision framework every operator faces when their product goes multi-modal.
Archive item produced with AI assistance from the cited source and published without individual review. Editor of record: Joe Werner.

Every AI product roadmap eventually hits the N-modality problem. Your first sprint ships chat. Then you need product image generation. Then voice input for mobile. Then a knowledge base that needs embeddings. Before you know it you are maintaining four provider SDKs, four billing relationships, four auth refresh flows, and four different retry and backoff implementations—all before you write a line of feature code.
On July 16, OpenRouter published a technical breakdown of how they solve this across their platform: one base URL (https://openrouter.ai/api/v1), one API key, one bill, and the same routing controls applied uniformly across every modality. It is worth reading not just for what OpenRouter does, but for what it reveals about the architectural decision every AI gateway operator is quietly making.
What OpenRouter's multi-modality map looks like
The OpenRouter design distinguishes two groups of modalities. Five of them—text chat, image input (vision), PDF, audio input, and video input—all ride the existing /chat/completions endpoint and differ only by content type in the message array. You are already calling this endpoint for text; adding image or audio input is a content-type change, not an endpoint change.
Five dedicated endpoints handle the generation and transformation tasks where the call shape is genuinely different:
| Endpoint | Modality |
|---|---|
POST /api/v1/images | Image generation (prompt → base64 images) |
POST /api/v1/videos | Video generation (async; submit → poll job ID) |
POST /api/v1/audio/speech | Text-to-speech (text → MP3/PCM) |
POST /api/v1/audio/transcriptions | Transcription (base64 audio → text) |
POST /api/v1/embeddings | Embeddings (text or text+image → vectors) |
Video generation is async by design—you submit a prompt, get a job ID, and poll for completion—the same pattern any operator needs for long-latency media jobs.
Why the routing layer is the critical insight
The API surface is the visible part. The more important claim is that the same routing policy object applies uniformly across all modalities. Provider failover, data_collection: "deny" for privacy-sensitive workloads, and cost/latency sort work identically whether you are calling /chat/completions or /embeddings.
This matters operationally. When each modality runs through its own SDK and provider integration, your policy enforcement is fragmented:
- Your chat calls respect a data residency rule; your image generation calls skip it because they go through a different integration.
- Your fallback logic handles text provider failures; an image generation provider outage surfaces as an unhandled error.
- Your billing dashboard shows text token spend; image generation spend lives in a separate invoice.
A routing layer that treats modality-agnostic policy as a first-class primitive removes all three gaps. One rule governs every call regardless of what it returns.
The operator decision framework
When your product goes multi-modal, you face a fork:
Option A: per-modality integrations. Each team picks the best provider for their modality, integrates directly, and you end up with N billing relationships and N policy surfaces. Fast to start, expensive to govern at scale.
Option B: route everything through a gateway. One credential, one billing surface, one place to enforce rate limiting, budget caps, data residency, and fallback logic across chat, image, audio, and embeddings simultaneously.
Option B's cost is that your gateway must understand every modality it routes. A gateway built only for /chat/completions cannot enforce provider fallback on an image generation call, because it never touches that traffic.
The practical checklist for operators evaluating their current stack:
- Does your gateway route image generation and video jobs the same way it routes chat? If not, those modalities are unprotected by your routing policy.
- Do you have provider fallback configured for image generation providers? Image generation is still dominated by a small set of providers; a single provider outage with no fallback is a product outage.
- Is async media (video generation, long TTS jobs) tracked in the same usage ledger as your synchronous calls? If not, your cost accounting has a gap.
- Can you enforce
data_collection: denyor equivalent privacy controls on embeddings calls? Embeddings often carry the most semantically sensitive content in an application.
What this means for your routing policy
OpenRouter's design is a useful benchmark regardless of which gateway you use. The signal is that the industry is converging on treating multi-modality as a routing problem, not just an integration problem. The teams that route it through a single policy layer get unified billing, consistent governance, and one place to add or swap providers. The teams that integrate each modality directly pay the governance tax at scale.
For operators running workloads across chat, image, audio, and embeddings today: audit whether your current routing layer covers all of them. If it covers only text, you are one provider outage away from a modality-specific gap in your reliability posture.
A few real limits worth planning around from the OpenRouter breakdown: embeddings don't stream (they return in one response), audio input is base64-only (no URL references), and video URL support is provider-specific rather than universal. These are the rough edges that show up when a unified interface meets genuinely different provider implementations—worth knowing before you commit to a provider for a modality-sensitive workload.

Claude Sonnet 5.5 Ships Five Breaking API Changes for Operators Running Sonnet 5
Claude Sonnet 5.5 (Sep 28) ships 5 breaking changes: forced tool use returns 400, `thinking:disabled` is rejected, thinking blocks are model-bound, `computer_20251124` is gone on the Claude API, and advisor pairings are now 5.x-only.

A Model-Level 429 From Zhipu Took GLM Flash Models Offline. TheRouter Now Scopes Cooldowns Per Model and Gives Them a Second Route.
On 2026-10-02 Zhipu's API returned a model-level rate-limit response for glm-4.6v-flash and TheRouter parked the whole account. Cooldowns are now per model, and six GLM flash-family models have a second route through Zhipu's international service.

OpenAI Prompt Cache Diagnostics Is GA: What Gateway Operators Must Not Strip
OpenAI's Prompt Cache Diagnostics tool is now GA in the Responses API. It adds comparison_response_id and a reason field that explain cache misses—and breaks silently if your AI gateway strips prompt_cache_options.