Skip to content

Commit c787be7

Browse files
committed
feat: add Instant reasoning effort level
Add ReasoningEffort::Instant variant for near-realtime responses. Map to None for OpenAI, "instant" for Chat Completions, and disabled thinking for Anthropic. Fix Low reasoning effort to map to "low" instead of "minimal" for OpenAI.
1 parent 7412516 commit c787be7

4 files changed

Lines changed: 29 additions & 3 deletions

File tree

src/core/language_model/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,8 @@ pub enum StopReason {
586586
/// Levels of reasoning effort for language models that support it.
587587
#[derive(Debug, Clone, Copy, Default)]
588588
pub enum ReasoningEffort {
589+
/// Instant/no reasoning — near-realtime responses.
590+
Instant,
589591
/// Low reasoning effort.
590592
#[default]
591593
Low,

src/providers/anthropic/conversions.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ impl From<LanguageModelOptions> for AnthropicOptions {
126126

127127
// convert reasoning to antropic thinking
128128
request.thinking(options.reasoning_effort.map(|effort| match effort {
129+
// Instant disables thinking entirely
130+
ReasoningEffort::Instant => AnthropicThinking::Disable,
129131
// Low is 25% of the max_tokens
130132
ReasoningEffort::Low => AnthropicThinking::Enable {
131133
budget_tokens: (max_tokens / 4) as usize,

src/providers/openai/conversions.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ impl From<types::ResponseUsage> for Usage {
171171
impl From<ReasoningEffort> for types::ReasoningEffort {
172172
fn from(value: ReasoningEffort) -> Self {
173173
match value {
174-
ReasoningEffort::Low => client::ReasoningEffort::Minimal,
174+
ReasoningEffort::Instant => client::ReasoningEffort::None,
175+
ReasoningEffort::Low => client::ReasoningEffort::Low,
175176
ReasoningEffort::Medium => client::ReasoningEffort::Medium,
176177
ReasoningEffort::High => client::ReasoningEffort::High,
177178
}
@@ -214,11 +215,18 @@ mod tests {
214215
LanguageModelOptions, ReasoningEffort as LMReasoningEffort, Usage,
215216
};
216217

218+
#[test]
219+
fn test_reasoning_effort_conversion_instant() {
220+
let effort = LMReasoningEffort::Instant;
221+
let openai_effort: ReasoningEffort = effort.into();
222+
assert_eq!(openai_effort, ReasoningEffort::None);
223+
}
224+
217225
#[test]
218226
fn test_reasoning_effort_conversion_low() {
219227
let effort = LMReasoningEffort::Low;
220228
let openai_effort: ReasoningEffort = effort.into();
221-
assert_eq!(openai_effort, ReasoningEffort::Minimal);
229+
assert_eq!(openai_effort, ReasoningEffort::Low);
222230
let _ = openai_effort;
223231
}
224232

@@ -236,6 +244,19 @@ mod tests {
236244
assert_eq!(openai_effort, ReasoningEffort::High);
237245
}
238246

247+
#[test]
248+
fn test_language_model_options_to_create_response_with_reasoning_effort_instant() {
249+
let options = LanguageModelOptions {
250+
reasoning_effort: Some(LMReasoningEffort::Instant),
251+
..Default::default()
252+
};
253+
let lm_options: OpenAILanguageModelOptions = options.into();
254+
assert!(lm_options.reasoning.is_some());
255+
let reasoning = lm_options.reasoning.unwrap();
256+
assert_eq!(reasoning.effort, Some(ReasoningEffort::None));
257+
assert_eq!(reasoning.summary, Some(SummaryType::Auto));
258+
}
259+
239260
#[test]
240261
fn test_language_model_options_to_create_response_with_reasoning_effort_low() {
241262
let options = LanguageModelOptions {
@@ -245,7 +266,7 @@ mod tests {
245266
let lm_options: OpenAILanguageModelOptions = options.into();
246267
assert!(lm_options.reasoning.is_some());
247268
let reasoning = lm_options.reasoning.unwrap();
248-
assert_eq!(reasoning.effort, Some(ReasoningEffort::Minimal));
269+
assert_eq!(reasoning.effort, Some(ReasoningEffort::Low));
249270
assert_eq!(reasoning.summary, Some(SummaryType::Auto));
250271
}
251272

src/providers/openai_chat_completions/conversions.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ impl From<LanguageModelOptions> for client::ChatCompletionsOptions {
7272

7373
let reasoning_effort = options.reasoning_effort.map(|effort| {
7474
match effort {
75+
ReasoningEffort::Instant => "instant",
7576
ReasoningEffort::Low => "low",
7677
ReasoningEffort::Medium => "medium",
7778
ReasoningEffort::High => "high",

0 commit comments

Comments
 (0)