mirror of
https://github.com/instructkr/claude-code.git
synced 2026-04-06 19:28:49 +03:00
Merge remote-tracking branch 'origin/rcc/cache-tracking' into integration/dori-cleanroom
This commit is contained in:
@@ -32,9 +32,19 @@ pub enum AssistantEvent {
|
||||
input: String,
|
||||
},
|
||||
Usage(TokenUsage),
|
||||
PromptCache(PromptCacheEvent),
|
||||
MessageStop,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct PromptCacheEvent {
|
||||
pub unexpected: bool,
|
||||
pub reason: String,
|
||||
pub previous_cache_read_input_tokens: u32,
|
||||
pub current_cache_read_input_tokens: u32,
|
||||
pub token_drop: u32,
|
||||
}
|
||||
|
||||
pub trait ApiClient {
|
||||
fn stream(&mut self, request: ApiRequest) -> Result<Vec<AssistantEvent>, RuntimeError>;
|
||||
}
|
||||
@@ -91,6 +101,7 @@ impl std::error::Error for RuntimeError {}
|
||||
pub struct TurnSummary {
|
||||
pub assistant_messages: Vec<ConversationMessage>,
|
||||
pub tool_results: Vec<ConversationMessage>,
|
||||
pub prompt_cache_events: Vec<PromptCacheEvent>,
|
||||
pub iterations: usize,
|
||||
pub usage: TokenUsage,
|
||||
pub auto_compaction: Option<AutoCompactionEvent>,
|
||||
@@ -284,6 +295,7 @@ where
|
||||
|
||||
let mut assistant_messages = Vec::new();
|
||||
let mut tool_results = Vec::new();
|
||||
let mut prompt_cache_events = Vec::new();
|
||||
let mut iterations = 0;
|
||||
|
||||
loop {
|
||||
@@ -317,6 +329,7 @@ where
|
||||
if let Some(usage) = usage {
|
||||
self.usage_tracker.record(usage);
|
||||
}
|
||||
prompt_cache_events.extend(turn_prompt_cache_events);
|
||||
let pending_tool_uses = assistant_message
|
||||
.blocks
|
||||
.iter()
|
||||
@@ -435,6 +448,7 @@ where
|
||||
Ok(TurnSummary {
|
||||
assistant_messages,
|
||||
tool_results,
|
||||
prompt_cache_events,
|
||||
iterations,
|
||||
usage: self.usage_tracker.cumulative_usage(),
|
||||
auto_compaction,
|
||||
@@ -534,9 +548,17 @@ fn parse_auto_compaction_threshold(value: Option<&str>) -> u32 {
|
||||
|
||||
fn build_assistant_message(
|
||||
events: Vec<AssistantEvent>,
|
||||
) -> Result<(ConversationMessage, Option<TokenUsage>), RuntimeError> {
|
||||
) -> Result<
|
||||
(
|
||||
ConversationMessage,
|
||||
Option<TokenUsage>,
|
||||
Vec<PromptCacheEvent>,
|
||||
),
|
||||
RuntimeError,
|
||||
> {
|
||||
let mut text = String::new();
|
||||
let mut blocks = Vec::new();
|
||||
let mut prompt_cache_events = Vec::new();
|
||||
let mut finished = false;
|
||||
let mut usage = None;
|
||||
|
||||
@@ -548,6 +570,7 @@ fn build_assistant_message(
|
||||
blocks.push(ContentBlock::ToolUse { id, name, input });
|
||||
}
|
||||
AssistantEvent::Usage(value) => usage = Some(value),
|
||||
AssistantEvent::PromptCache(event) => prompt_cache_events.push(event),
|
||||
AssistantEvent::MessageStop => {
|
||||
finished = true;
|
||||
}
|
||||
@@ -568,6 +591,7 @@ fn build_assistant_message(
|
||||
Ok((
|
||||
ConversationMessage::assistant_with_usage(blocks, usage),
|
||||
usage,
|
||||
prompt_cache_events,
|
||||
))
|
||||
}
|
||||
|
||||
@@ -700,6 +724,15 @@ mod tests {
|
||||
cache_creation_input_tokens: 1,
|
||||
cache_read_input_tokens: 3,
|
||||
}),
|
||||
AssistantEvent::PromptCache(PromptCacheEvent {
|
||||
unexpected: true,
|
||||
reason:
|
||||
"cache read tokens dropped while prompt fingerprint remained stable"
|
||||
.to_string(),
|
||||
previous_cache_read_input_tokens: 6_000,
|
||||
current_cache_read_input_tokens: 1_000,
|
||||
token_drop: 5_000,
|
||||
}),
|
||||
AssistantEvent::MessageStop,
|
||||
])
|
||||
}
|
||||
@@ -753,6 +786,7 @@ mod tests {
|
||||
assert_eq!(summary.iterations, 2);
|
||||
assert_eq!(summary.assistant_messages.len(), 2);
|
||||
assert_eq!(summary.tool_results.len(), 1);
|
||||
assert_eq!(summary.prompt_cache_events.len(), 1);
|
||||
assert_eq!(runtime.session().messages.len(), 4);
|
||||
assert_eq!(summary.usage.output_tokens, 10);
|
||||
assert_eq!(summary.auto_compaction, None);
|
||||
|
||||
Reference in New Issue
Block a user