doum_cli/llm/openai/
secret.rs1use crate::system::ProviderSecret;
2use anyhow::Result;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Default, Serialize, Deserialize)]
7pub struct OpenAISecret {
8 pub api_key: String,
9
10 #[serde(default, skip_serializing_if = "Option::is_none")]
11 pub organization: Option<String>,
12
13 #[serde(default, skip_serializing_if = "Option::is_none")]
14 pub project: Option<String>,
15}
16
17impl ProviderSecret for OpenAISecret {
18 fn validate(&self) -> Result<()> {
19 if self.api_key.is_empty() {
20 anyhow::bail!("API key cannot be empty");
21 }
22 Ok(())
23 }
24
25 fn masked(&self) -> String {
26 if self.api_key.len() > 10 {
27 format!(
28 "{}...{}",
29 &self.api_key[..7],
30 &self.api_key[self.api_key.len() - 4..]
31 )
32 } else {
33 "***".to_string()
34 }
35 }
36}