Skip to content

Releases: simonsmh/pi-provider-qoder

v0.6.5

Choose a tag to compare

@simonsmh simonsmh released this 23 Oct 03:19

Fixes

  • Keep the service-enabled Auto model 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 in getCachedModels still checked the raw key (configs.auto). That check was therefore always true and Auto was 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

Choose a tag to compare

@simonsmh simonsmh released this 22 Oct 15:13

Features

  • Expose real thinking efforts to OMP's effort picker (#42, @fredtanxo): cached models now carry a thinking config (mode: "effort", the catalog's actual effort list, default level, and requiresEffort) alongside thinkingLevelMap. OMP reads model.thinking — without it its picker fell back to a generic ladder that, e.g., offered an unsupported low for DeepSeek-V4-Pro and hid xhigh/max on 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

Choose a tag to compare

@simonsmh simonsmh released this 22 Oct 13:11

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 high reasons and with off returns zero reasoning content; Sonus off no longer errors after the follow-up fix.

v0.6.2

Choose a tag to compare

@simonsmh simonsmh released this 20 Oct 14:22

Fixes

  • Flat Context prompt 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 flat Context with top-level systemPrompt / tools. resolveRequestContext took the transcript path purely on helper presence, replayed no system message, and shipped tools: [] — 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 (the index is 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 any toolcall_end is 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 a finally on 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

Choose a tag to compare

@simonsmh simonsmh released this 15 Oct 16:27

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

Choose a tag to compare

@simonsmh simonsmh released this 15 Oct 15:52

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

Choose a tag to compare

@simonsmh simonsmh released this 14 Oct 14:51

Fixes

  • Rewrite tool call IDs that violate Qoder's wire format (#33). pi's OpenAI Responses adapter produces internal IDs like call_id|item_id containing |, which Qoder rejects with 400 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 based qtc_ 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

Choose a tag to compare

@simonsmh simonsmh released this 07 Oct 05:58

Highlights

  • Show actual Qoder session deductions in Credits, separately for Global and CN, and account-period personal/add-on/organization balances.
  • Add /qoder-usage and 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

Choose a tag to compare

@simonsmh simonsmh released this 01 Oct 10:58

What's Changed

New Contributors

Full Changelog: v0.4.6...v0.4.7

v0.4.6

Choose a tag to compare

@simonsmh simonsmh released this 25 Sep 07:31

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

Full Changelog: v0.4.5...v0.4.6