Title: Thinking-level (reasoning effort) picker in the chat composer · Issue #44 · modelstudioai/openwork · GitHub
Open Graph Title: Thinking-level (reasoning effort) picker in the chat composer · Issue #44 · modelstudioai/openwork
X Title: Thinking-level (reasoning effort) picker in the chat composer · Issue #44 · modelstudioai/openwork
Description: Problem or Motivation OpenWork supports six per-session thinking levels (off / low / medium / high / xhigh / max), but there is no way to change the thinking level from the chat composer. Today the only place to influence it is Settings ...
Open Graph Description: Problem or Motivation OpenWork supports six per-session thinking levels (off / low / medium / high / xhigh / max), but there is no way to change the thinking level from the chat composer. Today the...
X Description: Problem or Motivation OpenWork supports six per-session thinking levels (off / low / medium / high / xhigh / max), but there is no way to change the thinking level from the chat composer. Today the...
Opengraph URL: https://github.com/modelstudioai/openwork/issues/44
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Thinking-level (reasoning effort) picker in the chat composer","articleBody":"## Problem or Motivation\n\nOpenWork supports six per-session **thinking levels** (`off` / `low` / `medium` /\n`high` / `xhigh` / `max`), but there is **no way to change the thinking level from\nthe chat composer**. Today the only place to influence it is Settings → AI, which\nsets a *per-workspace default* for new chats. To dial reasoning effort up for a\nsingle hard task or down for a quick one, you have to leave the conversation, open\nsettings, change the default, and start a new chat.\n\nComparable desktop apps put this control right in the composer, next to the model\npicker: Claude Code Desktop ships a dedicated **effort menu** (`⌘⇧E`) alongside its\nmodel menu, so you can raise or lower reasoning effort per message without leaving\nthe prompt.\n\nOpenWork already has the neighbor for it — the composer has a **model picker**\ndropdown — but the thinking-level equivalent is missing even though all the\nplumbing is already in place:\n\n- The composer (`FreeFormInput`) already receives `thinkingLevel` and\n `onThinkingLevelChange` props — they are threaded from `ChatPage` /\n `DraftChatPage` → `ChatDisplay` → `ChatInputZone` → `InputContainer` →\n `FreeFormInput`, and both pages already persist the value (draft\n `createOptions.thinkingLevel` / session options). But `FreeFormInput` never\n renders a trigger for it — the prop is only read for an ACP command refresh.\n- The level metadata already exists: `THINKING_LEVELS` (id + `nameKey` +\n `descriptionKey`) in `packages/shared/src/agent/thinking-levels.ts`, and the\n `thinking.*` translation keys are already present in **all** locales.\n\nSo the value is fully wired end-to-end — the app just has no UI to set it from the\nplace you actually compose.\n\n## Proposed Solution\n\nAdd a **thinking-level picker** to the composer toolbar, immediately before the\nmodel picker, mirroring the existing model-picker dropdown:\n\n- A toolbar button showing the current level's name (e.g. \"Medium\") with a brain\n icon and a chevron; tooltip \"Thinking\".\n- Opening it lists all six levels (`THINKING_LEVELS` order) with name +\n description, a check on the active level, and calls the already-wired\n `onThinkingLevelChange(level)` on select — so the choice persists exactly like a\n model change does.\n- Hidden in `compactMode` (same rule the model picker uses).\n\nThis is a **frontend-only** change:\n\n- It renders a Radix dropdown (the same `StyledDropdownMenu*` primitives the model\n picker uses) and calls the existing `onThinkingLevelChange` prop. No backend / no\n qwen-code change — the value already flows to the runtime today.\n- It introduces **no new i18n keys**: level names/descriptions reuse the existing\n `thinking.*` keys and the trigger tooltip reuses `settings.ai.thinking`.\n\n## Alternatives Considered\n\n- **Settings → AI thinking default** already exists, but it is a *workspace\n default for new chats*, not a per-conversation control. You can't raise effort\n for the current task without starting over.\n- **A keyboard-only shortcut** (à la `⌘⇧E`) could open a menu, but OpenWork's\n established pattern for composer controls is a visible toolbar dropdown (the\n model picker), so a visible picker is the more discoverable, consistent fit. A\n shortcut can be layered on later.\n\n## Additional Context\n\nFeasibility: **frontend-only / doable.** Verified against `apps/electron` — the\n`thinkingLevel` / `onThinkingLevelChange` props already reach `FreeFormInput` and\nboth the draft and active chat pages already persist the value; only the UI trigger\nis missing.\n\n### Acceptance criteria (CDP e2e assertion)\n\nA new `e2e/assertions/thinking-level-picker.assert.ts` drives the real built app\nover CDP and asserts the full path:\n\n1. The composer renders a thinking-level trigger button.\n2. Clicking it opens a menu listing all **six** thinking levels.\n3. The trigger reflects a known current level (the default), and the active level\n is marked as selected in the menu.\n4. Selecting a **different** level closes the menu **and** updates the trigger\n label to the newly selected level — proving the picker actually changes the\n session's thinking level, not merely displays a list.\n\nPart of the autonomous desktop-feature loop (`loop-bot`).","author":{"url":"https://github.com/DragonnZhang","@type":"Person","name":"DragonnZhang"},"datePublished":"2026-07-02T01:25:52.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/44/openwork/issues/44"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:1dd14163-ba14-35c9-5bc1-7c4ad66387d4 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | CCAA:1A8C4D:10435F3:162E563:6A522713 |
| html-safe-nonce | e1757f44f45ea732a2511249affd43a33318c31d9dba1f2755e0d829abd3c9ea |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQ0FBOjFBOEM0RDoxMDQzNUYzOjE2MkU1NjM6NkE1MjI3MTMiLCJ2aXNpdG9yX2lkIjoiMjczOTA5NjAwNzMyNTM5NDcwNyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 7959a343dd0053a75ab2fe0dc53ab398dd4b04f7aa1f1520a264f2bd4f58db32 |
| hovercard-subject-tag | issue:4790445605 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/modelstudioai/openwork/44/issue_layout |
| twitter:image | https://opengraph.githubassets.com/057be00342745e95cb7bcc596de6b5cddee0eafb9b7711ce475555da37099cc9/modelstudioai/openwork/issues/44 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/057be00342745e95cb7bcc596de6b5cddee0eafb9b7711ce475555da37099cc9/modelstudioai/openwork/issues/44 |
| og:image:alt | Problem or Motivation OpenWork supports six per-session thinking levels (off / low / medium / high / xhigh / max), but there is no way to change the thinking level from the chat composer. Today the... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | DragonnZhang |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/modelstudioai/openwork git https://github.com/modelstudioai/openwork.git |
| octolytics-dimension-user_id | 283556804 |
| octolytics-dimension-user_login | modelstudioai |
| octolytics-dimension-repository_id | 1256697754 |
| octolytics-dimension-repository_nwo | modelstudioai/openwork |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1256697754 |
| octolytics-dimension-repository_network_root_nwo | modelstudioai/openwork |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width