vtcode_core/config/
router.rs

1use serde::{Deserialize, Serialize};
2
3/// Budget awareness for routing decisions
4#[derive(Debug, Clone, Deserialize, Serialize, Default)]
5pub struct ResourceBudget {
6    /// Max tokens per request (soft cap)
7    #[serde(default)]
8    pub max_tokens: Option<usize>,
9    /// Maximum parallel tool calls allowed
10    #[serde(default)]
11    pub max_parallel_tools: Option<usize>,
12    /// Max latency target in milliseconds (advisory)
13    #[serde(default)]
14    pub latency_ms_target: Option<u64>,
15}
16
17/// Map from a complexity label to a model identifier
18#[derive(Debug, Clone, Deserialize, Serialize, Default)]
19pub struct ComplexityModelMap {
20    /// Simple, quick tasks
21    #[serde(default)]
22    pub simple: String,
23    /// Standard single-turn tasks
24    #[serde(default)]
25    pub standard: String,
26    /// Complex, multi-step reasoning
27    #[serde(default)]
28    pub complex: String,
29    /// Code-generation heavy tasks (diffs, patches)
30    #[serde(default)]
31    pub codegen_heavy: String,
32    /// Retrieval/search heavy tasks
33    #[serde(default)]
34    pub retrieval_heavy: String,
35}
36
37/// Router configuration for dynamic model/engine selection
38#[derive(Debug, Clone, Deserialize, Serialize)]
39pub struct RouterConfig {
40    /// Enable router decisions for chat/ask commands
41    #[serde(default = "default_enabled")]
42    pub enabled: bool,
43    /// Use heuristics to classify complexity (no extra LLM call)
44    #[serde(default = "default_true")]
45    pub heuristic_classification: bool,
46    /// Optional: allow an LLM-based router step
47    #[serde(default)]
48    pub llm_router_model: String,
49    /// Model mapping per complexity class
50    #[serde(default)]
51    pub models: ComplexityModelMap,
52    /// Budgets used to guide generation parameters per class
53    #[serde(default)]
54    pub budgets: std::collections::HashMap<String, ResourceBudget>,
55}
56
57impl Default for RouterConfig {
58    fn default() -> Self {
59        use crate::config::constants::models;
60        Self {
61            enabled: true,
62            heuristic_classification: true,
63            llm_router_model: String::new(),
64            models: ComplexityModelMap {
65                simple: models::google::GEMINI_2_5_FLASH_PREVIEW.to_string(),
66                standard: models::google::GEMINI_2_5_FLASH_PREVIEW.to_string(),
67                complex: models::google::GEMINI_2_5_PRO.to_string(),
68                codegen_heavy: models::google::GEMINI_2_5_PRO.to_string(),
69                retrieval_heavy: models::google::GEMINI_2_5_PRO.to_string(),
70            },
71            budgets: Default::default(),
72        }
73    }
74}
75
76fn default_true() -> bool {
77    true
78}
79fn default_enabled() -> bool {
80    true
81}