{"record":{"id":"693e10547c327d66","repo":"zed-industries/zed","slug":"openrouter-does-not-support-custom-tools","errorCode":null,"errorMessage":"OpenRouter does not support custom tools","messagePattern":"OpenRouter does not support custom tools","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/language_models/src/provider/open_router.rs","lineNumber":421,"sourceCode":"    fn max_token_count(&self) -> u64 {\n        self.model.max_token_count()\n    }\n\n    fn max_output_tokens(&self) -> Option<u64> {\n        self.model.max_output_tokens()\n    }\n\n    fn supports_tool_choice(&self, choice: LanguageModelToolChoice) -> bool {\n        match choice {\n            LanguageModelToolChoice::Auto => true,\n            LanguageModelToolChoice::Any => true,\n            LanguageModelToolChoice::None => true,\n        }\n    }\n\n    fn supports_images(&self) -> bool {\n        self.model.supports_images.unwrap_or(false)\n    }\n\n    fn stream_completion(\n        &self,\n        request: LanguageModelRequest,\n        cx: &AsyncApp,\n    ) -> BoxFuture<\n        'static,\n        Result<\n            futures::stream::BoxStream<\n                'static,\n                Result<LanguageModelCompletionEvent, LanguageModelCompletionError>,\n            >,\n            LanguageModelCompletionError,\n        >,\n    > {\n        let openrouter_request =\n            match into_open_router(request, &self.model, self.max_output_tokens()) {\n                Ok(request) => request,","sourceCodeStart":403,"sourceCodeEnd":439,"githubUrl":"https://github.com/zed-industries/zed/blob/5a9b9558db01a6b906cec2fb70a797affdc58cdd/crates/language_models/src/provider/open_router.rs#L403-L439","documentation":"OpenRouter request conversion rejects LanguageModelRequests containing custom tool inputs because the provider path only maps function-style tools; any request carrying a custom tool input fails before it reaches the API.","triggerScenarios":"Thrown at crates/language_models/src/provider/open_router.rs:424 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use JSON-schema tools instead of custom tools with OpenRouter models","Choose a provider that supports custom tool input","Strip the custom tool call/results from the request before conversion"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"5a9b9558db01a6b906cec2fb70a797affdc58cdd","analyzedAt":"2026-08-20T19:29:52.058Z","contentChangedAt":"2026-08-20T19:29:52.058Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}