pub const BACKEND_VALUES: [&str; 3] = ["cuda", "cpu", "wgpu"];
#[derive(clap::Args, Debug, Clone, Default, PartialEq, Eq)]
pub struct BackendArg {
#[arg(long, value_name = "BACKEND", value_parser = BACKEND_VALUES)]
pub backend: Option<String>,
}
pub const FINETUNE_GPU_BACKEND_VALUES: [&str; 3] = ["auto", "cuda", "wgpu"];
pub const DISTILL_BACKEND_VALUES: [&str; 2] = ["fixture", "cuda"];
pub const TRACE_LEVEL_VALUES: [&str; 5] = ["none", "basic", "layer", "payload", "chrome"];
pub const RUN_FORMAT_VALUES: [&str; 4] = ["text", "json", "srt", "vtt"];
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum, Default)]
pub enum CodeOutputFormat {
#[default]
Text,
Json,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum, Default)]
pub enum CodeInputFormat {
#[default]
Text,
Json,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Run {
#[arg(value_name = "SOURCE")]
source: String,
#[arg(value_name = "PROMPT")]
positional_prompt: Option<String>,
#[arg(short, long)]
input: Option<PathBuf>,
#[arg(short, long)]
prompt: Option<String>,
#[arg(short = 'n', long, default_value = "32")]
max_tokens: usize,
#[arg(long)]
stream: bool,
#[arg(short, long)]
language: Option<String>,
#[arg(short, long)]
task: Option<String>,
#[arg(short = 'f', long, default_value = "text", value_parser = RUN_FORMAT_VALUES)]
format: String,
#[arg(long, alias = "cpu", conflicts_with = "gpu")]
no_gpu: bool,
#[arg(long, conflicts_with = "no_gpu")]
gpu: bool,
#[arg(long)]
offline: bool,
#[arg(long)]
benchmark: bool,
#[arg(long)]
trace: bool,
#[arg(long, value_delimiter = ',')]
trace_steps: Option<Vec<String>>,
#[arg(long)]
trace_verbose: bool,
#[arg(long, value_name = "FILE")]
trace_output: Option<PathBuf>,
#[arg(long, value_name = "LEVEL", default_value = "basic", value_parser = TRACE_LEVEL_VALUES)]
trace_level: String,
#[arg(long)]
trace_payload: bool,
#[arg(long)]
profile: bool,
#[arg(long)]
chat: bool,
#[arg(long, default_value = "0.0")]
temperature: f32,
#[arg(long, default_value = "1")]
top_k: usize,
#[arg(long)]
top_p: Option<f32>,
#[arg(long, default_value = "299792458")]
seed: u64,
#[arg(long, default_value = "1.0")]
repeat_penalty: f32,
#[arg(long, default_value = "64")]
repeat_last_n: usize,
#[arg(long)]
split_prompt: bool,
#[arg(long, value_name = "FILE")]
batch_jsonl: Option<PathBuf>,
#[arg(short, long)]
verbose: bool,
#[command(flatten)]
backend: BackendArg,
},
Serve {
#[command(subcommand)]
command: ServeCommands,
},
Inspect {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
vocab: bool,
#[arg(long)]
filters: bool,
#[arg(long)]
weights: bool,
#[arg(long)]
json: bool,
#[arg(long)]
quality: bool,
},
Debug {
#[arg(value_name = "FILE")]
file: Option<PathBuf>,
#[command(subcommand)]
action: Option<DebugCommands>,
#[arg(long)]
drama: bool,
#[arg(long)]
hex: bool,
#[arg(long)]
strings: bool,
#[arg(long, default_value = "256")]
limit: usize,
},
Validate {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
quality: bool,
#[arg(long)]
strict: bool,
#[arg(long)]
min_score: Option<u8>,
},
ValidateManifest {
#[arg(value_name = "MANIFEST")]
file: PathBuf,
#[arg(long, value_name = "APR_FILE")]
artifact: Option<PathBuf>,
#[arg(long)]
live: bool,
},
Diff {
#[arg(value_name = "FILE1")]
file1: PathBuf,
#[arg(value_name = "FILE2")]
file2: PathBuf,
#[arg(long)]
weights: bool,
#[arg(long)]
values: bool,
#[arg(long)]
filter: Option<String>,
#[arg(long, default_value = "10")]
limit: usize,
#[arg(long)]
transpose_aware: bool,
#[arg(long)]
json: bool,
#[arg(long)]
quant_roundtrip: bool,
#[arg(long, default_value = "0.95",
value_parser = crate::commands::threshold_arg::parse_cosine_f32)]
threshold: f32,
#[arg(long)]
no_threshold: bool,
},
Tensors {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
stats: bool,
#[arg(long)]
filter: Option<String>,
#[arg(long, default_value = "0")]
limit: usize,
#[arg(long)]
json: bool,
},
Trace {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
layer: Option<String>,
#[arg(long)]
reference: Option<PathBuf>,
#[arg(long)]
json: bool,
#[arg(short, long)]
verbose: bool,
#[arg(long)]
payload: bool,
#[arg(long)]
diff: bool,
#[arg(long)]
interactive: bool,
#[arg(long, value_name = "STAGES")]
save_tensor: Option<String>,
#[arg(long, value_name = "DIR")]
save_tensor_dir: Option<PathBuf>,
#[arg(long, value_name = "RANGE", default_value = "0..1")]
save_tensor_layers: String,
},
Lint {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
strict: bool,
},
#[command(name = "beat-run")]
BeatRun {
#[arg(value_name = "CONTRACT")]
contract: PathBuf,
#[arg(long, value_name = "VALUE")]
measured: Option<f64>,
},
Manifest {
#[arg(value_name = "FILES", num_args = 1..)]
files: Vec<PathBuf>,
#[arg(short, long, value_name = "MAN_JSON")]
output: PathBuf,
},
Explain {
#[arg(value_name = "CODE_OR_FILE")]
code_or_file: Option<String>,
#[arg(short, long)]
file: Option<PathBuf>,
#[arg(long)]
tensor: Option<String>,
#[arg(long)]
kernel: bool,
#[arg(long)]
json: bool,
#[arg(short, long)]
verbose: bool,
#[arg(long)]
proof_status: bool,
},
Canary {
#[command(subcommand)]
command: CanaryCommands,
},
Export {
#[arg(value_name = "FILE", required_unless_present = "list_formats")]
file: Option<PathBuf>,
#[arg(long, default_value = "safetensors")]
format: String,
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(long)]
quantize: Option<String>,
#[arg(long)]
list_formats: bool,
#[arg(long)]
batch: Option<String>,
#[arg(long)]
json: bool,
#[arg(long)]
plan: bool,
#[arg(short, long)]
force: bool,
},
Import {
#[arg(value_name = "SOURCE")]
source: String,
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(long, default_value = "auto")]
arch: String,
#[arg(long)]
quantize: Option<String>,
#[arg(long)]
strict: bool,
#[arg(long)]
preserve_q4k: bool,
#[arg(long)]
tokenizer: Option<PathBuf>,
#[arg(long)]
enforce_provenance: bool,
#[arg(long)]
allow_no_config: bool,
},
Pull {
#[arg(value_name = "MODEL_OR_ASSET_TYPE")]
model_ref: String,
#[arg(value_name = "REPO")]
repo: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
verify: bool,
#[arg(long)]
dry_run: bool,
#[arg(long, value_name = "REV")]
revision: Option<String>,
#[arg(long)]
offline: bool,
#[arg(long, value_name = "GLOB")]
include: Vec<String>,
#[arg(short = 'o', long)]
output: Option<PathBuf>,
},
Registry {
#[command(subcommand)]
command: crate::commands::registry::RegistryCommands,
},
#[command(name = "list", alias = "ls")]
List,
#[command(name = "rm", alias = "remove")]
Rm {
#[arg(value_name = "MODEL")]
model_ref: String,
},
Convert {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
quantize: Option<String>,
#[arg(long)]
compress: Option<String>,
#[arg(short, long)]
output: PathBuf,
#[arg(short, long)]
force: bool,
},
Stamp {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
license: Option<String>,
#[arg(long = "data-source")]
data_source: Option<String>,
#[arg(long = "data-license")]
data_license: Option<String>,
#[arg(long = "hf-architecture")]
hf_architecture: Option<String>,
#[arg(long = "hf-model-type")]
hf_model_type: Option<String>,
#[arg(long)]
architecture: Option<String>,
#[arg(long = "tokenizer", value_name = "DIR")]
tokenizer_dir: Option<PathBuf>,
#[arg(short, long)]
output: PathBuf,
#[arg(short, long)]
force: bool,
},
Compile {
#[arg(value_name = "FILE", required_unless_present = "list_targets")]
file: Option<PathBuf>,
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(long)]
target: Option<String>,
#[arg(long)]
quantize: Option<String>,
#[arg(long)]
release: bool,
#[arg(long)]
strip: bool,
#[arg(long)]
lto: bool,
#[arg(long)]
list_targets: bool,
},
Merge {
#[arg(value_name = "FILES", num_args = 2..)]
files: Vec<PathBuf>,
#[arg(long, default_value = "average")]
strategy: String,
#[arg(short, long, required_unless_present = "plan")]
output: Option<PathBuf>,
#[arg(long, value_delimiter = ',')]
weights: Option<Vec<f32>>,
#[arg(long)]
base_model: Option<PathBuf>,
#[arg(long, default_value = "0.9")]
drop_rate: f32,
#[arg(long, default_value = "0.2")]
density: f32,
#[arg(long, default_value = "42")]
seed: u64,
#[arg(long)]
plan: bool,
#[arg(short, long)]
force: bool,
},
Quantize {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long, short = 's', default_value = "int4")]
scheme: String,
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(long)]
format: Option<String>,
#[arg(long)]
batch: Option<String>,
#[arg(long)]
plan: bool,
#[arg(short, long)]
force: bool,
},
#[command(flatten)]
ModelOps(ModelOpsCommands),
Mcp {},
Tui {
#[arg(value_name = "FILE")]
file: Option<PathBuf>,
},
Check {
#[arg(value_name = "FILE")]
file: PathBuf,
#[arg(long)]
no_gpu: bool,
#[arg(long)]
json: bool,
},
#[cfg(feature = "training")]
Gpu {
#[arg(long)]
json: bool,
},
Code {
#[arg(long)]
model: Option<PathBuf>,
#[arg(long, default_value = ".")]
project: PathBuf,
#[arg(long)]
resume: Option<Option<String>>,
#[arg(long)]
manifest: Option<PathBuf>,
#[arg(short, long)]
print: bool,
prompt: Vec<String>,
#[arg(long, default_value = "50")]
max_turns: u32,
#[arg(long)]
emit_trace: Option<PathBuf>,
#[arg(long, value_enum, default_value_t = CodeOutputFormat::Text)]
output_format: CodeOutputFormat,
#[arg(long, value_enum, default_value_t = CodeInputFormat::Text)]
input_format: CodeInputFormat,
},
#[command(flatten)]
Extended(ExtendedCommands),
#[cfg(feature = "dev")]
#[command(subcommand)]
Mono(crate::commands::mono::MonoCommands),
#[command(subcommand)]
Rag(aprender_rag_cli::Commands),
#[command(subcommand)]
Zram(aprender_zram_cli::Commands),
#[command(subcommand, disable_help_subcommand = true)]
Sim(simular::cli::Commands),
#[command(subcommand)]
Cgp(cgp::cli::Commands),
#[command(subcommand)]
Pv(aprender_contracts_cli::cli::Commands),
}
#[derive(Subcommand, Debug)]
pub enum DebugCommands {
EmbedViz {
#[arg(long, value_name = "FILE")]
model: PathBuf,
#[arg(long, value_name = "NAME")]
tensor: Option<String>,
#[arg(long, value_enum, default_value_t = EmbedProjection::Pca)]
projection: EmbedProjection,
#[arg(long, value_name = "N", default_value_t = 0)]
seed: u64,
#[arg(long, value_name = "N")]
limit: Option<usize>,
#[arg(long, value_name = "FILE")]
tokens: Option<PathBuf>,
#[arg(short, long, value_name = "FILE")]
output: Option<PathBuf>,
#[arg(short, long)]
force: bool,
},
}