use std::{env, sync::Arc};
use artificial_core::error::{ArtificialError, Result};
use crate::client::{OpenAiClient, RetryPolicy};
pub struct OpenAiAdapter {
pub(crate) client: Arc<OpenAiClient>,
}
impl OpenAiAdapter {}
#[derive(Default)]
pub struct OpenAiAdapterBuilder {
pub(crate) api_key: Option<String>,
pub(crate) retry: Option<RetryPolicy>,
}
impl OpenAiAdapterBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn new_from_env() -> Self {
Self {
api_key: env::var("OPENAI_API_KEY").ok(),
retry: None,
}
}
pub fn with_retry_policy(mut self, retry: RetryPolicy) -> Self {
self.retry = Some(retry);
self
}
pub fn build(self) -> Result<OpenAiAdapter> {
let api_key = self.api_key.ok_or(ArtificialError::Invalid(
"missing env variable: `OPENAI_API_KEY`".into(),
))?;
let client = if let Some(retry) = self.retry {
OpenAiClient::new(api_key).with_retry_policy(retry)
} else {
OpenAiClient::new(api_key)
};
Ok(OpenAiAdapter {
client: Arc::new(client),
})
}
}