codetether_rlm/router/
fallback.rs1use super::truncate::smart_truncate;
4use crate::chunker::RlmChunker;
5use crate::result::RlmResult;
6use crate::stats::RlmStats;
7
8pub 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
38pub 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}