1use serde::Deserialize;
2
3use crate::client::Client;
4use crate::error::Result;
5
6#[derive(Debug, Clone, Deserialize)]
8pub struct ModelInfo {
9 pub id: String,
11
12 pub provider: String,
14
15 pub display_name: String,
17
18 #[serde(default)]
20 pub category: Option<String>,
21
22 #[serde(default)]
24 pub input_per_million: f64,
25
26 #[serde(default)]
28 pub output_per_million: f64,
29
30 #[serde(default)]
32 pub per_unit_price: Option<f64>,
33
34 #[serde(default)]
36 pub price_unit: Option<String>,
37}
38
39#[derive(Debug, Clone, Deserialize)]
41pub struct PricingInfo {
42 pub id: String,
44
45 pub provider: String,
47
48 pub display_name: String,
50
51 pub input_per_million: f64,
53
54 pub output_per_million: f64,
56}
57
58#[derive(Deserialize)]
59struct ModelsResponse {
60 models: Vec<ModelInfo>,
61}
62
63#[derive(Deserialize)]
64struct PricingResponse {
65 pricing: Vec<PricingInfo>,
66}
67
68impl Client {
69 pub async fn list_models(&self) -> Result<Vec<ModelInfo>> {
71 let (resp, _meta) = self.get_json::<ModelsResponse>("/qai/v1/models").await?;
72 Ok(resp.models)
73 }
74
75 pub async fn get_pricing(&self) -> Result<Vec<PricingInfo>> {
77 let (resp, _meta) = self.get_json::<PricingResponse>("/qai/v1/pricing").await?;
78 Ok(resp.pricing)
79 }
80}