diff --git a/CHANGELOG.md b/CHANGELOG.md
index a9ea82eff..de8698fa4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,15 +2,7 @@
All notable changes to the **OpenCode Go BYOK Provider** extension are documented here.
-## [Unreleased]
-
-### Fixed
-
-- **`[Models]` Free-tier Zen models are hidden from the picker, `opencodego.freeOnly` is deprecated, and every free-Zen claim is removed from the docs (Marketplace review, follow-up to #235/#240).** OpenCode has gated free-tier Zen models to its own app/CLI since Sep 17, 2026 (HTTP 403 for third-party clients — upstream anomalyco/opencode#49580), verified live against all 10 free models in the Zen catalog. With `freeOnly` defaulting to `true`, the Zen picker showed _only_ models that could never serve a request. Free-tier Zen models (`-free` suffix, plus `big-pickle`) are now always filtered out via a vendor-scoped `isZenFreeTierModel()` — the gate is Zen-only: Go's free models (`beam-free`, `minimax-m3.1-flash-free`, `longcat-2.5-preview-free`) are unlimited within a paid Go subscription, explicitly permitted for third-party clients, and remain selectable. `freeOnly` stays registered so existing settings don't error but no longer has any effect. README, extension description, and keywords no longer advertise free Zen models: the free-models table is replaced with a dated policy notice, and stale free claims (quick start, comparison table, FAQ, `free-models` keyword, "free Claude Opus" in the description) are corrected. Documented in `docs/issues/112-20261020-zen-free-tier-policy-followup.md`.
-
-- **`[Errors]` The free-tier / Router.Unavailable hint now renders in the chat, not only the toast (#258 follow-up).** `buildOpenCodeRequestError()` placed the actionable hint in `userMessage`, but VS Code's chat surface renders `error.message` — which carried the raw gateway JSON (`Error from provider (Console): OpenCode's free tier can only be used…`). The hint now replaces the raw detail in both messages; the upstream body is still preserved in the OpenCode output channel (`[http-error-body]`).
-
-## [0.7.10] — unreleased
+## [0.7.10] — 2026-10-20
### Added
@@ -18,6 +10,12 @@ All notable changes to the **OpenCode Go BYOK Provider** extension are documente
### Fixed
+- **`[Autocomplete]` The default inline-suggestions model no longer 400s silently — `qwen3.5-plus` was removed from the Go gateway, default is now `qwen3.6-plus` (reported by Yannick Huebner).** Inline suggestions send the configured model ID straight to `/chat/completions`, and the old default had vanished from the Go catalog — every request returned HTTP 400 `Model is unavailable`, which the completion engine logs to the output channel and then renders as nothing, so users just saw ghost text never appearing (budget and settings were irrelevant, making it look like a quota bug). Verified live 2026-10-20: gateway validation order is session → model → credential, so a dummy-key probe shows `qwen3.5-plus` rejected with `Model is unavailable` before auth while the new default `qwen3.6-plus` passes model validation (`qwen3.5-plus` also still works on Zen — the removal is Go-only, but suggestions are Go-only too); a real-key run then confirmed `qwen3.6-plus` at 1459ms TTFB with `reasoningChars=0`, matching the old default's latency profile. `DEFAULT_INLINE_MODEL`, the `package.json` settings default/enum, and the README now point at `qwen3.6-plus`; the enum also drops the equally-removed `deepseek-v4-flash` in favor of `deepseek-v4.1-flash`. Note for existing installs: a user-set model is never overwritten, so anyone still on the old default must switch once manually (`"opencodego.inlineSuggestionsModel": "qwen3.6-plus"`). `scripts/probe-completion-latency.ts` refreshed to current model candidates and now sends the required `x-opencode-session` header. Documented in `docs/issues/113-20261020-fim-default-model-removed-upstream.md`.
+
+- **`[Models]` Free-tier Zen models are hidden from the picker, `opencodego.freeOnly` is deprecated, and every free-Zen claim is removed from the docs (Marketplace review, follow-up to #235/#240).** OpenCode has gated free-tier Zen models to its own app/CLI since Sep 17, 2026 (HTTP 403 for third-party clients — upstream anomalyco/opencode#49580), verified live against all 10 free models in the Zen catalog. With `freeOnly` defaulting to `true`, the Zen picker showed _only_ models that could never serve a request. Free-tier Zen models (`-free` suffix, plus `big-pickle`) are now always filtered out via a vendor-scoped `isZenFreeTierModel()` — the gate is Zen-only: Go's free models (`beam-free`, `minimax-m3.1-flash-free`, `longcat-2.5-preview-free`) are unlimited within a paid Go subscription, explicitly permitted for third-party clients, and remain selectable. `freeOnly` stays registered so existing settings don't error but no longer has any effect. README, extension description, and keywords no longer advertise free Zen models: the free-models table is replaced with a dated policy notice, and stale free claims (quick start, comparison table, FAQ, `free-models` keyword, "free Claude Opus" in the description) are corrected. Documented in `docs/issues/112-20261020-zen-free-tier-policy-followup.md`.
+
+- **`[Errors]` The free-tier / Router.Unavailable hint now renders in the chat, not only the toast (#258 follow-up).** `buildOpenCodeRequestError()` placed the actionable hint in `userMessage`, but VS Code's chat surface renders `error.message` — which carried the raw gateway JSON (`Error from provider (Console): OpenCode's free tier can only be used…`). The hint now replaces the raw detail in both messages; the upstream body is still preserved in the OpenCode output channel (`[http-error-body]`).
+
- **`[Thinking]` MiniMax no longer repeats an identical reasoning preamble before every tool call.** MiniMax is an interleaved thinking model: its official contract (MiniMax-AI/MiniMax-M2 README, "Inference Parameters") requires assistant thinking to be replayed **inline as `...` inside `content`** — the upstream silently drops a separate `reasoning_content` field. The extension replayed MiniMax thinking history as `reasoning_content` (family-gated "tolerated" since PR #123), so prior thinking effectively vanished from context on every follow-up request; in long agent loops the model re-derived the same conclusion at each tool call, producing the same reasoning sentence 15+ times in a row. `shouldEchoThinkingHistory()` now returns `false` for `/^minimax-/i` and `convertMessage()` replays the thinking (plain and tool-call branches, per-tool reasoning included) as a `` prefix on `content` instead. Receive-side `` filtering is untouched. All other families (DeepSeek required-echo, Kimi/GLM/Qwen/Gemini, MiMo omitted, GPT/Claude n/a) keep their existing contracts — the new helpers are gated by `/^minimax-/i` alone. Live E2E against the gateway still pending. Documented in `docs/features/19-20261020-minimax-interleaved-thinking-replay.md`.
- **`[Models]` Gemini models served by OpenCode Go now route to the Google API instead of chat-completions.** Every request to `gemini-4-argon-contributor` failed with `400 Model does not support this protocol.` because the `gemini` row in `core/registry.ts` was restricted to `opencodezen`, so on Go the lookup fell through to the catch-all row and the model was sent to `chat/completions` — while the gateway serves it Google-native (models.dev marks it `@ai-sdk/google`, and OpenCode's own Go endpoint table lists it under `@ai-sdk/google` too). The row now applies to every vendor. Fixing that exposed the second half of the bug: the Google route is built as `{base}/{modelId}:streamGenerateContent?alt=sse`, and Go's built-in `/zen/go/v1` base does not serve that path at all (it answers with the opencode.ai website 404 page), so provider routing gained an optional `googleModelsUrl` — Go's built-in default points at `https://opencode.ai/inference/go/v1/models` (the base OpenCode's own endpoint table documents for the model), while Zen and any configured `apiBaseUrl` gateway keep deriving the route from `modelsUrl` exactly as before (issue #247 contract intact). Every other route (chat/completions, messages, responses, models, usage) is untouched. Routing tests now cover Go, Zen, and both agent-host variants. Registry drift found while investigating (Go/Zen `minimax-m3`, `qwen3.8-max`, `qwen3.8-flash`, `qwen3.7-plus` documented as Anthropic `messages`) is deliberately not changed here — each needs live verification first. Documented in `docs/features/17-20260814-data-driven-model-registry.md`.
diff --git a/README.md b/README.md
index 044f235b2..5a4c13a2b 100644
--- a/README.md
+++ b/README.md
@@ -353,7 +353,7 @@ required after toggling.
Ghost-text completions while typing, powered by the OpenCode gateway with **thinking forced off**:
- Opt-in: `"opencodego.inlineSuggestions": true` (requires a window reload).
-- Model: `opencodego.inlineSuggestionsModel` defaults to `qwen3.5-plus`, whose `enable_thinking=false` mode is a no-reasoning path (measured ~1.5s TTFB, zero hidden reasoning). Reasoning models (e.g. `deepseek-v4-flash`) burn 100+ reasoning tokens even with thinking off and are not recommended.
+- Model: `opencodego.inlineSuggestionsModel` defaults to `qwen3.6-plus` with `enable_thinking=false` (no-reasoning path). Reasoning models burn 100+ reasoning tokens even with thinking off and are not recommended. (The previous default, `qwen3.5-plus`, was removed from the Go gateway — installs on older releases must switch models manually.)
- Tuning knobs (all optional): `inlineSuggestionsDebounceMs` (300), `inlineSuggestionsTimeoutMs` (3000), `inlineSuggestionsMaxTokens` (128), `inlineSuggestionsPrefixLines` (10), `inlineSuggestionsSuffixChars` (300).
- Requests are tiny (10 lines before the cursor + a short suffix by default), debounced 300ms, time out at 3s, and are aborted on the next keystroke.
- The gateway exposes no FIM endpoint, so completions use fill-in-the-middle emulation with FIM tokens over `/chat/completions`.
diff --git a/docs/devlog.md b/docs/devlog.md
index aa1ae1fb4..443c1ca71 100644
--- a/docs/devlog.md
+++ b/docs/devlog.md
@@ -1,6 +1,20 @@
# 🧠 OPENCODE COPILOT CHAT DEVLOG
-**Branch:** `fix/issue244-followup-id-clobber` (work on `main`) | **Updated:** 2026-09-25 Asia/Jakarta | **Current Phase:** #244 follow-up fix complete + deep-verified (495/495 tests, lint 7/7, retry E2E 9/9, pre-release E2E 17/17); 0.7.8 pending push/PR/build.
+**Branch:** `fix/fim-default-model-dead` (work on `main`) | **Updated:** 2026-10-20 Asia/Jakarta | **Current Phase:** FIM default-model fix committed locally (`cb9f4f0`), docs synced (doc 113 + feature doc 15 + CHANGELOG `[Unreleased]`), real-key probe done — `qwen3.6-plus` verified 1459ms TTFB / `reasoningChars=0`; pending: push/PR approval.
+
+---
+
+## ✅ FIM Default Model Removed Upstream — inline suggestions silently dead — 2026-10-20
+
+**Scope:** inline suggestions produced nothing at all (reported via LinkedIn by Yannick Huebner), initially misread as Go budget exhaustion. `DEFAULT_INLINE_MODEL` (`qwen3.5-plus`) had been removed from the Go gateway, so every FIM request returned HTTP 400 `Model is unavailable` which the completion engine logs to the output channel and renders as nothing. The registry's deprecation filter never applied here: FIM sends the raw setting value straight to `/chat/completions`, bypassing the picker. This was the landmine doc 100 flagged on 2026-09-08 ("flagged, unchanged") — upstream finally dropped the model.
+
+**Verification without a paid key:** gateway validates in the order session → model → credential, so a dummy-key probe distinguishes the two failure classes: `qwen3.5-plus` → HTTP 400 `Model is unavailable` (before auth), `qwen3.6-plus` → HTTP 401 `Invalid credential` (model accepted). `qwen3.5-plus` is still served on Zen — the removal is Go-only, and suggestions are Go-only too.
+
+**Fix:** default → `qwen3.6-plus` (direct successor, same `enable_thinking=false` path); `package.json` enum also drops the equally-removed `deepseek-v4-flash` for `deepseek-v4.1-flash`; no settings auto-migration (same call as doc 112 — users on the old default switch manually once). Probe script refreshed to live candidates + required `x-opencode-session` header.
+
+**Real-key probe (2026-10-20, done):** `qwen3.6-plus` + `enable_thinking=false` → HTTP 200, TTFB 1459ms, total 1509ms, `reasoningChars=0` — on par with the old default (1518/1608ms), so the non-thinking rationale carries over; `suffix` field tolerated (HTTP 200); `qwen3.5-plus` re-confirmed HTTP 400.
+
+Docs: `docs/issues/113-20261020-fim-default-model-removed-upstream.md`, feature doc 15 updated, README inline-suggestions section, CHANGELOG `[Unreleased]`.
---
@@ -62,7 +76,7 @@ Docs: `docs/issues/100-20260923-issue226-thinking-default-echo.md`, `docs/issues
**Verification:** `npm run lint` — all 7 checks, 462/462 tests. Unit-test locks caught 2 stale expectations during the change (metadata kimi context, usage tracker pricing) — both updated as part of the sync.
-**Caveats:** 1M context limits not live-verified against the gateway with oversized requests (models.dev is OpenCode's own registry but can lag — #171 precedent). `DEFAULT_INLINE_MODEL` is still upstream-deprecated `qwen3.5-plus` — flagged, unchanged.
+**Caveats:** 1M context limits not live-verified against the gateway with oversized requests (models.dev is OpenCode's own registry but can lag — #171 precedent). `DEFAULT_INLINE_MODEL` is still upstream-deprecated `qwen3.5-plus` — flagged, unchanged. _(Resolved 2026-10-20 — doc 113: upstream removed it from Go; default now `qwen3.6-plus`.)_
Docs: `docs/issues/100-20260908-bundled-model-data-sync.md`, CHANGELOG `[Unreleased]`.
diff --git a/docs/features/15-20260813-inline-code-suggestions.md b/docs/features/15-20260813-inline-code-suggestions.md
index b6a0bdc0f..a6987a2e7 100644
--- a/docs/features/15-20260813-inline-code-suggestions.md
+++ b/docs/features/15-20260813-inline-code-suggestions.md
@@ -3,11 +3,11 @@
# Inline Code Suggestions (Ghost Text) — Experimental (#49)
**Topic:** autocomplete / inline-completions / ghost-text / fim / qwen / provider
-**Updated:** 2026-08-13
+**Updated:** 2026-10-20
**Tags:** #autocomplete #inline-completions #ghost-text #fim #qwen #provider #feature
**GitHub Issue:** [#49](https://github.com/ltmoerdani/opencode-copilot-chat/issues/49)
**PR:** [#136](https://github.com/ltmoerdani/opencode-copilot-chat/pull/136) (+ #138 for the review fixes)
-**Related:** Issue doc [`25-20260617-inline-completions-fim-research.md`](../issues/25-20260617-inline-completions-fim-research.md)
+**Related:** Issue doc [`25-20260617-inline-completions-fim-research.md`](../issues/25-20260617-inline-completions-fim-research.md), [`113-20261020-fim-default-model-removed-upstream.md`](../issues/113-20261020-fim-default-model-removed-upstream.md)
---
@@ -17,14 +17,15 @@ Ghost-text inline completions (Copilot-style) while typing, powered by the OpenC
## Engine Decision (live-measured, not assumed)
-OpenCode exposes **no FIM endpoint** (`/completions` probed 404 on `zen/go`/`zen`/`beta`), and every opencode-go model is reasoning-first. A live latency probe (`scripts/probe-completion-latency.ts`, key from env only) measured:
+OpenCode exposes **no FIM endpoint** (`/completions` probed 404 on `zen/go`/`zen`/`beta`), and every opencode-go model is reasoning-first. A live latency probe (`scripts/probe-completion-latency.ts`, key from env only) measured, at feature launch (2026-08-13):
-| Model | TTFB | Total | Hidden reasoning |
-| -------------------------------------------- | ---------- | ---------- | ---------------------------- |
-| `deepseek-v4-flash` (no `reasoning_effort`) | 1813ms | 2264ms | 128 chars — non-viable |
-| **`qwen3.5-plus` (`enable_thinking=false`)** | **1518ms** | **1608ms** | **0 — genuine non-thinking** |
+| Model | TTFB | Total | Hidden reasoning |
+| ------------------------------------------------------------------- | ---------- | ---------- | ---------------------------- |
+| `deepseek-v4-flash` (no `reasoning_effort`) | 1813ms | 2264ms | 128 chars — non-viable |
+| **`qwen3.5-plus` (`enable_thinking=false`)** | **1518ms** | **1608ms** | **0 — genuine non-thinking** |
+| **`qwen3.6-plus` (`enable_thinking=false`)** — re-probed 2026-10-20 | **1459ms** | **1509ms** | **0 — genuine non-thinking** |
-So the default engine is **`qwen3.5-plus` with `enable_thinking: false`** — zero hidden reasoning, ~1.5s time-to-first-token. DeepSeek is intentionally **not** the default (burns hidden reasoning tokens even with thinking off).
+That probe chose `qwen3.5-plus` as the original default. Upstream has since **removed it from the Go gateway** (2026-10-20 — every FIM request 400'd silently; see [doc 113](../issues/113-20261020-fim-default-model-removed-upstream.md)), so the default is now **`qwen3.6-plus` with `enable_thinking: false`** — the direct successor on the same non-thinking path, re-measured live on 2026-10-20 at 1459ms TTFB with zero hidden reasoning (fastest of all candidates ever probed), with the gateway also still tolerating the `suffix` field on it (HTTP 200). DeepSeek is intentionally **not** the default (burns hidden reasoning tokens even with thinking off).
## How It Works
@@ -52,15 +53,15 @@ Because the gateway exposes no FIM endpoint, completions **emulate fill-in-the-m
## Settings (all under `opencodego.`)
-| Setting | Default | Notes |
-| ------------------------------ | -------------- | -------------------------------------------------------------------------------- |
-| `inlineSuggestions` | `false` | Opt-in master switch; requires a window reload |
-| `inlineSuggestionsModel` | `qwen3.5-plus` | Dropdown: `qwen3.5-plus` / `qwen3.6-plus` / `qwen3.7-plus` / `deepseek-v4-flash` |
-| `inlineSuggestionsDebounceMs` | `300` | 50–2000 |
-| `inlineSuggestionsTimeoutMs` | `3000` | 500–15000 |
-| `inlineSuggestionsMaxTokens` | `128` | 16–1024 |
-| `inlineSuggestionsPrefixLines` | `10` | 1–100 |
-| `inlineSuggestionsSuffixChars` | `300` | 0 disables the suffix |
+| Setting | Default | Notes |
+| ------------------------------ | -------------- | ----------------------------------------------------------------- |
+| `inlineSuggestions` | `false` | Opt-in master switch; requires a window reload |
+| `inlineSuggestionsModel` | `qwen3.6-plus` | Dropdown: `qwen3.6-plus` / `qwen3.7-plus` / `deepseek-v4.1-flash` |
+| `inlineSuggestionsDebounceMs` | `300` | 50–2000 |
+| `inlineSuggestionsTimeoutMs` | `3000` | 500–15000 |
+| `inlineSuggestionsMaxTokens` | `128` | 16–1024 |
+| `inlineSuggestionsPrefixLines` | `10` | 1–100 |
+| `inlineSuggestionsSuffixChars` | `300` | 0 disables the suffix |
## Review Fixes (merged via #138)
diff --git a/docs/issues/100-20260908-bundled-model-data-sync.md b/docs/issues/100-20260908-bundled-model-data-sync.md
index 4e9c179a2..0f1117424 100644
--- a/docs/issues/100-20260908-bundled-model-data-sync.md
+++ b/docs/issues/100-20260908-bundled-model-data-sync.md
@@ -105,4 +105,6 @@ both ids behave identically). Updated to `hy3`.
the #171 precedent (models.dev output values overstated) shows the gateway
can lag. If a user reports context truncation on these models, re-verify.
- `DEFAULT_INLINE_MODEL` is still `qwen3.5-plus`, which is upstream-deprecated.
- Flagged for follow-up; not changed here.
+ Flagged for follow-up; not changed here. _(Resolved 2026-10-20: upstream removed
+ `qwen3.5-plus` from the Go gateway and requests 400'd silently — default
+ switched to `qwen3.6-plus` in [doc 113](113-20261020-fim-default-model-removed-upstream.md).)_
diff --git a/docs/issues/113-20261020-fim-default-model-removed-upstream.md b/docs/issues/113-20261020-fim-default-model-removed-upstream.md
new file mode 100644
index 000000000..d0b27d8c5
--- /dev/null
+++ b/docs/issues/113-20261020-fim-default-model-removed-upstream.md
@@ -0,0 +1,54 @@
+# FIM Default Model Removed Upstream — Inline Suggestions Silently Dead
+
+**Status:** ✅ Solved
+**Topic:** autocomplete / models / config
+**Updated:** 2026-10-20
+**Tags:** #autocomplete #fim #go #models #silent-failure
+**Related:** [15 — inline code suggestions](../features/15-20260813-inline-code-suggestions.md), [88 — issue204 block unavailable Zen free models](88-20260903-issue204-block-unavailable-zen-free-models.md), [100 — bundled model data sync](100-20260908-bundled-model-data-sync.md)
+
+---
+
+## Problem
+
+Reported via LinkedIn (Yannick Huebner, 2026-10-13): inline suggestions stopped working entirely — "not working or suggesting anything" — with `opencodego.inlineSuggestions: true` set. First hypothesis (budget exhausted, no fallback path) was wrong: he later confirmed no suggestions even with a valid Go budget. Only settings changed were `inlineSuggestions: true` and `inlineSuggestionsDebounceMs: 150` (valid, within the 50–2000 clamp).
+
+## Root Cause
+
+`DEFAULT_INLINE_MODEL` was `qwen3.5-plus` (in `src/config.ts` and the `package.json` settings default). OpenCode removed that model from the **Go** gateway — the FIM path posts straight to `/chat/completions` with the configured ID, so every suggestion request returned HTTP 400 `Model is unavailable`. The completion engine treats any non-OK response as "no completion" (log to the `OpenCode Completions` output channel, return `undefined`), so the failure was invisible: no ghost text, no error surface.
+
+Why it looked like a quota bug at first: Go's status page and the request pattern matched "budget exhausted". Why it dragged: this was a known landmine — README already filtered `qwen3.5-plus` from the picker as deprecated (registry path), and doc 100 had flagged "`DEFAULT_INLINE_MODEL` is still upstream-deprecated `qwen3.5-plus` — flagged, unchanged". The FIM path bypasses the registry filter entirely (it sends the raw setting, never a picker model), so the deprecation never touched it until upstream finally dropped the model.
+
+## Evidence (verified live 2026-10-20)
+
+| Probe | Result |
+| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `GET https://opencode.ai/zen/go/v1/models` | `qwen3.5-plus` absent; Qwen on Go: `qwen3.6-plus`, `qwen3.7-plus`, `qwen3.7-max`, `qwen3.8-flash`, `qwen3.8-max` |
+| `GET https://opencode.ai/zen/v1/models` (Zen) | `qwen3.5-plus` still listed — removal is **Go-only**; irrelevant in practice since suggestions are Go-only (`chatCompletionsUrl` is the Go endpoint) |
+| `POST /chat/completions` (Go) with `qwen3.5-plus`, dummy key | HTTP 400 `Upstream request failed: Model is unavailable` — **model validation runs before credential check** |
+| `POST /chat/completions` (Go) with `qwen3.6-plus`, dummy key | HTTP 401 `Invalid credential` — passes model validation; the workaround is live-verified |
+
+Key discovery: the gateway validates in the order session → model → credential, which means model availability is testable without a paid key (a dummy-key probe distinguishes "model unknown" from "model known but auth failed").
+
+## Changes
+
+| File | Change |
+| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `src/config.ts` | `DEFAULT_INLINE_MODEL` → `qwen3.6-plus`, with a comment naming why (`qwen3.5-plus` removed from Go) |
+| `package.json` | `inlineSuggestionsModel` default → `qwen3.6-plus`; enum drops `qwen3.5-plus` **and** the equally-removed `deepseek-v4-flash`, adds `deepseek-v4.1-flash`; stale latency claims (measured on the old model) removed from descriptions |
+| `src/test/config.test.ts` | Default-model assertion updated |
+| `README.md` | Inline-suggestions section now names `qwen3.6-plus` and notes the removal + manual-switch caveat |
+| `scripts/probe-completion-latency.ts` | Candidate list refreshed to live models; sends the required `x-opencode-session` header (added 2026-09-07 enforcement, commit `418c4c4`) |
+
+## Decisions
+
+- **`qwen3.6-plus` as default, not `qwen3.8-flash`.** It is the direct successor, passes gateway model validation, and keeps the verified `enable_thinking=false` non-thinking path. Re-measured live with a real key on 2026-10-20: 1459ms TTFB / 1509ms total with `reasoningChars=0` — on par with the old default's numbers (1518ms/1608ms), so the non-thinking rationale carries over intact.
+- **No settings auto-migration.** Same call as doc 112 (freeOnly): writing user configuration without permission is worse than a documented one-time manual switch. Users on the old default must set `"opencodego.inlineSuggestionsModel": "qwen3.6-plus"` once — communicated directly to the reporter.
+- **Silent-degradation design left as is.** Ghost text that half-works is worse than none, and the diagnostics output channel already logs every failure. Surfacing a toast per failed FIM request would spam on every keystroke. The real guard is keeping the default model alive (this fix) and the probe script making that cheap to re-verify.
+
+## Verification
+
+- Dummy-key probe table above (root cause + workaround both live-verified).
+- Real-key probe run 2026-10-20 (`scripts/probe-completion-latency.ts`): `qwen3.6-plus` + `enable_thinking=false` → HTTP 200, TTFB 1459ms, total 1509ms, `reasoningChars=0`; with the `suffix` field → HTTP 200, TTFB 1660ms; `qwen3.5-plus` re-confirmed HTTP 400 `Model is unavailable`.
+- `npm run compile` — pass.
+
+Follow-up to doc 100 (flagged, now fixed) | Detected via LinkedIn report, 2026-10-20
diff --git a/package.json b/package.json
index 5f9686b90..a93b9c476 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "opencode-copilot-chat",
"displayName": "OpenCode for Copilot Chat: BYOK 30+ AI Models",
"description": "Use 30+ frontier AI models (DeepSeek V4, Kimi K2.6, GLM-5.1, Qwen3.7, MiMo V2.5, MiniMax M2.7, Claude Opus, GPT-5.5, Gemini 3.5, Grok) in GitHub Copilot Chat. Bring Your Own Key, no Copilot Pro needed.",
- "version": "0.7.9",
+ "version": "0.7.10",
"publisher": "ltmoerdani",
"license": "MIT",
"icon": "media/opencodego.png",
@@ -290,24 +290,22 @@
"opencodego.inlineSuggestions": {
"type": "boolean",
"default": false,
- "markdownDescription": "Enable ghost-text inline code suggestions while typing (experimental). Suggestions run through the OpenCode gateway with **thinking forced off** for low latency; non-thinking models (e.g. `qwen3.5-plus`) are recommended. Requires a window reload after enabling."
+ "markdownDescription": "Enable ghost-text inline code suggestions while typing (experimental). Suggestions run through the OpenCode gateway with **thinking forced off** for low latency; non-thinking models (e.g. `qwen3.6-plus`) are recommended. Requires a window reload after enabling."
},
"opencodego.inlineSuggestionsModel": {
"type": "string",
"enum": [
- "qwen3.5-plus",
"qwen3.6-plus",
"qwen3.7-plus",
- "deepseek-v4-flash"
+ "deepseek-v4.1-flash"
],
"enumDescriptions": [
- "Fastest verified option: enable_thinking=false yields ~1.5s with zero hidden reasoning.",
- "Qwen3.6 hybrid: same non-thinking mode, slightly larger context budget.",
- "Qwen3.7 hybrid: newest Qwen on OpenCode Go, same non-thinking behavior.",
- "Works but measurably slower; burns hidden reasoning tokens even with thinking off (~2s+)."
+ "Current default: enable_thinking=false non-thinking mode (successor of the removed qwen3.5-plus).",
+ "Qwen3.7 hybrid: same non-thinking behavior.",
+ "DeepSeek family: works but burns hidden reasoning tokens even with thinking off (~2s+)."
],
- "default": "qwen3.5-plus",
- "markdownDescription": "Model used for inline code suggestions. Prefer the non-thinking Qwen options. Measured: `qwen3.5-plus` with `enable_thinking=false` returns in ~1.5s with zero hidden reasoning, while reasoning models (e.g. `deepseek-v4-flash`) burn 100+ reasoning tokens even with thinking off."
+ "default": "qwen3.6-plus",
+ "markdownDescription": "Model used for inline code suggestions. Prefer the non-thinking Qwen options."
},
"opencodego.inlineSuggestionsChatInput": {
"type": "boolean",
diff --git a/scripts/probe-completion-latency.ts b/scripts/probe-completion-latency.ts
index dabb3d2cf..5ee7ca0a5 100644
--- a/scripts/probe-completion-latency.ts
+++ b/scripts/probe-completion-latency.ts
@@ -6,9 +6,11 @@
// gateway tolerates a `suffix` field (FIM emulation).
//
// Usage:
-// OPENCODE_KEY=sk-... tsx scripts/probe-completion-latency.ts [--stream]
+// OPENCODE_KEY=sk-... npx tsx scripts/probe-completion-latency.ts [--stream]
//
// The key is read from the environment only and never printed or logged.
+// Requests carry a fixed x-opencode-session probe id (required by the Go
+// gateway since 2026-09-07; extension parity per commit 418c4c4).
import { spawnSync } from "node:child_process";
@@ -32,11 +34,14 @@ const SUFFIX = ";\n}";
const probes: ProbeConfig[] = [
{
- label: "deepseek-v4-flash (thinking off, no reasoning_effort)",
+ // Removed from the Go catalog (2026-10-20 check) — expect an HTTP error,
+ // which confirms the FIM root cause (issue: inline suggestions silent).
+ label: "qwen3.5-plus (enable_thinking=false) — expect removed",
body: {
- model: "deepseek-v4-flash",
+ model: "qwen3.5-plus",
stream: true,
max_tokens: MAX_TOKENS,
+ enable_thinking: false,
messages: [
{ role: "system", content: SYSTEM },
{ role: "user", content: `<|fim_prefix|>${PREFIX}<|fim_suffix|>${SUFFIX}<|fim_middle|>` },
@@ -44,9 +49,10 @@ const probes: ProbeConfig[] = [
},
},
{
- label: "qwen3.5-plus (enable_thinking=false)",
+ // Current default candidate (successor of qwen3.5-plus on Go).
+ label: "qwen3.6-plus (enable_thinking=false)",
body: {
- model: "qwen3.5-plus",
+ model: "qwen3.6-plus",
stream: true,
max_tokens: MAX_TOKENS,
enable_thinking: false,
@@ -57,9 +63,9 @@ const probes: ProbeConfig[] = [
},
},
{
- label: "qwen3.5-plus + suffix field (gateway tolerance)",
+ label: "qwen3.6-plus + suffix field (gateway tolerance)",
body: {
- model: "qwen3.5-plus",
+ model: "qwen3.6-plus",
stream: true,
max_tokens: MAX_TOKENS,
enable_thinking: false,
@@ -89,7 +95,11 @@ function probe(config: ProbeConfig): void {
const started = Number(process.env.PROBE_STARTED);
fetch("${URL}", {
method: "POST",
- headers: { Authorization: "Bearer " + KEY, "Content-Type": "application/json" },
+ headers: {
+ Authorization: "Bearer " + KEY,
+ "Content-Type": "application/json",
+ "x-opencode-session": "vscode-completion-latency-probe",
+ },
body: JSON.stringify(body),
}).then(async (r) => {
process.stdout.write("HTTP " + r.status + "\\n");
diff --git a/src/config.ts b/src/config.ts
index 60cba8d13..222bebf63 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -76,7 +76,8 @@ export const INLINE_TIMEOUT_MS_SETTING = "inlineSuggestionsTimeoutMs";
export const INLINE_MAX_TOKENS_SETTING = "inlineSuggestionsMaxTokens";
export const INLINE_PREFIX_LINES_SETTING = "inlineSuggestionsPrefixLines";
export const INLINE_SUFFIX_CHARS_SETTING = "inlineSuggestionsSuffixChars";
-export const DEFAULT_INLINE_MODEL = "qwen3.5-plus";
+/** qwen3.5-plus was removed from the Go gateway (FIM requests 400'd silently). */
+export const DEFAULT_INLINE_MODEL = "qwen3.6-plus";
export const DEFAULT_INLINE_DEBOUNCE_MS = 300;
export const DEFAULT_INLINE_TIMEOUT_MS = 3_000;
export const DEFAULT_INLINE_MAX_TOKENS = 128;
diff --git a/src/test/config.test.ts b/src/test/config.test.ts
index 34ca73598..d486765ca 100644
--- a/src/test/config.test.ts
+++ b/src/test/config.test.ts
@@ -199,7 +199,7 @@ describe("config — storage keys", () => {
describe("config — autocomplete defaults", () => {
it("keeps the inline-completion knobs in a usable range", () => {
- assert.equal(DEFAULT_INLINE_MODEL, "qwen3.5-plus");
+ assert.equal(DEFAULT_INLINE_MODEL, "qwen3.6-plus");
expectValue("debounce", DEFAULT_INLINE_DEBOUNCE_MS, (v) => v >= 50, "at least 50ms");
expectValue("max tokens", DEFAULT_INLINE_MAX_TOKENS, (v) => v >= 16, "at least 16 tokens");
expectValue("prefix lines", DEFAULT_INLINE_PREFIX_LINES, (v) => v >= 1, "at least 1 line");