Latest Results
release: cut v0.2.0 with the provider presets and dialects
v0.2.0 is the first release since v0.1.0. It carries the Provider type
and the WithProvider option, which build a client for one vendor from
its base URL, paths and key variable; the provider package with seven
presets (TypeSafe, Codiv, Perplexity, both OpenRouter endpoints,
Decisions API and OpenAI); and the Dialect hook, through which the
Decisions API preset unwraps its envelope and the OpenAI preset
rewrites the request and the answers between System One's wire and
OpenAI's. The live tests call each provider with its own key and
record what it returns, and the recorder's guard also refuses an
account id, the vendors' key prefixes and a masked echo of a key.
Version and the API golden move to 0.2.0 (one golden line), the
changelog's Unreleased section becomes 0.2.0, and the README states
the new version. docs/release-checklist.md records the evidence of
each release line at this commit; the CI, CodSpeed and Codecov lines
come from this commit's push, and the tag stays the owner's act.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fu77sdU9VnvsiHSSCGDgrX provider: give every uncovered dialect block a test or a reason
CI's check that every zero-count block has a row in the uncovered-lines
table had not run on the dialect code before it reached main, so the
first push of main since the dialects failed it on 22 blocks across
provider/json.go, provider/openai.go, provider/decisionsapi.go and
dialect.go.
Sixteen of them are reachable with a crafted vendor body or a caller's
ExtraBody, so they get tests: bodies cut off at a member name, inside a
value or where the answers should be, a model given as a number, a
question the prepared set lacks, a choice without its probabilities, a
score without its confidence, a repeated member name inside a copied
value, an envelope cut off, and a transport that replays GetBody and
must see the bytes that were sent. The other six cannot be reached
through the public API (a bracket read that fails only past jsontext's
depth limit, a path error that is never passed to bodyError, a nil
dialect the caller has already excluded, a marker method) and get a
Defensive row with that argument.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fu77sdU9VnvsiHSSCGDgrX provider: add presets for both OpenRouter decision endpoints
OpenRouter serves System One models behind two endpoints, POST
/api/v1/systemone and the alpha POST /api/alpha/decisions, and both
take the SDK's request unchanged and answer in the System One shape
with members the decoder already ignores (id, provider, usage.cost).
provider.OpenRouter() and provider.OpenRouterDecisions() name them,
sharing OPENROUTER_API_KEY. Model ids are namespaced, such as
typesafe/jev-1.13; the live run confirmed that the bare id jev-1.13 is
answered under typesafe/jev-1.13 too.
What the vendor does not give shaped the presets and the harness: its
GET /api/v1/models lists the whole chat catalogue in its own shape, so
the presets carry no listing path and List fails before sending; its
responses carry no x-request-id (a 200 has x-generation-id, which the
SDK does not read), so RequestID reports none and the stand-in tests
pin that; and a yes/no question that describes only its Yes outcome is
refused with 400, so the live harness asks OpenRouter the plain set
through a per-provider field rather than a third provider kind. The
alpha path has no /v1 segment: both /api/v1 spellings answer 404.
The recorded exchanges under testdata/live/providers/openrouter and
openrouter-decisions are scrubbed; the guard tests also refuse a body
that carries a user_id member, which the vendor's 400 bodies include.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R9aunysEChjR8ADAKQ32JQ Latest Branches
-29%
dependabot/github_actions/astral-sh/setup-uv-10.3.0 -48%
dependabot/go_modules/golang.org/x/net-0.61.0 © 2026 CodSpeed Technology