You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
the expected outputs only controls whether the thinking tokens are emitted or not in a stream, while the create options controls whether thinking is enabled and what effort should be used for this session.
Thanks for the suggestion @sushraja-msft and @michaelwasserman! Moving to a top-level thinkingEffort option alongside expectedOutputs: [{ type: "text", languages: ["en"] }, { type: "thought" }] is much cleaner and aligns thought emission directly with how Tool Use negotiates structured { type, value } outputs via { type: "tool-call" }.
Concretely, this gives us a consistent surface across the API:
LanguageModelCreateCoreOptions: thinkingEffort ("none" | "low" | "medium" | "high", default "none") controls whether reasoning is enabled and its baseline budget tier, while expectedOutputs: [{ type: "text", languages: ["en"] }, { type: "thought" }] opts the session into receiving structured LanguageModelMessageContent items ([{ type: "thought", value }, { type: "text", value }]) from prompt() and promptStreaming().
LanguageModelPromptOptions: thinkingEffort overrides the session's baseline effort tier for an individual prompt() or promptStreaming() call. Because structured output negotiation happens at session creation via expectedOutputs, a session created with { type: "thought" } always uses the LanguageModelMessageContent format across all turns (emitting [{ type: "thought", value }, { type: "text", value }] on thinking turns, and [{ type: "text", value }] if a specific turn is overridden to thinkingEffort: "none").
LanguageModel: keeps readonly attribute LanguageModelThinkingEffort thinkingEffort; and drops the separate includeThoughts boolean and LanguageModelThinkingOptions dictionary.
Activity
michaelwasserman commentedon Oct 6, 2026
This is a great suggestion, I totally agree.
@isaacahouma can you help update the explainer, spec, and follow up with wrt chromium impl plans?
isaacahouma commentedon Oct 6, 2026
Thanks for the suggestion @sushraja-msft and @michaelwasserman! Moving to a top-level
thinkingEffortoption alongsideexpectedOutputs: [{ type: "text", languages: ["en"] }, { type: "thought" }]is much cleaner and aligns thought emission directly with how Tool Use negotiates structured{ type, value }outputs via{ type: "tool-call" }.Concretely, this gives us a consistent surface across the API:
LanguageModelCreateCoreOptions:thinkingEffort("none" | "low" | "medium" | "high", default"none") controls whether reasoning is enabled and its baseline budget tier, whileexpectedOutputs: [{ type: "text", languages: ["en"] }, { type: "thought" }]opts the session into receiving structuredLanguageModelMessageContentitems ([{ type: "thought", value }, { type: "text", value }]) fromprompt()andpromptStreaming().LanguageModelPromptOptions:thinkingEffortoverrides the session's baseline effort tier for an individualprompt()orpromptStreaming()call. Because structured output negotiation happens at session creation viaexpectedOutputs, a session created with{ type: "thought" }always uses theLanguageModelMessageContentformat across all turns (emitting[{ type: "thought", value }, { type: "text", value }]on thinking turns, and[{ type: "text", value }]if a specific turn is overridden tothinkingEffort: "none").LanguageModel: keepsreadonly attribute LanguageModelThinkingEffort thinkingEffort;and drops the separateincludeThoughtsboolean andLanguageModelThinkingOptionsdictionary.I opened #224 to update the explainer (
README.md) and updated https://chromestatus.com/feature/5098001721851904 too. Thinking Mode is not in the spec yet.