Skip to content

Chat's temperature and thinking-effort overrides are sent on every turn and read by nothing #924

Description

@DEENUU1

The chat's Settings tab offers a temperature slider and a thinking-effort
picker. Both are sent on every turn and read by nothing. Whatever the person
chooses, the run uses the agent's spec.

The trail

frontend/src/hooks/use-chat.ts:657-659 puts all three overrides on the send
frame:

if (modelProfileRef.current) payload.model_profile_id = modelProfileRef.current;
if (temperatureRef.current !== null) payload.temperature = temperatureRef.current;
if (thinkingEffortRef.current !== null) payload.thinking_effort = thinkingEffortRef.current;

app/services/agent_session.py:284 reads two keys off that frame -
requested_model_profile_id(data) and requested_environment_id(data) - and
nothing else. grep for thinking_effort across backend/app returns nothing at
all, and the only "temperature" outside the spec and the ingestion config is the
manifest's recorded-settings list. So the model override works; the other two are
dropped on the floor.

How it happened

Not a deletion - the reader outlived by its control. Before b56ba1fe ("Land the
MVP platform work", 2026-07-31) the frame was read by the general assistant
path: get_agent(model_name=data.get("model"), thinking_effort=data.get("thinking_effort"), ...).
That path is gone on purpose - there is no app/agents/assistant.py and an agent
is data now - and the platform's run path that replaced it never picked the two
keys up. The popover was not touched, so it has been offering two dead controls
since.

Why it is worth a medium

The control does not merely do nothing - it says it does something. From
chat-controls.tsx's own docstring:

What survives is what a person genuinely decides per conversation: which of the
organization's models to spend, and how hard it should think. Both are recorded
on the run, so an override stays attributable.

Neither is recorded, because neither arrives. A person setting effort to high on
a hard question gets the agent's default and no sign of it - the same class as #29
and #561, a stated contract that the code does not keep.

Two ways to fix it, and they are not equivalent

  1. Wire them. thinking_effort maps to the thinking capability, which is a
    capability binding, not a model setting - spec.py:395 is explicit that
    reasoning effort is deliberately not a ModelSettingsSpec field, "because
    'reason harder' is a decision about what the agent is for". Overriding it per
    turn means overriding a binding's config for one run, which is a bigger idea
    than the slider suggests and needs the run to record it.
  2. Delete them. Two controls, their messages/en.json keys, the refs, and the
    Settings tab if nothing else lands in it - leaving the model picker, which
    works.

Recommended: (2) unless (1) is wanted soon, because a control that lies is worse
than a control that is absent, and the removal is a small, verifiable change. If
(1), temperature is genuinely a model setting and is the easy half; effort is
the one that needs a design.

Done when

Either the two overrides reach the run and are recorded on it, or they are gone
from the popover, the frame and the catalog - and chat-controls.tsx's docstring
says what is actually true either way.

Related

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingeffort:sUnder a dayfrontendNext.js app, BFF proxies, permission gatingseverity:mediumCorrectness risk under load or edge input, or a contract that lies

Type

Projects

  • Status
    Done

Relationships

None yet

Development

No branches or pull requests

Issue actions