llm_cost_ops_cli/cli/
mod.rs

1use clap::{Parser, Subcommand};
2use std::path::PathBuf;
3
4// CLI argument definitions for LLM Cost Operations
5
6#[derive(Parser)]
7#[command(name = "cost-ops")]
8#[command(about = "LLM Cost Operations Platform", long_about = None)]
9#[command(version)]
10pub struct Cli {
11    /// Configuration file path
12    #[arg(short, long, value_name = "FILE")]
13    pub config: Option<PathBuf>,
14
15    /// Verbosity level (-v, -vv, -vvv)
16    #[arg(short, long, action = clap::ArgAction::Count)]
17    pub verbose: u8,
18
19    #[command(subcommand)]
20    pub command: Commands,
21}
22
23#[derive(Subcommand)]
24pub enum Commands {
25    /// Initialize database and create schema
26    Init {
27        /// Database URL (e.g., sqlite:cost-ops.db)
28        #[arg(long)]
29        database_url: Option<String>,
30    },
31
32    /// Ingest usage metrics
33    Ingest {
34        /// Input file path (JSON)
35        #[arg(short, long)]
36        file: PathBuf,
37
38        /// Provider name
39        #[arg(short, long)]
40        provider: Option<String>,
41    },
42
43    /// Query cost records
44    Query {
45        /// Time range (e.g., "last-24-hours", "last-7-days")
46        #[arg(long, default_value = "last-24-hours")]
47        range: String,
48
49        /// Organization ID filter
50        #[arg(long)]
51        organization: Option<String>,
52
53        /// Group by dimension (provider, model, project)
54        #[arg(long)]
55        group_by: Option<String>,
56
57        /// Output format (json, table, csv)
58        #[arg(long, default_value = "table")]
59        output: String,
60    },
61
62    /// Generate cost summary
63    Summary {
64        /// Time period (e.g., "last-30-days")
65        #[arg(long, default_value = "last-30-days")]
66        period: String,
67
68        /// Organization ID filter
69        #[arg(long)]
70        organization: Option<String>,
71    },
72
73    /// Export cost data
74    Export {
75        /// Output file path
76        #[arg(short, long)]
77        output: PathBuf,
78
79        /// Format (json, csv, parquet)
80        #[arg(short, long, default_value = "json")]
81        format: String,
82
83        /// Time period
84        #[arg(long)]
85        period: Option<String>,
86    },
87
88    /// Manage pricing tables
89    Pricing {
90        #[command(subcommand)]
91        command: PricingCommands,
92    },
93}
94
95#[derive(Subcommand)]
96pub enum PricingCommands {
97    /// List all pricing tables
98    List,
99
100    /// Add a new pricing table
101    Add {
102        /// Provider name
103        #[arg(long)]
104        provider: String,
105
106        /// Model name
107        #[arg(long)]
108        model: String,
109
110        /// Input price per million tokens
111        #[arg(long)]
112        input_price: f64,
113
114        /// Output price per million tokens
115        #[arg(long)]
116        output_price: f64,
117    },
118
119    /// Get active pricing for a model
120    Get {
121        /// Provider name
122        #[arg(long)]
123        provider: String,
124
125        /// Model name
126        #[arg(long)]
127        model: String,
128    },
129}
130
131impl Cli {
132    pub fn parse_args() -> Self {
133        Self::parse()
134    }
135}