fix: clear Ollama-unreachable error naming the endpoint + fix hint
Some checks failed
CI / Linux x86_64 (Forgejo) (push) Failing after 2s

Signed-off-by: flemming-it <sf@flemming.it>
This commit is contained in:
flemming-it 2026-07-07 19:18:24 +02:00
parent 88c5a0c158
commit 18a84ef4cb

View file

@ -35,7 +35,7 @@ pub fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> {
prompt: &prompt, prompt: &prompt,
}; };
let result = crate::llm::chat_with_identity(&client, &params) let result = crate::llm::chat_with_identity(&client, &params)
.map_err(|e| ModuleError::internal(e.to_string()))?; .map_err(|e| llm_error_to_module_error(e, &endpoint, &model))?;
Ok(Outputs::new() Ok(Outputs::new()
.with_text("response", result.response) .with_text("response", result.response)
@ -51,6 +51,35 @@ fn payload_text(p: &Payload) -> Option<String> {
} }
} }
/// Turn a transport/protocol error into a message that names the
/// likely cause and the fix, instead of a raw `ConnectionRefused`.
/// The endpoint is Ollama-shaped by default, so a connect failure
/// almost always means Ollama isn't running or the model isn't
/// pulled.
fn llm_error_to_module_error(e: crate::llm::LlmError, endpoint: &str, model: &str) -> ModuleError {
use crate::llm::LlmError;
match e {
LlmError::Http(detail) => ModuleError::internal(format!(
"LLM endpoint {endpoint} not reachable ({detail}). Is Ollama running? \
Start it with `ollama serve`, then pull the model with `ollama pull {model}`. \
If the LLM runs elsewhere, set the `endpoint` input to its /api URL."
)),
LlmError::Status(404) => ModuleError::internal(format!(
"LLM endpoint {endpoint} returned 404 for model '{model}' — the model is \
likely not pulled. Run `ollama pull {model}` (or check the model name)."
)),
LlmError::Status(code) => ModuleError::internal(format!(
"LLM endpoint {endpoint} returned HTTP {code} for model '{model}'."
)),
LlmError::Decode(detail) => ModuleError::internal(format!(
"LLM response from {endpoint} was not valid Ollama JSON: {detail}"
)),
LlmError::MissingInput(name) => ModuleError::invalid_input(format!(
"missing required input '{name}'"
)),
}
}
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
fn make_client() -> WakiClient { fn make_client() -> WakiClient {
WakiClient WakiClient