Skip to main content

codetether_rlm/router/
fallback.rs

1//! Fallback result builders.
2
3use super::truncate::smart_truncate;
4use crate::chunker::RlmChunker;
5use crate::result::RlmResult;
6use crate::stats::RlmStats;
7
8/// Build a fallback `RlmResult` (truncation only, no LLM call).
9pub fn fallback_result(
10    output: &str,
11    tool_id: &str,
12    tool_args: &serde_json::Value,
13    input_tokens: usize,
14) -> RlmResult {
15    let (truncated, _, _) = smart_truncate(output, tool_id, tool_args, 8000);
16    let out_tok = RlmChunker::estimate_tokens(&truncated);
17    RlmResult {
18        processed: format!("[RLM processing failed, showing truncated output]\n\n{truncated}"),
19        stats: RlmStats {
20            input_tokens,
21            output_tokens: out_tok,
22            iterations: 0,
23            subcalls: 0,
24            elapsed_ms: 0,
25            compression_ratio: if out_tok == 0 {
26                0.0
27            } else {
28                out_tok as f64 / input_tokens as f64
29            },
30        },
31        success: false,
32        error: Some("Model call failed".into()),
33        trace: None,
34        trace_id: None,
35    }
36}
37
38/// Enhanced fallback — structured excerpt depending on tool type.
39pub fn enhanced_fallback(
40    output: &str,
41    tool_id: &str,
42    tool_args: &serde_json::Value,
43    input_tokens: usize,
44) -> String {
45    if tool_id == "session_context" {
46        super::fallback_context::session_context_fallback(output, input_tokens)
47    } else {
48        let (truncated, _, _) = smart_truncate(output, tool_id, tool_args, 8000);
49        format!(
50            "## Fallback Summary\n*RLM processing failed - showing structured excerpt*\n\n{truncated}"
51        )
52    }
53}