Feature Description
Add Telegram inline-keyboard pickers for /reasoning and /fast (no-args), matching the existing /model bubble UX (send_model_picker).
Today:
/model with no arguments → interactive provider/model inline keyboard (Telegram + Discord).
/reasoning with no arguments → text-only status card (gateway.reasoning.status); effort/display changes require typing /reasoning high, /reasoning show, etc.
/fast with no arguments → similar text path (status / manual subcommands).
Hermes Desktop already exposes reasoning effort and fast toggles in the model menu UI; messaging users on Telegram have no equivalent unless they memorize slash syntax.
Motivation
- UX parity: Users who discover settings via
/model bubbles reasonably expect /reasoning and /fast to work the same way.
- Lower friction: Reasoning levels (
none, minimal, low, medium, high, xhigh) and display (show/hide) are a small finite set — ideal for inline buttons.
- Fast mode is similarly discrete (
fast / normal / status); a picker reduces errors and support questions.
Related open work is mostly about showing reasoning in messages (#50193, #7251) or status accuracy (#11903), not about configuring effort via Telegram UI.
Proposed Solution
Mirror the /model handler pattern in gateway/slash_commands.py:
- When
/reasoning is invoked with no args (and optionally when args are status only — product choice), if the platform adapter implements send_reasoning_picker, call it and return None (picker owns the reply).
TelegramAdapter.send_reasoning_picker(...):
- One message with current effort + display state.
- Inline keyboard rows for effort levels (mark current with ✓).
- Row for display on/off.
- Optional hint: persist globally via
/reasoning <level> --global (unchanged).
- Callback prefix e.g.
rp: (parallel to model picker mp:/mm:), 64-byte callback_data cap respected.
- Same for
/fast → send_fast_picker with fp: (or similar), gated by model_supports_fast_mode for the active model.
- Typed commands unchanged:
/reasoning xhigh --global, /fast normal, etc. still go through existing parsers.
Discord/Matrix could adopt the same adapter methods later for consistency.
Acceptance Criteria
Alternatives Considered
- Document slash syntax only — status quo; poor discoverability vs
/model.
- Fold reasoning into
/model picker only — helps Desktop; Telegram /model flow is already heavy; reasoning/display are session settings worth a dedicated entry.
- Telegram slash menu limits — unrelated; pickers are triggered by command, not Bot API command list slots.
Environment
- Hermes Agent (git install), Telegram gateway, any profile.
- Pattern reference:
plugins/platforms/telegram/adapter.py send_model_picker, gateway/slash_commands.py /model no-args branch.
Feature Description
Add Telegram inline-keyboard pickers for
/reasoningand/fast(no-args), matching the existing/modelbubble UX (send_model_picker).Today:
/modelwith no arguments → interactive provider/model inline keyboard (Telegram + Discord)./reasoningwith no arguments → text-only status card (gateway.reasoning.status); effort/display changes require typing/reasoning high,/reasoning show, etc./fastwith no arguments → similar text path (status / manual subcommands).Hermes Desktop already exposes reasoning effort and fast toggles in the model menu UI; messaging users on Telegram have no equivalent unless they memorize slash syntax.
Motivation
/modelbubbles reasonably expect/reasoningand/fastto work the same way.none,minimal,low,medium,high,xhigh) and display (show/hide) are a small finite set — ideal for inline buttons.fast/normal/status); a picker reduces errors and support questions.Related open work is mostly about showing reasoning in messages (#50193, #7251) or status accuracy (#11903), not about configuring effort via Telegram UI.
Proposed Solution
Mirror the
/modelhandler pattern ingateway/slash_commands.py:/reasoningis invoked with no args (and optionally when args arestatusonly — product choice), if the platform adapter implementssend_reasoning_picker, call it and returnNone(picker owns the reply).TelegramAdapter.send_reasoning_picker(...):/reasoning <level> --global(unchanged).rp:(parallel to model pickermp:/mm:), 64-bytecallback_datacap respected./fast→send_fast_pickerwithfp:(or similar), gated bymodel_supports_fast_modefor the active model./reasoning xhigh --global,/fast normal, etc. still go through existing parsers.Discord/Matrix could adopt the same adapter methods later for consistency.
Acceptance Criteria
/reasoningon Telegram shows inline keyboard; tapping a level updates session-scoped effort and confirms in-chat (same semantics as today’s text command).display.platforms.telegram.show_reasoning(per-platform override behavior preserved)./faston Telegram shows picker when fast is supported for the session model; otherwise clear text fallback.tests/gateway/test_telegram_reasoning_fast_picker.py(or equivalent) cover keyboard layout + callback routing./reasoningand/fastopen interactive pickers when sent without arguments.”Alternatives Considered
/model./modelpicker only — helps Desktop; Telegram/modelflow is already heavy; reasoning/display are session settings worth a dedicated entry.Environment
plugins/platforms/telegram/adapter.pysend_model_picker,gateway/slash_commands.py/modelno-args branch.