Repository navigation
Conversation
(ai: vllm-qwen/qwen3.8-27b) Status — verified live just now: this thread is already fully closed; nothing is in flight for goose.
So there's no work item left to act on here. I did not reopen or merge anything — merging is human-only, and I won't unilaterally resurrect a PR its author deliberately closed. My independent read of the diff (reviewed all of it against current master): the fix is correct and well-built. It reuses existing helpers ( Two things keep it out of auto-merge even on its own merits: (a) it adds a new detection surface rather than being a pure 🔶 需要决策 — what I'd need from you to proceed (pick one; default = leave closed):
My recommendation: A unless goose custom-provider support matters to you, in which case C. Tell me which and I'll act. 独立审核八问(对已关闭的 diff 本身):
结论:代码本身可合入(低风险、双向测试齐全、干净应用当前 master、冻结分支可恢复),但因作者已自行关闭并删分支,当前无可合入对象;是否复活由你定(推荐 A,除非在意 goose 自定义 provider 支持则 C)。 |
(ai: vllm-qwen/qwen3.8-27b) Closing out — my full assessment is the comment above (verified it landed). Recap in one breath:
One thing I need from you: A leave closed (my recommendation unless you care about goose custom-provider support) · B ping @biscober to resubmit · C I recreate from this frozen ref + open a new PR against #6191. Say the word and I'll act. |
Fixes #6191
What was wrong
bili goosediscovered Goose's provider config in the shape #1049 planned (config.toml+custom_providers/*.toml). Stock Goose ships a different shape: settings live inconfig.yaml, and declarative providers are<id>.jsonfiles — Goose's own loader filterspath.extension()? == "json"(crates/goose-providers/src/declarative.rs) and writes them withserde_json::to_string_pretty(crates/goose/src/config/declarative_providers.rs).So for a Goose install whose active provider is a custom provider (any local / self-hosted endpoint), the lane was a silent no-op:
readGooseConfigfound noactiveProvider(so not even the "no override seam" warning fired), no/bili/rewrite was registered, and noGOOSE_PATH_ROOToverlay was created. Model traffic went direct, uncompressed. Same family as #6022.Before / after (real Goose 1.57 layout, same machine,
node dist/index.js goose -- --version)Provider under test:
custom_providers/custom_strata__local.json→"engine": "openai","base_url": "http://192.168.1.178:8080", two Qwen models withcontext_limit262144 / 131072;active_providerinconfig.yaml.master (
e3220adc) — no rewrite field at all, no overlay:this branch — provider discovered and re-pointed,
config.yamland the real provider JSON left byte-identical (md5summatched before/after):and in the overlay the provider line reads:
valid JSON, every other field (models, costs,
preserves_thinking, …) untouched. The route carries traffic:POST /bili/http://192.168.1.178:8080/v1/chat/completionsreturned the upstream's own401 {"error":{"type":"authentication_error","message":"missing or wrong API key"}}.How
src/client-config.ts—readGooseConfig:active_providerread fromconfig.yaml(top-level keys only, so an indentedactive_providerinside a block cannot be mistaken for the setting;config.tomlandGOOSE_PROVIDERstay as fallbacks),custom_providers/*.jsonscanned alongside.toml, and each provider'smodels[].name+context_limitcollected as model windows.src/launcher.ts—prepareGooseHomesplices the wrappedbase_urlinto JSON provider files in the overlay with the same one-line splice used for TOML (no re-serialisation, so formatting and unrelated bytes survive).collectModelWindows/collectModelMaxOutputsgain thegoosescope, so bili uses the endpoint's declared windows instead of the generic fallback.GOOSE_JSON_BASE_URL_RE), because a provider that gets discovered but cannot be re-pointed is precisely the misroute this lane exists to avoid. The pattern is line-shaped (^branch forto_string_pretty,[,{]branch for hand-written compact JSON) rather thanJSON.parse, so a half-written provider file still yields its url — matching how the TOML path already behaved.Config surface
None. No new config key, env var, or CLI flag;
network.allowPrivateHttpProvidersand the/bili/prefix machinery are unchanged.Pre-flight
npm run typecheck— clean.npm run build— clean (dist-import-annotations: OK,dist-external: OK).tests/launcher.test.ts+tests/model-windows.test.ts— 379/379 pass, 0 fail.tests/identity-harvest.test.ts(the other goose-touching file) — 16/16.node scripts/check-unused-exports.mjs— clean.testlanes on this head (§7.2).config.yaml/JSON discovery fires for the real layout, and stays silent for a non-goose scope (collectModelWindows(cfg, "codex")sees no goose windows); the overlay rewrite touches only the intendedbase_url(pretty + compact spellings) and leaves a provider outside the rewrite set verbatim.Not touched:
kernel/,pi-subagents/,src/update.ts, config schema, persistence format, wire/message shape.