Repository navigation
Releases: simonsmh/pi-provider-qoder
Release list
v0.6.5
Fixes
- Keep the service-enabled
Automodel in the list (#43, @fredtanxo): since the display-keyed config refactor (9d88e99), the cache writer stores model configs only under the display id (configs.Auto), but the legacy-cleanup filter ingetCachedModelsstill checked the raw key (configs.auto). That check was therefore always true andAutowas unconditionally dropped on every cache read, even though the service returns it enabled. The filter now checks both spellings, restoring the original intent: keep an explicitly enabled service model, drop only the legacy injected fallback.
Verified against a real account cache: v0.6.4 lists 14 models with Auto missing; v0.6.5 lists 15 with Auto first. Full suite: 404 tests passing.
v0.6.4
Features
- Expose real thinking efforts to OMP's effort picker (#42, @fredtanxo): cached models now carry a
thinkingconfig (mode: "effort", the catalog's actual effort list, default level, andrequiresEffort) alongsidethinkingLevelMap. OMP readsmodel.thinking— without it its picker fell back to a generic ladder that, e.g., offered an unsupportedlowfor DeepSeek-V4-Pro and hidxhigh/maxon Ultimate, Sonus, and Qwen3.8-Max. Earendil pi ignores the extra field, so pi users are unaffected.
Verified beyond the test suite (403 tests passing): installed OMP 18.12.6, logged in with a PAT, and compared omp models qoder --json against v0.6.3 — DeepSeek-V4-Pro now lists exactly high, max, Ultimate the full ladder, and an end-to-end DeepSeek-V4-Pro --thinking max request succeeded.
v0.6.3
What's new
Thinking-off now fully disables reasoning (#40, @fredtanxo)
Turning thinking off previously only sent enable_thinking: false while model_config.is_reasoning stayed true, so the gateway kept routing the model as reasoning-enabled — and for models whose catalog has no disabled branch, clampThinkingLevel could even snap "off" back up to the lowest effort. The off path now emits qodercli's full disable signal set (enable_thinking: false + reasoning_effort: "none" + is_reasoning: false in both model_config and chat_context), normalizes every host's off signal ("off" / false / OMP's disableReasoning / forceReasoningOff), and skips clamping when off.
Follow-up: no reasoning_effort: "none" for models without a disabled branch (030a1fb)
Live verification against the real gateway showed that strict-enum upstreams without a disabled branch (e.g. Sonus) reject reasoning_effort: "none" with a 400. When the catalog positively shows the branch is missing (effort-based thinking_config without disabled, or thinkingLevelMap off: null), the effort signal is now omitted; the other disable signals still go out and models with a disabled branch are unchanged.
Recover from transient model-busy (10605) rejections (#41, @summer-tt)
Qoder's scheduler reports a busy model as HTTP 200 with an SSE envelope carrying statusCodeValue 403 and nested error 10605 / RESOURCE_LIMIT, which previously failed the whole turn with a non-retryable error. The provider now parses the nested envelope and recovers only for the ready state (isQueued: false + serviceAvailable: true): bounded local retries honoring retryAfterSeconds, maxRetries and maxRetryDelayMs (5s hard cap), fresh request_id/chat_record_id and re-signing per attempt, per-attempt state cleanup, abort handling, and no retry once any model output has been emitted. When the local budget is exhausted, the error is reported as retryable so the host's retry policy can take over.
Verification
- 399 tests passing (22 files), lint / typecheck / build clean, CI green.
- Live gateway checks: Ultimate with thinking
highreasons and withoffreturns zero reasoning content; Sonusoffno longer errors after the follow-up fix.
v0.6.2
Fixes
- Flat
Contextprompt and tools kept when the transcript has no system message (#38, fixes #37): hosts like omp 18.12.x export the pi-ai transcript toolkit yet still pass a flatContextwith top-levelsystemPrompt/tools.resolveRequestContexttook the transcript path purely on helper presence, replayed no system message, and shippedtools: []— the model answered with DSML text markup and every turn ended empty. The resolver now treats the leading system message as the proof of a folded transcript and falls back to the flat fields when it is absent. - Tool-call identity preserved by ID, invalid arguments rejected (#39): streamed tool calls are now keyed by their explicit
id(theindexis only a continuation hint). Previously, two calls reusing one index were merged into a single state and the survivor was published with{}arguments — a silent wrong-tool execution risk. Argument fragments are scanned incrementally for the root-object boundary, the whole batch is validated before anytoolcall_endis published, and malformed, non-object, or trailing-garbage arguments now fail the turn loudly instead of degrading to{}.finish_reason: "length"is preserved and the stream reader is released in afinallyon all paths.
Validation
- lint ✅ · typecheck ✅ · 362/362 tests ✅ (311 prior + 2 regression tests for #37 + 49 tool-call identity cases C01–C15) · build ✅ · published via the tag-triggered release workflow (npm provenance)
v0.6.1
Fixes
- COSY version refresh ordering (#36, Codex P1 on #35): the dynamic COSY identity refresh now runs before the model catalog request is signed, instead of fire-and-forget after it. In v0.6.0, a catalog fetched right after a new Qoder CLI release was still signed with the stale identity, so the gateway returned the reduced catalog and that list was cached for its full TTL. The refresh remains throttled to once a day and failure-tolerant.
Validation
- lint ✅ · typecheck ✅ · 311/311 tests ✅ (incl. a new regression test pinning the refresh-before-signing order) · build ✅
v0.6.0
Features
- Support Qoder's latest Fast model (#34): the COSY client identity moves to qodercli 1.1.71, the first client version whose catalog includes the Fast tier.
- COSY identity now tracks the latest Qoder CLI release automatically (#35). The effective version is resolved from the same releases feed the public changelog page uses (repo.qoder.com/repos/QoderAI/changelog-CLI/releases), cached in ~/.pi/agent/qoder-cosy-version-cache.json and refreshed at most once a day after a successful model-catalog update. Request signing stays synchronous and offline-tolerant — failures keep the cached or bundled version and the identity never downgrades. The bundled fallback in this release is 1.1.72, so future CLI releases no longer need a manual bump PR.
Validation
- 310 tests passed (11 new for dynamic version resolution); lint, typecheck and build clean.
Full Changelog: v0.5.1...v0.6.0
v0.5.1
Fixes
- Rewrite tool call IDs that violate Qoder's wire format (#33). pi's OpenAI Responses adapter produces internal IDs like
call_id|item_idcontaining|, which Qoder rejects with400 tool_use.id: String should match pattern '^[a-zA-Z0-9_-]+$'— and because the history is re-sent every turn, one such ID broke every later request in the session. Outgoing IDs are now mapped deterministically (SHA-256 basedqtc_IDs) for the wire only; session history is never mutated and assistant/tool-result pairing is preserved.
Validation
- 299 tests passed; lint, typecheck and build clean.
Full Changelog: v0.5.0...v0.5.1
v0.5.0
Highlights
- Show actual Qoder session deductions in Credits, separately for Global and CN, and account-period personal/add-on/organization balances.
- Add
/qoder-usageand the opt-in credit footer, preserving full request billing precision and identifying unknown usage. - Queue forced quota refreshes after pending reads and cache session statistics between footer renders.
Maintenance
- Upgrade Pi packages to 1.0.4 and update build/test tooling.
- Refresh the dependency lockfile to remove vulnerable brace-expansion and source-map-js versions; npm audit reports zero vulnerabilities.
Validation
- 282 tests passed; typecheck, lint, build and package dry run passed.
v0.4.7
What's Changed
- fix: keep image-bearing tool runs contiguous by @AllanChain in #30
New Contributors
- @AllanChain made their first contribution in #30
Full Changelog: v0.4.6...v0.4.7
v0.4.6
What's Changed
- fix: bind tools from TranscriptContext for pi-ai >=0.86 by @shyoldman in #25
- fix: surface turns the gateway drops a tool call from, strip DSML residue by @wangzaogen in #28
- fix: replay assistant reasoning out of band by @simonsmh in #29
New Contributors
- @wangzaogen made their first contribution in #28
Full Changelog: v0.4.5...v0.4.6