diff --git a/Cargo.lock b/Cargo.lock index 4c9059ec5c5c1acd61c8bb562f44085dfcbd95f6..2f3bd8843256f1b217ae0e7835bf201666ee83af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,6 +22,7 @@ dependencies = [ "itertools 0.14.0", "language", "language_model", + "log", "markdown", "multi_buffer", "parking_lot", diff --git a/crates/acp_thread/Cargo.toml b/crates/acp_thread/Cargo.toml index 0dc8d7d447bbf3be370da7a3b69d43eb13702ba2..83cf86bfafc33e4d1b520ca5af04da626831aed7 100644 --- a/crates/acp_thread/Cargo.toml +++ b/crates/acp_thread/Cargo.toml @@ -30,6 +30,7 @@ gpui.workspace = true itertools.workspace = true language.workspace = true language_model.workspace = true +log.workspace = true markdown.workspace = true parking_lot = { workspace = true, optional = true } image = { workspace = true, optional = true } diff --git a/crates/acp_thread/src/acp_thread.rs b/crates/acp_thread/src/acp_thread.rs index 24c7ecb1a552b552a36bb84dee6e671981372134..57cad6348644725af58565467a80355114bc2300 100644 --- a/crates/acp_thread/src/acp_thread.rs +++ b/crates/acp_thread/src/acp_thread.rs @@ -885,6 +885,7 @@ pub struct TokenUsage { pub used_tokens: u64, pub input_tokens: u64, pub output_tokens: u64, + pub max_output_tokens: Option, } impl TokenUsage { @@ -1953,11 +1954,13 @@ impl AcpThread { Ok(Err(e)) => { this.send_task.take(); cx.emit(AcpThreadEvent::Error); + log::error!("Error in run turn: {:?}", e); Err(e) } Ok(Ok(r)) if r.stop_reason == acp::StopReason::MaxTokens => { this.send_task.take(); cx.emit(AcpThreadEvent::Error); + log::error!("Max tokens reached. Usage: {:?}", this.token_usage); Err(anyhow!("Max tokens reached")) } result => { diff --git a/crates/agent/src/tests/mod.rs b/crates/agent/src/tests/mod.rs index 07f3447903c05afb3eb8cc1308eaf951fe524d02..232c626135b2128e62f15698d2387b7575202ca3 100644 --- a/crates/agent/src/tests/mod.rs +++ b/crates/agent/src/tests/mod.rs @@ -2736,6 +2736,7 @@ async fn test_truncate_first_message(cx: &mut TestAppContext) { Some(acp_thread::TokenUsage { used_tokens: 32_000 + 16_000, max_tokens: 1_000_000, + max_output_tokens: None, input_tokens: 32_000, output_tokens: 16_000, }) @@ -2797,6 +2798,7 @@ async fn test_truncate_first_message(cx: &mut TestAppContext) { Some(acp_thread::TokenUsage { used_tokens: 40_000 + 20_000, max_tokens: 1_000_000, + max_output_tokens: None, input_tokens: 40_000, output_tokens: 20_000, }) @@ -2847,6 +2849,7 @@ async fn test_truncate_second_message(cx: &mut TestAppContext) { Some(acp_thread::TokenUsage { used_tokens: 32_000 + 16_000, max_tokens: 1_000_000, + max_output_tokens: None, input_tokens: 32_000, output_tokens: 16_000, }) @@ -2903,6 +2906,7 @@ async fn test_truncate_second_message(cx: &mut TestAppContext) { Some(acp_thread::TokenUsage { used_tokens: 40_000 + 20_000, max_tokens: 1_000_000, + max_output_tokens: None, input_tokens: 40_000, output_tokens: 20_000, }) diff --git a/crates/agent/src/thread.rs b/crates/agent/src/thread.rs index 8e76291854e88524790acc321b72df707b718910..965898f362f028017b6ae3d1daafe7401c64eb8b 100644 --- a/crates/agent/src/thread.rs +++ b/crates/agent/src/thread.rs @@ -1507,6 +1507,7 @@ impl Thread { let model = self.model.clone()?; Some(acp_thread::TokenUsage { max_tokens: model.max_token_count(), + max_output_tokens: model.max_output_tokens(), used_tokens: usage.total_tokens(), input_tokens: usage.input_tokens, output_tokens: usage.output_tokens,