Skip to content

feat(sessions): auto-summarize session titles after first exchange (fixes #495) — v0.50.57 - #557

Merged
nesquena-hermes merged 5 commits into
masterfrom
release/v0.50.57
Apr 16, 2026
Merged

nesquena-hermes merged 5 commits into
masterfrom
release/v0.50.57

Conversation

@nesquena-hermes

Copy link
Copy Markdown
Collaborator

feat(sessions): auto-summarize session titles — v0.50.57

PR #535 by @franksong2702. Full review completed — 4 bugs found and fixed on branch (maintainer edits enabled), all verified.

1312/1312 tests pass (10 new). QA harness 20/20. Browser API sanity 11/11. JS syntax clean (node --check). Zero JS errors in browser test.

Bugs fixed during review

  • messages.js — JS syntax error: mismatched quote in setComposerStatus('Reconnecting…') (would crash reconnect path)
  • messages.js — broken template literal \\n\\n*{d.hint}* restored to \n\n*${d.hint}* (error hint text was non-functional)
  • messages.jsshowApprovalCard(pending, pendingCount), _approvalCurrentId, and approval_id in respondApproval were removed, regressing PR fix: queue simultaneous approval requests per session (fixes #527) #546 approval queue fix — restored
  • api/streaming.py — MiniMax thinking delimiter regex fixed: <|channel><|channel|>

Closes #495.

Frank Song and others added 5 commits April 15, 2026 23:59
BUG-1 (CRITICAL): messages.js line 522 — mismatched quote in
setComposerStatus('Reconnecting…') caused JS syntax error on the
reconnect path.

BUG-2 (HIGH): messages.js line 491 — broken template literal
'\\n\\n*{d.hint}*' restored to '\n\n*${d.hint}*'. Error hint
text was non-functional (missing $ prefix and escaped newlines).

BUG-3 (HIGH): messages.js — showApprovalCard(pending, pendingCount),
_approvalCurrentId, and approval_id in respondApproval() were removed,
regressing the simultaneous approval queue fix from PR #546. Restored
all three, including the '1 of N pending' counter and poll passthrough.

BUG-4 (LOW): api/streaming.py — MiniMax thinking delimiter regex
missing closing pipe: <|channel> -> <|channel|> in both
_strip_thinking_markup() and _looks_invalid_generated_title().

ALSO: test_issue487b.py docstring changed to raw string to fix
DeprecationWarning for invalid escape sequence '\s'.
…ixes #495) — PR #535

After the first user/assistant exchange, generates a concise session title
in a background daemon thread using the first user message + first visible
assistant reply as input. Title updates live in the UI via a new 'title' SSE event.
The stream now terminates with 'stream_end' instead of 'done' so the title
generation thread has time to finish before the client disconnects.

Provisional titles (first-message substrings) are replaced; manual renames
are preserved; generation only runs once per session (llm_title_generated flag).
Includes MiniMax token budget handling and a local heuristic fallback.

Additional fixes applied in agent review:
- messages.js: fix JS syntax error (mismatched quote in setComposerStatus)
- messages.js: fix broken template literal in error hint rendering
- messages.js: restore approval queue multi-slot fix (approval_id, pendingCount,
  _approvalCurrentId) that was accidentally removed
- api/streaming.py: fix MiniMax thinking delimiter regex (<|channel|>)
- tests/test_issue487b.py: fix DeprecationWarning (raw string docstring)

Co-authored-by: franksong2702 <franksong2702@users.noreply.github.com>
@nesquena-hermes
nesquena-hermes merged commit 0a9b952 into master Apr 16, 2026
@nesquena-hermes
nesquena-hermes deleted the release/v0.50.57 branch April 16, 2026 00:07
nesquena-hermes pushed a commit that referenced this pull request Apr 16, 2026
…ad of generic 'Custom'

When a custom_providers entry in config.yaml has a 'name' field (e.g. 'Agent37'),
the web UI model picker now uses that name as the group header instead of the
generic 'Custom' label.

Previously all custom_providers entries were bucketed under 'custom' which
rendered as 'Custom' in the dropdown optgroup — losing the named identity the
user set up during onboarding.

Changes:
- Track named custom providers as 'custom:<slug>' keys internally so multiple
  named providers can coexist as separate groups
- When building model groups, emit each named provider under its own display
  name (e.g. 'Agent37') rather than falling through to the generic label
- Unnamed entries (no 'name' field) still fall back to the 'Custom' group
- When all entries are named, the bare 'Custom' bucket is suppressed

Adds 7 tests covering single named provider, multiple named providers,
multiple models in same named provider, unnamed fallback, and mixed cases.

Fixes #557
nesquena-hermes pushed a commit that referenced this pull request Apr 16, 2026
…ad of generic 'Custom' — PR #558

Named custom_providers entries (those with a 'name' field) now get their own
dropdown group using the configured name (e.g. 'Agent37') instead of the
generic 'Custom' label. Unnamed entries still fall back to 'Custom'.

Closes #557.
JKJameson pushed a commit to JKJameson/hermes-webui that referenced this pull request Apr 25, 2026
…ad of generic 'Custom'

When a custom_providers entry in config.yaml has a 'name' field (e.g. 'Agent37'),
the web UI model picker now uses that name as the group header instead of the
generic 'Custom' label.

Previously all custom_providers entries were bucketed under 'custom' which
rendered as 'Custom' in the dropdown optgroup — losing the named identity the
user set up during onboarding.

Changes:
- Track named custom providers as 'custom:<slug>' keys internally so multiple
  named providers can coexist as separate groups
- When building model groups, emit each named provider under its own display
  name (e.g. 'Agent37') rather than falling through to the generic label
- Unnamed entries (no 'name' field) still fall back to the 'Custom' group
- When all entries are named, the bare 'Custom' bucket is suppressed

Adds 7 tests covering single named provider, multiple named providers,
multiple models in same named provider, unnamed fallback, and mixed cases.

Fixes nesquena#557
JKJameson pushed a commit to JKJameson/hermes-webui that referenced this pull request Apr 25, 2026
…ad of generic 'Custom' — PR nesquena#558

Named custom_providers entries (those with a 'name' field) now get their own
dropdown group using the configured name (e.g. 'Agent37') instead of the
generic 'Custom' label. Unnamed entries still fall back to 'Custom'.

Closes nesquena#557.
SysAdminDoc pushed a commit to SysAdminDoc/hermes-webui that referenced this pull request Jun 26, 2026
…ad of generic 'Custom'

When a custom_providers entry in config.yaml has a 'name' field (e.g. 'Agent37'),
the web UI model picker now uses that name as the group header instead of the
generic 'Custom' label.

Previously all custom_providers entries were bucketed under 'custom' which
rendered as 'Custom' in the dropdown optgroup — losing the named identity the
user set up during onboarding.

Changes:
- Track named custom providers as 'custom:<slug>' keys internally so multiple
  named providers can coexist as separate groups
- When building model groups, emit each named provider under its own display
  name (e.g. 'Agent37') rather than falling through to the generic label
- Unnamed entries (no 'name' field) still fall back to the 'Custom' group
- When all entries are named, the bare 'Custom' bucket is suppressed

Adds 7 tests covering single named provider, multiple named providers,
multiple models in same named provider, unnamed fallback, and mixed cases.

Fixes nesquena#557
SysAdminDoc pushed a commit to SysAdminDoc/hermes-webui that referenced this pull request Jun 26, 2026
…ad of generic 'Custom' — PR nesquena#558

Named custom_providers entries (those with a 'name' field) now get their own
dropdown group using the configured name (e.g. 'Agent37') instead of the
generic 'Custom' label. Unnamed entries still fall back to 'Custom'.

Closes nesquena#557.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(sessions): LLM-generated session titles instead of first-message substring

2 participants