Repository navigation
v2.8.0
Another one from the community — thanks again to @manueltusset (Manuel Ristoff Tusset) for Kimi K3 and the catalog-driven request fields (#4). 🎉 It turns the one place model support kept breaking — guessing a model's reasoning channel from its name — into something read from the catalog itself.
Added
- Kimi K3. Offered once the account catalog is read, with its
low/high/maxreasoning dial. Experimental, available only in Kiro's US geography, and a Kiro Excluded Model (no AWS output indemnity). - Request fields derived from the catalog schema, not the model name. The old rule sent anything matching
gpt|openaitoreasoning.effortand everything else tooutput_config.effort— which broke on the first model that did not fit the split (Kimi, whose schema takesreasoningwith nomax_tokens). A newRequestFieldsProfilereads the channel, the levels, the off switch and themax_tokensceiling straight from each model's schema, falls back to the built-in lists while the catalog is cold, and sends a level a model lacks as the nearest one below it. (#4) - Diagnostics for a reply that breaks off mid-stream. A stream that errors part-way now logs
[STREAM] broke off convId=… after N events, and the SDK-client cache logs when a burst of concurrent sessions evicts or retires an in-use client — the three places one session could sever another's stream, none of which left a trace before. - A mapping contract test against a snapshot of what Kiro actually serves, plus tests for the retry strategy, the account cache/repository (against the real store), the message transformer and the SDK response handler. Overall coverage is up from ~89.9% to ~92.2%.
Fixed
- A reply no longer breaks off mid-stream when several sessions run at once. A retired SDK client's grace timer used to
destroy()the client 30s after it was retired, no matter what — severing the socket of any answer still streaming past the grace. With 2–3 sessions a dispose/re-init storm or a cache eviction retires a live client, so a large-context session (whose reply streams well past 30s) had its socket torn out from under it, and the user saw the answer simply stop with no error. The timer now defers toinFlight: a client still streaming is left alone and freed only when its stream ends. max_tokensand the effortoffswitch are sent only where the model's schema accepts them, instead of 400-ing a model that does not list them. GPT-5.6 Luna's drop ofmax_tokensand the Kimi rows are the visible effect. (#4)- Thinking-off on a model that cannot stop reasoning now warns once instead of silently charging for reasoning the user turned off.
- A dropped connection during a bearer-403 refresh, or a background catalog lookup, no longer marks a working account unhealthy or signs it out.
- Four existing tests were strengthened after a full-suite audit: one guarded a field the transformer never emits, three recomputed their expected value with the code's own formula — all now assert independently and are mutation-checked.
Removed
- The unused v1 non-SDK response path and the prompt-cache checkpoint builder (Kiro returns no cached-token counts for what this plugin sends), along with a few dead type mirrors and helpers.
Compatibility
- Works on OpenCode v1 and v2 from the same build; type-checked against
@opencode/pluginthrough 2.1.1. The catalog cache version is bumped, so the first request after upgrading refetches it once under the existing 30-minute TTL — no action needed.