feat(fireworks): catalog DeepSeek V4 Pro, MiniMax M2.7, GLM-5.1, GPT-OSS 120B reasoning models#92217
feat(fireworks): catalog DeepSeek V4 Pro, MiniMax M2.7, GLM-5.1, GPT-OSS 120B reasoning models#92217obuchowski wants to merge 1 commit into
Conversation
|
Codex review: needs real behavior proof before merge. Reviewed June 30, 2026, 6:51 PM ET / 22:51 UTC. Summary PR surface: Source +136, Tests +105, Docs +4. Total +245 across 5 files. Reproducibility: yes. at source level: current main maps a below-range off request on a no-off profile to high, and the PR adds the first no-off Fireworks row that would expose that path. The dynamic Kimi profile regression is also source-reproducible by comparing current main's Kimi matcher with the PR-head exact manifest lookup. Review metrics: 2 noteworthy metrics.
Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Keep the manifest-owned catalog approach, but refresh the branch, preserve dynamic Kimi off-only policy, land or include the no-off clamp before shipping GPT-OSS, and require current-head Fireworks proof for the exact catalog rows. Do we have a high-confidence way to reproduce the issue? Yes at source level: current main maps a below-range off request on a no-off profile to high, and the PR adds the first no-off Fireworks row that would expose that path. The dynamic Kimi profile regression is also source-reproducible by comparing current main's Kimi matcher with the PR-head exact manifest lookup. Is this the best way to solve the issue? No, not as a standalone merge. The catalog boundary is the right direction, but the best fix also preserves Kimi dynamic behavior, lands or includes the shared no-off clamp before GPT-OSS ships, and refreshes exact current-head live proof. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 3811001d2783. Label changesLabel justifications:
Evidence reviewedPR surface: Source +136, Tests +105, Docs +4. Total +245 across 5 files. View PR surface stats
Acceptance criteria:
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
Review history (1 earlier review cycle)
|
aed2ebc to
8d00cb0
Compare
… not up resolveSupportedThinkingLevelFromProfile sorts the supported levels descending, then, when every supported level exceeds the request (e.g. a stored `off` on a profile that has no off level), fell through to `ranked.find(non-off)` — the first entry of a descending list, i.e. the most expensive level. A session carrying thinking `off` that switched onto such a model was silently remapped to maximum reasoning and persisted (src/auto-reply/reply/directive-handling.persist.ts). Use `ranked.findLast(non-off)` so a below-range request resolves to the cheapest non-off level instead. Regression test included (red before, green after). This surfaces with the first bundled no-off thinking profiles (Fireworks GPT-OSS 120B, see openclaw#92217), but the clamp lives in shared core logic, so it ships on its own.
… not up resolveSupportedThinkingLevelFromProfile sorts the supported levels descending, then, when every supported level exceeds the request (e.g. a stored `off` on a profile that has no off level), fell through to `ranked.find(non-off)` — the first entry of a descending list, i.e. the most expensive level. A session carrying thinking `off` that switched onto such a model was silently remapped to maximum reasoning and persisted (src/auto-reply/reply/directive-handling.persist.ts). Use `ranked.findLast(non-off)` so a below-range request resolves to the cheapest non-off level instead. Regression test included (red before, green after). This surfaces with the first bundled no-off thinking profiles (Fireworks GPT-OSS 120B, see openclaw#92217), but the clamp lives in shared core logic, so it ships on its own.
c242301 to
ac5b2c4
Compare
… not up resolveSupportedThinkingLevelFromProfile sorts the supported levels descending, then, when every supported level exceeds the request (e.g. a stored `off` on a profile that has no off level), fell through to `ranked.find(non-off)` — the first entry of a descending list, i.e. the most expensive level. A session carrying thinking `off` that switched onto such a model was silently remapped to maximum reasoning and persisted (src/auto-reply/reply/directive-handling.persist.ts). Use `ranked.findLast(non-off)` so a below-range request resolves to the cheapest non-off level instead. Regression test included (red before, green after). This surfaces with the first bundled no-off thinking profiles (Fireworks GPT-OSS 120B, see openclaw#92217), but the clamp lives in shared core logic, so it ships on its own.
Dependency graph guard clearedThis PR no longer has blocked dependency graph changes. A future dependency graph change requires a fresh
|
…S 120B reasoning models Add four Fireworks serverless reasoning models to the bundled catalog, each with reasoning_effort compat (supported efforts + level map) verified against the live Fireworks API. Thinking menus are derived from each row's supportedReasoningEfforts, so /think only offers levels the deployment accepts. DeepSeek V4 Pro carries thinkingFormat:"openai" to opt out of core's deepseek-native fallback: Fireworks 400s when a request sends `thinking` alongside `reasoning_effort`. GPT-OSS 120B is the first bundled profile with no off level (the API rejects reasoning_effort:"none"). The core thinking-clamp fix it relies on ships separately on fix/thinking-clamp-below-range so this stays plugin-only. Model ids, context windows, reasoning_effort ranges, and pricing verified against the live Fireworks API (/v1/models, /v1/chat/completions) and docs.fireworks.ai/serverless/pricing.
|
This pull request has been automatically marked as stale due to inactivity. |
TL;DR I run OpenClaw against Fireworks serverless and wanted their current reasoning lineup — DeepSeek V4 Pro, MiniMax M3, GLM-5.1, GPT-OSS 120B — selectable like any bundled model instead of falling through to the dynamic-model guesswork. Cataloging DeepSeek V4 on Fireworks also trips a real bug: core's deepseek-native fallback injects
thinkingnext toreasoning_effortand Fireworks rejects that request outright. The fix turned out to need zero new runtime code — one manifest compat field core already supports.Summary
What does this add? Four Fireworks serverless reasoning models to the bundled
extensions/fireworksmanifest catalog, each withreasoning_effortcompat (supported efforts + level map) and a per-family thinking profile so thinking menus only offer levels the deployment actually accepts:deepseek-v4-prominimax-m3glm-5p1gpt-oss-120bThinking menus are derived from each row's
supportedReasoningEfforts(extensions/fireworks/thinking-policy.ts) rather than hand-maintained per family, so the catalog row is the single source of truth and the/thinkmenu can never drift from the wire contract.What does this fix? — DeepSeek V4 Pro 400. Without the patch, selecting
fireworks/accounts/fireworks/models/deepseek-v4-prowith thinking enabled kills every turn. Core's DeepSeek V4 fallback (src/agents/embedded-agent-runner/extra-params.ts) matches the id's last segment (deepseek-v4-pro) on any unowned OpenAI-compatible provider and injectsthinking: { type: "enabled" }plusreasoning_effort. Fireworks rejects that payload:Core already built the seam for exactly this class of deployment:
compat.thinkingFormat≠"deepseek"suppresses the injectedthinkingentirely (even{type:"disabled"}) and strips deepseek replay fields, whilereasoning_effortkeeps flowing from the manifest map. The doc comment ondeepSeekV4NativeThinkingAllowedByCompatnames the use case (Azure AI Foundry DeepSeek V4 rejectsthinkingoutright), andextra-params.deepseek-v4-thinking-format.test.tspins the whole behavior. So the deepseek-v4-pro row carries"thinkingFormat": "openai"— no plugin runtime code, one manifest field core already supports.Note — GPT-OSS 120B is the first bundled no-off profile. Its Fireworks deployment rejects
reasoning_effort:"none"(400 Invalid reasoning effort: none, verified below), so its menu has nooff. That exposes a separate core quirk: a session carrying a storedoffthat switches onto a no-off model was clamped up to the most expensive level. That fix is shared core logic, so it ships on its own — #93335 /fix/thinking-clamp-below-range(see Linked context). This PR is intentionally plugin-only; the two are best landed together.Why
supportsReasoningEffort: trueon every row. Fireworks' baseUrl classifies as a proxy-like endpoint, so the transport's detected compat disablesreasoning_effortby default; the explicit manifest flag is what keeps each model's effort contract on the wire.Where do the numbers come from? Model ids, context windows,
reasoning_effortranges, and pricing (incl. cache-read rates) verified against the live Fireworks API (/v1/models,/v1/chat/completions) andhttps://docs.fireworks.ai/serverless/pricing.minimax-m3is absent from that account-scoped/v1/modelslisting, so it was confirmed with live completions across its full effort range.Linked context
fix/thinking-clamp-below-rangeclamps a below-range thinking request (e.g. a storedoff) down to the cheapest level instead of up to the most expensive. GPT-OSS 120B (added here) is the first bundled profile that triggers it. Independent PRs; recommend landing together.22fdc39adb) makes core resolve bundled catalog params (contextWindow/maxTokens/compat) fromopenclaw.plugin.json. This PR builds on that merged behavior — the branch is rebased on currentmain, so the four rows are authoritative through core with no plugin-side resolution code. An earlier iteration re-implemented that resolution locally; all of it was deleted once fix(fireworks): resolve catalog model params from plugin.json via core #90326 landed (see Current review state).extra-params.ts(deepSeekV4NativeThinkingAllowedByCompat, non-native sanitizer),extra-params.deepseek-v4-thinking-format.test.ts.extensions/deepseek/openclaw.plugin.jsonships the samesupportsReasoningEffortcompat;deepseek-v4-propricing matches the first-party row.thinkingFormat,supportedReasoningEfforts,reasoningEffortMap) are existing config schema:src/config/zod-schema.core.ts,src/config/types.models.ts.Real behavior proof
Behavior or issue addressed: Fireworks DeepSeek V4 Pro turns failing with 400 "cannot specify both 'thinking' and 'reasoning_effort'" when thinking is enabled; the three other reasoning families missing from the bundled catalog (no pricing, wrong default thinking levels via dynamic fallback).
Real environment tested: live Fireworks serverless API (
api.fireworks.ai/inference/v1) with a real API key; OpenClaw checkout of this branch on Linux/Node 24.Exact steps or command run after this patch:
openclaw models list --all --provider fireworks --plain, then one noninteractive agent turn per model, e.g.openclaw agent --session-id fw-shot-ds -m "One sentence: why is the sky blue?" --model fireworks/accounts/fireworks/models/deepseek-v4-pro --thinking high(and the minimax/glm/gpt-oss equivalents).Evidence after fix: screenshot below; red→green at the same command:
openclaw agent --local --session-id fw-proof-ds -m "Say READY and nothing else." --model fireworks/accounts/fireworks/models/deepseek-v4-pro --thinking high→ before:error=LLM request failed … rawError=400 cannot specify both 'thinking' and 'reasoning_effort'; after:READY. Raw API contract probe: a directPOST /v1/chat/completionsfordeepseek-v4-prowith{"thinking":{"type":"enabled"},"reasoning_effort":"low"}returns the same 400, while{"reasoning_effort":"low"}alone returns a normal completion — the patched plugin emits the latter shape.Observed result after fix: all four models listed in the catalog with pricing; live one-turn agent runs on this branch return model replies for all four families (deepseek-v4-pro/minimax-m2p7/glm-5p1/gpt-oss-120b), including a deepseek-v4-pro turn at
--thinking maxthrough the dynamic-id path.What was not tested: Fire Pass /
routers/*-fastids (separate follow-up), image input (all four rows are text-only per the live API),xhigh/maxefforts end-to-end on deepseek (mapped per Fireworks' documented effort list but not exercised in a live turn).Tests and validation
extensions/fireworksvitest: 18 passed (catalog compat incl. the newthinkingFormatassertion, per-family thinking profiles, dynamic family compat merge, dynamic-model fallbacks);src/auto-reply/thinking.test.ts: 48 passed incl. the new no-off clamp regression; clamp consumers (agent-command.live-model-switch, cron model-override forwarding): green.docs/providers/fireworks.md: built-in catalog table and dynamic-id thinking notes refreshed with the new models.extra-params.deepseek-v4-thinking-format.test.ts8 passed (pre-existing; proves the manifest override path this PR relies on).tsgocore + extension lanes clean; oxlint clean; oxfmt clean.Risk checklist
thinking-policy.ts, replaces the old per-family Kimi matcher) and four id constants. Net +265/−23 across 5 files, all underextensions/fireworks/**anddocs/**.deepseek-v4*, which gains the compat opt-out (those turns 400'd before, so nothing working changes). Non-cataloged ids get the generic thinking menu; only the four cataloged ids get derived menus.curl), so a user-selected unsupported level can no longer produce a rejected request.offsession switched onto it clamps up to the most expensive level until the sibling core fix (fix/thinking-clamp-below-range) lands. No other added model is affected (the rest are off-capable).Current review state
What is the next action? Maintainer review. Author attaches the terminal screenshot (catalog listing + one live turn per family + the
curleffort matrix) at the placeholder above.What is still waiting on author, maintainer, CI, or external proof? Author: screenshot. Maintainer: review/land decision + ordering vs the sibling core fix. CI: standard checks. No external proof outstanding.
Is this PR plugin-only? Yes. An earlier iteration of this branch carried much more — a per-family regex matcher (
model-id.ts), a dynamic-family compat table (index.ts), exportedFIREWORKS_*_COMPATclones, and a core thinking-clamp fix. The first three were workarounds for core not resolving the plugin'sopenclaw.plugin.jsoncatalog; once #90326 merged they were deleted. The core clamp fix was split out tofix/thinking-clamp-below-rangeso this PR is purely additive plugin data + manifest-derived menus + the DeepSeekthinkingFormatopt-out (one manifest field).Which bot or reviewer comments were addressed? None posted on the current revision yet. The branch was force-pushed to its surgical form after #90326 merged and after the core fix was split out; a prior over-scoped revision is superseded.
Review state guidance
Pause this PR until https://github.com/openclaw/openclaw/pull/90326 establishes manifest-authoritative resolution, then rebase and rerun the combined Fireworks tests and live proof.