use std::{env, sync::Arc};
use artificial_core::error::{ArtificialError, Result};
use crate::client::{HttpTimeoutConfig, OpenAiClient, RetryPolicy};
pub struct OpenAiAdapter {
pub(crate) client: Arc<OpenAiClient>,
}
impl OpenAiAdapter {}
#[derive(Default)]
pub struct OpenAiAdapterOptions {
pub(crate) api_key: Option<String>,
pub(crate) retry: Option<RetryPolicy>,
pub(crate) timeouts: Option<HttpTimeoutConfig>,
}
impl OpenAiAdapterOptions {
pub fn new() -> Self {
Self::default()
}
pub fn new_from_env() -> Self {
Self {
api_key: env::var("OPENAI_API_KEY").ok(),
retry: None,
timeouts: None,
}
}
pub fn with_api_key(mut self, api_key: impl Into<String>) -> Self {
self.api_key = Some(api_key.into());
self
}
pub fn with_retry_policy(mut self, retry: RetryPolicy) -> Self {
self.retry = Some(retry);
self
}
pub fn with_http_timeouts(mut self, timeouts: HttpTimeoutConfig) -> Self {
self.timeouts = Some(timeouts);
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 mut client = if let Some(timeouts) = self.timeouts {
OpenAiClient::new_with_timeouts(api_key, timeouts)
} else {
OpenAiClient::new(api_key)
};
if let Some(retry) = self.retry {
client = client.with_retry_policy(retry);
}
Ok(OpenAiAdapter {
client: Arc::new(client),
})
}
}
pub type OpenAiAdapterBuilder = OpenAiAdapterOptions;