MCPcopy Create free account
hub / github.com/ChrisFeldmeier/OpenCodeRust / should_compact

Method should_compact

crates/opencode-session/src/prompt.rs:2150–2183  ·  view source on GitHub ↗
(
        messages: &[SessionMessage],
        provider: &dyn Provider,
        model_id: &str,
        max_output_tokens: Option<u64>,
    )

Source from the content-addressed store, hash-verified

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() {

Callers

nothing calls this directly

Calls 4

get_model_context_limitFunction · 0.85
newFunction · 0.85
get_modelMethod · 0.45
is_overflowMethod · 0.45

Tested by

no test coverage detected