Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

omni-inference — Claude Code skill: what it does, how to install

Connects OpenAI-compatible inference endpoints for chat, embeddings, audio, and images. Useful for AI agents calling OmniRoute endpoints.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add cheaper-inference/OmniRoute --skill omni-inference -a claude-code
Open on GitHub

What omni-inference does

The skill provides the agent with documentation for OmniRoute inference endpoints. It maps OpenAI-compatible routes including POST /api/v1/chat/completions, token counting via POST /api/v1/messages/count_tokens, image generation, reranking, and OCR endpoints. It also lists routes for batch processing, speech-to-text, and file handling.

Every request expects a Bearer token or a session cookie obtained via POST /api/auth/login. When running local development environments, you can bypass this requirement by setting REQUIRE_API_KEY=false. Missing credentials will cause immediate request failures if that variable is unset.

What it helps with

  • call chat completions and count message tokens
  • generate embeddings and multimodal vectors via API
  • transcribe and synthesize audio through speech endpoints
  • manage batch processing jobs with /api/v1/batches

Example prompts for the agent

  • Show the required parameters for `POST /api/v1/chat/completions` in OmniRoute
  • How do I send a transcription request to `POST /api/v1/audio/transcriptions`?
  • What headers are needed to call `POST /api/v1/rerank`?

How to install omni-inference

1Skills CLI (Vercel)

npx skills add cheaper-inference/OmniRoute --skill omni-inference -a claude-code

2Manually: put the files in place

~/.claude/skills/omni-inference/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/omni-inference/

From the same set34

The whole set →
cli-setup cheaper-inference Helps the agent configure OmniRoute, manage autostart, apply CLI updates, and adjust session environment variables. Claude Code CX Codex Cursor +1 1,200installs omni-combos-routing cheaper-inference This skill creates and manages model routing combos with fallback chains, tests, and metrics. Use it when OmniRoute needs configurable provider routing. Claude Code CX Codex Cursor +1 1,200installs cli-providers cheaper-inference Manage OmniRoute provider connections from the CLI: inspect the catalog, test connections, rotate keys, and view metrics. Useful when provider setup is part of your terminal workflow. Claude Code CX Codex Cursor +1 1,100installs omni-auth cheaper-inference Manage API keys and sessions in OmniRoute. Authenticates requests via Bearer tokens, handles dashboard login with password or OIDC, and controls session access. Claude Code CX Codex Cursor +1 1,100installs cli-routing cheaper-inference Manage model routing combos from the command line with omniroute. Test routing strategies, inspect metrics, and configure fallback chains interactively. Claude Code CX Codex Cursor +1 1,100installs omni-mcp cheaper-inference Connects an agent to the OmniRoute MCP server for request routing, memory, cache, and audit work. Use it when those operations need to be available as MCP tools. Claude Code CX Codex Cursor +1 1,100installs omni-providers cheaper-inference Manages connections to 375 AI providers via REST API: adds keys, tests connections, syncs models. Claude Code CX Codex Cursor +1 1,100installs cli-keys cheaper-inference Manages OmniRoute API keys and provider OAuth flows from your terminal. Handy when configuring model access and usage policies. Claude Code CX Codex Cursor +1 1,000installs

Similar

video-toolkit calesthio Automates video creation: generates voiceovers, background music, animates talking heads, and composes scenes with Remotion. Requires Node.js, Python3, ffmpeg, and cloud GPU access (Modal or RunPod). Claude Code CX Codex Cursor +1 1,100installs text-to-speech calesthio Generates speech audio with HeyGen Starfish and lets you choose a voice, speed, and pitch. Useful for voiceovers, narration, and podcasts. Claude Code CX Codex Cursor +1 1,100installs ascii-video SHL0MS, Hermes Agent Converts video, audio, and images into colored ASCII video (MP4, GIF). Supports audio-reactive visualization, generative animation, and text overlays. Claude Code CX Codex Cursor +1 435installs frontend-dev MiniMax-AI Orchestrates frontend development, motion design, AI-generated media, and conversion copy. Built for landing pages, marketing sites, and dashboards. Claude Code CX Codex Cursor +1 3,200installs microsoft-agent-framework official github Guides GitHub Copilot through building, updating, reviewing, and explaining Microsoft Agent Framework applications. It also covers migrations from Semantic Kernel and AutoGen. GitHub Copilot 1,900installs bfl-api Black Forest Labs This skill helps connect BFL FLUX API for image generation and editing. It covers async requests, polling, rate limits, and webhooks. Claude Code CX Codex Cursor +1 1,000installs skill-creator official anthropics Creates and refines skills, then tests them with prompts, evaluations, and performance checks. Claude Code Claude.ai 414,180installs writing-for-agents Matt Pocock Guidance for writing skills and agent-facing documents. Use it when editing AGENTS.md, CLAUDE.md, or reference files reached from them. Claude Code 466,719installs

Questions about omni-inference

How to install omni-inference in Claude Code?

Run npx skills add cheaper-inference/OmniRoute --skill omni-inference -a claude-code in your terminal.

What does omni-inference do?

It gives your coding agent an index of OmniRoute OpenAI-compatible endpoints for chat, embeddings, audio, OCR, and batch tasks.

What authentication does omni-inference require?

All endpoints require a Bearer token or session cookie from POST /api/auth/login, unless you set REQUIRE_API_KEY=false for local setups.

Source text

SKILL.md · MIT
---
name: omni-inference
description: "The core OpenAI-compatible inference endpoints: chat completions, embeddings, images, audio (TTS/STT), moderations, rerank, and the Responses API. The primary integration surface for AI agents."
---
<!-- generated by src/lib/agentSkills/generator.ts; manual edits will be overwritten -->

## Overview

The core OpenAI-compatible inference endpoints: chat completions, embeddings, images, audio (TTS/STT), moderations, rerank, and the Responses API. The primary integration surface for AI agents.

## Authentication

All requests require a valid Bearer token or session cookie. Obtain a token via `POST /api/auth/login` or configure `REQUIRE_API_KEY=false` for local development.

## Endpoints

- [`POST /api/v1/session-leases`](references/endpoints.md#post-apiv1session-leases)
- [`GET /api/v1/search`](references/endpoints.md#get-apiv1search)
- [`POST /api/v1/search`](references/endpoints.md#post-apiv1search)
- [`POST /api/v1/chat/completions`](references/endpoints.md#post-apiv1chatcompletions)
- [`GET /api/v1/ws`](references/endpoints.md#get-apiv1ws)
- [`POST /api/v1/providers/{provider}/chat/completions`](references/endpoints.md#post-apiv1providersproviderchatcompletions)
- [`POST /api/v1/api/chat`](references/endpoints.md#post-apiv1apichat)
- [`POST /api/v1/messages`](references/endpoints.md#post-apiv1messages)
- [`POST /api/v1/messages/count_tokens`](references/endpoints.md#post-apiv1messagescounttokens)
- [`POST /api/v1/responses`](references/endpoints.md#post-apiv1responses)
- [`POST /api/v1/embeddings`](references/endpoints.md#post-apiv1embeddings)
- [`GET /api/v1/multimodal-embeddings`](references/endpoints.md#get-apiv1multimodal-embeddings)
- [`POST /api/v1/multimodal-embeddings`](references/endpoints.md#post-apiv1multimodal-embeddings)
- [`POST /api/v1/providers/{provider}/embeddings`](references/endpoints.md#post-apiv1providersproviderembeddings)
- [`POST /api/v1/images/generations`](references/endpoints.md#post-apiv1imagesgenerations)
- [`POST /api/v1/providers/{provider}/images/generations`](references/endpoints.md#post-apiv1providersproviderimagesgenerations)
- [`POST /api/v1/audio/speech`](references/endpoints.md#post-apiv1audiospeech)
- [`POST /api/v1/audio/transcriptions`](references/endpoints.md#post-apiv1audiotranscriptions)
- [`POST /api/v1/moderations`](references/endpoints.md#post-apiv1moderations)
- [`POST /api/v1/rerank`](references/endpoints.md#post-apiv1rerank)
- [`GET /api/v1`](references/endpoints.md#get-apiv1)
- [`GET /api/v1/providers/{provider}/models`](references/endpoints.md#get-apiv1providersprovidermodels)
- [`GET /api/v1/management/proxy-subscriptions`](references/endpoints.md#get-apiv1managementproxy-subscriptions)
- [`POST /api/v1/management/proxy-subscriptions`](references/endpoints.md#post-apiv1managementproxy-subscriptions)
- [`GET /api/v1/management/proxy-subscriptions/{id}`](references/endpoints.md#get-apiv1managementproxy-subscriptionsid)
- [`PATCH /api/v1/management/proxy-subscriptions/{id}`](references/endpoints.md#patch-apiv1managementproxy-subscriptionsid)
- [`DELETE /api/v1/management/proxy-subscriptions/{id}`](references/endpoints.md#delete-apiv1managementproxy-subscriptionsid)
- [`GET /api/v1/management/proxy-subscriptions/{id}/nodes`](references/endpoints.md#get-apiv1managementproxy-subscriptionsidnodes)
- [`POST /api/v1/management/proxy-subscriptions/{id}/refresh`](references/endpoints.md#post-apiv1managementproxy-subscriptionsidrefresh)
- [`POST /api/v1/ocr`](references/endpoints.md#post-apiv1ocr)
- [`POST /api/v1/audio/translations`](references/endpoints.md#post-apiv1audiotranslations)
- [`GET /api/v1/voices`](references/endpoints.md#get-apiv1voices)
- [`POST /api/v1/speech-to-text`](references/endpoints.md#post-apiv1speech-to-text)
- [`POST /api/v1/text-to-speech/{voiceId}`](references/endpoints.md#post-apiv1text-to-speechvoiceid)
- [`GET /api/v1/explain/routing`](references/endpoints.md#get-apiv1explainrouting)
- [`GET /api/v1/providers/suggested-models`](references/endpoints.md#get-apiv1providerssuggested-models)
- [`GET /api/v1/provider-plugin-manifest`](references/endpoints.md#get-apiv1provider-plugin-manifest)
- [`GET /api/v1/{omnirouteCatchAll}`](references/endpoints.md#get-apiv1omniroutecatchall)
- [`POST /api/v1/{omnirouteCatchAll}`](references/endpoints.md#post-apiv1omniroutecatchall)
- [`PUT /api/v1/{omnirouteCatchAll}`](references/endpoints.md#put-apiv1omniroutecatchall)
- [`PATCH /api/v1/{omnirouteCatchAll}`](references/endpoints.md#patch-apiv1omniroutecatchall)
- [`DELETE /api/v1/{omnirouteCatchAll}`](references/endpoints.md#delete-apiv1omniroutecatchall)
- [`GET /api/v1/accounts/{id}/limits`](references/endpoints.md#get-apiv1accountsidlimits)
- [`PUT /api/v1/accounts/{id}/limits`](references/endpoints.md#put-apiv1accountsidlimits)
- [`GET /api/v1/agents/credentials`](references/endpoints.md#get-apiv1agentscredentials)
- [`POST /api/v1/agents/credentials`](references/endpoints.md#post-apiv1agentscredentials)
- [`GET /api/v1/agents/health`](references/endpoints.md#get-apiv1agentshealth)
- [`GET /api/v1/agents/tasks`](references/endpoints.md#get-apiv1agentstasks)
- [`POST /api/v1/agents/tasks`](references/endpoints.md#post-apiv1agentstasks)
- [`DELETE /api/v1/agents/tasks`](references/endpoints.md#delete-apiv1agentstasks)
- [`GET /api/v1/agents/tasks/{id}`](references/endpoints.md#get-apiv1agentstasksid)
- [`POST /api/v1/agents/tasks/{id}`](references/endpoints.md#post-apiv1agentstasksid)
- [`DELETE /api/v1/agents/tasks/{id}`](references/endpoints.md#delete-apiv1agentstasksid)
- [`POST /api/v1/antigravity`](references/endpoints.md#post-apiv1antigravity)
- [`GET /api/v1/auto-combo/{channel}/candidates`](references/endpoints.md#get-apiv1auto-combochannelcandidates)
- [`GET /api/v1/batches`](references/endpoints.md#get-apiv1batches)
- [`POST /api/v1/batches`](references/endpoints.md#post-apiv1batches)
- [`GET /api/v1/batches/{id}`](references/endpoints.md#get-apiv1batchesid)
- [`DELETE /api/v1/batches/{id}`](references/endpoints.md#delete-apiv1batchesid)
- [`POST /api/v1/batches/{id}/cancel`](references/endpoints.md#post-apiv1batchesidcancel)
- [`DELETE /api/v1/batches/delete-completed`](references/endpoints.md#delete-apiv1batchesdelete-completed)
- [`POST /api/v1/classify`](references/endpoints.md#post-apiv1classify)
- [`GET /api/v1/combos`](references/endpoints.md#get-apiv1combos)
- [`POST /api/v1/completions`](references/endpoints.md#post-apiv1completions)
- [`GET /api/v1/files`](references/endpoints.md#get-apiv1files)
- [`POST /api/v1/files`](references/endpoints.md#post-apiv1files)
- [`GET /api/v1/files/{id}`](references/endpoints.md#get-apiv1filesid)
- [`DELETE /api/v1/files/{id}`](references/endpoints.md#delete-apiv1filesid)
- [`GET /api/v1/files/{id}/content`](references/endpoints.md#get-apiv1filesidcontent)
- [`POST /api/v1/images/edits`](references/endpoints.md#post-apiv1imagesedits)
- [`GET /api/v1/images/upscale`](references/endpoints.md#get-apiv1imagesupscale)
- [`POST /api/v1/images/upscale`](references/endpoints.md#post-apiv1imagesupscale)
- [`GET /api/v1/media/{id}`](references/endpoints.md#get-apiv1mediaid)
- [`POST /api/v1/issues/report`](references/endpoints.md#post-apiv1issuesreport)
- [`GET /api/v1/management/proxies`](references/endpoints.md#get-apiv1managementproxies)
- [`POST /api/v1/management/proxies`](references/endpoints.md#post-apiv1managementproxies)
- [`PATCH /api/v1/management/proxies`](references/endpoints.md#patch-apiv1managementproxies)
- [`DELETE /api/v1/management/proxies`](references/endpoints.md#delete-apiv1managementproxies)
- [`GET /api/v1/management/proxies/assignments`](references/endpoints.md#get-apiv1managementproxiesassignments)
- [`PUT /api/v1/management/proxies/assignments`](references/endpoints.md#put-apiv1managementproxiesassignments)
- [`PUT /api/v1/management/proxies/bulk-assign`](references/endpoints.md#put-apiv1managementproxiesbulk-assign)
- [`GET /api/v1/management/proxies/health`](references/endpoints.md#get-apiv1managementproxieshealth)
- [`GET /api/v1/me/status`](references/endpoints.md#get-apiv1mestatus)
- [`GET /api/v1/muse-code/models`](references/endpoints.md#get-apiv1muse-codemodels)
- [`GET /api/v1/music/generations`](references/endpoints.md#get-apiv1musicgenerations)
- [`POST /api/v1/music/generations`](references/endpoints.md#post-apiv1musicgenerations)
- [`GET /api/v1/providers/{provider}/limits`](references/endpoints.md#get-apiv1providersproviderlimits)
- [`PUT /api/v1/providers/{provider}/limits`](references/endpoints.md#put-apiv1providersproviderlimits)
- [`GET /api/v1/quotas/check`](references/endpoints.md#get-apiv1quotascheck)
- [`GET /api/v1/registered-keys`](references/endpoints.md#get-apiv1registered-keys)
- [`POST /api/v1/registered-keys`](references/endpoints.md#post-apiv1registered-keys)
- [`GET /api/v1/registered-keys/{id}`](references/endpoints.md#get-apiv1registered-keysid)
- [`DELETE /api/v1/registered-keys/{id}`](references/endpoints.md#delete-apiv1registered-keysid)
- [`POST /api/v1/registered-keys/{id}/revoke`](references/endpoints.md#post-apiv1registered-keysidrevoke)
- [`POST /api/v1/relay/chat/completions`](references/endpoints.md#post-apiv1relaychatcompletions)
- [`POST /api/v1/relay/chat/completions/bifrost`](references/endpoints.md#post-apiv1relaychatcompletionsbifrost)
- [`POST /api/v1/responses/{path}`](references/endpoints.md#post-apiv1responsespath)
- [`GET /api/v1/search/analytics`](references/endpoints.md#get-apiv1searchanalytics)
- [`POST /api/v1/segment`](references/endpoints.md#post-apiv1segment)
- [`GET /api/v1/video-bridge/drilldown`](references/endpoints.md#get-apiv1video-bridgedrilldown)
- [`DELETE /api/v1/video-bridge/drilldown`](references/endpoints.md#delete-apiv1video-bridgedrilldown)
- [`GET /api/v1/videos/generations`](references/endpoints.md#get-apiv1videosgenerations)
- [`POST /api/v1/videos/generations`](references/endpoints.md#post-apiv1videosgenerations)
- [`GET /api/v1/vscode/{token}`](references/endpoints.md#get-apiv1vscodetoken)
- [`POST /api/v1/vscode/{token}/api/chat`](references/endpoints.md#post-apiv1vscodetokenapichat)
- [`POST /api/v1/vscode/{token}/api/show`](references/endpoints.md#post-apiv1vscodetokenapishow)
- [`GET /api/v1/vscode/{token}/api/tags`](references/endpoints.md#get-apiv1vscodetokenapitags)
- [`GET /api/v1/vscode/{token}/api/version`](references/endpoints.md#get-apiv1vscodetokenapiversion)
- [`POST /api/v1/vscode/{token}/chat/completions`](references/endpoints.md#post-apiv1vscodetokenchatcompletions)
- [`GET /api/v1/vscode/{token}/combos`](references/endpoints.md#get-apiv1vscodetokencombos)
- [`GET /api/v1/vscode/{token}/models`](references/endpoints.md#get-apiv1vscodetokenmodels)
- [`POST /api/v1/vscode/{token}/responses`](references/endpoints.md#post-apiv1vscodetokenresponses)
- [`POST /api/v1/vscode/{token}/v1/chat/completions`](references/endpoints.md#post-apiv1vscodetokenv1chatcompletions)
- [`GET /api/v1/vscode/{token}/v1/models`](references/endpoints.md#get-apiv1vscodetokenv1models)
- [`GET /api/v1/vscode/combos/{token}/{{slug}}`](references/endpoints.md#get-apiv1vscodecombostokenslug)
- [`POST /api/v1/vscode/combos/{token}/{{slug}}`](references/endpoints.md#post-apiv1vscodecombostokenslug)
- [`GET /api/v1/vscode/raw/{token}`](references/endpoints.md#get-apiv1vscoderawtoken)
- [`POST /api/v1/vscode/raw/{token}/api/chat`](references/endpoints.md#post-apiv1vscoderawtokenapichat)
- [`POST /api/v1/vscode/raw/{token}/api/show`](references/endpoints.md#post-apiv1vscoderawtokenapishow)
- [`GET /api/v1/vscode/raw/{token}/api/tags`](references/endpoints.md#get-apiv1vscoderawtokenapitags)
- [`GET /api/v1/vscode/raw/{token}/api/version`](references/endpoints.md#get-apiv1vscoderawtokenapiversion)
- [`POST /api/v1/vscode/raw/{token}/chat/completions`](references/endpoints.md#post-apiv1vscoderawtokenchatcompletions)
- [`GET /api/v1/vscode/raw/{token}/combos`](references/endpoints.md#get-apiv1vscoderawtokencombos)
- [`GET /api/v1/vscode/raw/{token}/models`](references/endpoints.md#get-apiv1vscoderawtokenmodels)
- [`POST /api/v1/vscode/raw/{token}/responses`](references/endpoints.md#post-apiv1vscoderawtokenresponses)
- [`POST /api/v1/vscode/raw/{token}/v1/chat/completions`](references/endpoints.md#post-apiv1vscoderawtokenv1chatcompletions)
- [`GET /api/v1/vscode/raw/{token}/v1/models`](references/endpoints.md#get-apiv1vscoderawtokenv1models)
- [`POST /api/v1/web/fetch`](references/endpoints.md#post-apiv1webfetch)
## Payloads

See the full OpenAPI specification at `GET /api/openapi/spec` or `docs/openapi.yaml` for detailed request/response schemas.

<!-- skill:custom-start -->
<!-- Aggregated from: omniroute-chat, omniroute-image, omniroute-tts, omniroute-stt, omniroute-embeddings, omniroute-web-search, omniroute-web-fetch -->

## Chat completions

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omni-auth/SKILL.md) for setup.

### Endpoints

- `POST $OMNIROUTE_URL/v1/chat/completions` — OpenAI format
- `POST $OMNIROUTE_URL/v1/messages` — Anthropic Messages format
- `POST $OMNIROUTE_URL/v1/responses` — OpenAI Responses API

### Discover

```bash
curl $OMNIROUTE_URL/v1/models | jq '.data[].id'
```

Combos (e.g. `auto`, `cost-optimized`, `subscription`) auto-fallback through multiple providers.

### OpenAI format example

```bash
curl -X POST $OMNIROUTE_URL/v1/chat/completions \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-opus-4-7",
    "messages": [{"role": "user", "content": "Refactor this function"}],
    "stream": true
  }'
```

### Anthropic format example

```bash
curl -X POST $OMNIROUTE_URL/v1/messages \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-opus-4-7",
    "max_tokens": 4096,
    "messages": [{"role": "user", "content": "Hi"}]
  }'
```

### Tool use

Supports OpenAI `tools` array and Anthropic `tools` block. Tool results
auto-compressed via RTK (47 filters: git-diff, grep, test-jest, terraform-plan,
docker-logs, etc.) — 20-40% token savings. Disable per-request with
`X-Omniroute-Rtk: off` header.

### Reasoning / thinking

Anthropic extended thinking and OpenAI Responses reasoning blocks are forwarded
verbatim. Cached automatically via reasoning cache.

### Errors

- `401` → invalid API key
- `400 invalid_model` → model not in registry; check `/v1/models`
- `503 circuit_open` → provider circuit breaker tripped; retry later or use combo
- `429 rate_limited` → honor `Retry-After`; consider using a combo for auto-fallback

## Image generation

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omni-auth/SKILL.md) for setup.

### Endpoints

- `POST $OMNIROUTE_URL/v1/images/generations` — Text-to-image
- `POST $OMNIROUTE_URL/v1/images/edits` — Image edit (mask)
- `POST $OMNIROUTE_URL/v1/images/variations` — Variations

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/image | jq '.data[]'
```

Returns `{ id, owned_by, sizes:[...], capabilities:[...] }` per model.

### Generate example

```bash
curl -X POST $OMNIROUTE_URL/v1/images/generations \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "dall-e-3",
    "prompt": "a red bicycle on a wet street, photoreal",
    "n": 1,
    "size": "1024x1024",
    "response_format": "b64_json"
  }'
```

Response: `{ created, data: [{ url? or b64_json, revised_prompt }] }`

### Errors

- `400 invalid_size` → not supported by this model; check `/v1/models/image`
- `400 content_policy_violation` → blocked by provider safety
- `503` → provider unavailable; try another model in `/v1/models/image`

## Text-to-speech

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omni-auth/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/audio/speech` — returns binary audio (mp3/opus/wav/flac)

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/tts | jq '.data[]'
```

Each entry includes `voices:[...]` for the available voice names per provider.

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/audio/speech \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tts-1",
    "input": "Hello from OmniRoute.",
    "voice": "alloy",
    "response_format": "mp3"
  }' --output speech.mp3
```

### Voices

Voice names vary by provider. Check `/v1/models/tts` — each entry has `voices:[...]`.
Common OpenAI voices: `alloy`, `echo`, `fable`, `onyx`, `nova`, `shimmer`.

### Errors

- `400 invalid_voice` → voice not supported by this model
- `400 input_too_long` → input exceeds model character limit
- `503` → provider unavailable; try another model in `/v1/models/tts`

## Speech-to-text

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omni-auth/SKILL.md) for setup.

### Endpoints

- `POST $OMNIROUTE_URL/v1/audio/transcriptions` — multipart upload, returns text
- `POST $OMNIROUTE_URL/v1/audio/translations` — transcribe + translate to English

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/stt | jq '.data[]'
```

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/audio/transcriptions \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -F "[email protected]" \
  -F "model=whisper-1" \
  -F "response_format=verbose_json"
```

Response: `{ text, language, duration, segments?:[{ start, end, text }] }`

### Supported formats

Audio: `mp3`, `mp4`, `mpeg`, `mpga`, `m4a`, `wav`, `webm`.
Response formats: `json`, `text`, `srt`, `verbose_json`, `vtt`.

### Errors

- `400 invalid_file_format` → unsupported audio format
- `400 file_too_large` → exceeds provider limit (usually 25MB)
- `503` → provider unavailable; try another model in `/v1/models/stt`

## Embeddings

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omni-auth/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/embeddings`

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/embedding | jq '.data[]'
```

Each entry: `{ id, owned_by, dimensions, max_input_tokens }`.

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/embeddings \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-large",
    "input": ["first text", "second text"],
    "encoding_format": "float"
  }'
```

Response: `{ data:[{ embedding:[...], index }], usage:{ prompt_tokens, total_tokens } }`

### Batch input

`input` accepts a string or array of strings (up to provider batch limit, typically 2048 items).

### Errors

- `400 input_too_long` → input exceeds `max_input_tokens` for this model
- `400 invalid_encoding_format` → use `float` or `base64`
- `503` → provider unavailable; try another model in `/v1/models/embedding`

## Web search

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omni-auth/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/web/search` — unified search format

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/web | jq '.data[] | select(.kind == "webSearch")'
```

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/web/search \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tavily/search",
    "query": "OmniRoute github latest release",
    "max_results": 5,
    "include_answer": true
  }'
```

Response: `{ answer?, results:[{ url, title, content, score }] }`

### Parameters

| Field            | Type    | Description                          |
| ---------------- | ------- | ------------------------------------ |
| `model`          | string  | Provider model from `/v1/models/web` |
| `query`          | string  | Search query                         |
| `max_results`    | number  | Max results (default: 5)             |
| `include_answer` | boolean | Include AI-synthesized answer        |
| `search_depth`   | string  | `basic` or `advanced` (Tavily)       |

### Errors

- `400 query_too_long` → shorten the search query
- `503` → provider unavailable; try another model in `/v1/models/web`

## Web fetch

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omni-auth/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/web/fetch`

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/web | jq '.data[] | select(.kind == "webFetch")'
```

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/web/fetch \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "jina/reader",
    "url": "https://anthropic.com",
    "format": "markdown"
  }'
```

Response: `{ url, title, markdown, links?:[...], images?:[...] }`

### Parameters

| Field    | Type   | Description                                                             |
| -------- | ------ | ----------------------------------------------------------------------- |
| `model`  | string | Provider from `/v1/models/web` (e.g. `jina/reader`, `firecrawl/scrape`) |
| `url`    | string | URL to fetch                                                            |
| `format` | string | `markdown` (default), `html`, `text`                                    |

### Errors

- `400 invalid_url` → URL must be http/https
- `403 blocked` → provider blocked by target site; try a different model
- `503` → provider unavailable; try another model in `/v1/models/web`
<!-- skill:custom-end -->

© cheaper-inference · MIT · cheaper-inference/OmniRoute

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor