Skip to content

Commit ab97c8a

Browse files
committed
Merge branch 'main' of github.com:block/goose into zane/working-dir-add-extension
* 'main' of github.com:block/goose: Use Canonical Models to set context window sizes (#6723)
2 parents 57f207a + 3959805 commit ab97c8a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+431
-547
lines changed

crates/goose-acp/src/server.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,8 @@ impl GooseAcpAgent {
738738
let config_path = self.config_dir.join(CONFIG_YAML_NAME);
739739
let config = Config::new(&config_path, "goose")?;
740740
let model_id = config.get_goose_model()?;
741-
goose::model::ModelConfig::new(&model_id)?
741+
let provider_name = config.get_goose_provider()?;
742+
goose::model::ModelConfig::new(&model_id)?.with_canonical_limits(&provider_name)
742743
}
743744
};
744745
let provider = (self.provider_factory)(model_config, Vec::new()).await?;
@@ -956,9 +957,18 @@ impl GooseAcpAgent {
956957
session_id: &str,
957958
model_id: &str,
958959
) -> Result<SetSessionModelResponse, sacp::Error> {
959-
let model_config = goose::model::ModelConfig::new(model_id).map_err(|e| {
960-
sacp::Error::invalid_params().data(format!("Invalid model config: {}", e))
960+
let config_path = self.config_dir.join(CONFIG_YAML_NAME);
961+
let config = Config::new(&config_path, "goose").map_err(|e| {
962+
sacp::Error::internal_error().data(format!("Failed to read config: {}", e))
963+
})?;
964+
let provider_name = config.get_goose_provider().map_err(|_| {
965+
sacp::Error::internal_error().data("No provider configured".to_string())
961966
})?;
967+
let model_config = goose::model::ModelConfig::new(model_id)
968+
.map_err(|e| {
969+
sacp::Error::invalid_params().data(format!("Invalid model config: {}", e))
970+
})?
971+
.with_canonical_limits(&provider_name);
962972
let provider = (self.provider_factory)(model_config, Vec::new())
963973
.await
964974
.map_err(|e| {

crates/goose-acp/src/server_factory.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@ impl AcpServer {
3838
Box::pin(async move {
3939
let config_path = config_dir.join(goose::config::base::CONFIG_YAML_NAME);
4040
let config = goose::config::Config::new(&config_path, "goose")?;
41-
let provider_name = config
42-
.get_goose_provider()
43-
.map_err(|_| anyhow::anyhow!("No provider configured"))?;
41+
let provider_name = config.get_goose_provider()?;
4442
goose::providers::create(&provider_name, model_config, extensions).await
4543
})
4644
});

crates/goose-acp/tests/common_tests/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub async fn run_config_mcp<C: Connection>() {
2525
let mcp = McpFixture::new(Some(expected_session_id.clone())).await;
2626

2727
let config_yaml = format!(
28-
"GOOSE_MODEL: {TEST_MODEL}\nextensions:\n mcp-fixture:\n enabled: true\n type: streamable_http\n name: mcp-fixture\n description: MCP fixture\n uri: \"{}\"\n",
28+
"GOOSE_MODEL: {TEST_MODEL}\nGOOSE_PROVIDER: openai\nextensions:\n mcp-fixture:\n enabled: true\n type: streamable_http\n name: mcp-fixture\n description: MCP fixture\n uri: \"{}\"\n",
2929
mcp.url
3030
);
3131
fs::write(temp_dir.path().join(CONFIG_YAML_NAME), config_yaml).unwrap();

crates/goose-acp/tests/fixtures/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,11 @@ pub async fn spawn_acp_server_in_process(
199199
fs::create_dir_all(data_root).unwrap();
200200
let config_path = data_root.join(goose::config::base::CONFIG_YAML_NAME);
201201
if !config_path.exists() {
202-
fs::write(&config_path, format!("GOOSE_MODEL: {TEST_MODEL}\n")).unwrap();
202+
fs::write(
203+
&config_path,
204+
format!("GOOSE_MODEL: {TEST_MODEL}\nGOOSE_PROVIDER: openai\n"),
205+
)
206+
.unwrap();
203207
}
204208
let provider_factory = provider_factory.unwrap_or_else(|| {
205209
let base_url = openai_base_url.to_string();

crates/goose-cli/src/commands/configure.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ async fn handle_oauth_configuration(provider_name: &str, key_name: &str) -> anyh
327327
));
328328

329329
// Create a temporary provider instance to handle OAuth
330-
let temp_model = ModelConfig::new("temp")?;
330+
let temp_model = ModelConfig::new("temp")?.with_canonical_limits(provider_name);
331331
match create(provider_name, temp_model, Vec::new()).await {
332332
Ok(provider) => match provider.configure_oauth().await {
333333
Ok(_) => {
@@ -682,7 +682,8 @@ pub async fn configure_provider_dialog() -> anyhow::Result<bool> {
682682
let spin = spinner();
683683
spin.start("Attempting to fetch supported models...");
684684
let models_res = {
685-
let temp_model_config = ModelConfig::new(&provider_meta.default_model)?;
685+
let temp_model_config =
686+
ModelConfig::new(&provider_meta.default_model)?.with_canonical_limits(provider_name);
686687
let temp_provider = create(provider_name, temp_model_config, Vec::new()).await?;
687688
retry_operation(&RetryConfig::default(), || async {
688689
temp_provider.fetch_recommended_models().await
@@ -1442,7 +1443,7 @@ pub async fn configure_tool_permissions_dialog() -> anyhow::Result<()> {
14421443
let model: String = config
14431444
.get_goose_model()
14441445
.expect("No model configured. Please set model first");
1445-
let model_config = ModelConfig::new(&model)?;
1446+
let model_config = ModelConfig::new(&model)?.with_canonical_limits(&provider_name);
14461447

14471448
let agent = Agent::new();
14481449

@@ -1662,7 +1663,7 @@ pub async fn handle_openrouter_auth() -> anyhow::Result<()> {
16621663
println!("\nTesting configuration...");
16631664
let configured_model: String = config.get_goose_model()?;
16641665
let model_config = match goose::model::ModelConfig::new(&configured_model) {
1665-
Ok(config) => config,
1666+
Ok(config) => config.with_canonical_limits("openrouter"),
16661667
Err(e) => {
16671668
eprintln!("⚠️ Invalid model configuration: {}", e);
16681669
eprintln!("Your settings have been saved. Please check your model configuration.");
@@ -1742,7 +1743,7 @@ pub async fn handle_tetrate_auth() -> anyhow::Result<()> {
17421743
println!("\nTesting configuration...");
17431744
let configured_model: String = config.get_goose_model()?;
17441745
let model_config = match goose::model::ModelConfig::new(&configured_model) {
1745-
Ok(config) => config,
1746+
Ok(config) => config.with_canonical_limits("tetrate"),
17461747
Err(e) => {
17471748
eprintln!("⚠️ Invalid model configuration: {}", e);
17481749
eprintln!("Your settings have been saved. Please check your model configuration.");

crates/goose-cli/src/commands/term.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,13 @@ pub async fn handle_term_info() -> Result<()> {
291291
let context_limit = config
292292
.get_goose_model()
293293
.ok()
294-
.and_then(|model_name| goose::model::ModelConfig::new(&model_name).ok())
294+
.and_then(|model_name| {
295+
config.get_goose_provider().ok().and_then(|provider_name| {
296+
goose::model::ModelConfig::new(&model_name)
297+
.ok()
298+
.map(|c| c.with_canonical_limits(&provider_name))
299+
})
300+
})
295301
.map(|mc| mc.context_limit())
296302
.unwrap_or(128_000);
297303

crates/goose-cli/src/commands/web.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ fn get_provider_and_model() -> (String, String) {
168168
}
169169

170170
async fn create_agent(provider_name: &str, model: &str) -> Result<Agent> {
171-
let model_config = goose::model::ModelConfig::new(model)?;
171+
let model_config = goose::model::ModelConfig::new(model)?.with_canonical_limits(provider_name);
172172

173173
let agent = Agent::new();
174174

crates/goose-cli/src/scenario_tests/scenario_runner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ where
188188

189189
let inner_provider = create(
190190
&factory_name,
191-
ModelConfig::new(config.model_name)?,
191+
ModelConfig::new(config.model_name)?.with_canonical_limits(&factory_name),
192192
Vec::new(),
193193
)
194194
.await?;

crates/goose-cli/src/session/builder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ fn resolve_provider_and_model(
386386
output::render_error(&format!("Failed to create model configuration: {}", e));
387387
process::exit(1);
388388
})
389+
.with_canonical_limits(&provider_name)
389390
.with_temperature(temperature)
390391
};
391392

crates/goose-cli/src/session/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1847,7 +1847,7 @@ async fn get_reasoner() -> Result<Arc<dyn Provider>, anyhow::Error> {
18471847
};
18481848

18491849
let model_config =
1850-
ModelConfig::new_with_context_env(model, Some("GOOSE_PLANNER_CONTEXT_LIMIT"))?;
1850+
ModelConfig::new_with_context_env(model, &provider, Some("GOOSE_PLANNER_CONTEXT_LIMIT"))?;
18511851
let extensions = goose::config::extensions::get_enabled_extensions_with_config(config);
18521852
let reasoner = create(&provider, model_config, extensions).await?;
18531853

0 commit comments

Comments
 (0)