busbar v1.2.0 — more than chat
Busbar 1.2.0
Busbar now speaks more than chat. Five new operations land on top of it, and every one runs through the same lossless translation, pools, failover, and breakers that carried chat: Embeddings, Moderations, Image generation, Audio (transcription, speech-to-English translation, text-to-speech), and Rerank. A Gemini client can call embeddings on a Bedrock backend. An OpenAI client can route images and audio to Gemini. A Cohere client can rerank on Bedrock. Every answer comes back in the caller's own dialect, errors included.
This release also changes the license: Busbar 1.2.0 and onward is Apache 2.0. Permissive, commercial-friendly, with an explicit patent grant and no copyleft obligations.
New operations
- Embeddings: OpenAI, Bedrock (Titan), Cohere (v2), and Gemini, any dialect in, any of them out. Vectors, token accounting, and errors survive the hop.
- Moderations: OpenAI surface, translated through the IR.
- Image generation: OpenAI, Gemini (Imagen), Bedrock (Titan).
- Audio: transcription, speech-to-English translation, and text-to-speech on OpenAI and Gemini.
- Rerank: Cohere v2 rerank and Bedrock rerank models, cross-protocol between the two. The wires share a result shape, so translation is exact.
- Calling an operation a backend does not implement returns a clean 404 in your own protocol's dialect. Never a crash, never a lane penalty.
Reliability: catch the hang
Some providers fail by hanging: the connection opens and response headers never come back, silently eating the whole failover budget. attempt_timeout_ms caps a single attempt's time to response headers; on expiry the attempt counts as a transient breaker failure and the request fails over within the same request. Set it on a model as a default and override it per pool member, so the same model can carry a 10s cap in a batch pool and a 50ms cap in a latency-critical one. It never cuts off a stream that has started answering.
More survives translation
Fields that used to die at the protocol seam now cross it:
- Logprobs (OpenAI and Gemini), buffered and streaming. The ask travels one way, the per-token data travels back in your own shape, chunk by chunk on streams.
- Reasoning and thinking, gated per lane. OpenAI
reasoning_effort, Anthropicthinking.budget_tokens, and GeminithinkingBudgettranslate between each other: numbers copy exactly, words convert through a configurable effort table. Because thinking support is per model, you declare it:reasoning: trueon a model or pool member. Without the flag the ask is dropped with a warning and never sent, so a non-reasoning model can never 400 from translation. userandparallel_tool_callscarry between OpenAI and Anthropic (metadata.user_idandtool_choice.disable_parallel_tool_useare the same fields in different spellings).- The documented field-survival table in the protocols doc is now measured against real egress capture, not asserted.
Fixed
- Gemini streamed thinking no longer leaks into answer text on cross-protocol streams. Thought parts stream as proper thinking blocks with balanced framing.
Internal (but load-bearing)
- The request path is now Router → RequestHandler → OperationHandler → IR: every operation is a small codec over one shared reliability engine, and chat is operation #1 rather than a special case. Adding rerank touched zero lines of routing, failover, or breaker code.
- Billing is a polymorphic data model (tokens, duration, characters, images, flat units). The pricing engine that turns units into cost lands in 1.3.
Verification
- 1,775 unit tests, clippy clean.
- A user-emulating acceptance harness drives a real busbar binary against a six-protocol mock that mimics real providers (native stream framings including AWS eventstream, SigV4 verification, real-capture-modeled payloads): 188/188 offline rows green across translation, streaming, operations, no-handler 404s, reliability (hang/failover/breaker), auth (token and passthrough), governance, and the full admin key lifecycle with exact billing assertions.
- Live-validated against real providers, including streaming logprobs from a Gemini-dialect client served by OpenAI.
Upgrading
No breaking changes: the HTTP API, configuration schema, and all six wire-protocol contracts are unchanged under Semantic Versioning. New config surface is opt-in only (attempt_timeout_ms, reasoning, limits.reasoning_effort_budgets).
As with every release: binaries for Linux/macOS (Intel and ARM) and Windows (Intel), a CycloneDX SBOM, a build-provenance attestation, and cosign-signed GHCR images. Docker: getbusbar/busbar:1.2.0.
Full detail: CHANGELOG · Docs · The 1.2 post