From 4f8c8fe3f593213ba3bf4b65f96d1a459ea79eee Mon Sep 17 00:00:00 2001 From: Yingjie He Date: Wed, 16 Apr 2025 13:13:42 -0700 Subject: [PATCH] fix: expose tool not support error (#2228) --- crates/goose/src/providers/errors.rs | 44 +++++++++++++++++++++++- crates/goose/src/providers/openrouter.rs | 7 +++- ui/desktop/openapi.json | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/crates/goose/src/providers/errors.rs b/crates/goose/src/providers/errors.rs index fb8bf4d4..9d7b6462 100644 --- a/crates/goose/src/providers/errors.rs +++ b/crates/goose/src/providers/errors.rs @@ -75,14 +75,56 @@ impl GoogleErrorCode { } } -#[derive(serde::Deserialize)] +#[derive(serde::Deserialize, Debug)] pub struct OpenAIError { + #[serde(deserialize_with = "code_as_string")] pub code: Option, pub message: Option, #[serde(rename = "type")] pub error_type: Option, } +fn code_as_string<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::Deserializer<'de>, +{ + use serde::de::{self, Visitor}; + use std::fmt; + + struct CodeVisitor; + + impl Visitor<'_> for CodeVisitor { + type Value = Option; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a string or a number for the code field") + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + Ok(Some(value.to_string())) + } + + fn visit_u64(self, value: u64) -> Result + where + E: de::Error, + { + Ok(Some(value.to_string())) + } + + fn visit_none(self) -> Result + where + E: de::Error, + { + Ok(None) + } + } + + deserializer.deserialize_any(CodeVisitor) +} + impl OpenAIError { pub fn is_context_length_exceeded(&self) -> bool { if let Some(code) = &self.code { diff --git a/crates/goose/src/providers/openrouter.rs b/crates/goose/src/providers/openrouter.rs index 28629f52..79059fc9 100644 --- a/crates/goose/src/providers/openrouter.rs +++ b/crates/goose/src/providers/openrouter.rs @@ -20,7 +20,12 @@ pub const OPENROUTER_DEFAULT_MODEL: &str = "anthropic/claude-3.5-sonnet"; pub const OPENROUTER_MODEL_PREFIX_ANTHROPIC: &str = "anthropic"; // OpenRouter can run many models, we suggest the default -pub const OPENROUTER_KNOWN_MODELS: &[&str] = &[OPENROUTER_DEFAULT_MODEL]; +pub const OPENROUTER_KNOWN_MODELS: &[&str] = &[ + "anthropic/claude-3.5-sonnet", + "anthropic/claude-3.7-sonnet", + "google/gemini-2.5-pro-exp-03-25:free", + "deepseek/deepseek-r1", +]; pub const OPENROUTER_DOC_URL: &str = "https://openrouter.ai/models"; #[derive(serde::Serialize)] diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 7aed0554..c398e17b 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "Apache-2.0" }, - "version": "1.0.17" + "version": "1.0.18" }, "paths": { "/agent/tools": {