Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 271e3d6

Browse files
tusharmathforge-code-agent
authored andcommitted
feat(api): add get and set reasoning effort methods for API and services
1 parent 7c1ee66 commit 271e3d6

15 files changed

Lines changed: 194 additions & 7 deletions

File tree

crates/forge_api/src/api.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use anyhow::Result;
44
use forge_app::dto::ToolsOverview;
55
use forge_app::{User, UserUsage};
66
use forge_config::ForgeConfig;
7-
use forge_domain::{AgentId, ModelId, ProviderModels};
7+
use forge_domain::{AgentId, Effort, ModelId, ProviderModels};
88
use forge_stream::MpscStream;
99
use futures::stream::BoxStream;
1010
use url::Url;
@@ -166,6 +166,12 @@ pub trait API: Sync + Send {
166166
/// suggestion generation).
167167
async fn set_suggest_config(&self, config: forge_domain::SuggestConfig) -> anyhow::Result<()>;
168168

169+
/// Gets the current reasoning effort setting.
170+
async fn get_reasoning_effort(&self) -> anyhow::Result<Option<Effort>>;
171+
172+
/// Sets the reasoning effort level applied to all agents.
173+
async fn set_reasoning_effort(&self, effort: Effort) -> anyhow::Result<()>;
174+
169175
/// Refresh MCP caches by fetching fresh data
170176
async fn reload_mcp(&self) -> Result<()>;
171177

crates/forge_api/src/forge_api.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,14 @@ impl<A: Services, F: CommandInfra + EnvironmentInfra + SkillRepository + GrpcInf
294294
self.services.set_suggest_config(config).await
295295
}
296296

297+
async fn get_reasoning_effort(&self) -> anyhow::Result<Option<Effort>> {
298+
self.services.get_reasoning_effort().await
299+
}
300+
301+
async fn set_reasoning_effort(&self, effort: Effort) -> anyhow::Result<()> {
302+
self.services.set_reasoning_effort(effort).await
303+
}
304+
297305
async fn reload_mcp(&self) -> Result<()> {
298306
self.services.mcp_service().reload_mcp().await
299307
}

crates/forge_app/src/command_generator.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,14 @@ mod tests {
288288
async fn set_suggest_config(&self, _config: forge_domain::SuggestConfig) -> Result<()> {
289289
Ok(())
290290
}
291+
292+
async fn get_reasoning_effort(&self) -> Result<Option<forge_domain::Effort>> {
293+
Ok(None)
294+
}
295+
296+
async fn set_reasoning_effort(&self, _effort: forge_domain::Effort) -> Result<()> {
297+
Ok(())
298+
}
291299
}
292300

293301
#[tokio::test]

crates/forge_app/src/services.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ pub trait AppConfigService: Send + Sync {
226226
/// Sets the suggest configuration (provider and model for command
227227
/// suggestion generation).
228228
async fn set_suggest_config(&self, config: forge_domain::SuggestConfig) -> anyhow::Result<()>;
229+
230+
/// Gets the current reasoning effort setting.
231+
async fn get_reasoning_effort(&self) -> anyhow::Result<Option<forge_domain::Effort>>;
232+
233+
/// Sets the reasoning effort level applied to all agents.
234+
async fn set_reasoning_effort(&self, effort: forge_domain::Effort) -> anyhow::Result<()>;
229235
}
230236

231237
#[async_trait::async_trait]
@@ -984,6 +990,14 @@ impl<I: Services> AppConfigService for I {
984990
async fn set_suggest_config(&self, config: forge_domain::SuggestConfig) -> anyhow::Result<()> {
985991
self.config_service().set_suggest_config(config).await
986992
}
993+
994+
async fn get_reasoning_effort(&self) -> anyhow::Result<Option<forge_domain::Effort>> {
995+
self.config_service().get_reasoning_effort().await
996+
}
997+
998+
async fn set_reasoning_effort(&self, effort: forge_domain::Effort) -> anyhow::Result<()> {
999+
self.config_service().set_reasoning_effort(effort).await
1000+
}
9871001
}
9881002

9891003
#[async_trait::async_trait]

crates/forge_domain/src/agent.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use derive_setters::Setters;
55
use merge::Merge;
66
use schemars::JsonSchema;
77
use serde::{Deserialize, Serialize};
8-
use strum_macros::Display as StrumDisplay;
8+
use strum_macros::{Display as StrumDisplay, EnumString};
99

1010
use crate::{
1111
Compact, Error, EventContext, MaxTokens, ModelId, ProviderId, Result, SystemContext,
@@ -71,9 +71,9 @@ pub struct ReasoningConfig {
7171
pub enabled: Option<bool>,
7272
}
7373

74-
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, StrumDisplay)]
74+
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, StrumDisplay, EnumString)]
7575
#[serde(rename_all = "lowercase")]
76-
#[strum(serialize_all = "lowercase")]
76+
#[strum(serialize_all = "lowercase", ascii_case_insensitive)]
7777
pub enum Effort {
7878
/// No reasoning; skips the thinking step entirely.
7979
None,

crates/forge_domain/src/env.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use derive_more::Display;
55
use derive_setters::Setters;
66
use serde::{Deserialize, Serialize};
77

8-
use crate::{ModelId, ProviderId};
8+
use crate::{Effort, ModelId, ProviderId};
99

1010
/// Domain-level session configuration pairing a provider with a model.
1111
///
@@ -35,6 +35,8 @@ pub enum ConfigOperation {
3535
SetCommitConfig(crate::CommitConfig),
3636
/// Set the shell-command suggestion configuration.
3737
SetSuggestConfig(crate::SuggestConfig),
38+
/// Set the reasoning effort level for all agents.
39+
SetReasoningEffort(Effort),
3840
}
3941

4042
const VERSION: &str = match option_env!("APP_VERSION") {

crates/forge_infra/src/env.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,21 @@ fn apply_config_op(fc: &mut ForgeConfig, op: ConfigOperation) {
6767
model_id: Some(suggest.model.to_string()),
6868
});
6969
}
70+
ConfigOperation::SetReasoningEffort(effort) => {
71+
let config_effort = match effort {
72+
forge_domain::Effort::None => forge_config::Effort::None,
73+
forge_domain::Effort::Minimal => forge_config::Effort::Minimal,
74+
forge_domain::Effort::Low => forge_config::Effort::Low,
75+
forge_domain::Effort::Medium => forge_config::Effort::Medium,
76+
forge_domain::Effort::High => forge_config::Effort::High,
77+
forge_domain::Effort::XHigh => forge_config::Effort::XHigh,
78+
forge_domain::Effort::Max => forge_config::Effort::Max,
79+
};
80+
let reasoning = fc
81+
.reasoning
82+
.get_or_insert_with(forge_config::ReasoningConfig::default);
83+
reasoning.effort = Some(config_effort);
84+
}
7085
}
7186
}
7287

crates/forge_main/src/built_in_commands.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@
2323
"command": "model-reset",
2424
"description": "Reset session model to use global config [alias: mr]"
2525
},
26+
{
27+
"command": "reasoning-effort",
28+
"description": "Set reasoning effort for the current session only [alias: re]"
29+
},
30+
{
31+
"command": "config-reasoning-effort",
32+
"description": "Set the reasoning effort level in global config [alias: cre]"
33+
},
2634
{
2735
"command": "config-commit-model",
2836
"description": "Set the model used for commit message generation [alias: ccm]"

crates/forge_main/src/cli.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use std::path::PathBuf;
99

1010
use clap::{Parser, Subcommand, ValueEnum};
11-
use forge_domain::{AgentId, ConversationId, ModelId, ProviderId};
11+
use forge_domain::{AgentId, ConversationId, Effort, ModelId, ProviderId};
1212

1313
#[derive(Parser)]
1414
#[command(version = env!("CARGO_PKG_VERSION"))]
@@ -542,6 +542,11 @@ pub enum ConfigSetField {
542542
/// Model ID to use for command suggestion generation.
543543
model: ModelId,
544544
},
545+
/// Set the reasoning effort level applied to all agents.
546+
ReasoningEffort {
547+
/// Effort level: none, minimal, low, medium, high, xhigh, max.
548+
effort: Effort,
549+
},
545550
}
546551

547552
/// Type-safe subcommands for `forge config get`.
@@ -555,6 +560,8 @@ pub enum ConfigGetField {
555560
Commit,
556561
/// Get the command suggestion generation config.
557562
Suggest,
563+
/// Get the reasoning effort level.
564+
ReasoningEffort,
558565
}
559566

560567
/// Command group for conversation management.

crates/forge_main/src/ui.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3488,6 +3488,13 @@ impl<A: API + ConsoleWriter + 'static, F: Fn() -> A + Send + Sync> UI<A, F> {
34883488
format!("is now the suggest model for provider '{provider}'"),
34893489
))?;
34903490
}
3491+
ConfigSetField::ReasoningEffort { effort } => {
3492+
self.api.set_reasoning_effort(effort.clone()).await?;
3493+
self.writeln_title(
3494+
TitleFormat::action(effort.to_string())
3495+
.sub_title("is now the reasoning effort"),
3496+
)?;
3497+
}
34913498
}
34923499

34933500
Ok(())
@@ -3549,6 +3556,13 @@ impl<A: API + ConsoleWriter + 'static, F: Fn() -> A + Send + Sync> UI<A, F> {
35493556
None => self.writeln("Suggest: Not set")?,
35503557
}
35513558
}
3559+
ConfigGetField::ReasoningEffort => {
3560+
let effort = self.api.get_reasoning_effort().await?;
3561+
match effort {
3562+
Some(e) => self.writeln(e.to_string())?,
3563+
None => self.writeln("ReasoningEffort: Not set")?,
3564+
}
3565+
}
35523566
}
35533567

35543568
Ok(())

0 commit comments

Comments
 (0)