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

  1. Update the Runtime to a version that reports `capabilities.turn_image_inputs: true`.
  2. Send the prompt without image attachments on the current Runtime.
  3. 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

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


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 = turn

View on GitHub (pinned to 73e0f67d83)