(
messages: &[SessionMessage],
provider: &dyn Provider,
model_id: &str,
max_output_tokens: Option<u64>,
)
| 2148 | } |
| 2149 | |
| 2150 | fn should_compact( |
| 2151 | messages: &[SessionMessage], |
| 2152 | provider: &dyn Provider, |
| 2153 | model_id: &str, |
| 2154 | max_output_tokens: Option<u64>, |
| 2155 | ) -> bool { |
| 2156 | let usage = Self::token_usage_from_messages(messages); |
| 2157 | let model = provider.get_model(model_id); |
| 2158 | let limits = ModelLimits { |
| 2159 | context: model |
| 2160 | .map(|info| info.context_window) |
| 2161 | .unwrap_or_else(|| get_model_context_limit(model_id)), |
| 2162 | max_input: None, |
| 2163 | max_output: max_output_tokens |
| 2164 | .or_else(|| model.map(|info| info.max_output_tokens)) |
| 2165 | .unwrap_or(8192), |
| 2166 | }; |
| 2167 | let engine = CompactionEngine::new(CompactionConfig::default()); |
| 2168 | if engine.is_overflow(&usage, &limits) { |
| 2169 | return true; |
| 2170 | } |
| 2171 | |
| 2172 | let total_chars: usize = messages |
| 2173 | .iter() |
| 2174 | .flat_map(|m| m.parts.iter()) |
| 2175 | .filter_map(|p| match &p.part_type { |
| 2176 | PartType::Text { text, .. } => Some(text.len()), |
| 2177 | _ => None, |
| 2178 | }) |
| 2179 | .sum(); |
| 2180 | |
| 2181 | const MAX_CONTEXT_CHARS: usize = 200_000; |
| 2182 | total_chars > MAX_CONTEXT_CHARS |
| 2183 | } |
| 2184 | |
| 2185 | async fn ensure_title(session: &mut Session, provider: Arc<dyn Provider>, model_id: &str) { |
| 2186 | if !session.is_default_title() { |
nothing calls this directly
no test coverage detected