Repository navigation
v0.6.0 — the gemini dialect
What's new
A fourth public dialect joins chat, messages and responses: gemini (the generateContent wire). It converts to and from all three existing dialects on every surface — request bodies, response bodies and SSE streams — as direct one-hop folds, while the semantics stay pinned to LiteLLM v1.100.1 (whose own path between these dialects is a two-hop composition through chat).
Highlights
- Three new leaf packages:
geminichat,geminimessages,geminiresponses— request/response/stream folds each, self-contained like their siblings. - Stream terminal semantics for the sentinel-less wire: a finishReason-bearing frame closes the turn;
StreamResultstays honest for hosts that bill on it. - Boundary updated deliberately: four dialects in the closure,
geminioff the vendor denylist (it is a dialect name now), exported-surface allowlist and README contract moved with it. - Tool arguments preserve the source string's key order into the target's
args; signed thinking blocks fold as flagged thought parts on response bodies and keep the writer's unflagged replay spelling on request bodies — each side mirrors its own reference. - Reverse stream fold recovers done-only text and response-level
thought_signatures.
Verification
- Reference parity: 317 executed-reference cases + 148 derived/roundtrip cases (six parity test files), goldens regenerated through the composed adapters.
- Live endpoint testing on gemini-3.6-flash, gemini-3.8-flash and gemma-4-26b-a4b-it: image recognition, forced tool calls, JSON-structured output, streamed tool calls and reverse round-trips on every dialect — all green.
go build/go vet/gofmt/ fullgo testclean.
Full Changelog: v0.5.1...v0.6.0