feat(metamodels): Add support for Muse Spark 1.1 via the Meta Models API (#10432)
This commit is contained in:
@@ -27,6 +27,7 @@ pub(crate) mod declarative_providers {
|
||||
inception,
|
||||
llama_swap,
|
||||
lmstudio,
|
||||
meta,
|
||||
minimax,
|
||||
mistral,
|
||||
moonshot,
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "meta",
|
||||
"engine": "openai",
|
||||
"display_name": "Meta",
|
||||
"description": "Meta's Model API, home of the Muse Spark models",
|
||||
"api_key_env": "META_MODEL_API_KEY",
|
||||
"base_url": "https://api.meta.ai/v1",
|
||||
"catalog_provider_id": "meta",
|
||||
"dynamic_models": true,
|
||||
"models": [
|
||||
{
|
||||
"name": "muse-spark-1.1",
|
||||
"context_limit": 1000000,
|
||||
"max_tokens": 32000,
|
||||
"input_token_cost": 0.00000125,
|
||||
"output_token_cost": 0.00000425,
|
||||
"currency": "USD",
|
||||
"reasoning": true
|
||||
}
|
||||
],
|
||||
"preserves_thinking": true,
|
||||
"supports_streaming": true,
|
||||
"model_doc_link": "https://dev.meta.ai/docs",
|
||||
"setup_steps": [
|
||||
"Sign in to https://dev.meta.ai",
|
||||
"Navigate to API Keys in your account settings",
|
||||
"Create a new API key",
|
||||
"Copy the key and paste it above"
|
||||
]
|
||||
}
|
||||
@@ -18,9 +18,11 @@ use crate::openai_compatible::{
|
||||
handle_response_openai_compat, handle_status, stream_openai_compat, stream_responses_compat,
|
||||
};
|
||||
use crate::request_log::{start_log, LoggerHandleExt};
|
||||
use crate::thinking::ThinkingEffort;
|
||||
use anyhow::Result;
|
||||
use async_trait::async_trait;
|
||||
use reqwest::StatusCode;
|
||||
use serde_json::json;
|
||||
use std::collections::HashMap;
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
@@ -347,7 +349,33 @@ impl OpenAiProvider {
|
||||
|
||||
const PROVIDERS_NEEDING_STANDARD_CHAT_PARAMS: &[&str] = &["nearai"];
|
||||
|
||||
fn sanitize_request_for_compat(&self, mut payload: serde_json::Value) -> serde_json::Value {
|
||||
/// Providers whose reasoning models accept an OpenAI-style
|
||||
/// `reasoning_effort` field on chat-completions requests but aren't
|
||||
/// matched by [`is_openai_responses_model`] (which only recognises
|
||||
/// OpenAI's own `o*`/`gpt-5*` model names). These need the unified
|
||||
/// [`ThinkingEffort`] mapped onto the request explicitly.
|
||||
const PROVIDERS_NEEDING_REASONING_EFFORT_MAPPING: &[&str] = &["meta"];
|
||||
|
||||
/// Maps the unified thinking effort onto Meta's Muse Spark
|
||||
/// `reasoning_effort` levels: `low`, `medium`, `high`, `xhigh`.
|
||||
///
|
||||
/// Muse Spark always reasons and has no supported "disable reasoning"
|
||||
/// level, so `Off` is clamped to `low` (the lightest level Meta
|
||||
/// supports) rather than sent as-is or omitted.
|
||||
fn meta_reasoning_effort(effort: ThinkingEffort) -> &'static str {
|
||||
match effort {
|
||||
ThinkingEffort::Off | ThinkingEffort::Low => "low",
|
||||
ThinkingEffort::Medium => "medium",
|
||||
ThinkingEffort::High => "high",
|
||||
ThinkingEffort::Max => "xhigh",
|
||||
}
|
||||
}
|
||||
|
||||
fn sanitize_request_for_compat(
|
||||
&self,
|
||||
mut payload: serde_json::Value,
|
||||
model_config: &ModelConfig,
|
||||
) -> serde_json::Value {
|
||||
if let Some(obj) = payload.as_object_mut() {
|
||||
if Self::PROVIDERS_NEEDING_MAX_TOKENS_REMAP.contains(&self.name.as_str()) {
|
||||
if let Some(value) = obj.remove("max_completion_tokens") {
|
||||
@@ -373,6 +401,20 @@ impl OpenAiProvider {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if Self::PROVIDERS_NEEDING_REASONING_EFFORT_MAPPING.contains(&self.name.as_str()) {
|
||||
match model_config.thinking_effort() {
|
||||
Some(effort) => {
|
||||
obj.insert(
|
||||
"reasoning_effort".to_string(),
|
||||
json!(Self::meta_reasoning_effort(effort)),
|
||||
);
|
||||
}
|
||||
None => {
|
||||
obj.remove("reasoning_effort");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
payload
|
||||
@@ -672,7 +714,7 @@ impl Provider for OpenAiProvider {
|
||||
preserve_thinking_context: self.preserve_thinking_context,
|
||||
},
|
||||
)?;
|
||||
let payload = self.sanitize_request_for_compat(payload);
|
||||
let payload = self.sanitize_request_for_compat(payload, model_config);
|
||||
let mut log = start_log(model_config, &payload)?;
|
||||
|
||||
let response = self
|
||||
@@ -876,7 +918,8 @@ mod tests {
|
||||
"max_completion_tokens": 16384
|
||||
});
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload);
|
||||
let result = provider
|
||||
.sanitize_request_for_compat(payload, &ModelConfig::new("mistral-medium-latest"));
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert!(!obj.contains_key("max_completion_tokens"));
|
||||
@@ -893,7 +936,8 @@ mod tests {
|
||||
"max_completion_tokens": 16384
|
||||
});
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload);
|
||||
let result = provider
|
||||
.sanitize_request_for_compat(payload, &ModelConfig::new("mistral-medium-latest"));
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert!(!obj.contains_key("max_completion_tokens"));
|
||||
@@ -909,7 +953,7 @@ mod tests {
|
||||
"max_completion_tokens": 16384
|
||||
});
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload);
|
||||
let result = provider.sanitize_request_for_compat(payload, &ModelConfig::new("o3"));
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert!(obj.contains_key("max_completion_tokens"));
|
||||
@@ -925,7 +969,8 @@ mod tests {
|
||||
"max_completion_tokens": 16384
|
||||
});
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload);
|
||||
let result =
|
||||
provider.sanitize_request_for_compat(payload, &ModelConfig::new("future-model"));
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert!(obj.contains_key("max_completion_tokens"));
|
||||
@@ -940,7 +985,10 @@ mod tests {
|
||||
"messages": []
|
||||
});
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload.clone());
|
||||
let result = provider.sanitize_request_for_compat(
|
||||
payload.clone(),
|
||||
&ModelConfig::new("llama-3.3-70b-versatile"),
|
||||
);
|
||||
assert_eq!(result, payload);
|
||||
}
|
||||
|
||||
@@ -963,7 +1011,8 @@ mod tests {
|
||||
"max_completion_tokens": 16384
|
||||
});
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload);
|
||||
let result = provider
|
||||
.sanitize_request_for_compat(payload, &ModelConfig::new("Qwen/Qwen3.6-35B-A3B-FP8"));
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert!(!obj.contains_key("reasoning_effort"));
|
||||
@@ -983,7 +1032,8 @@ mod tests {
|
||||
"max_completion_tokens": 16384
|
||||
});
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload);
|
||||
let result =
|
||||
provider.sanitize_request_for_compat(payload, &ModelConfig::new("openai/gpt-5"));
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert_eq!(obj.get("reasoning_effort"), Some(&json!("medium")));
|
||||
@@ -991,6 +1041,73 @@ mod tests {
|
||||
assert_eq!(obj.get("max_tokens").unwrap(), &json!(16384));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sanitize_meta_applies_reasoning_effort_from_thinking_effort() {
|
||||
let provider = make_provider("meta");
|
||||
let payload = json!({
|
||||
"model": "muse-spark-1.1",
|
||||
"messages": []
|
||||
});
|
||||
let model_config =
|
||||
ModelConfig::new("muse-spark-1.1").with_thinking_effort(ThinkingEffort::High);
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload, &model_config);
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert_eq!(obj.get("reasoning_effort"), Some(&json!("high")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sanitize_meta_maps_max_thinking_effort_to_xhigh() {
|
||||
let provider = make_provider("meta");
|
||||
let payload = json!({
|
||||
"model": "muse-spark-1.1",
|
||||
"messages": []
|
||||
});
|
||||
let model_config =
|
||||
ModelConfig::new("muse-spark-1.1").with_thinking_effort(ThinkingEffort::Max);
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload, &model_config);
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert_eq!(obj.get("reasoning_effort"), Some(&json!("xhigh")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sanitize_meta_clamps_off_thinking_effort_to_low() {
|
||||
// Muse Spark always reasons and has no "disable reasoning" level,
|
||||
// so an explicit `Off` must be clamped to the lightest supported
|
||||
// level rather than omitted or sent as-is.
|
||||
let provider = make_provider("meta");
|
||||
let payload = json!({
|
||||
"model": "muse-spark-1.1",
|
||||
"messages": [],
|
||||
"reasoning_effort": "high"
|
||||
});
|
||||
let model_config =
|
||||
ModelConfig::new("muse-spark-1.1").with_thinking_effort(ThinkingEffort::Off);
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload, &model_config);
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert_eq!(obj.get("reasoning_effort"), Some(&json!("low")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sanitize_meta_omits_reasoning_effort_when_unset() {
|
||||
let provider = make_provider("meta");
|
||||
let payload = json!({
|
||||
"model": "muse-spark-1.1",
|
||||
"messages": []
|
||||
});
|
||||
let model_config = ModelConfig::new("muse-spark-1.1");
|
||||
|
||||
let result = provider.sanitize_request_for_compat(payload, &model_config);
|
||||
let obj = result.as_object().unwrap();
|
||||
|
||||
assert!(!obj.contains_key("reasoning_effort"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nearai_uses_chat_completions_for_openai_reasoning_models() {
|
||||
let provider = make_provider("nearai");
|
||||
|
||||
@@ -41,6 +41,7 @@ goose is compatible with a wide range of LLM providers, allowing you to choose a
|
||||
| [iFlytek Astron MaaS](https://maas.xfyun.cn/) | iFlytek Astron MaaS (讯飞星辰) hosting Spark X2, DeepSeek, GLM, Kimi, MiniMax, Qwen, and Astron coding models via an OpenAI-compatible API. Set `ASTRON_BASE_URL` to switch between the Token Plan and Coding Plan endpoints. | `ASTRON_API_KEY`, `ASTRON_BASE_URL` (optional) |
|
||||
| [LiteLLM](https://docs.litellm.ai/docs/) | LiteLLM proxy supporting multiple models with automatic prompt caching and unified API access. | `LITELLM_HOST`, `LITELLM_BASE_PATH` (optional), `LITELLM_API_KEY` (optional), `LITELLM_CUSTOM_HEADERS` (optional), `LITELLM_TIMEOUT` (optional) |
|
||||
| [LM Studio](https://lmstudio.ai/) | Run local models with LM Studio's OpenAI-compatible server. **Because this provider runs locally, you must first [download a model](#local-llms).** | None required. Connects to local server at `localhost:1234` by default. |
|
||||
| [Meta](https://dev.meta.ai/) | Meta's Model API, home of the Muse Spark models. | `META_MODEL_API_KEY` |
|
||||
| [Mistral AI](https://mistral.ai/) | Provides access to Mistral models including general-purpose models, specialized coding models (Codestral), and multimodal models (Pixtral). | `MISTRAL_API_KEY` |
|
||||
| [NEAR AI Cloud](https://cloud.near.ai/) | TEE-backed private inference through an OpenAI-compatible API with dynamic model discovery. | `NEARAI_API_KEY` |
|
||||
| [Novita AI](https://novita.ai/) | 90+ open-source models with OpenAI-compatible API and competitive pricing. Supports Kimi K2.5, DeepSeek, GLM, MiniMax, Qwen, and more. | `NOVITA_API_KEY` |
|
||||
@@ -91,11 +92,11 @@ To configure your chosen provider, see available options, or select a model, vis
|
||||
<Tabs groupId="interface">
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
**First-time users:**
|
||||
|
||||
|
||||
On the welcome screen the first time you open goose, you have these options:
|
||||
|
||||
|
||||
<OnboardingProviderSetup />
|
||||
|
||||
|
||||
<Tabs groupId="setup">
|
||||
<TabItem value="apikey" label="Quick Setup" default>
|
||||
1. Choose `Quick Setup with API Key`.
|
||||
@@ -111,34 +112,34 @@ To configure your chosen provider, see available options, or select a model, vis
|
||||
4. When you return to goose Desktop, you're ready to begin your first session.
|
||||
</TabItem>
|
||||
<TabItem value="tetrate" label="Agent Router">
|
||||
We recommend new users start with Agent Router by Tetrate. Tetrate provides access to multiple AI models with built-in rate limiting and automatic failover.
|
||||
We recommend new users start with Agent Router by Tetrate. Tetrate provides access to multiple AI models with built-in rate limiting and automatic failover.
|
||||
|
||||
:::info Free Credits Offer
|
||||
You'll receive $10 in free credits the first time you automatically authenticate with Tetrate through goose. This offer is available to both new and existing Tetrate users.
|
||||
:::
|
||||
1. Choose `Agent Router by Tetrate`.
|
||||
1. Choose `Agent Router by Tetrate`.
|
||||
2. goose will open a browser window for you to authenticate with Tetrate, or create a new account if you don't have one already.
|
||||
3. When you return to goose Desktop, you're ready to begin your first session.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="openrouter" label="OpenRouter">
|
||||
1. Choose `Automatic setup with OpenRouter`.
|
||||
1. Choose `Automatic setup with OpenRouter`.
|
||||
2. goose will open a browser window for you to authenticate with OpenRouter, or create a new account if you don't have one already.
|
||||
3. When you return to the goose Desktop, you're ready to begin your first session.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="others" label="Other Providers">
|
||||
1. If you have a specific provider you want to use with goose, and an API key from that provider, choose `Other Providers`.
|
||||
2. Find the provider of your choice and click its `Configure` button. If you don't see your provider in the list, click `Add Custom Provider` at the bottom of the window to [configure a custom provider](#configure-custom-provider).
|
||||
1. If you have a specific provider you want to use with goose, and an API key from that provider, choose `Other Providers`.
|
||||
2. Find the provider of your choice and click its `Configure` button. If you don't see your provider in the list, click `Add Custom Provider` at the bottom of the window to [configure a custom provider](#configure-custom-provider).
|
||||
3. Depending on your provider, you'll need to input your API Key, API Host, or other optional [parameters](#available-providers). Click the `Submit` button to authenticate and begin your first session.
|
||||
|
||||
:::info Ollama Model Detection
|
||||
For Ollama users, all locally installed models display automatically in the model selection dropdown.
|
||||
:::
|
||||
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
**To update your LLM provider and API key:**
|
||||
**To update your LLM provider and API key:**
|
||||
1. Click the <PanelLeft className="inline" size={16} /> button in the top-left to open the sidebar
|
||||
2. Click the `Settings` button on the sidebar
|
||||
3. Click the `Models` tab
|
||||
@@ -166,7 +167,7 @@ To configure your chosen provider, see available options, or select a model, vis
|
||||
4. Click `Reset Provider and Model` to clear your current settings and return to the welcome screen
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
1. In your terminal, run the following command:
|
||||
1. In your terminal, run the following command:
|
||||
|
||||
```sh
|
||||
goose configure
|
||||
@@ -175,59 +176,59 @@ To configure your chosen provider, see available options, or select a model, vis
|
||||
2. Select `Configure Providers` from the menu and press `Enter`.
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◆ What would you like to configure?
|
||||
// highlight-start
|
||||
│ ● Configure Providers (Change provider or update credentials)
|
||||
// highlight-end
|
||||
│ ○ Custom Providers
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
│ ○ Custom Providers
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
```
|
||||
3. Choose a model provider and press `Enter`. Use the arrow keys (↑/↓) to move through the options, or start typing to filter the list.
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◆ Which model provider should we use?
|
||||
│ ○ Amazon Bedrock
|
||||
│ ○ Amazon SageMaker TGI
|
||||
│ ○ Amazon Bedrock
|
||||
│ ○ Amazon SageMaker TGI
|
||||
// highlight-start
|
||||
│ ● Anthropic (Claude and other models from Anthropic)
|
||||
// highlight-end
|
||||
│ ○ Azure OpenAI
|
||||
│ ○ Azure OpenAI
|
||||
│ ○ Claude Code CLI
|
||||
│ ○ ...
|
||||
└
|
||||
└
|
||||
```
|
||||
4. Enter your API key (and any other configuration details) when prompted.
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◇ Which model provider should we use?
|
||||
│ Anthropic
|
||||
│ Anthropic
|
||||
│
|
||||
◆ Provider Anthropic requires ANTHROPIC_API_KEY, please enter a value
|
||||
// highlight-start
|
||||
│ ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
|
||||
// highlight-end
|
||||
└
|
||||
└
|
||||
```
|
||||
|
||||
|
||||
If you're just changing models, skip any prompts to update the provider configuration.
|
||||
|
||||
5. Enter your desired `ANTHROPIC_HOST` or press `Enter` to use the default.
|
||||
5. Enter your desired `ANTHROPIC_HOST` or press `Enter` to use the default.
|
||||
|
||||
```
|
||||
◆ Provider Anthropic requires ANTHROPIC_HOST, please enter a value
|
||||
@@ -239,7 +240,7 @@ To configure your chosen provider, see available options, or select a model, vis
|
||||
- Select the model from a list
|
||||
- Search for the model by name
|
||||
- Enter the model name directly
|
||||
|
||||
|
||||
```
|
||||
│
|
||||
◇ Model fetch complete
|
||||
@@ -252,7 +253,7 @@ To configure your chosen provider, see available options, or select a model, vis
|
||||
◒ Checking your configuration...
|
||||
└ Configuration saved successfully
|
||||
```
|
||||
|
||||
|
||||
This change takes effect the next time you start a session.
|
||||
|
||||
:::note
|
||||
@@ -385,7 +386,7 @@ Custom providers must use OpenAI, Anthropic, or Ollama compatible API formats. T
|
||||
4. Click `Configure providers`
|
||||
5. Click `Add Custom Provider` at the bottom of the window
|
||||
6. Fill in the provider details:
|
||||
- **Provider Type**:
|
||||
- **Provider Type**:
|
||||
- `OpenAI Compatible` (most common)
|
||||
- `Anthropic Compatible`
|
||||
- `Ollama Compatible`
|
||||
@@ -404,7 +405,7 @@ Custom providers must use OpenAI, Anthropic, or Ollama compatible API formats. T
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
1. In your terminal, run the following command:
|
||||
1. In your terminal, run the following command:
|
||||
|
||||
```sh
|
||||
goose configure
|
||||
@@ -413,38 +414,38 @@ Custom providers must use OpenAI, Anthropic, or Ollama compatible API formats. T
|
||||
2. Select `Custom Providers`. Use the arrow keys (↑/↓) to move through the options.
|
||||
|
||||
```sh
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◆ What would you like to configure?
|
||||
│ ○ Configure Providers
|
||||
// highlight-start
|
||||
│ ● Custom Providers (Add custom provider with compatible API)
|
||||
// highlight-end
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
```
|
||||
|
||||
3. Select `Add A Custom Provider`
|
||||
|
||||
```sh
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Custom Providers
|
||||
│ Custom Providers
|
||||
│
|
||||
◆ What would you like to do?
|
||||
// highlight-start
|
||||
│ ● Add A Custom Provider (Add a new OpenAI/Anthropic/Ollama compatible Provider)
|
||||
// highlight-end
|
||||
│ ○ Remove Custom Provider
|
||||
└
|
||||
└
|
||||
```
|
||||
|
||||
4. Follow the prompts to enter the provider details:
|
||||
- **API Type**:
|
||||
- **API Type**:
|
||||
- `OpenAI Compatible` (most common)
|
||||
- `Anthropic Compatible`
|
||||
- `Ollama Compatible`
|
||||
@@ -523,8 +524,8 @@ Custom providers must use OpenAI, Anthropic, or Ollama compatible API formats. T
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
|
||||
1. In your terminal, run the following command:
|
||||
|
||||
1. In your terminal, run the following command:
|
||||
|
||||
```sh
|
||||
goose configure
|
||||
@@ -533,40 +534,40 @@ Custom providers must use OpenAI, Anthropic, or Ollama compatible API formats. T
|
||||
2. Select `Configure Providers` from the menu and press `Enter`.
|
||||
|
||||
```sh
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◆ What would you like to configure?
|
||||
// highlight-start
|
||||
│ ● Configure Providers (Change provider or update credentials)
|
||||
// highlight-end
|
||||
│ ○ Custom Providers
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
│ ○ Custom Providers
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
```
|
||||
|
||||
3. Select the custom provider you want to update and press `Enter`. Use the arrow keys (↑/↓) to move through the options, or start typing to filter the list.
|
||||
|
||||
```sh
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◆ Which model provider should we use?
|
||||
│ ○ Amazon Bedrock
|
||||
│ ○ Amazon SageMaker TGI
|
||||
│ ○ Amazon Bedrock
|
||||
│ ○ Amazon SageMaker TGI
|
||||
│ ○ Anthropic
|
||||
│ ○ Azure OpenAI
|
||||
│ ○ Claude Code CLI
|
||||
│ ○ Azure OpenAI
|
||||
│ ○ Claude Code CLI
|
||||
// highlight-start
|
||||
│ ● Corporate API (Custom Corporate API provider)
|
||||
// highlight-end
|
||||
│ ○ Cursor Agent
|
||||
│ ○ Cursor Agent
|
||||
│ ○ ...
|
||||
└
|
||||
└
|
||||
```
|
||||
|
||||
4. Follow the prompts to update the fields.
|
||||
@@ -598,8 +599,8 @@ Your changes are available in your next goose session.
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
|
||||
1. In your terminal, run the following command:
|
||||
|
||||
1. In your terminal, run the following command:
|
||||
|
||||
```sh
|
||||
goose configure
|
||||
@@ -608,34 +609,34 @@ Your changes are available in your next goose session.
|
||||
2. Select `Custom Providers`. Use the arrow keys (↑/↓) to move through the options.
|
||||
|
||||
```sh
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◆ What would you like to configure?
|
||||
│ ○ Configure Providers
|
||||
// highlight-start
|
||||
│ ● Custom Providers (Add custom provider with compatible API)
|
||||
// highlight-end
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
│ ○ Add Extension
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Remove Extension
|
||||
│ ○ goose Settings
|
||||
└
|
||||
```
|
||||
|
||||
3. Select `Remove Custom Provider`.
|
||||
|
||||
```sh
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Custom Providers
|
||||
│ Custom Providers
|
||||
│
|
||||
◆ What would you like to do?
|
||||
│ ○ Add A Custom Provider
|
||||
│ ○ Add A Custom Provider
|
||||
// highlight-start
|
||||
│ ● Remove Custom Provider (Remove an existing custom provider)
|
||||
// highlight-end
|
||||
└
|
||||
└
|
||||
```
|
||||
|
||||
4. Select the custom provider you want to remove.
|
||||
@@ -658,7 +659,7 @@ Your changes are available in your next goose session.
|
||||
|
||||
## Using goose for Free
|
||||
|
||||
goose is a free and open source AI agent that you can start using right away, but not all supported [LLM Providers][providers] provide a free tier.
|
||||
goose is a free and open source AI agent that you can start using right away, but not all supported [LLM Providers][providers] provide a free tier.
|
||||
|
||||
Below, we outline a couple of free options and how to get started with them.
|
||||
|
||||
@@ -672,7 +673,7 @@ Groq provides free access to open source (open weight) models with high-speed in
|
||||
|
||||
Groq offers several open source models that support tool calling, including:
|
||||
- **moonshotai/kimi-k2-instruct-0905** - Mixture-of-Experts model with 1 trillion parameters, optimized for agentic intelligence and tool use
|
||||
- **qwen/qwen3-32b** - 32.8 billion parameter model with advanced reasoning and multilingual capabilities
|
||||
- **qwen/qwen3-32b** - 32.8 billion parameter model with advanced reasoning and multilingual capabilities
|
||||
- **llama-3.3-70b-versatile** - Meta's Llama 3.3 model for versatile applications
|
||||
- **llama-3.1-8b-instant** - Meta's Llama 3.1 model for fast inference
|
||||
|
||||
@@ -682,7 +683,7 @@ To set up Groq with goose, follow these steps:
|
||||
|
||||
<Tabs groupId="interface">
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
**To update your LLM provider and API key:**
|
||||
**To update your LLM provider and API key:**
|
||||
|
||||
1. Click the <PanelLeft className="inline" size={16} /> button in the top-left to open the sidebar.
|
||||
2. Click the `Settings` button on the sidebar.
|
||||
@@ -694,7 +695,7 @@ To set up Groq with goose, follow these steps:
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
1. Run:
|
||||
1. Run:
|
||||
```sh
|
||||
goose configure
|
||||
```
|
||||
@@ -723,7 +724,7 @@ To set up EmpirioLabs with goose, follow these steps:
|
||||
|
||||
<Tabs groupId="interface">
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
**To update your LLM provider and API key:**
|
||||
**To update your LLM provider and API key:**
|
||||
|
||||
1. Click the <PanelLeft className="inline" size={16} /> button in the top-left to open the sidebar.
|
||||
2. Click the `Settings` button on the sidebar.
|
||||
@@ -735,7 +736,7 @@ To set up EmpirioLabs with goose, follow these steps:
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
1. Run:
|
||||
1. Run:
|
||||
```sh
|
||||
goose configure
|
||||
```
|
||||
@@ -762,7 +763,7 @@ To set up FuturMix with goose, follow these steps:
|
||||
|
||||
<Tabs groupId="interface">
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
**To update your LLM provider and API key:**
|
||||
**To update your LLM provider and API key:**
|
||||
|
||||
1. Click the <PanelLeft className="inline" size={16} /> button in the top-left to open the sidebar.
|
||||
2. Click the `Settings` button on the sidebar.
|
||||
@@ -774,7 +775,7 @@ To set up FuturMix with goose, follow these steps:
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
1. Run:
|
||||
1. Run:
|
||||
```sh
|
||||
goose configure
|
||||
```
|
||||
@@ -801,7 +802,7 @@ To set up Novita AI with goose, follow these steps:
|
||||
|
||||
<Tabs groupId="interface">
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
**To update your LLM provider and API key:**
|
||||
**To update your LLM provider and API key:**
|
||||
|
||||
1. Click the <PanelLeft className="inline" size={16} /> button in the top-left to open the sidebar.
|
||||
2. Click the `Settings` button on the sidebar.
|
||||
@@ -813,7 +814,7 @@ To set up Novita AI with goose, follow these steps:
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
1. Run:
|
||||
1. Run:
|
||||
```sh
|
||||
goose configure
|
||||
```
|
||||
@@ -868,7 +869,7 @@ To set up Google Gemini with goose, follow these steps:
|
||||
|
||||
<Tabs groupId="interface">
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
**To update your LLM provider and API key:**
|
||||
**To update your LLM provider and API key:**
|
||||
|
||||
1. Click the <PanelLeft className="inline" size={16} /> button in the top-left to open the sidebar.
|
||||
2. Click the `Settings` button on the sidebar.
|
||||
@@ -879,7 +880,7 @@ To set up Google Gemini with goose, follow these steps:
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
1. Run:
|
||||
1. Run:
|
||||
```sh
|
||||
goose configure
|
||||
```
|
||||
@@ -899,7 +900,7 @@ To set up Google Gemini with goose, follow these steps:
|
||||
│
|
||||
◇ Provider Google Gemini requires GOOGLE_API_KEY, please enter a value
|
||||
│▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
|
||||
│
|
||||
│
|
||||
◇ Enter a model from that provider:
|
||||
│ gemini-2.0-flash-exp
|
||||
│
|
||||
@@ -1022,14 +1023,14 @@ Here are some local providers we support:
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="deepseek" label="DeepSeek-R1">
|
||||
The native `DeepSeek-r1` model doesn't support tool calling, however, we have a [custom model](https://ollama.com/michaelneale/deepseek-r1-goose) you can use with goose.
|
||||
The native `DeepSeek-r1` model doesn't support tool calling, however, we have a [custom model](https://ollama.com/michaelneale/deepseek-r1-goose) you can use with goose.
|
||||
|
||||
:::warning
|
||||
Note that this is a 70B model size and requires a powerful device to run smoothly.
|
||||
:::
|
||||
|
||||
|
||||
1. [Download Ollama](https://ollama.com/download).
|
||||
1. [Download Ollama](https://ollama.com/download).
|
||||
2. In a terminal window, run the following command to install the custom DeepSeek-r1 model:
|
||||
|
||||
```sh
|
||||
@@ -1045,44 +1046,44 @@ Here are some local providers we support:
|
||||
4. Choose to `Configure Providers`
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◆ What would you like to configure?
|
||||
│ ● Configure Providers (Change provider or update credentials)
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Add Extension
|
||||
└
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Add Extension
|
||||
└
|
||||
```
|
||||
|
||||
5. Choose `Ollama` as the model provider
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◆ Which model provider should we use?
|
||||
│ ○ Anthropic
|
||||
│ ○ Databricks
|
||||
│ ○ Google Gemini
|
||||
│ ○ Groq
|
||||
│ ○ Anthropic
|
||||
│ ○ Databricks
|
||||
│ ○ Google Gemini
|
||||
│ ○ Groq
|
||||
│ ● Ollama (Local open source models)
|
||||
│ ○ OpenAI
|
||||
│ ○ OpenRouter
|
||||
└
|
||||
│ ○ OpenAI
|
||||
│ ○ OpenRouter
|
||||
└
|
||||
```
|
||||
|
||||
6. Enter the host where your model is running
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◇ Which model provider should we use?
|
||||
│ Ollama
|
||||
│ Ollama
|
||||
│
|
||||
◆ Provider Ollama requires OLLAMA_HOST, please enter a value
|
||||
│ http://localhost:11434
|
||||
@@ -1092,17 +1093,17 @@ Here are some local providers we support:
|
||||
7. Enter the installed model from above
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◇ Which model provider should we use?
|
||||
│ Ollama
|
||||
│ Ollama
|
||||
│
|
||||
◇ Provider Ollama requires OLLAMA_HOST, please enter a value
|
||||
│ http://localhost:11434
|
||||
│
|
||||
│ http://localhost:11434
|
||||
│
|
||||
◇ Enter a model from that provider:
|
||||
│ michaelneale/deepseek-r1-goose
|
||||
│
|
||||
@@ -1112,7 +1113,7 @@ Here are some local providers we support:
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="others" label="Other Models" default>
|
||||
1. [Download Ollama](https://ollama.com/download).
|
||||
1. [Download Ollama](https://ollama.com/download).
|
||||
2. In a terminal, run any [model supporting tool-calling](https://ollama.com/search?c=tools)
|
||||
|
||||
Example:
|
||||
@@ -1130,32 +1131,32 @@ Here are some local providers we support:
|
||||
4. Choose to `Configure Providers`
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◆ What would you like to configure?
|
||||
│ ● Configure Providers (Change provider or update credentials)
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Add Extension
|
||||
└
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Add Extension
|
||||
└
|
||||
```
|
||||
|
||||
5. Choose `Ollama` as the model provider
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◆ Which model provider should we use?
|
||||
│ ○ Anthropic
|
||||
│ ○ Databricks
|
||||
│ ○ Google Gemini
|
||||
│ ○ Groq
|
||||
│ ○ Anthropic
|
||||
│ ○ Databricks
|
||||
│ ○ Google Gemini
|
||||
│ ○ Groq
|
||||
│ ● Ollama (Local open source models)
|
||||
│ ○ OpenAI
|
||||
│ ○ OpenRouter
|
||||
└
|
||||
│ ○ OpenAI
|
||||
│ ○ OpenRouter
|
||||
└
|
||||
```
|
||||
|
||||
6. Enter the host where your model is running
|
||||
@@ -1168,13 +1169,13 @@ Here are some local providers we support:
|
||||
:::
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◇ Which model provider should we use?
|
||||
│ Ollama
|
||||
│ Ollama
|
||||
│
|
||||
◆ Provider Ollama requires OLLAMA_HOST, please enter a value
|
||||
│ http://localhost:11434
|
||||
@@ -1185,13 +1186,13 @@ Here are some local providers we support:
|
||||
7. Enter the model you have running
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◇ What would you like to configure?
|
||||
│ Configure Providers
|
||||
│ Configure Providers
|
||||
│
|
||||
◇ Which model provider should we use?
|
||||
│ Ollama
|
||||
│ Ollama
|
||||
│
|
||||
◇ Provider Ollama requires OLLAMA_HOST, please enter a value
|
||||
│ http://localhost:11434
|
||||
@@ -1207,7 +1208,7 @@ Here are some local providers we support:
|
||||
:::tip Context Length
|
||||
If you notice that goose is having trouble using extensions or is ignoring [.goosehints](/docs/guides/context-engineering/using-goosehints), it is likely that the model's default context length of 4096 tokens is too low. Set the `OLLAMA_CONTEXT_LENGTH` environment variable to a [higher value](https://github.com/ollama/ollama/blob/main/docs/faq.mdx#how-can-i-specify-the-context-window-size).
|
||||
:::
|
||||
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
</TabItem>
|
||||
@@ -1320,7 +1321,7 @@ Here are some local providers we support:
|
||||
docker model pull hf.co/unsloth/gemma-3n-e4b-it-gguf:q6_k
|
||||
```
|
||||
|
||||
4. Configure goose to use Docker Model Runner, using the OpenAI API compatible endpoint:
|
||||
4. Configure goose to use Docker Model Runner, using the OpenAI API compatible endpoint:
|
||||
|
||||
```sh
|
||||
goose configure
|
||||
@@ -1329,16 +1330,16 @@ Here are some local providers we support:
|
||||
5. Choose to `Configure Providers`
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
┌ goose-configure
|
||||
│
|
||||
◆ What would you like to configure?
|
||||
│ ● Configure Providers (Change provider or update credentials)
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Add Extension
|
||||
└
|
||||
│ ○ Toggle Extensions
|
||||
│ ○ Add Extension
|
||||
└
|
||||
```
|
||||
|
||||
6. Choose `OpenAI` as the model provider:
|
||||
6. Choose `OpenAI` as the model provider:
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
@@ -1354,7 +1355,7 @@ Here are some local providers we support:
|
||||
│ ○ OpenRouter
|
||||
```
|
||||
|
||||
7. Configure Docker Model Runner endpoint as the `OPENAI_HOST`:
|
||||
7. Configure Docker Model Runner endpoint as the `OPENAI_HOST`:
|
||||
|
||||
```
|
||||
┌ goose-configure
|
||||
@@ -1370,10 +1371,10 @@ Here are some local providers we support:
|
||||
└
|
||||
```
|
||||
|
||||
The default value for the host-side port Docker Model Runner is 12434, so the `OPENAI_HOST` value could be:
|
||||
`http://localhost:12434`.
|
||||
The default value for the host-side port Docker Model Runner is 12434, so the `OPENAI_HOST` value could be:
|
||||
`http://localhost:12434`.
|
||||
|
||||
8. Configure the base path:
|
||||
8. Configure the base path:
|
||||
|
||||
```
|
||||
◆ Provider OpenAI requires OPENAI_BASE_PATH, please enter a value
|
||||
@@ -1390,7 +1391,7 @@ Here are some local providers we support:
|
||||
◇ Enter a model from that provider:
|
||||
│ gpt-4o
|
||||
│
|
||||
◒ Checking your configuration...
|
||||
◒ Checking your configuration...
|
||||
└ Configuration saved successfully
|
||||
```
|
||||
</TabItem>
|
||||
@@ -1455,6 +1456,39 @@ Beyond single-model setups, goose supports [multi-model configurations](/docs/gu
|
||||
- **Planning Mode** - Use a dedicated planner model to create detailed project breakdowns before execution
|
||||
- **Subagents** - Delegate scoped tasks to isolated sessions to keep your primary workflow focused and efficient
|
||||
|
||||
## Meta Muse Spark Reasoning Effort
|
||||
|
||||
Meta's Muse Spark models support a configurable reasoning effort that maps to Meta's `reasoning_effort` request parameter:
|
||||
- **Low** - Faster responses, lighter reasoning
|
||||
- **Medium** - Balanced reasoning depth and latency
|
||||
- **High** - Deeper reasoning, higher latency
|
||||
- **Max** - Sent as `xhigh`, the deepest reasoning level Meta supports
|
||||
|
||||
<Tabs groupId="interface">
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
When selecting a Muse Spark model, a "Thinking Effort" dropdown appears automatically. Select your preference and the setting persists across sessions.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
When you run `goose configure` and select a Muse Spark model, you'll be prompted to choose a thinking effort:
|
||||
|
||||
```
|
||||
◆ Select thinking effort:
|
||||
│ ● Off - No extended thinking
|
||||
│ ○ Low - Better latency, lighter reasoning
|
||||
│ ○ Medium - Moderate thinking
|
||||
│ ○ High - Deep reasoning
|
||||
│ ○ Max - No constraints on thinking depth
|
||||
```
|
||||
|
||||
You can also set this globally with the `GOOSE_THINKING_EFFORT` environment variable (`off`, `low`, `medium`, `high`, or `max`).
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
:::note
|
||||
Muse Spark always reasons and has no way to disable it, so choosing `off` is clamped to `low` (the lightest level Meta supports) rather than omitting the `reasoning_effort` parameter.
|
||||
:::
|
||||
|
||||
## Gemini 3 Thinking Levels
|
||||
|
||||
Gemini 3 models support configurable thinking levels to balance response latency and reasoning depth:
|
||||
@@ -1469,12 +1503,12 @@ When thinking is enabled, you can view the model's reasoning process. See [Viewi
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
When selecting a Gemini 3 model, a "Thinking Level" dropdown appears automatically. Select your preference and the setting persists across sessions.
|
||||
</TabItem>
|
||||
|
||||
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
**Interactive configuration:**
|
||||
|
||||
|
||||
When you run `goose configure` and select a Gemini 3 model, you'll be prompted to choose a thinking level:
|
||||
|
||||
|
||||
```
|
||||
◆ Select thinking level for Gemini 3:
|
||||
│ ● Low - Better latency, lighter reasoning
|
||||
@@ -1505,16 +1539,16 @@ Some models expose their internal reasoning or "chain of thought" as part of the
|
||||
<TabItem value="ui" label="goose Desktop" default>
|
||||
Reasoning output appears automatically in a collapsible **"Show reasoning"** toggle above the model's response. Click it to expand and view the model's thought process.
|
||||
</TabItem>
|
||||
|
||||
|
||||
<TabItem value="cli" label="goose CLI">
|
||||
Reasoning output is **hidden by default** in the CLI. To display it, set the `GOOSE_CLI_SHOW_THINKING` environment variable:
|
||||
|
||||
|
||||
```bash
|
||||
export GOOSE_CLI_SHOW_THINKING=1
|
||||
```
|
||||
|
||||
|
||||
When enabled, reasoning appears under a "Thinking:" header in dimmed text before the model's main response.
|
||||
|
||||
|
||||
:::note
|
||||
This requires stdout to be a terminal (reasoning output won't appear when piping output to a file or another command).
|
||||
:::
|
||||
|
||||
Reference in New Issue
Block a user