use std::sync::Arc;
use reqwest::Method;
use crate::chat::ChatClient;
use crate::config::{ClientConfig, ServiceBase};
use crate::error::{RekaError, Result};
use crate::models::ModelsClient;
use crate::research::ResearchClient;
use crate::transport::http::HttpTransport;
use crate::transport::request::RequestBuilder;
use crate::vision::VisionClient;
#[derive(Clone)]
pub struct Client {
inner: Arc<ClientInner>,
}
struct ClientInner {
config: ClientConfig,
transport: HttpTransport,
}
impl Client {
pub fn new(api_key: impl Into<String>) -> Result<Self> {
Self::with_config(ClientConfig::builder(api_key).build()?)
}
pub fn from_env() -> Result<Self> {
Self::with_config(ClientConfig::from_env()?)
}
pub fn with_config(config: ClientConfig) -> Result<Self> {
let transport = HttpTransport::new(&config)?;
Ok(Self {
inner: Arc::new(ClientInner { config, transport }),
})
}
pub fn config(&self) -> &ClientConfig {
&self.inner.config
}
pub fn models(&self) -> ModelsClient {
ModelsClient::new(self.clone())
}
pub fn chat(&self) -> ChatClient {
ChatClient::new(self.clone())
}
pub fn research(&self) -> ResearchClient {
ResearchClient::new(self.clone())
}
pub fn vision(&self) -> VisionClient {
VisionClient::new(self.clone())
}
pub(crate) fn request(
&self,
service: ServiceBase,
method: Method,
path: impl Into<String>,
) -> RequestBuilder {
self.inner
.transport
.request(&self.inner.config, service, method, path)
}
pub(crate) fn map_transport_error(error: reqwest::Error) -> RekaError {
RekaError::Transport(error)
}
}