diff --git a/package.json b/package.json index 7115bde..258ac79 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eveflow", - "version": "2.0.1", + "version": "2.0.2", "description": "JARVIS-style desktop HUD for Hermes Agent: voice, streaming runs, scheduled jobs, skills and telemetry", "main": "dist-electron/main.js", "private": true, diff --git a/src/services/hermes/client.ts b/src/services/hermes/client.ts index 8ee1806..c626159 100644 --- a/src/services/hermes/client.ts +++ b/src/services/hermes/client.ts @@ -397,9 +397,10 @@ export class HermesClient { }); let fullText = ''; + let toolsAllowed = useTools; for (let iteration = 0; iteration < 6 && !aborted; iteration++) { const payload: Rec = { model: this.config.model || 'hermes-agent', messages, stream: true }; - if (useTools) { + if (toolsAllowed) { payload.tools = options.localToolDefinitions; payload.tool_choice = 'auto'; } @@ -435,7 +436,15 @@ export class HermesClient { currentHandle = handle; if (!handle.start.ok) { await handle.done.catch(() => undefined); - throw new HttpError(handle.start.status, errorMessage(handle.start.status, errorChunks.join(''))); + const detail = errorMessage(handle.start.status, errorChunks.join('')); + // Some Hermes builds reject client-side tool definitions: retry once without them. + if (toolsAllowed && handle.start.status === 400 && iteration === 0) { + Log.warn('hermes', `chat completions rejected the tools payload (${detail}); retrying without local tools`); + toolsAllowed = false; + iteration--; + continue; + } + throw new HttpError(handle.start.status, detail); } ready = true; const rotated = handle.start.headers['x-hermes-session-id']; @@ -445,7 +454,7 @@ export class HermesClient { parser.end(); fullText += iterationText; - if (finishReason === 'tool_calls' && useTools && toolCalls.size > 0 && !aborted) { + if (finishReason === 'tool_calls' && toolsAllowed && toolCalls.size > 0 && !aborted) { const calls = [...toolCalls.values()]; messages.push({ role: 'assistant', diff --git a/src/state/hermes.ts b/src/state/hermes.ts index 7c77248..d3f62df 100644 --- a/src/state/hermes.ts +++ b/src/state/hermes.ts @@ -91,7 +91,12 @@ export const useHermes = create((set, get) => ({ webhook: null, busy: false, - client: () => new HermesClient(useSettings.getState().settings.hermes), + client: () => { + const config = useSettings.getState().settings.hermes; + // Without an explicit model, use the alias advertised by /v1/models (Hermes rejects unknown names). + const model = config.model.trim() || get().models[0]?.id || ''; + return new HermesClient({ ...config, model }); + }, connect: async () => { const config = useSettings.getState().settings.hermes;