feat(config): optional provider pricing for cost metrics

This commit is contained in:
xiaoxixi 2026-07-24 17:11:37 +08:00
parent 11474c080e
commit 115e77ff27
5 changed files with 23 additions and 0 deletions

View File

@ -832,6 +832,8 @@ mod tests {
token_limit: 4096, token_limit: 4096,
workspace_dir: std::env::temp_dir(), workspace_dir: std::env::temp_dir(),
input_types: vec!["text".into()], input_types: vec!["text".into()],
price_input_per_million: None,
price_output_per_million: None,
}, },
Arc::new(ToolRegistry::new()), Arc::new(ToolRegistry::new()),
None, None,

View File

@ -508,6 +508,19 @@ pub struct LLMProviderConfig {
pub token_limit: usize, pub token_limit: usize,
pub workspace_dir: PathBuf, pub workspace_dir: PathBuf,
pub input_types: Vec<String>, pub input_types: Vec<String>,
pub price_input_per_million: Option<f64>,
pub price_output_per_million: Option<f64>,
}
impl LLMProviderConfig {
pub fn cost_of(&self, prompt_tokens: u32, completion_tokens: u32) -> Option<f64> {
match (self.price_input_per_million, self.price_output_per_million) {
(Some(pi), Some(po)) => Some(
prompt_tokens as f64 / 1e6 * pi + completion_tokens as f64 / 1e6 * po,
),
_ => None,
}
}
} }
pub fn get_default_config_path() -> PathBuf { pub fn get_default_config_path() -> PathBuf {
@ -653,6 +666,8 @@ impl Config {
token_limit: agent.token_limit, token_limit: agent.token_limit,
workspace_dir: expand_path(&self.workspace_dir), workspace_dir: expand_path(&self.workspace_dir),
input_types: model.input_type.clone(), input_types: model.input_type.clone(),
price_input_per_million: None,
price_output_per_million: None,
}) })
} }
} }

View File

@ -225,6 +225,8 @@ mod tests {
token_limit: 8_192, token_limit: 8_192,
workspace_dir: PathBuf::from("."), workspace_dir: PathBuf::from("."),
input_types: vec!["text".to_string(), "image".to_string()], input_types: vec!["text".to_string(), "image".to_string()],
price_input_per_million: None,
price_output_per_million: None,
}; };
let session = Arc::new(Mutex::new( let session = Arc::new(Mutex::new(
Session::new( Session::new(

View File

@ -27,6 +27,8 @@ fn load_config() -> Option<LLMProviderConfig> {
token_limit: 128_000, token_limit: 128_000,
workspace_dir: std::path::PathBuf::from("/tmp/test-workspace"), workspace_dir: std::path::PathBuf::from("/tmp/test-workspace"),
input_types: vec!["text".to_string()], input_types: vec!["text".to_string()],
price_input_per_million: None,
price_output_per_million: None,
}) })
} }

View File

@ -27,6 +27,8 @@ fn load_openai_config() -> Option<LLMProviderConfig> {
token_limit: 128_000, token_limit: 128_000,
workspace_dir: std::path::PathBuf::from("/tmp/test-workspace"), workspace_dir: std::path::PathBuf::from("/tmp/test-workspace"),
input_types: vec!["text".to_string()], input_types: vec!["text".to_string()],
price_input_per_million: None,
price_output_per_million: None,
}) })
} }