Skip to content

v0.6.0 — the gemini dialect

Choose a tag to compare

@veildawn veildawn released this 14 Oct 06:36
· 43 commits to main since this release

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; StreamResult stays honest for hosts that bill on it.
  • Boundary updated deliberately: four dialects in the closure, gemini off 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 / full go test clean.

Full Changelog: v0.5.1...v0.6.0