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
- 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.
- 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
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-659puts all three overrides on the sendframe:
app/services/agent_session.py:284reads two keys off that frame -requested_model_profile_id(data)andrequested_environment_id(data)- andnothing else.
grepforthinking_effortacrossbackend/appreturns nothing atall, and the only
"temperature"outside the spec and the ingestion config is themanifest'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 theMVP 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.pyand an agentis 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
mediumThe control does not merely do nothing - it says it does something. From
chat-controls.tsx's own docstring:Neither is recorded, because neither arrives. A person setting effort to
highona 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
thinking_effortmaps to thethinkingcapability, which is acapability binding, not a model setting -
spec.py:395is explicit thatreasoning effort is deliberately not a
ModelSettingsSpecfield, "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.
messages/en.jsonkeys, the refs, and theSettingstab if nothing else lands in it - leaving the model picker, whichworks.
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),
temperatureis genuinely a model setting and is the easy half; effort isthe 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 docstringsays what is actually true either way.
Related
contract stated that the code does not keep.
ride the same frame and become the third dead control in the same popover if it
were wired the same way.