Hmbown/CodeWhale · error · anyhow::Error
Runtime image input is unavailable; update the Runtime…
Error message
Runtime image input is unavailable; update the Runtime before sending attachments
What it means
Before attaching images to a prompt, the app-server checks the Runtime's `capabilities.turn_image_inputs` capability flag. If it is not exactly `true`, the connected Runtime cannot accept image inputs on a turn, and the request is rejected so attachments are not silently dropped. The Runtime must be updated to a version supporting image input.
Solutions
- Update the Runtime to a version that reports `capabilities.turn_image_inputs: true`.
- Send the prompt without image attachments on the current Runtime.
- Verify the capability with a GET of the runtime info/health endpoint after upgrading.
Defensive patterns
Strategy: validation
Validate before calling
// gate attachments on the reported capability
const info = await fetch(`${base}/info`).then(r => r.json());
const imagesOk = info?.capabilities?.turn_image_inputs === true;
const payload = images.length && !imagesOk ? { prompt } : { prompt, images }; Type guard
function supportsImageInput(runtimeInfo) {
return runtimeInfo?.capabilities?.turn_image_inputs === true;
} Prevention
- Check /capabilities at session start and disable attachment UI when turn_image_inputs is not true.
- Keep the Runtime upgraded alongside the app-server.
- Fail fast client-side rather than sending images to a runtime that will reject them.
When it happens
Trigger: Sending a one-shot prompt with non-empty `images` while `info.pointer("/capabilities/turn_image_inputs")` is absent, false, or otherwise not `Some(true)`.
Common situations: Pairing the app-server with an older Runtime build that predates image-input support, then dragging screenshots or images into a session.
Related errors
- ${compactRuntimeError(response.status, result)}
- runtime API returned
- runtime API returned
- Runtime model catalog cursor repeated
- The selected Runtime model does not support maxOutputTokens
AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22).
Data as JSON: /api/errors/9d29d0d7e6c2b4fe.
Report an issue: GitHub.
Appendix: source
Thrown at crates/app-server/src/lib.rs:1777
registration: Option<(TurnRegistry, String)>,
mut transcript: Option<&mut TurnTranscript>,
) -> Result<Value> {
let mut request = json!({ "prompt": input });
if !images.is_empty() {
let info = self
.request_json(
self.authed(
self.client
.get(format!("{}/v1/runtime/info", self.base_url)),
),
)
.await?;
if info
.pointer("/capabilities/turn_image_inputs")
.and_then(Value::as_bool)
!= Some(true)
{
bail!(
"Runtime image input is unavailable; update the Runtime before sending attachments"
);
}
request["images"] = json!(images);
}
if let Some(limit) = max_output_tokens {
request["maxOutputTokens"] = json!(limit);
}
let turn = self
.request_json(
self.authed(
self.client
.post(format!("{}/v1/threads/{thread_id}/turns", self.base_url)),
)
.json(&request),
)
.await?;
let turn_id = turnView on GitHub (pinned to 73e0f67d83)