-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcomplexity.rs
More file actions
68 lines (55 loc) · 1.91 KB
/
Copy pathcomplexity.rs
File metadata and controls
68 lines (55 loc) · 1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Copyright (c) 2026 vectorless developers
// SPDX-License-Identifier: Apache-2.0
//! LLM-based query complexity detection.
//!
//! Uses the Pilot's LLM client to classify query complexity.
//! Falls back to heuristic rules when LLM is unavailable or fails.
use serde::Deserialize;
use super::super::complexity::QueryComplexity;
use crate::llm::LlmClient;
/// LLM response schema for complexity classification.
#[derive(Debug, Deserialize)]
struct ComplexityResponse {
complexity: String,
}
/// System prompt for complexity classification.
const SYSTEM_PROMPT: &str = include_str!("prompts/system_complexity.txt");
/// User prompt template.
const USER_PROMPT: &str = include_str!("prompts/user_complexity.txt");
/// Detect query complexity using LLM.
///
/// Returns `None` if the LLM call fails (caller should fall back to heuristic).
pub async fn detect_with_llm(client: &LlmClient, query: &str) -> Option<QueryComplexity> {
let user = USER_PROMPT.replace("{query}", query);
let resp: ComplexityResponse = client
.complete_json_with_max_tokens(SYSTEM_PROMPT, &user, 80)
.await
.ok()?;
let complexity = match resp.complexity.to_lowercase().as_str() {
"simple" => QueryComplexity::Simple,
"complex" => QueryComplexity::Complex,
_ => QueryComplexity::Medium,
};
tracing::debug!(
"LLM complexity detection: query='{}', result={:?}",
query,
complexity
);
Some(complexity)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_system_prompt_not_empty() {
assert!(!SYSTEM_PROMPT.is_empty());
assert!(SYSTEM_PROMPT.contains("simple"));
assert!(SYSTEM_PROMPT.contains("complex"));
}
#[test]
fn test_user_prompt_template() {
assert!(USER_PROMPT.contains("{query}"));
let filled = USER_PROMPT.replace("{query}", "test query");
assert!(filled.contains("test query"));
}
}