🫧 feat: Claude Opus 4.7 Reasoning Visibility (#12701)

* 🫧 fix: Restore Claude Opus 4.7 Reasoning Visibility

Claude Opus 4.7 omits `thinking` content from Messages API responses by
default — empty thinking blocks still stream, but the `thinking` field is
blank unless the caller passes `display: "summarized"` in the adaptive
thinking config. This silenced the LibreChat "Thoughts" UI for Anthropic
(and Anthropic-on-Bedrock) adaptive models.

- Extend `ThinkingConfigAdaptive` in `packages/api/src/types/anthropic.ts`
  with an optional `display: 'summarized' | 'omitted'` field
- Emit `{ type: 'adaptive', display: 'summarized' }` from
  `configureReasoning` in `packages/api/src/endpoints/anthropic/helpers.ts`
- Emit `{ type: 'adaptive', display: 'summarized' }` from
  `bedrockInputParser` in `packages/data-provider/src/bedrock.ts` and
  update the local `ThinkingConfig` union
- Update existing adaptive-thinking assertions to include the new field
- Add dedicated tests asserting `display: 'summarized'` flows through
  both the Anthropic endpoint and the Bedrock parser

See https://platform.claude.com/docs/en/about-claude/models/whats-new-claude-4-7#thinking-content-omitted-by-default

* refactor: Gate `display: summarized` on Opus 4.7+

Narrow the reasoning-visibility opt-in to the models that actually omit
thinking content by default, instead of applying it to every adaptive
model. Pre-Opus-4.7 adaptive models (Opus 4.6, Sonnet 4.6) already return
summaries, so sending the field is unnecessary noise.

- Add `omitsThinkingByDefault(model)` in `packages/data-provider/src/bedrock.ts`
  that returns true only for Opus 4.7+ (including future majors like Opus 5+)
- Bedrock parser now only attaches `display: 'summarized'` when the helper
  matches, keeping the adaptive object unchanged for older models
- Anthropic endpoint `configureReasoning` uses the same helper so its emit
  path matches the Bedrock one
- Tests: replace the blanket `display: 'summarized'` assertions with
  model-specific ones (Opus 4.7 gets it, Opus 4.6 / Sonnet 4.6 do not),
  add a dedicated `omitsThinkingByDefault` suite covering naming variants
  and future versions

* feat: Configurable Thought Visibility for Anthropic Adaptive Models

Expose the Anthropic `thinking.display` API field as a user-facing
parameter so users can override the `auto` default (which stays as the
Opus-4.7+ opt-in added earlier in this PR). Also fixes the CI type error
by widening the adaptive thinking type assignment via a resolver helper
that returns a properly-typed object.

- Add `ThinkingDisplay` enum (`auto` | `summarized` | `omitted`) and
  matching zod schema in `packages/data-provider/src/schemas.ts`
- Add `thinkingDisplay` to `tConversationSchema`, `anthropicSettings`, and
  the pick lists for Bedrock input/parser + Anthropic agent params
- Add `resolveThinkingDisplay(model, explicit)` helper in
  `packages/data-provider/src/bedrock.ts` that returns the wire value or
  undefined (auto → model default, explicit → always honored)
- `bedrockInputParser` now reads `thinkingDisplay` from input and emits
  `display` only when the resolver returns a value; strips the field
  on non-adaptive-model branches so it does not leak
- `configureReasoning` in the Anthropic endpoint threads
  `thinkingDisplay` through, uses the resolver, and casts the adaptive
  config to `AnthropicClientOptions['thinking']` so the widened shape
  compiles against the stale installed SDK types
- Add UI slider for `thinkingDisplay` in `parameterSettings.ts` next to
  `effort`, with three-position `com_ui_auto` / `com_ui_summarized` /
  `com_ui_omitted` labels
- Add translation keys `com_endpoint_anthropic_thinking_display`,
  `com_endpoint_anthropic_thinking_display_desc`, `com_ui_summarized`,
  `com_ui_omitted`
- Add tests: `resolveThinkingDisplay` suite (5 cases covering auto /
  explicit / unknown input), parser round-trip tests for all three
  modes on Opus 4.6 and Opus 4.7, Anthropic endpoint tests for explicit
  summarized/omitted overrides

* fix: Drop `thinkingDisplay` When Adaptive Thinking Is Disabled

If a user turns adaptive thinking off but had previously selected a
`thinkingDisplay` value, the stale field was left in `additionalFields`
and ended up merged into the Bedrock request's
`additionalModelRequestFields`. That leaks a non-Bedrock key into the
payload and can round-trip back into `llmConfig`.

- Delete `additionalFields.thinkingDisplay` alongside `thinking` and
  `thinkingBudget` in the `thinking === false` branch of
  `bedrockInputParser`
- Add a regression test asserting `thinking`, `thinkingBudget`, and
  `thinkingDisplay` are all absent when adaptive thinking is disabled on
  an Opus 4.7 request

Reported by chatgpt-codex-connector on PR #12701.

* refactor: Consolidate `ThinkingDisplay` Types and Preserve Persisted Display

Address review findings on PR #12701:

- [Codex P2] `bedrockInputSchema.transform` now extracts
  `thinking.display` from persisted `additionalModelRequestFields` back
  into the top-level `thinkingDisplay` field so explicit `'omitted'`
  round-trips through storage instead of being silently reverted to
  `'summarized'` on the next parse.
- [Codex P2] `getLLMConfig` in the Anthropic endpoint now reads
  `.display` from a persisted `thinking` object (agents store the full
  Anthropic shape) and uses it as the fallback for `thinkingDisplay`
  when no top-level override is present.
- [Audit #2] Collapse the three parallel wire-value types into a single
  `ThinkingDisplayWireValue = Exclude<ThinkingDisplay, 'auto'>` exported
  from `schemas.ts`; remove the duplicate `ThinkingDisplay` alias in
  `packages/api/src/types/anthropic.ts` (which collided with the enum
  name) and the `ThinkingDisplayValue` alias in `bedrock.ts`.
- [Audit #3] Add `thinkingDisplay` to the `TEndpointOption` pick list
  next to `effort`.
- [Audit #4] Add a TODO comment next to the `as
  AnthropicClientOptions['thinking']` cast explaining the stale
  `@librechat/agents` SDK types that require it.
- Add tests: four round-trip cases asserting `bedrockInputSchema`
  recovers `display` from persisted AMRF (Opus 4.7 omitted, pre-4.7
  summarized, unknown-value ignore, explicit top-level wins), and two
  `getLLMConfig` cases asserting the Anthropic endpoint preserves and
  overrides persisted `thinking.display`.

* fix: Preserve Persisted `thinking.display` in bedrockInputParser

The parser constructed a fresh adaptive thinking config without looking at
any `display` already embedded in the incoming
`additionalModelRequestFields.thinking`. On round-trip through
`initializeBedrock`, a persisted user choice of `'omitted'` on Opus 4.7+
was silently reverted to `'summarized'` by the auto fallback.

- Extract `extractPersistedDisplay` helper and reuse it in both the
  schema transform (form-state round-trip) and the parser (wire-request
  round-trip)
- `bedrockInputParser` now feeds the persisted display as the resolver's
  explicit value when no top-level `thinkingDisplay` override is set
- Add regression tests: parser preserves `display: 'omitted'` for
  persisted Opus 4.7 AMRF, and top-level `thinkingDisplay` still wins
  over persisted AMRF display

Reported by chatgpt-codex-connector (P1) on PR #12701.
This commit is contained in:
Danny Avila 2026-04-16 21:56:52 -04:00 committed by GitHub
parent e2e3284713
commit 034b672d0c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 571 additions and 7 deletions

View file

@ -226,6 +226,8 @@
"com_endpoint_agent_placeholder": "Please select an Agent",
"com_endpoint_ai": "AI",
"com_endpoint_anthropic_effort": "Controls how much computational effort Claude applies. Lower effort saves tokens and reduces latency; higher effort produces more thorough responses. 'Max' enables the deepest reasoning (Opus 4.6 only).",
"com_endpoint_anthropic_thinking_display": "Thought Visibility",
"com_endpoint_anthropic_thinking_display_desc": "Controls whether Claude's reasoning is returned. 'Auto' opts in to summarized thoughts for models that hide them by default (Opus 4.7+); 'Summarized' always shows them; 'Omitted' always hides them for slightly lower latency.",
"com_endpoint_anthropic_maxoutputtokens": "Maximum number of tokens that can be generated in the response. Specify a lower value for shorter responses and a higher value for longer responses. Note: models may stop before reaching this maximum.",
"com_endpoint_anthropic_prompt_cache": "Prompt caching allows reusing large context or instructions across API calls, reducing costs and latency",
"com_endpoint_anthropic_temp": "Ranges from 0 to 1. Use temp closer to 0 for analytical / multiple choice, and closer to 1 for creative and generative tasks. We recommend altering this or Top P but not both.",
@ -1251,6 +1253,7 @@
"com_ui_open_source_chat_new_tab_title": "Open Source Chat in New Tab - {{title}}",
"com_ui_open_var": "Open {{0}}",
"com_ui_openai": "OpenAI",
"com_ui_omitted": "Omitted",
"com_ui_optional": "(optional)",
"com_ui_options": "options",
"com_ui_output": "Output",
@ -1451,6 +1454,7 @@
"com_ui_storage": "Storage",
"com_ui_storage_filter_sort": "Filter and Sort by Storage",
"com_ui_submit": "Submit",
"com_ui_summarized": "Summarized",
"com_ui_summarizing": "Summarizing...",
"com_ui_support_contact": "Support Contact",
"com_ui_support_contact_email": "Email",