mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-29 11:42:04 +00:00
The web dashboard only showed a read-only "Reasoning" capability badge with no way to set the effort level — unlike the desktop app, which has an effort radio in its composer model menu. This adds a picker so the two surfaces reach parity. - ReasoningPicker: a Select rendered in the chat sidebar, gated on the effective model's supports_reasoning capability (from /api/model/info). Reads/writes agent.reasoning_effort via the existing config REST endpoints (read-modify-write, the dashboard's single-key save pattern), so the value lands in the config the agent boots a fresh chat from. Options mirror the desktop: Off/Minimal/Low/Medium/High/Max. - ChatSidebar: capture supports_reasoning from the model-info fetch and render the picker; on change, show the same 'apply on /new or reload' notice the model switch uses. - reasoning-effort.ts: DOM-free helpers (normalizeEffort + options) so the node-env vitest harness can cover the resolution logic, plus tests.
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
/**
|
|
* Pure reasoning-effort helpers shared by the dashboard ReasoningPicker.
|
|
*
|
|
* Kept DOM-free so the node-environment vitest harness can cover the
|
|
* resolution logic without loading React or the UI kit.
|
|
*
|
|
* Values mirror hermes_constants.VALID_REASONING_EFFORTS plus `none`
|
|
* (thinking-off). An empty/unset config value means the Hermes default,
|
|
* which is `medium`.
|
|
*/
|
|
|
|
export interface EffortOption {
|
|
value: string;
|
|
label: string;
|
|
}
|
|
|
|
export const EFFORT_OPTIONS: ReadonlyArray<EffortOption> = [
|
|
{ value: "none", label: "Off (no thinking)" },
|
|
{ value: "minimal", label: "Minimal" },
|
|
{ value: "low", label: "Low" },
|
|
{ value: "medium", label: "Medium" },
|
|
{ value: "high", label: "High" },
|
|
{ value: "xhigh", label: "Max" },
|
|
];
|
|
|
|
export const VALID_EFFORTS: ReadonlySet<string> = new Set(
|
|
EFFORT_OPTIONS.map((o) => o.value),
|
|
);
|
|
|
|
/** Normalize a raw `agent.reasoning_effort` config value to a selectable
|
|
* option. Empty/unknown → `medium` (Hermes' default when unset). */
|
|
export function normalizeEffort(raw: unknown): string {
|
|
const value = String(raw ?? "").trim().toLowerCase();
|
|
if (!value) return "medium";
|
|
return VALID_EFFORTS.has(value) ? value : "medium";
|
|
}
|