{"record":{"id":"24d729d9ffd308d9","repo":"tinyhumansai/openhuman","slug":"local-model-runtime-is-unavailable-in-this-core-bu","errorCode":null,"errorMessage":"Local model runtime is unavailable in this core build. Restart app after updating to the latest build.","messagePattern":"Local model runtime is unavailable in this core build\\. Restart app after updating to the latest build\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"app/src/utils/tauriCommands/localAi.ts","lineNumber":246,"sourceCode":"): Promise<CommandResponse<string>> {\n  if (!isTauri()) {\n    throw new Error('Not running in Tauri');\n  }\n  return await callCoreRpc<CommandResponse<string>>({\n    method: 'openhuman.agent_chat',\n    params: { message, model_override: modelOverride, temperature },\n  });\n}\n\nexport async function openhumanLocalAiStatus(): Promise<CommandResponse<LocalAiStatus>> {\n  try {\n    return await callCoreRpc<CommandResponse<LocalAiStatus>>({\n      method: 'openhuman.inference_status',\n    });\n  } catch (err) {\n    const message = tauriErrorMessage(err);\n    if (message.includes('unknown method: openhuman.inference_status')) {\n      throw new Error(\n        'Local model runtime is unavailable in this core build. Restart app after updating to the latest build.'\n      );\n    }\n    throw new Error(message);\n  }\n}\n\nexport async function openhumanLocalAiSummarize(\n  text: string,\n  maxTokens?: number\n): Promise<CommandResponse<string>> {\n  return await callCoreRpc<CommandResponse<string>>({\n    method: 'openhuman.inference_summarize',\n    params: { text, max_tokens: maxTokens },\n  });\n}\n\nexport async function openhumanLocalAiPrompt(","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/utils/tauriCommands/localAi.ts#L228-L264","documentation":"openhumanLocalAiStatus calls openhuman.inference_status over relay_http_rpc and inspects the failure: when the core's error message contains 'unknown method: openhuman.inference_status' it re-throws this friendly 'Local model runtime is unavailable in this core build' error. The 'unknown method: ' prefix is the core dispatcher's method_not_found signal (UNKNOWN_METHOD_PREFIX in src/core/dispatch.rs, mirrored in coreRpcClient.ts:126) — a permanent transport-boundary version skew, not a transient fault. It means the running core binary genuinely does not expose the inference status RPC: an older core than the UI bundle, a staged update that updated one half, or a slim/gated build without the inference domain.","triggerScenarios":"UI bundle newer than the embedded core (core updated but app restarted into the old binary, or vice versa); a core compiled with the inference surface gated out (DomainSet/feature-gated or kernel-profile build); a rolled-back core binary with a newer frontend. Any call to openhumanLocalAiStatus() in that state.","commonSituations":"Partial app update where the web layer and Rust core are out of sync; self-compiled or slim core builds (cargo build with a reduced feature set) driving the full UI; embedded hosts using DomainSet presets that omit the inference domain; local model settings screen polling status on first render.","solutions":["Follow the message: update to the latest build and restart the app so the core binary and UI bundle match.","Verify the running core actually exposes the method: GET /schema on the core (or the about/health RPC) and check for openhuman.inference_status.","If building the core yourself, enable the inference surface (product feature set / appropriate DomainSet) instead of a slim profile.","If the mismatch is expected (embedded host), catch this error and hide/disable the local-AI settings UI rather than retrying — method_not_found never self-heals."],"exampleFix":"// before\nconst status = (await openhumanLocalAiStatus()).result;\n\n// after\ntry {\n  const status = (await openhumanLocalAiStatus()).result;\n  renderLocalAiPanel(status);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('unavailable in this core build')) {\n    renderUpgradeNotice(); // permanent — do not poll/retry\n  } else throw e;\n}","handlingStrategy":"try-catch","validationCode":"// Before calling, confirm the running core exposes the method (permanent check):\nimport { callCoreRpc } from '../services/coreRpcClient';\n\nconst supportsInferenceStatus = async (): Promise<boolean> => {\n  try {\n    await callCoreRpc({ method: 'openhuman.inference_status' });\n    return true;\n  } catch (err) {\n    return !(err instanceof Error && err.message.includes('unknown method: openhuman.inference_status'));\n  }\n};","typeGuard":"const isInferenceUnavailableError = (e: unknown): boolean =>\n  e instanceof Error && e.message.includes('Local model runtime is unavailable in this core build');","tryCatchPattern":"try {\n  const status = (await openhumanLocalAiStatus()).result;\n} catch (e) {\n  if (e instanceof Error && e.message.includes('unavailable in this core build')) {\n    // method_not_found — permanent version/gate skew: hide local-AI UI, prompt update, do NOT retry\n  } else {\n    throw e;\n  }\n}","preventionTips":["Treat method_not_found as permanent: stop polling instead of retrying (#5157 pattern).","Branch on CoreRpcError.kind === 'method_not_found' from coreRpcClient rather than raw message regexes.","Keep UI bundle and core binary in lockstep — complete app updates and restart rather than hot-swapping one half.","Custom/slim core builds must include the inference surface before driving the full UI.","Verify with GET /schema on the core when skew is suspected."],"tags":["rpc","version-skew","feature-gate","inference","tauri","method-not-found"],"backgroundTag":"rpc-method-not-found","analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}