Skip to content

Feature: Telegram inline pickers for /reasoning and /fast (parity with /model) #61110

Description

@wousp112

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:

  1. 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).
  2. 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.
  3. Same for /fastsend_fast_picker with fp: (or similar), gated by model_supports_fast_mode for the active model.
  4. 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

  • Bare /reasoning on Telegram shows inline keyboard; tapping a level updates session-scoped effort and confirms in-chat (same semantics as today’s text command).
  • Display on/off buttons update display.platforms.telegram.show_reasoning (per-platform override behavior preserved).
  • Bare /fast on Telegram shows picker when fast is supported for the session model; otherwise clear text fallback.
  • Unit tests in tests/gateway/test_telegram_reasoning_fast_picker.py (or equivalent) cover keyboard layout + callback routing.
  • Docs: one line in Telegram messaging guide — “/reasoning and /fast open interactive pickers when sent without arguments.”

Alternatives Considered

  1. Document slash syntax only — status quo; poor discoverability vs /model.
  2. Fold reasoning into /model picker only — helps Desktop; Telegram /model flow is already heavy; reasoning/display are session settings worth a dedicated entry.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low — cosmetic, nice to havecomp/gatewayGateway runner, session dispatch, deliveryplatform/telegramTelegram bot adaptertype/featureNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions