{"record":{"id":"9d29d0d7e6c2b4fe","repo":"Hmbown/CodeWhale","slug":"runtime-image-input-is-unavailable-update-the-runtime-before","errorCode":null,"errorMessage":"Runtime image input is unavailable; update the Runtime before sending attachments","messagePattern":"Runtime image input is unavailable; update the Runtime before sending attachments","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/app-server/src/lib.rs","lineNumber":1777,"sourceCode":"        registration: Option<(TurnRegistry, String)>,\n        mut transcript: Option<&mut TurnTranscript>,\n    ) -> Result<Value> {\n        let mut request = json!({ \"prompt\": input });\n        if !images.is_empty() {\n            let info = self\n                .request_json(\n                    self.authed(\n                        self.client\n                            .get(format!(\"{}/v1/runtime/info\", self.base_url)),\n                    ),\n                )\n                .await?;\n            if info\n                .pointer(\"/capabilities/turn_image_inputs\")\n                .and_then(Value::as_bool)\n                != Some(true)\n            {\n                bail!(\n                    \"Runtime image input is unavailable; update the Runtime before sending attachments\"\n                );\n            }\n            request[\"images\"] = json!(images);\n        }\n        if let Some(limit) = max_output_tokens {\n            request[\"maxOutputTokens\"] = json!(limit);\n        }\n        let turn = self\n            .request_json(\n                self.authed(\n                    self.client\n                        .post(format!(\"{}/v1/threads/{thread_id}/turns\", self.base_url)),\n                )\n                .json(&request),\n            )\n            .await?;\n        let turn_id = turn","sourceCodeStart":1759,"sourceCodeEnd":1795,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/app-server/src/lib.rs#L1759-L1795","documentation":"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.","triggerScenarios":"Sending a one-shot prompt with non-empty `images` while `info.pointer(\"/capabilities/turn_image_inputs\")` is absent, false, or otherwise not `Some(true)`.","commonSituations":"Pairing the app-server with an older Runtime build that predates image-input support, then dragging screenshots or images into a session.","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."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// gate attachments on the reported capability\nconst info = await fetch(`${base}/info`).then(r => r.json());\nconst imagesOk = info?.capabilities?.turn_image_inputs === true;\nconst payload = images.length && !imagesOk ? { prompt } : { prompt, images };","typeGuard":"function supportsImageInput(runtimeInfo) {\n  return runtimeInfo?.capabilities?.turn_image_inputs === true;\n}","tryCatchPattern":null,"preventionTips":["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."],"tags":["api","capabilities","images","runtime","version"],"backgroundTag":"feature-not-enabled","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}