Last updated 2026-05-17
Changelog
User-visible changes to llmrouter, newest first.
Internal refactors that don’t affect callers are omitted
here — read
the commit log
if you want the full history.
Versions follow semantic versioning. While we are pre-1.0, expect minor breakages between minor versions; patch releases never change the public API.
The GitHub Releases page has the auto-generated commit-level notes for every tag. This page is the curated, human-written summary.
v0.8.0 — 2026-05-17
The Router, Vertex AI Anthropic, Azure Serverless, Deepgram decode fix.
The headline release for the "magic model × platform" story. A
new router/ package decouples the model vendor from
the hosting platform; two new provider packages
(vertexanthropic, azureserverless)
fill in the Vertex Claude story and unlock the
Llama / Mistral / Cohere / Phi / DeepSeek catalogue on Azure;
Issue #9 (Deepgram decode bug) is fixed; the test suite grew by
~127 new regression tests.
New router package
- New API:
router.Resolve(Request{Model, Platform, Credentials}) (llmrouter.Provider, error)androuter.ResolveFromEnv(model string) (llmrouter.Provider, error). - 12 platforms:
PlatformAuto,PlatformDirect,PlatformBedrock,PlatformVertex,PlatformAzure,PlatformOpenRouter,PlatformTogether,PlatformGroq,PlatformFireworks,PlatformCerebras,PlatformDeepSeek,PlatformPerplexity,PlatformxAI. - 9 model families:
FamilyOpenAI,FamilyAnthropic,FamilyLlama,FamilyMistral,FamilyCohere,FamilyGemini,FamilyGrok,FamilyDeepSeek,FamilyOther. Family inference via prefix matching after stripping hosting-platform vendor prefixes. - Model-id translation:
router.ApplyModelTranslation(req, platform)rewrites vendor-neutral ids to Bedrock prefixed form (anthropic.claude-3-5-sonnet-20241022-v2:0) and Vertex@-versioned form (claude-3-5-sonnet-v2@20241022). - Env-var fallback:
router.DefaultEnvVarsis the global lookup table (OPENAI_API_KEY,ANTHROPIC_API_KEY,AWS_REGION, …). Mutate to customise per-tenant. - 4 typed errors:
ErrEmptyModel,ErrUnsupportedRoute,ErrMissingCredentials,ErrNoAutoPlatform. Useerrors.Isto discriminate. See the Router concept and API reference.
New providers/vertexanthropic
- Claude on Google Vertex AI Model Garden.
Endpoint:
https://<region>-aiplatform.googleapis.com/v1/projects/<project>/locations/<region>/publishers/anthropic/models/<model>:streamRawPredict. - Pure HTTP — no
google.golang.org/genaidependency. Bring your own token source. - Vertex-specific quirk handled: the
anthropic_version: "vertex-2023-10-16"field is injected into the body (Vertex requires it in the body, not as a header). - Model id uses
@-versioning:claude-3-5-sonnet-v2@20241022. Pass verbatim inChatRequest.Modelor userouter.ApplyModelTranslation. - Auth:
WithTokenSource(...)(preferred — supports refresh) orWithAccessToken(...)(static). Rejectsllmrouter.WithAPIKey. See the provider page.
New providers/azureserverless
- Generic provider for non-OpenAI / non-Claude models on Azure AI Foundry's Serverless API (MaaS) deployment mode. Covers Llama, Mistral, Cohere, Phi, Jais, Nemotron, DeepSeek.
- Two URL shapes: deployment-scoped
(
https://<deploy>.<region>.models.ai.azure.com) and hub-scoped. Both viallmrouter.WithBaseURL. - No
api-versionquery (gotcha versusazureopenai— copy-pasted URLs with?api-version=...will 400). - Auth:
llmrouter.WithAPIKey(sets the Azure-styleapi-keyheader) XORazureserverless.WithAADToken. See the provider page.
Bug fixes
- Deepgram decode (Issue
#9)
— some interim segments on Nova-3 streams were surfacing with
empty
Text. The decoder now handles the affected event shape.
Tests
- ~127 new regression tests covering the router resolution matrix, the Vertex Anthropic body / SSE translation, the Azure Serverless URL composition and auth XOR, and the Deepgram decode regression.
Migration notes
-
v0.7 code runs unchanged. The
router/package is additive; existing callers that construct providers directly keep working. -
Deepgram callers on streams that hit Issue #9 will start
seeing populated
Texton the previously empty interim segments. Re-test any downstream code that filtered empty-text segments as a workaround.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.8.0
v0.7.0 — 2026-05-17
Azure AI Foundry Anthropic, polished README, 10 examples, CONTRIBUTING, hardened CI.
The "make it usable" release. One new provider package fills the
Claude gap on Azure AI Foundry; the README becomes the canonical
install + capability-matrix surface; ten end-to-end examples land
under examples/; CONTRIBUTING is added; and CI is
hardened with race-clean runs and static-analysis gates.
New providers/azureanthropic
- Claude on Azure AI Foundry. Body and SSE event
stream are byte-identical to direct Anthropic — every
capability of the
direct provider
works without code changes (typed tool use, thinking deltas,
prompt cache, multipart, structured outputs, mid-stream errors,
ToolResultMessage). - Two URL variants: deployment-scoped
(
/openai/deployments/<deployment>/messages) viaWithDeployment(...), or resource-scoped (/openai/v1/messages) when no deployment is set. The model field in the body picks the variant in the resource-scoped path. - Mandatory
WithAPIVersion(version)— theanthropic-versionheader is never sent; Foundry manages the API version via the query parameter. - Auth:
llmrouter.WithAPIKey(Azure-styleapi-keyheader, notx-api-key) XORazureanthropic.WithAADToken(src). Both — or neither — fails fast inNew(). See the provider page.
Polished README + 10 examples + CONTRIBUTING
-
The canonical 22-provider capability matrix moves to the README
so
pkg.go.devvisitors see it without clicking through to the docs site. -
Ten runnable examples under
examples/covering chat (OpenAI, Anthropic), embeddings, TTS, STT, realtime, rerank, structured outputs, and the new Azure Anthropic flow. -
CONTRIBUTING.mddocuments the byte-passthrough contract, the provider-package conventions, and the table-driven test idioms the rest of the codebase uses.
CI hardening
- Race-clean test runs on every PR (
go test -race -count=1 ./...). go vet+staticcheckgates.- Coverage tracking surfaced on the README badge.
Migration notes
- v0.6 code runs unchanged.
providers/azureanthropicis additive.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.7.0
v0.6.0 — 2026-05-16
STT event-type discriminator + SpeechFinal for voice-agent turn-taking.
A focused STT release. Streaming transcribers now distinguish
transcript content from endpointing / metadata events, and
voice-agent callers get a clean turn-taking signal that's
independent of the per-window is_final marker.
New TranscriptSegment fields
-
Type string— populated verbatim from the upstream event name. Empty string is the default and means "transcript content"; non-empty values surface the upstream's discriminator (Deepgram:"Results","SpeechStarted","UtteranceEnd","Metadata"). -
SpeechFinal bool— distinct fromFinal.Finalis the upstream's per-windowis_final;SpeechFinalis the end-of-utterance signal from VAD. Voice agents should dispatch turn-taking offSpeechFinal, notFinal. See the audio concept.
Migration notes
-
Both fields default to the zero value — existing consumers
that read
Text,Final,Wordskeep working with no code changes. - Deepgram callers that previously dispatched
voice-agent turn-taking off
Finalshould switch toSpeechFinal. The previous behaviour was effectively wrong on long utterances —is_finalfires several times within a single sentence as Deepgram freezes intermediate windows. -
A separate Deepgram decode bug (Issue
#9)
that produced empty
Texton some interim segments was discovered after v0.6 shipped and fixed in v0.8. Bump to v0.8 or later if you hit it.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.6.0
v0.5.0 — 2026-05-16
Gemini Live, Realtime tool use, structured outputs, Rerank, embeddings on Fireworks + DeepSeek.
The function-calling and RAG-refinement release. Five capability
blocks land together: Google's full-duplex Gemini Live joins the
realtime tier; OpenAI Realtime gets first-class tool use;
structured outputs become a cross-vendor
ChatRequest field; a brand-new
Reranker interface closes the second-stage RAG
gap; and Fireworks + DeepSeek complete the OpenAI-compat
embedding coverage. Existing v0.4 code continues to work — the
new surface is additive.
New top-level capability: Gemini Live
- New package
providers/geminilive— wraps Google'sBidiGenerateContentWebSocket API. Mirror ofopenairealtimeexactly:Provider.Connect(ctx, SessionConfig) (*Session, error)returning a handle withSendText,SendAudio,SendToolResult,Close,Events(), andErr(). - SessionConfig fields:
Model,Voice(one ofAoede,Charon,Fenrir,Kore,Puck),Instructions,OutputAudioFormat,Modalities,Temperature,TopP,Tools,Raw. - SessionEvent types:
setup.complete,server.text,server.audio(withAudioMime),server.tool_call(withToolCallID,ToolName,ToolArgs),server.turn_complete,error. - Sample-rate asymmetry surfaced in docs: input is 16 kHz PCM, output is 24 kHz PCM. One session per connection. See the Gemini Live provider page.
Tool use on OpenAI Realtime
-
SessionConfig.ToolsandSessionConfig.ToolChoice— samellmrouter.ToolDefshape used by chat. No new tool schema for callers to learn. - New
SessionEventfields:ToolCallID,ToolName,ToolArgumentsDelta(incremental JSON args fromresponse.function_call_arguments.delta), andToolArguments(complete args fromresponse.function_call_arguments.done). - New
Session.SendToolResult(ctx, toolCallID, output)— replies to a tool call with the function output as a typedconversation.item.createframe. Function-calling is now first-class over the Realtime channel — no more dropping toRaw.
Structured outputs (JSON Schema)
- New root type:
llmrouter.ResponseSchemawithName,Description,Schema json.RawMessage, andStrict bool. - New field:
ChatRequest.ResponseSchema *ResponseSchema.nilmeans “no constraint” (the existing behaviour). - Cross-vendor translation: OpenAI uses native
response_format.json_schema; Anthropic translates to forced tool-use with a synthetic tool whoseinput_schemamatches; Vertex and Gemini setGenerateContentConfig.ResponseMIMEType + ResponseSchemavia the genai SDK. Other providers ignore the field. See the Structured outputs concept.
Rerank
- New root interface:
llmrouter.RerankerwithRerank(ctx, RerankRequest) (*RerankResponse, error). - New request / response types:
RerankRequest(Model,Query,Documents,TopN,Raw),RerankResponse(Results,Usage,Raw), andRerankResult(Index,Score,Document). Results are sorted by descending score;Indexjoins back to the original document slice. - Implementations: Cohere
(
rerank-v3.5and the v3.0 family), Voyage (rerank-2,rerank-2-lite), Together (Salesforce/Llama-Rank-V1). See the Rerank concept and API reference.
Embeddings extended to Fireworks + DeepSeek
-
Thin delegation through the OpenAI-compatible provider, with
the right base URLs pre-configured. Completes the
OpenAI-compat embedding coverage across the ten verified
vendors — every OpenAI-compat provider that exposes an
embedding endpoint now implements
Embedderwithout extra work.
Capability matrix updates
- New row: Gemini Live (session-based audio + text, tool use).
- New column: Rerank (Cohere ✓, Voyage ✓, Together ✓).
- New column: Structured outputs (OpenAI ✓, Anthropic ✓ via tool-use coercion, Vertex ✓, Gemini ✓).
- Embed column extended: Fireworks ✓, DeepSeek ✓.
Tests
- Subtest count grew from 1,742 to ~2,200. The new tests cover the Gemini Live state machine, the Realtime tool-call event translation, structured-output schema translation on three providers, and rerank request/response shapes on three providers.
Migration notes
-
v0.4 code runs unchanged.
ResponseSchemadefaults tonil; the newSessionConfig.Tools/SessionConfig.ToolChoicefields are additions, not replacements. -
If you previously parsed Realtime tool-call events from
SessionEvent.Raw, the typedToolCallID/ToolName/ToolArgumentsDelta/ToolArgumentsfields are now populated alongside — theRawescape hatch still works. -
Anthropic structured-output callers must read the result from
Choice.Delta.ToolCalls(forced tool-use), not fromChoice.Delta.Content. The concept page shows the pattern.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.5.0
v0.4.0 — 2026-05-16
Realtime sessions, WebSocket streaming for audio, typed tool-result messages, Anthropic Voyage shim.
The realtime release. Existing audio providers gain WebSocket transports, OpenAI's full-duplex Realtime API gets its own top-level package, and the typed chat surface grows a proper tool-result message helper. Existing v0.3 code continues to work — the new surface is additive.
WebSocket streaming on existing providers
- Deepgram live transcription —
TranscribeRequest.Stream = truenow opens a WebSocket againstwss://api.deepgram.com/v1/listen. Interim and final segments stream back with per-word timing.TranscriptSegment.Final = falsefor interim results,truefor the terminal segment per utterance. - Cartesia
SpeakRealtime— new methodSpeakRealtime(ctx, SpeechRequest) (*AudioStream, *RealtimeContext, error). TheRealtimeContexthandle exposesAppend(text),Finalize(), andClose()for multi-turn TTS over a single socket.AudioStreambehaves like the v0.3 streaming path on the consumer side. - ElevenLabs
SpeakRealtime— identical signature, WebSocket TTS via/stream-input. SameRealtimeContextsemantics — pick the vendor by voice quality / latency, not by API shape.
New top-level capability: OpenAI Realtime
- New package
providers/openairealtime— wraps thegpt-4o-realtimeWebSocket API. Distinct fromProvider/Speaker/Transcriberbecause the surface is session-based, not request-response. - Session lifecycle:
Provider.Connect(ctx, SessionConfig) (*Session, error)thenSendText,SendAudio,Commit,CreateResponse,UpdateSession, andClose. Events stream out ofSession.Events()with the terminal error onSession.Err()— same lifecycle asStream. - Full walkthroughs in the OpenAI Realtime provider page and the Realtime sessions concept page.
Typed tool-result messages
- New helper:
llmrouter.ToolResultMessage(toolCallID, content)returns aMessagewithRole: "tool"and the linkage fields set. - New
Messagefields:ToolCallIDandName, bothomitempty. The existingRole+Contentfields are unchanged. - Vendor wire translation: OpenAI passes the
typed shape through directly; Anthropic translates a
Role: "tool"message into a user-role message containing atool_resultcontent block, withtool_use_idderived fromToolCallID. Caller code is identical for both.
Anthropic + Voyage embeddings shim
- New constructor:
providers/anthropic.NewRecommendedEmbedder(voyageAPIKey string, opts ...llmrouter.Option) (llmrouter.Embedder, error). Returns a Voyage-backedEmbedderso calling code can ask the Anthropic package for embeddings without knowing about Voyage. -
Codifies Anthropic's documented recommendation that Claude
users embed with Voyage. The Anthropic provider itself still
does not implement
Embedder; this is a convenience shim, not a wire-level wrapper.
Dependencies and tests
-
New dependency:
github.com/coder/websocket v1.8.14— pure-Go, no cgo, no transitive churn. - Subtest count grew from 1,592 to 1,742. The new tests cover the WebSocket framing for Deepgram, Cartesia, and ElevenLabs, the Realtime session state machine, the tool-result translation for both vendors, and the Voyage shim.
Migration notes
- v0.3 code runs unchanged. The new methods are additions; no existing signatures changed.
-
If you previously sent tool results as a hand-rolled
Message{Role: "tool", Content: ...}, that still works — butToolResultMessagewiresToolCallIDin the right place for Anthropic automatically. -
Deepgram streaming behaviour changes:
Stream=trueused to be a no-op, now it opens a WebSocket. Code that setStream=trueon Deepgram and got the single-final-segment fallback will now receive interim segments.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.4.0
v0.3.0 — 2026-05-15
Audio, embeddings, and four new specialist providers.
The biggest single release since v0.1. llmrouter
grows beyond chat: three new root capabilities (Embeddings, TTS,
STT) and four new provider packages dedicated to audio and
embeddings. Existing chat code is unchanged — the new interfaces
live alongside Provider.
New root capabilities
-
llmrouter.Embedderinterface —Embed(ctx, EmbedRequest) (*EmbedResponse, error). Documented at Embeddings concept and API reference. -
llmrouter.Speakerinterface (TTS) —Speak(ctx, SpeechRequest) (*AudioStream, error). -
llmrouter.Transcriberinterface (STT) —Transcribe(ctx, TranscribeRequest) (*TranscriptStream, error). Documented at Audio concept and API reference. -
AudioStream/TranscriptStreamwith the same single-consumer, context-cancellation, terminal-error lifecycle asStream. New types:AudioChunk,TranscriptSegment,TranscriptWord,SpeechRequest,TranscribeRequest,EmbedRequest,EmbedResponse. -
Cross-vendor format normalisation: audio formats
(
mp3/opus/wav/pcm/ulaw) and embedding task types (Vertex canonical → Cohere / Voyage / OpenAI translations).
New providers
- ElevenLabs
— TTS via the Eleven family (
eleven_turbo_v2_5,eleven_multilingual_v2,eleven_flash_v2_5) and STT via Scribe (scribe_v1). No chat. - Deepgram
— STT only. Nova-3, Nova-2, enhanced, with per-word timing,
confidence scores, and diarization via
Raw. WebSocket streaming on v0.4 roadmap. - Cartesia — TTS only. Sonic-2 with sub-100 ms first-token latency, SSE streaming. WebSocket streaming on v0.4 roadmap.
- Voyage AI — Embeddings only. voyage-3 / voyage-3-large / voyage-code-3 / voyage-finance-2 / voyage-multilingual-2. Recommended pairing for Anthropic Claude.
Capability matrix updates for existing providers
- OpenAI now implements
Embedder,Speaker(TTS), andTranscriber(Whisper) in addition toProvider. - Azure OpenAI matches OpenAI for all four capabilities (each requires a separate deployment).
- AWS Bedrock adds embeddings via Titan and Cohere on Bedrock.
- Vertex AI adds embeddings
(
text-embedding-005) and partial TTS via the Gemini path. - Gemini (AI Studio) adds embeddings, TTS, and STT via audio understanding — the only chat-first provider with all four capabilities.
- Cohere adds Embed v3 embeddings with
mandatory input_type derived from
TaskType. - Mistral adds
mistral-embed. - Together adds delegated embeddings.
- Groq adds Whisper STT.
Known limitations
- Deepgram and Cartesia have HTTP/SSE paths today; WebSocket streaming lands in v0.4.
-
Anthropic does not offer first-party embeddings.
llmrouterrecommends pairing with Voyage AI; when Anthropic ships embeddings, the provider will gainEmbedder. - Bedrock TTS (Polly) and STT (Transcribe) are not wrapped; use ElevenLabs / Cartesia / Deepgram for those.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.3.0
v0.2.0 — 2026-05-15
Cloud triple, tool use, multimodal, ten OpenAI-compatible providers verified.
The cloud-provider release. Adds the three managed cloud LLM
endpoints (Azure OpenAI, AWS Bedrock, Google Vertex), plus
direct-API providers for Gemini, Cohere, and Mistral. Closes the
typed surface around features that previously rode on
Raw (tool use, multimodal, prompt caching).
New providers
- Azure OpenAI Service
— deployment-scoped URL,
api-keyheader,api-versionquery parameter. Chat + embeddings + TTS + Whisper STT (each via its own deployment). - AWS Bedrock — SigV4 signing, per-model-family body translation for Claude, Llama, Titan, Nova, Mistral, and Cohere on Bedrock.
- Google Vertex AI — ADC auth, project/region scoping, Gemini and Claude chat, embeddings, partial TTS.
- Google Gemini (AI Studio) — API-key-based direct API.
- Cohere — Command family chat + Embed v3.
- Mistral
— chat +
mistral-embed. - Ten OpenAI-compatible providers verified:
OpenRouter, Together, Groq, DeepSeek, Fireworks, xAI (Grok),
Perplexity, Cerebras, vLLM, Ollama. All share the OpenAI
provider machinery via
WithBaseURL.
API additions
- Typed tool-call passthrough:
ChatRequest.Tools []ToolDefon the way out andChoice.Delta.ToolCallson the way back, with full translation to Anthropictool_use/tool_result. Closes #1. - Extended thinking: Claude 3.7+ thinking blocks
surfaced via
Choice.Delta.Thinking. - Prompt caching:
Message.CacheControlfor Anthropic ephemeral cache;Usage.CachedTokenspopulated for OpenAI auto-cache. - Multimodal content helpers:
llmrouter.ImageURLContentandImageBytesContent. Closes #2. - Mid-stream error surfacing: SSE-delivered error
events arriving after the stream opened are now surfaced via
Stream.Err()instead of silent EOF.
Migration notes
-
WithExtrais now a typed map per provider; if you stored Azure deployment / Vertex project / Bedrock region there, switch to the dedicatedazureopenai.WithDeployment,vertex.WithProject,bedrock.WithRegionhelpers. -
Choice.Delta.Contentremains a string for typed callers; tool calls now arrive onChoice.Delta.ToolCalls. Application code that previously parsed tool calls fromChunk.Rawcontinues to work.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.2.0
v0.1.1 — 2026-05-15
Tests / coverage. No source or API changes.
A pure-quality release. v0.1.0 application code runs unchanged on v0.1.1 — there is no migration to do, and you can bump safely.
- Added a 330-subtest table-driven test suite spanning the root package, both providers, the option pattern, the streaming producer, and the error wrapper.
- 100% statement coverage on the root package
(
llmrouter.go,options.go,stream.go,errors.go). - 90.4% statement coverage on each provider package. The uncovered branches are non-2xx-with-fixture HTTP error paths that need full upstream HTTP fixtures — those land in a separate provider integration suite later.
-
All tests run race-clean
(
go test -race -count=1 ./...). - No public-API changes. No new dependencies. No behaviour changes.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.1.1
v0.1.0 — 2026-05-15
Initial public release.
First tagged release of the library. Establishes the core
surface (the Provider interface, the
ChatRequest/Chunk types, the
Stream handle, the option pattern, the
ErrUpstream wrapper) and ships the first two
providers.
Core API
-
llmrouter.Providerinterface — minimal surface ofName()andCompletionStream(ctx, ChatRequest) (*Stream, error). One method, one shape; everything else lives on the request and response types. -
llmrouter.ChatRequest— OpenAI-shaped request body with aRaw json.RawMessageescape hatch for byte passthrough. -
llmrouter.Messagewithllmrouter.TextMessageconstructor; multimodal content is sent via the rawContentjson.RawMessagefield. -
llmrouter.Streamhandle withChunks()receive channel,Err()terminal error, andCancel()convenience cancel. -
llmrouter.Chunkwith normalised OpenAI-shapedChoices, optionalUsage, and aRaw json.RawMessagewith the original wire-format event for byte-level passthrough. -
Option pattern:
WithAPIKey,WithBaseURL,WithHTTPClient,WithTimeout,WithExtra. -
llmrouter.ErrUpstreamerror wrapping non-2xx responses withProvider,StatusCode, and the raw responseBody.
OpenAI provider
-
Streaming chat completions against
/v1/chat/completionswith SSE. -
WithBaseURLoverride that turns the OpenAI provider into a universal OpenAI-compatible client — works out of the box with OpenRouter, Together, Groq, vLLM, Ollama, LM Studio, and any other endpoint that speaks the OpenAI SSE shape. -
Byte passthrough on requests
(
ChatRequest.Raw) and on chunks (Chunk.Raw) so a proxy can forward bytes unchanged.
Anthropic provider
-
Full request translation: OpenAI
messagesarray → Anthropic/v1/messagesbody, including lifting thesystemrole into Anthropic’s top-levelsystemfield and translating the content block shape. -
Full SSE event translation: Anthropic’s
message_start,content_block_delta,message_delta, andmessage_stopevents → OpenAI-shaped deltaChunks. Your consumer loop sees the same structure regardless of which provider is upstream. -
MaxTokensis required on the request (Anthropic rejects requests without it); see the quickstart for the canonical example.
Streaming semantics
-
Producer goroutine pushes
Chunkvalues into a buffered channel; the single consumer reads withrange stream.Chunks()until close. -
context.Contextcancellation propagates from the caller all the way to the in-flight HTTP request — cancelling the context closes the upstream connection and unwinds the producer. -
stream.Cancel()is equivalent to cancelling the context: safe to call multiple times, safe to call before or after the consumer drains. -
stream.Err()returns the terminal error after the channel closes; blocks until the producer finishes; returnsnilon a clean stream.
Known limitations (at v0.1.0 release)
All of these have since been addressed in subsequent releases:
- No Azure / Bedrock / Vertex provider — landed in v0.2.0.
- No typed tool-call surface — landed in v0.2.0.
- No embeddings API — landed in v0.3.0.
- No audio (TTS / STT) — landed in v0.3.0.
- Pre-1.0 — still applies; expect minor breakages between minor versions.
Release link: github.com/elloloop/llmrouter/releases/tag/v0.1.0
Future versions
Future versions are appended at the top of this page as they
ship. The
roadmap describes
what is planned for v0.9 (Vertex-native
vertexllama / vertexmistral /
vertexcohere, batch APIs, OpenAI Files +
Assistants v2, gpt-4o-audio in chat), v0.10
(prompt management, semantic caching), and v1.0 (API freeze).
For commit-by-commit detail and signed release artifacts, see the full GitHub Releases page.