From 6305b9d62ab98b9febcc660081bc31e00bc87b4d Mon Sep 17 00:00:00 2001 From: Zane <75694352+zanesq@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:48:43 -0800 Subject: [PATCH] Added lmstudio declarative provider (#7455) --- .../goose/src/config/declarative_providers.rs | 17 +++++++-- .../goose/src/providers/declarative/kimi.json | 28 ++++++--------- .../src/providers/declarative/lmstudio.json | 11 ++++++ .../src/providers/declarative/moonshot.json | 36 ++++++++----------- 4 files changed, 51 insertions(+), 41 deletions(-) create mode 100644 crates/goose/src/providers/declarative/lmstudio.json diff --git a/crates/goose/src/config/declarative_providers.rs b/crates/goose/src/config/declarative_providers.rs index de95bfdee3..340a589445 100644 --- a/crates/goose/src/config/declarative_providers.rs +++ b/crates/goose/src/config/declarative_providers.rs @@ -266,7 +266,10 @@ pub fn load_provider(id: &str) -> Result { .contents_utf8() .ok_or_else(|| anyhow::anyhow!("Failed to read file as UTF-8: {:?}", file.path()))?; - let config: DeclarativeProviderConfig = serde_json::from_str(content)?; + let config: DeclarativeProviderConfig = match serde_json::from_str(content) { + Ok(config) => config, + Err(_) => continue, + }; if config.name == id { return Ok(LoadedProvider { config, @@ -306,8 +309,16 @@ fn load_fixed_providers() -> Result> { .contents_utf8() .ok_or_else(|| anyhow::anyhow!("Failed to read file as UTF-8: {:?}", file.path()))?; - let config: DeclarativeProviderConfig = serde_json::from_str(content)?; - res.push(config) + match serde_json::from_str(content) { + Ok(config) => res.push(config), + Err(e) => { + tracing::warn!( + "Skipping invalid declarative provider {:?}: {}", + file.path(), + e + ); + } + } } Ok(res) diff --git a/crates/goose/src/providers/declarative/kimi.json b/crates/goose/src/providers/declarative/kimi.json index f4b1e94d3a..e1ccf9ad5a 100644 --- a/crates/goose/src/providers/declarative/kimi.json +++ b/crates/goose/src/providers/declarative/kimi.json @@ -1,19 +1,13 @@ { - "name": "Kimi", - "metadata": { - "homepage": "https://kimi.ai", - "docs": "https://platform.moonshot.cn/docs/intro", - "description": "Kimi Code AI models optimized for coding tasks" - }, - "engine": { - "type": "openai", - "base_url": "https://api.moonshot.cn/v1", - "api_key_env_var": "MOONSHOT_API_KEY" - }, - "models": [ - {"name": "kimi-for-coding", "context_limit": 262144}, - {"name": "kimi-code", "context_limit": 262144} - ], - "streaming_default": true, - "pricing_info_url": "https://platform.moonshot.cn/pricing" + "name": "kimi", + "engine": "openai", + "display_name": "Kimi", + "description": "Kimi Code AI models optimized for coding tasks", + "api_key_env": "MOONSHOT_API_KEY", + "base_url": "https://api.moonshot.cn/v1/chat/completions", + "models": [ + {"name": "kimi-for-coding", "context_limit": 262144}, + {"name": "kimi-code", "context_limit": 262144} + ], + "supports_streaming": true } diff --git a/crates/goose/src/providers/declarative/lmstudio.json b/crates/goose/src/providers/declarative/lmstudio.json new file mode 100644 index 0000000000..ad8c7a392d --- /dev/null +++ b/crates/goose/src/providers/declarative/lmstudio.json @@ -0,0 +1,11 @@ +{ + "name": "lmstudio", + "engine": "openai", + "display_name": "LM Studio", + "description": "Run local models with LM Studio", + "api_key_env": "", + "base_url": "http://localhost:1234/v1/chat/completions", + "models": [], + "supports_streaming": true, + "requires_auth": false +} diff --git a/crates/goose/src/providers/declarative/moonshot.json b/crates/goose/src/providers/declarative/moonshot.json index 7e8a69c575..bd64902291 100644 --- a/crates/goose/src/providers/declarative/moonshot.json +++ b/crates/goose/src/providers/declarative/moonshot.json @@ -1,23 +1,17 @@ { - "name": "Moonshot", - "metadata": { - "homepage": "https://kimi.moonshot.cn/", - "docs": "https://platform.moonshot.cn/docs/intro", - "description": "Moonshot AI (Kimi) models" - }, - "engine": { - "type": "openai", - "base_url": "https://api.moonshot.cn/v1", - "api_key_env_var": "MOONSHOT_API_KEY" - }, - "models": [ - {"name": "kimi-latest", "context_limit": 131072}, - {"name": "kimi-thinking-preview", "context_limit": 131072}, - {"name": "kimi-k2-0711", "context_limit": 131072}, - {"name": "kimi-k2", "context_limit": 262144}, - {"name": "moonshot-v1-8k", "context_limit": 8192}, - {"name": "moonshot-v1-32k", "context_limit": 32768} - ], - "streaming_default": true, - "pricing_info_url": "https://platform.moonshot.cn/pricing" + "name": "moonshot", + "engine": "openai", + "display_name": "Moonshot", + "description": "Moonshot AI (Kimi) models", + "api_key_env": "MOONSHOT_API_KEY", + "base_url": "https://api.moonshot.cn/v1/chat/completions", + "models": [ + {"name": "kimi-latest", "context_limit": 131072}, + {"name": "kimi-thinking-preview", "context_limit": 131072}, + {"name": "kimi-k2-0711", "context_limit": 131072}, + {"name": "kimi-k2", "context_limit": 262144}, + {"name": "moonshot-v1-8k", "context_limit": 8192}, + {"name": "moonshot-v1-32k", "context_limit": 32768} + ], + "supports_streaming": true }