Skip to main content

qualia_cli/cli/
llm.rs

1use clap::Subcommand;
2use std::path::PathBuf;
3
4#[derive(Subcommand, Debug)]
5pub enum LlmAction {
6    List {
7        #[arg(short, long)]
8        vault_path: Option<PathBuf>,
9    },
10    Duplicates {
11        #[arg(long)]
12        vault_path: Option<PathBuf>,
13    },
14    Load {
15        model: String,
16        #[arg(short, long)]
17        vault_path: Option<PathBuf>,
18    },
19    Status,
20    Eval {
21        prompt: String,
22        #[arg(long)]
23        orchestrated: bool,
24        #[arg(long)]
25        stream: bool,
26        #[arg(long)]
27        lora: Option<PathBuf>,
28    },
29    Evict {
30        model_id: String,
31    },
32    Test {
33        #[arg(short, long)]
34        vault_path: Option<PathBuf>,
35        #[arg(long, value_delimiter = ',')]
36        models: Option<Vec<String>>,
37        #[arg(long)]
38        quantization: Option<String>,
39        #[arg(long, id = "test_verbose")]
40        verbose: bool,
41    },
42    Validate {
43        #[arg(short, long)]
44        vault_path: Option<PathBuf>,
45        #[arg(long)]
46        strict: bool,
47    },
48    ComprehensiveTest {
49        #[arg(short, long)]
50        vault_path: Option<PathBuf>,
51        model: String,
52        #[arg(long, id = "comprehensive_verbose")]
53        verbose: bool,
54    },
55    Benchmark {
56        #[arg(short, long)]
57        vault_path: Option<PathBuf>,
58        #[arg(long, value_delimiter = ',')]
59        models: Option<Vec<String>>,
60        #[arg(long)]
61        iterations: Option<u32>,
62        #[arg(long)]
63        warmup: Option<u32>,
64    },
65    Report {
66        #[arg(short, long)]
67        vault_path: Option<PathBuf>,
68        #[arg(long)]
69        output: Option<PathBuf>,
70        #[arg(long)]
71        format: Option<String>,
72    },
73    Convert {
74        input: PathBuf,
75        #[arg(short, long)]
76        out: PathBuf,
77        #[arg(long, default_value_t = 14)]
78        page_log2: u16,
79        #[arg(long, default_value = "auto")]
80        layout: String,
81    },
82    Optimize {
83        input: PathBuf,
84        #[arg(short, long)]
85        out: Option<PathBuf>,
86        #[arg(long)]
87        skip_passport: bool,
88    },
89    Passport {
90        #[arg(long)]
91        reprobe: bool,
92        #[arg(long, default_value_t = 2048)]
93        gemv_n: usize,
94        #[arg(long)]
95        cache: Option<PathBuf>,
96        #[arg(long)]
97        apply_env_hint: bool,
98        #[arg(long)]
99        decode_proxy: Option<Option<PathBuf>>,
100        #[arg(long, default_value_t = 16)]
101        decode_proxy_tokens: u32,
102    },
103    DecodeProxy {
104        model: PathBuf,
105        #[arg(long, default_value_t = 16)]
106        tokens: u32,
107    },
108    /// Fixed-step model-only decoder benchmark (no product helpers, EOS, or fallback).
109    RawDecodeBench {
110        model: PathBuf,
111        #[arg(long, default_value_t = 256)]
112        steps: u32,
113        #[arg(long, default_value_t = 1)]
114        warmups: u16,
115        #[arg(long, default_value_t = 5)]
116        runs: u16,
117        #[arg(long, default_value = "Q8_0")]
118        quantization: String,
119        #[arg(long, default_value = "Write a sequence of distinct short words:")]
120        prompt: String,
121        /// Deterministically cycle the encoded prompt to exactly this many prefill tokens.
122        #[arg(long)]
123        target_prompt_tokens: Option<u32>,
124        /// Explicit evidence directory to create. It must not already exist.
125        #[arg(long)]
126        retain_artifacts: Option<PathBuf>,
127    },
128    Mode {
129        name: Option<String>,
130    },
131    PathSelect {
132        #[arg(long)]
133        reprobe: bool,
134        #[arg(long)]
135        apply: bool,
136    },
137    Profile {
138        name: Option<String>,
139    },
140    Lab {
141        action: String,
142        #[arg(long)]
143        model: Option<PathBuf>,
144        #[arg(long, default_value_t = 0)]
145        tokens: u32,
146        #[arg(long, default_value_t = 256)]
147        n_in: usize,
148        #[arg(long, default_value_t = 64)]
149        n_out: usize,
150        #[arg(long, default_value_t = 512)]
151        gemv_n: usize,
152        #[arg(long)]
153        out: Option<PathBuf>,
154        #[arg(long, default_value_t = 2.0)]
155        hours: f64,
156        #[arg(long, default_value_t = 8)]
157        max_generations: u32,
158        #[arg(long)]
159        ollama_model: Option<String>,
160        #[arg(long, default_value = "http://127.0.0.1:11434")]
161        ollama_url: String,
162        #[arg(long, default_value_t = false)]
163        no_ollama: bool,
164    },
165    Ground {
166        prompt: String,
167        answer: String,
168    },
169    SeedGrounding,
170    CudaTcBench {
171        #[arg(long, default_value_t = 256)]
172        side: usize,
173    },
174    Explore {
175        input: PathBuf,
176        #[arg(short, long)]
177        out: Option<PathBuf>,
178        #[arg(long, default_value_t = 16)]
179        tokens: u32,
180        #[arg(long, default_value = "auto")]
181        layouts: String,
182        #[arg(long)]
183        skip_convert: bool,
184        #[arg(long)]
185        sweep_ffn_f16: bool,
186        #[arg(long)]
187        modes: Option<String>,
188    },
189}