Skip to content

🐛 fix: strip temperature/top_p for Claude Opus 4.7#13909

Merged
tjx666 merged 5 commits into
canaryfrom
fix/opus-4-7-strip-sampling-params
Apr 17, 2026
Merged

🐛 fix: strip temperature/top_p for Claude Opus 4.7#13909
tjx666 merged 5 commits into
canaryfrom
fix/opus-4-7-strip-sampling-params

Conversation

@tjx666

@tjx666 tjx666 commented Apr 17, 2026

Copy link
Copy Markdown
Member

💻 Change Type

  • 🐛 fix
  • 💄 style

🔀 Description of Change

Claude Opus 4.7 rejects any non-default temperature, top_p, or top_k with HTTP 400 — a documented breaking change relative to Opus 4.6 per the Anthropic migration guide. The safest fix is to omit these parameters entirely from the request payload.

This showed up in production right after the Opus 4.7 launch: Bedrock returned temperature is deprecated for this model on every request that didn't enable adaptive thinking (the thinking branch skips sampling params, which masked the bug during launch verification).

Two commits:

1. 🐛 Runtime strippackages/model-runtime

  • New omitSamplingParamsModelPatterns + shouldOmitSamplingParams(model) in src/const/models.ts, mirroring the existing temperatureTopPConflictModelPatterns / hasTemperatureTopPConflict shape.
  • Short-circuit inside resolveModelSamplingParameters — when the model matches, return placeholder undefined values for any keys the caller provided so spreading onto a payload clears them (JSON.stringify drops undefined).
  • Covered id shapes: Anthropic API (claude-opus-4-7), AWS Bedrock (anthropic.claude-opus-4-7, us.anthropic.claude-opus-4-7-v1), OpenRouter (anthropic/claude-opus-4-7, anthropic/claude-4-7-opus).
  • Both the Bedrock provider and the Anthropic-compatible factory already delegate to resolveModelSamplingParameters, so no direct edits to those files are needed.

2. 💄 UI hidesrc/features/AgentSetting/AgentModal

  • When shouldOmitSamplingParams(config.model) returns true, filter temperature and top_p out of the visible param sliders so users don't waste time tweaking parameters that the API rejects. Other sliders (penalties, max tokens) are unchanged.

🧪 How to Test

  • Tested locally
  • Added/updated tests

Run the parameter resolver suite:

cd packages/model-runtime && bunx vitest run --silent='passed-only' 'src/core/parameterResolver.test.ts'

New test cases cover:

  • claude-opus-4-7 (Anthropic API id) → both keys returned as undefined
  • us.anthropic.claude-opus-4-7-v1 (Bedrock id) → both keys returned as undefined
  • claude-opus-4-7 with no sampling input → empty object, no spurious keys
  • shouldOmitSamplingParams matches Opus 4.7 across Anthropic / Bedrock / OpenRouter id shapes and does not match Opus 4.6 / Sonnet 4.5 / non-Claude models

📝 Additional Information

Pattern is intentionally narrow (Opus 4.7 only). Future Sonnet/Haiku 4.7 or Opus 5.x will require an additive change — we don't want to strip sampling params from models that still accept them.

Claude Opus 4.7 rejects any non-default temperature/top_p/top_k with HTTP 400
per the Anthropic migration guide. Add an omit pattern + early return in the
sampling parameter resolver so both Anthropic and Bedrock providers drop these
params from outbound payloads.

Ref: https://platform.claude.com/docs/en/about-claude/models/migration-guide
@vercel

vercel Bot commented Apr 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lobehub Ready Ready Preview, Comment Apr 17, 2026 3:44am

Request Review

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've reviewed this pull request using the Sourcery rules engine

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e490b8f055

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +128 to +129
/^anthropic\/claude-opus-4-7/,
/^anthropic\/claude-4-7-opus/,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Match OpenRouter Opus 4.7 model IDs in omit regex

The new OpenRouter patterns only match dash-form IDs (anthropic/claude-opus-4-7 / anthropic/claude-4-7-opus), so shouldOmitSamplingParams will not trigger for the actual OpenRouter Opus 4.7 ID format (anthropic/claude-opus-4.7). In that case resolveModelSamplingParameters leaves temperature/top_p in place and requests can still fail with 400 for Opus 4.7. Please add dot-notation OpenRouter patterns (and a test case) so the omit logic applies to real OpenRouter model IDs.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — fixed in fc76112. Patterns now use dot notation (anthropic/claude-opus-4.7, anthropic/claude-4.7-opus) to match the real OpenRouter id format, mirroring the existing contextCachingModelPatterns / temperatureTopPConflictModelPatterns convention. Added a negative test for the dash form to prevent regression.

@codecov

codecov Bot commented Apr 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.91%. Comparing base (d2197f4) to head (fc76112).
⚠️ Report is 4 commits behind head on canary.

Additional details and impacted files
@@           Coverage Diff            @@
##           canary   #13909    +/-   ##
========================================
  Coverage   66.91%   66.91%            
========================================
  Files        2058     2059     +1     
  Lines      175147   175188    +41     
  Branches    17291    18078   +787     
========================================
+ Hits       117196   117233    +37     
- Misses      57827    57831     +4     
  Partials      124      124            
Flag Coverage Δ
app 59.30% <100.00%> (+<0.01%) ⬆️
database 92.42% <ø> (ø)
packages/agent-runtime 79.72% <ø> (ø)
packages/context-engine 83.22% <ø> (ø)
packages/conversation-flow 92.36% <ø> (ø)
packages/file-loaders 87.02% <ø> (ø)
packages/memory-user-memory 74.74% <ø> (ø)
packages/model-bank 99.86% <ø> (ø)
packages/model-runtime 84.21% <100.00%> (+0.01%) ⬆️
packages/prompts 69.24% <ø> (ø)
packages/python-interpreter 92.90% <ø> (ø)
packages/ssrf-safe-fetch 0.00% <ø> (ø)
packages/utils 90.34% <ø> (ø)
packages/web-crawler 88.66% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
Store 66.25% <100.00%> (+<0.01%) ⬆️
Services 51.63% <66.66%> (+<0.01%) ⬆️
Server 66.92% <100.00%> (-0.01%) ⬇️
Libs 51.35% <ø> (ø)
Utils 91.12% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Pair with the runtime-layer strip fix: when the selected model matches
shouldOmitSamplingParams (currently Claude Opus 4.7), hide the two sliders
in the agent modal so users don't waste time tweaking parameters that the
API rejects.
tjx666 added 3 commits April 17, 2026 11:18
Add AiModelSettings.disabledParams and wire AgentModal to filter sliders
by aiModelSelectors.modelDisabledParams instead of importing a predicate
from model-runtime. Declare Opus 4.7's sampling restrictions on its card
so future models can opt in via metadata.

Runtime-layer shouldOmitSamplingParams is kept as a defensive fallback
so payloads stay clean even if a model card forgets to declare the list.
Three cases mirroring the modelExtendParams style: returns the declared
list, returns undefined when settings is missing, returns undefined for
unknown models.
OpenRouter Claude model ids use dot notation (anthropic/claude-opus-4.7)
rather than dash form. The previous regex only matched the dash form, so
shouldOmitSamplingParams never triggered on real OpenRouter requests and
temperature/top_p would still leak through and 400 the API.

Caught via codex review: #13909 (comment)
@tjx666 tjx666 merged commit d658daa into canary Apr 17, 2026
38 checks passed
@tjx666 tjx666 deleted the fix/opus-4-7-strip-sampling-params branch April 17, 2026 03:47
@arvinxx arvinxx mentioned this pull request Apr 27, 2026
arvinxx added a commit that referenced this pull request Apr 27, 2026
# 🚀 LobeHub v2.1.53 (20260427)

**Release Date:** April 27, 2026
**Since v2.1.52:** 194 merged PRs · 17 contributors

> Introduce Heterogeneous Agent — Claude Code and Codex run as
first-class desktop runtimes, paired with a new Agent Signal package,
sharper desktop UX, and a wave of flagship model additions.

---

## ✨ Highlights

- **Introduce Heterogeneous Agent** — Claude Code and Codex run as
first-class desktop agents: subagent rendering, partial-message
streaming, multi-turn resume, terminal error surfacing, rich tool
inspectors, and runtime polish. (#14162, #13754, #14067, #14001, #13970,
#13942)
- **Screen capture & Quick Chat tray** — New desktop screen capture
overlay (macOS permission-gated) with Quick Chat tray and upload
pipeline improvements; chat input auto-focuses on overlay mount.
(#13818, #14097, #14105)
- **Desktop topic & tab UX** — Dedicated topic popup window with
cross-window sync, Cmd+W/Cmd+T tab shortcuts, TabBar polish, recent
working directories expanded to 20, and human approval notifications.
(#13957, #13983, #13972, #14036, #14092)
- **Git workflow built-in** — One-click pull/push from the branch chip,
ahead/behind badge, and submodule/worktree repo detection. (#14041,
#13980, #13978)
- **Agent Signal package** — New `@lobechat/agent-signal` runtime for
dynamic memory feedback signals, with OTel metrics and self-iteration in
Lab. (#14157, #14170, #14159, #14169, #14187)
- **New models** — Claude Opus 4.7 with `xhigh` effort tier, GPT-5.5,
DeepSeek V4 Flash/Pro with reasoning slider, Kimi K2.6, MiMo-V2.5/Pro,
gpt-image-2, Qwen3.6 Flash/Plus, and Pixverse-c1. (#13903, #14147,
#14114, #14004, #14089, #14039, #13923)
- **New providers** — OpenCode Zen, OpenCode Go, and Azure OpenAI Router
runtime. (#13943, #14064, #13823)
- **Mobile settings overhaul** — Full settings menu and responsive
profile layout for mobile. (#14019)

---

## 🏗️ Heterogeneous Agent

- Claude Code runtime, working-directory awareness, and sidebar polish.
(#13970)
- CC subagent rendering with persistent streamed text; parallel-tool
orphan fix. (#14001, #13968, #14024)
- Per-step usage persisted to each step assistant message. (#13964)
- Per-phase workflow expand defaults; full-expand toggle with
three-level expansion. (#14171, #13906)
- Hetero-mode actions bar; tool inspector polish. (#13963, #14034,
#14030)
- Codex desktop integration with rich tool rendering and devtools
preview. (#14067, #14100)
- Codex terminal error surfacing and CLI output tracing. (#14166)
- Tighten `isCanUseVision` default and add aggregator fallback. (#14172)
- Persist `ccSessionId` in topic metadata for CC multi-turn resume.
(#13902)
- CC account card, topic filter, and integration polish. (#13955,
#13942, #13950)
- Token-level deltas streamed via `--include-partial-messages`. (#13929)

---

## 🧠 Agent Signal & Self-Iteration

- New `@lobechat/agent-signal` package with dynamic feedback signals.
(#14157)
- AgentSignalRuntime wired through agent-tracing and observability-otel
metrics. (#14170, #14159)
- Self-iteration feature flag added to Lab; front-side flag check.
(#14169, #14186)
- Signal policy for receiving memory feedback dynamically. (#14187)

---

## 💬 Conversation

- Queue follow-up sends during running CC turns. (#14179)
- Persist per-topic chat scroll position; pin user message + fold long
messages. (#14191, #14056)
- Inline resend when editing last user message. (#14080)
- Disable first-block markdown streaming to prevent flicker. (#14193,
#13904)
- Prevent Markdown stream replay when vlist remounts streaming items.
(#14086)
- Stop repinning after manual scroll; unify scroll-to-user + spacer
hooks. (#14099, #14132)

---

## 📱 Platforms & Integrations

### Desktop / Electron

- Screen capture overlay, Quick Chat tray, and upload pipeline
improvements. (#13818)
- macOS permission gate for screen capture; auto-focus chat panel input.
(#14097, #14105)
- Dedicated topic popup window with cross-window sync. (#13957)
- TabBar polish: `+` button for new topic, dark theme blend, close icon
by default. (#13972, #14203, #13973)
- Recent working directories expanded from 5 to 20; submodule/worktree
repo detection. (#14036, #13978)
- Cmd+W / Cmd+T tab shortcuts and global shortcut consolidation.
(#13983, #13880)
- Linux icon configuration; human approval desktop notifications.
(#14042, #14092)

### Git Workflow

- One-click pull/push from branch chip; ahead/behind badge with
refactored GitCtr. (#14041, #13980)

### Mobile

- Full settings menu and responsive profile layout. (#14019)
- Agent route added to mobile router; mobile agent topic route
registered. (#14103, #14158)
- Session list skeleton row layout corrected. (#14040)

### Bot / Messaging

- DM strategy support; bot emoji and markdown render optimization.
(#14201, #14091, #14140)
- Slack webhook fix; bot platform setup guide reference. (#14052,
#14121)

---

## 🤖 Models & Providers

### New models

- **Claude Opus 4.7** with `xhigh` effort tier; strip temperature/top_p.
(#13903, #13909)
- **GPT-5.5**. (#14147)
- **DeepSeek V4** Flash/Pro cards with reasoning slider; cache-hit and
Pro discount pricing. (#14114, #14209, #14196, #14131)
- **Kimi K2.6** model with LobeHub-hosted card. (#14004, #14006)
- **MiMo-V2.5 / V2.5-Pro**. (#14089)
- **gpt-image-2**, **Qwen3.6 Flash/Plus**, **Pixverse-c1**. (#14039,
#13923)

### New providers

- **OpenCode Zen** and **OpenCode Go** with env-var support. (#13943,
#14064)
- **Azure OpenAI Router** runtime support. (#13823)
- Model alias mapping for image and video runtimes. (#13896)
- Seedance video models migrated to Dreamina. (#14144)

### Runtime reliability

- Sanitize invalid tool_call arguments to unbreak strict providers.
(#14033)
- Tolerate null `function.name` in streaming tool_call deltas. (#14139)
- Preserve Gemini 3 `thoughtSignature` in `call_tools_batch`
normalization. (#14032)
- Downgrade `image_url` parts when target model lacks vision. (#14029)
- Preserve Cloudflare provider error context. (#14136)
- Use `safety_identifier` for OpenAI Responses API. (#14148)
- Unwrap underlying PG error in `formatErrorEventData`. (#14038)

---

## 🖥️ User Experience

- **Onboarding** — Preset agent naming suggestions, structured hunk ops
for `updateDocument`, persona analytics snapshot, footer promotion
pipeline, wrap-up button. (#13931, #13989, #13930, #13853, #13934)
- **Document workflow** — Agent documents promoted as primary workspace
panel; history management and compare workflow; web-crawl docs
associated with agent documents. (#13924, #13725, #13893)
- **cmdk** — Agent identity surfaced on topic search results;
topic/message search scoped to current agent. (#14204, #13960)
- **Floating chat panel** and workspace improvements. (#13887)
- **Topic completion status** with dropdown action and filter. (#14005)

---

## 🔧 Tooling

- Redis-backed feature flag provider for runtime config. (#14098)
- Vite upgraded to 8.0.0 with Rolldown strict execution order. (#12720,
#14058)
- `@lobechat/model-bank` automated npm release with provenance. (#14015,
#14017, #14018)
- Skill activation fallback when `activateTools` cannot find identifier.
(#14010)
- Cron tool: timezone and existing jobs injected into system prompt;
clarified `lobe-gtd` and `lobe-cron` descriptions. (#14012, #14013)

---

## 🔒 Security & Reliability

- **Security:** uuid bumped to v14 (advisory). (#14083)
- **Security:** validate avatar URL and scope old-avatar deletion to
owner. (#13982)
- **Security:** clear OIDC sessions on better-auth signout; return 401
(not 500) for expired OIDC JWT. (#13916, #14014)
- **Reliability:** scope pending-approval check to current assistant
turn. (#14182)
- **Reliability:** sanitize heterogeneous-agent attachment cache
filenames. (#13937)
- **Reliability:** reduce subagent task status error noise. (#14026)

---

## 👥 Contributors

Huge thanks to **17 contributors** who shipped **194 merged PRs** this
week.

@hardy · @shaun0927 · @hezhijie0327 · @sxjeru · @arvinxx · @Innei ·
@tjx666 · @lijian · @neko · @rdmclin2 · @AmAzing129 · @sudongyuer ·
@CanisMinor · @rivertwilight

Plus @lobehubbot and renovate[bot] for maintenance.

---

**Full Changelog**:
v2.1.52...v2.1.53
mrsimpson pushed a commit to mrsimpson/lobehub that referenced this pull request May 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant