Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions crates/merry-cli/src/cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,8 @@ use merry::profiles::{CodingRuntime, CodingRuntimeBuilder, CodingRuntimeInput};
use merry_core::{ErrorInfo, PendingToolCall, SessionId, ToolInputSchema};
use merry_llm::{ModelName, ModelProvider, ModelRetryPolicy};
use merry_runtime::{
AgentLoopConfig, AgentLoopStatus, AutomaticCompactionConfig, RegisteredTool, Runtime,
StepContext, StepInput, ToolExecutionContext, ToolExecutionOutcome, ToolExecutor,
ToolExecutorFuture,
AgentLoopConfig, AgentLoopStatus, CompactionConfig, RegisteredTool, Runtime, StepContext,
StepInput, ToolExecutionContext, ToolExecutionOutcome, ToolExecutor, ToolExecutorFuture,
};
use schemars::{JsonSchema, Schema, SchemaGenerator};
use serde::{Deserialize, Serialize};
Expand Down Expand Up @@ -189,7 +188,7 @@ pub(crate) struct RuntimeInput<'a> {
pub(crate) environment: CommandGenerationEnvironment,
pub(crate) provider: Arc<dyn ModelProvider>,
pub(crate) model: ModelName,
pub(crate) automatic_compaction: AutomaticCompactionConfig,
pub(crate) automatic_compaction: CompactionConfig,
pub(crate) retry_policy: Option<ModelRetryPolicy>,
pub(crate) context_compaction: Option<RuntimeRoleProviderConfig>,
pub(crate) skill_roots: Vec<PathBuf>,
Expand Down
6 changes: 3 additions & 3 deletions crates/merry-cli/src/cmd/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ async fn command_generation_runtime_is_read_only_workspace_only() {
environment: CommandGenerationEnvironment::detect(&workspace),
provider: Arc::new(provider.clone()),
model: ModelName::new("debug-model").expect("valid model name"),
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
skill_roots: Vec::new(),
Expand Down Expand Up @@ -181,7 +181,7 @@ async fn generate_command_plan_reads_structured_final_output() {
environment: CommandGenerationEnvironment::detect(&workspace),
provider: Arc::new(provider),
model: ModelName::new("debug-model").expect("valid model name"),
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
skill_roots: Vec::new(),
Expand Down Expand Up @@ -243,7 +243,7 @@ async fn cmd_check_command_tool_reports_path_availability() {
environment,
provider: Arc::new(provider),
model: ModelName::new("debug-model").expect("valid model name"),
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
skill_roots: Vec::new(),
Expand Down
6 changes: 3 additions & 3 deletions crates/merry-cli/src/coding/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use merry_llm::{ModelName, ModelProvider, ModelRetryPolicy};
use merry_runtime::FileSessionStore;
#[cfg(test)]
use merry_runtime::Runtime;
use merry_runtime::{AutomaticCompactionConfig, LoadedSession, RegisteredTool};
use merry_runtime::{CompactionConfig, LoadedSession, RegisteredTool};
use std::{
path::{Path, PathBuf},
sync::Arc,
Expand All @@ -19,7 +19,7 @@ use std::{
#[cfg(test)]
pub(crate) struct CodingRuntimeOptions {
pub(crate) approval_review: Option<RuntimeRoleProviderConfig>,
pub(crate) automatic_compaction: AutomaticCompactionConfig,
pub(crate) automatic_compaction: CompactionConfig,
pub(crate) retry_policy: Option<ModelRetryPolicy>,
pub(crate) context_compaction: Option<RuntimeRoleProviderConfig>,
pub(crate) process_backend: ActionProcessBackend,
Expand All @@ -36,7 +36,7 @@ pub(crate) struct HeadlessCodingRuntimeInput<'a> {
pub(crate) model: ModelName,
pub(crate) process_backend: ActionProcessBackend,
pub(crate) extra_tools: Vec<RegisteredTool>,
pub(crate) automatic_compaction: AutomaticCompactionConfig,
pub(crate) automatic_compaction: CompactionConfig,
pub(crate) retry_policy: Option<ModelRetryPolicy>,
pub(crate) context_compaction: Option<RuntimeRoleProviderConfig>,
pub(crate) approval_review: Option<RuntimeRoleProviderConfig>,
Expand Down
2 changes: 1 addition & 1 deletion crates/merry-cli/src/coding/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ fn headless_input<'a>(
permissioned_process_runner_factory,
)),
extra_tools: Vec::new(),
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
approval_review: None,
Expand Down
4 changes: 2 additions & 2 deletions crates/merry-cli/src/coding/tests/composition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ async fn headless_runtime_uses_coding_agent_profile() {
permissioned_factory,
)),
extra_tools: Vec::new(),
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
approval_review: None,
Expand Down Expand Up @@ -149,7 +149,7 @@ async fn headless_runtime_registers_extra_tools() {
runner,
permissioned_factory,
)),
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
approval_review: None,
Expand Down
4 changes: 2 additions & 2 deletions crates/merry-cli/src/coding/tests/project_rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ async fn coding_projects_root_agents_in_the_stable_prefix() {
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down Expand Up @@ -89,7 +89,7 @@ async fn coding_omits_project_rules_when_root_agents_is_missing() {
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down
6 changes: 3 additions & 3 deletions crates/merry-cli/src/coding/tests/skills.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ async fn projects_skill_metadata_without_body() {
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down Expand Up @@ -110,7 +110,7 @@ async fn includes_skill_roots_in_workspace_read_tools() {
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down Expand Up @@ -155,7 +155,7 @@ async fn allows_missing_default_skill_root() {
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down
6 changes: 3 additions & 3 deletions crates/merry-cli/src/coding/tests/subagents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ async fn hides_subagent_tools_by_default() {
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down Expand Up @@ -78,7 +78,7 @@ async fn exposes_subagent_tools_when_enabled() {
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down Expand Up @@ -176,7 +176,7 @@ async fn subagent_with_narrow_tools_keeps_stable_profile_and_runtime_admission()
model_name(),
CodingRuntimeOptions {
approval_review: None,
automatic_compaction: merry_runtime::AutomaticCompactionConfig::disabled(),
automatic_compaction: merry_runtime::CompactionConfig::disabled(),
retry_policy: None,
context_compaction: None,
process_backend: test_process_backend(),
Expand Down
39 changes: 21 additions & 18 deletions crates/merry-cli/src/config/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,10 @@ impl MerryConfig {
} else {
ProviderConfigSource::User
};
let reasoning_effort =
parse_provider_reasoning_effort(alias.as_str(), provider.reasoning_effort.as_deref())?;
let reasoning_effort = parse_reasoning_effort(
&format!("providers.{alias}.reasoning_effort"),
provider.reasoning_effort.as_deref(),
)?;
let service_tier =
parse_provider_service_tier(alias.as_str(), provider.service_tier.as_deref())?;
let protocol = match kind {
Expand Down Expand Up @@ -109,13 +111,11 @@ impl MerryConfig {
.and_then(|providers| providers.default.as_ref())
.filter(|default| default.provider == alias)
.and_then(|default| default.reasoning_effort.as_deref())
.map(ReasoningEffort::new)
.transpose()
.map_err(|error| {
ConfigError::Invalid(format!(
"providers.default.reasoning_effort is invalid: {error}"
))
})?;
.map(|effort| {
parse_reasoning_effort("providers.default.reasoning_effort", Some(effort))
})
.transpose()?
.flatten();

match default_reasoning_effort {
Some(reasoning_effort) => Ok(Some(reasoning_effort)),
Expand Down Expand Up @@ -246,8 +246,10 @@ impl MerryConfig {
.ok_or_else(|| ConfigError::Invalid(format!("[providers.{alias}] is required")))?;
let kind = provider.kind.as_deref().unwrap_or(alias);
let api_key = resolve_api_key_source(alias, provider, &self.config_dir, &self.home)?;
let reasoning_effort =
parse_provider_reasoning_effort(alias, provider.reasoning_effort.as_deref())?;
let reasoning_effort = parse_reasoning_effort(
&format!("providers.{alias}.reasoning_effort"),
provider.reasoning_effort.as_deref(),
)?;
let service_tier = parse_provider_service_tier(alias, provider.service_tier.as_deref())?;
let protocol = provider.protocol.unwrap_or_default();
match kind {
Expand Down Expand Up @@ -359,18 +361,19 @@ fn resolve_api_key_source(
Ok(api_key)
}

fn parse_provider_reasoning_effort(
alias: &str,
/// Parses one reasoning-effort config value under its own config path.
///
/// Every place that accepts a reasoning-effort string shares this, so the
/// accepted values and the diagnostic shape stay identical for providers,
/// provider defaults, and runtime compaction.
pub(super) fn parse_reasoning_effort(
field: &str,
value: Option<&str>,
) -> Result<Option<ReasoningEffort>, ConfigError> {
value
.map(ReasoningEffort::new)
.transpose()
.map_err(|error| {
ConfigError::Invalid(format!(
"providers.{alias}.reasoning_effort is invalid: {error}"
))
})
.map_err(|error| ConfigError::Invalid(format!("{field} is invalid: {error}")))
}

fn parse_provider_service_tier(
Expand Down
Loading
Loading