doum_cli/llm/openai/
secret.rs

1use crate::system::ProviderSecret;
2use anyhow::Result;
3use serde::{Deserialize, Serialize};
4
5/// OpenAI Secret information
6#[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}