Skip to main content
warpllm is an AI gateway. You write one request in the OpenAI chat-completions shape, name a model as provider/model, and warpllm routes it — translating where a provider differs and normalizing what comes back, including failures. The routing core is written once in Rust and compiled for three languages, so Python and Node get the same behaviour as Rust rather than a reimplementation of it.

Quickstart

Install, export one key, and make a request in under five minutes.

Model routing

How provider/model strings resolve, and why an unknown one is an error.

SDK reference

The full surface for Python, TypeScript, and Rust.

Self-hosted gateway

Point any OpenAI SDK at a warpllm you run yourself.

Two ways to integrate

Install the package for your language and call it in-process. No extra hop, no service to operate. Start at the quickstart.

What ships today

The published packages are 0.6.1. warpllm is early, and this table is the honest version of what you can build on.
Claude is the first model warpllm reaches over a protocol that is not chat completions. You still write an OpenAI-shaped request and read an OpenAI-shaped reply; warpllm translates to Anthropic’s /messages on the way out and back, streaming included. Two gaps are worth knowing before you route production traffic there — see Model routing.
0.6.0 is breaking in all three languages: the client-wide base_url option moved under each provider — see Declaring providers — and eight retired model names left the roster. Read the changelog before upgrading from 0.5.x.

Design decisions worth knowing up front

warpllm matches the whole model string against its registry. A bare gpt-5-nano, or any name the registry does not carry, fails before a request goes out — rather than being forwarded to some upstream default and billed. See Model routing.
Request fields are the OpenAI ones, and fields warpllm does not model are forwarded untouched. Nothing is renamed on the way in or out. See Requests and responses.
DeepSeek answers an exhausted balance with a 402; warpllm reports it as OpenAI would — a 429 with code: "insufficient_quota" — so one handler covers every provider. See Errors.
A client reads them once, when it is built, from the variable each provider’s registry entry names — so it is never asked up front for a key it can find. A client can also declare the providers it serves, which narrows both what is read and what is routable. See Authentication.

Get help

Discord

Ask questions and follow development.

GitHub issues

Bugs, feature requests, and the public roadmap.