Skip to content

Commit ea4098c

Browse files
authored
feat(claude_model): add effort variable (#7614)
1 parent d2db83a commit ea4098c

5 files changed

Lines changed: 77 additions & 6 deletions

File tree

docs/advanced-config/README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -426,12 +426,13 @@ The `claude_model` module displays the current Claude model being used in the se
426426

427427
#### Variables
428428

429-
| Variable | Example | Description |
430-
| -------- | ------------------- | ------------------------------------- |
431-
| model | `Claude 3.5 Sonnet` | The display name of the current model |
432-
| model_id | `claude-3-5-sonnet` | The model ID |
433-
| symbol | | Mirrors the value of option `symbol` |
434-
| style\* | | Mirrors the value of option `style` |
429+
| Variable | Example | Description |
430+
| -------- | ------------------- | --------------------------------------- |
431+
| model | `Claude 3.5 Sonnet` | The display name of the current model |
432+
| model_id | `claude-3-5-sonnet` | The model ID |
433+
| effort | `high` | The reasoning effort level, if reported |
434+
| symbol | | Mirrors the value of option `symbol` |
435+
| style\* | | Mirrors the value of option `style` |
435436

436437
\*: This variable can only be used as a part of a style string
437438

src/modules/claude_context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ mod tests {
209209
},
210210
cost: None,
211211
workspace: None,
212+
effort: None,
212213
}
213214
}
214215

src/modules/claude_cost.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ mod tests {
179179
total_lines_removed: 500,
180180
}),
181181
workspace: None,
182+
effort: None,
182183
}
183184
}
184185

src/modules/claude_model.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
3838
.map(|variable| match variable {
3939
"model" => Some(Ok(model_display)),
4040
"model_id" => Some(Ok(claude_data.model.id.as_str())),
41+
"effort" => claude_data.effort.as_ref().map(|e| Ok(e.level.as_str())),
4142
_ => None,
4243
})
4344
.parse(None, Some(context))
@@ -76,6 +77,7 @@ mod tests {
7677
context_window: crate::context::ContextWindow::default(),
7778
cost: None,
7879
workspace: None,
80+
effort: None,
7981
};
8082
let actual = ModuleRenderer::new("claude_model")
8183
.config(toml::toml! {
@@ -98,6 +100,7 @@ mod tests {
98100
context_window: crate::context::ContextWindow::default(),
99101
cost: None,
100102
workspace: None,
103+
effort: None,
101104
};
102105

103106
let actual = ModuleRenderer::new("claude_model")
@@ -125,6 +128,7 @@ mod tests {
125128
context_window: crate::context::ContextWindow::default(),
126129
cost: None,
127130
workspace: None,
131+
effort: None,
128132
};
129133

130134
let actual = ModuleRenderer::new("claude_model")
@@ -142,6 +146,62 @@ mod tests {
142146
assert_eq!(actual, expected);
143147
}
144148

149+
#[test]
150+
fn test_effort_level() {
151+
let data = crate::context::ClaudeCodeData {
152+
cwd: None,
153+
model: crate::context::ModelInfo {
154+
id: "claude-opus-4-8".to_string(),
155+
display_name: "Opus 4.8".to_string(),
156+
},
157+
context_window: crate::context::ContextWindow::default(),
158+
cost: None,
159+
workspace: None,
160+
effort: Some(crate::utils::statusline::EffortInfo {
161+
level: "high".to_string(),
162+
}),
163+
};
164+
165+
let actual = ModuleRenderer::new("claude_model")
166+
.config(toml::toml! {
167+
[claude_model]
168+
symbol = ""
169+
format = "[$model $effort]($style)"
170+
})
171+
.claude_code_data(data)
172+
.collect();
173+
174+
let expected = Some(format!("{}", Color::Blue.bold().paint("Opus 4.8 high")));
175+
assert_eq!(actual, expected);
176+
}
177+
178+
#[test]
179+
fn test_effort_absent_omits_variable() {
180+
let data = crate::context::ClaudeCodeData {
181+
cwd: None,
182+
model: crate::context::ModelInfo {
183+
id: "claude-opus-4-8".to_string(),
184+
display_name: "Opus 4.8".to_string(),
185+
},
186+
context_window: crate::context::ContextWindow::default(),
187+
cost: None,
188+
workspace: None,
189+
effort: None,
190+
};
191+
192+
let actual = ModuleRenderer::new("claude_model")
193+
.config(toml::toml! {
194+
[claude_model]
195+
symbol = ""
196+
format = "[$model( \\($effort\\))]($style)"
197+
})
198+
.claude_code_data(data)
199+
.collect();
200+
201+
let expected = Some(format!("{}", Color::Blue.bold().paint("Opus 4.8")));
202+
assert_eq!(actual, expected);
203+
}
204+
145205
#[test]
146206
fn test_alias_by_display_name() {
147207
let data = crate::context::ClaudeCodeData {
@@ -153,6 +213,7 @@ mod tests {
153213
context_window: crate::context::ContextWindow::default(),
154214
cost: None,
155215
workspace: None,
216+
effort: None,
156217
};
157218

158219
let actual = ModuleRenderer::new("claude_model")

src/utils/statusline.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ pub struct ClaudeCodeData {
2020
pub context_window: ContextWindow,
2121
pub cost: Option<CostInfo>,
2222
pub workspace: Option<Workspace>,
23+
pub effort: Option<EffortInfo>,
24+
}
25+
26+
#[derive(Deserialize, Debug, Clone, Default)]
27+
#[serde(default)]
28+
pub struct EffortInfo {
29+
pub level: String,
2330
}
2431

2532
#[derive(Deserialize, Debug, Clone, Default)]

0 commit comments

Comments
 (0)