pub mod capabilities;
pub mod embedding_model;
pub mod language_model;
pub mod settings;
use crate::Error;
use crate::core::DynamicModel;
use crate::core::capabilities::ModelName;
use crate::core::utils::validate_base_url;
use crate::error::Result;
use crate::providers::openai_chat_completions::OpenAIChatCompletions;
use crate::providers::openai_compatible::settings::OpenAICompatibleSettings;
#[derive(Debug, Clone)]
pub struct OpenAICompatible<M: ModelName> {
pub settings: OpenAICompatibleSettings,
pub(crate) inner: OpenAIChatCompletions<M>,
}
impl<M: ModelName> OpenAICompatible<M> {
pub fn builder() -> OpenAICompatibleBuilder<M> {
OpenAICompatibleBuilder::default()
}
}
impl OpenAICompatible<DynamicModel> {
pub fn model_name(name: impl Into<String>) -> Self {
let settings = OpenAICompatibleSettings::default();
let inner = OpenAIChatCompletions::<DynamicModel>::model_name(name);
OpenAICompatible { settings, inner }
}
}
impl<M: ModelName> Default for OpenAICompatible<M> {
fn default() -> OpenAICompatible<M> {
OpenAICompatibleBuilder::default().build().unwrap()
}
}
pub struct OpenAICompatibleBuilder<M: ModelName> {
settings: OpenAICompatibleSettings,
inner: OpenAIChatCompletions<M>,
}
impl<M: ModelName> Default for OpenAICompatibleBuilder<M> {
fn default() -> Self {
let settings = OpenAICompatibleSettings::default();
let mut inner = OpenAIChatCompletions::default();
inner.settings.provider_name = settings.provider_name.clone();
inner.settings.base_url = settings.base_url.clone();
inner.settings.api_key = settings.api_key.clone();
inner.settings.path = settings.path.clone();
Self { settings, inner }
}
}
impl<M: ModelName> OpenAICompatibleBuilder<M> {
pub fn provider_name(mut self, provider_name: impl Into<String>) -> Self {
let name = provider_name.into();
self.settings.provider_name = name.clone();
self.inner.settings.provider_name = name;
self
}
pub fn base_url(mut self, base_url: impl Into<String>) -> Self {
let url = base_url.into();
self.settings.base_url = url.clone();
self.inner.settings.base_url = url;
self
}
pub fn api_key(mut self, api_key: impl Into<String>) -> Self {
let key = api_key.into();
self.settings.api_key = key.clone();
self.inner.settings.api_key = key;
self
}
pub fn path(mut self, path: impl Into<String>) -> Self {
let p = Some(path.into());
self.settings.path = p.clone();
self.inner.settings.path = p;
self
}
pub fn build(mut self) -> Result<OpenAICompatible<M>> {
let base_url = validate_base_url(&self.settings.base_url)?;
if self.settings.api_key.is_empty() {
return Err(Error::MissingField("api_key".to_string()));
}
self.inner.settings.base_url = base_url.to_string();
self.settings.base_url = base_url.to_string();
Ok(OpenAICompatible {
settings: self.settings,
inner: self.inner,
})
}
}
impl OpenAICompatibleBuilder<DynamicModel> {
pub fn model_name(mut self, model_name: impl Into<String>) -> Self {
self.inner.options.model = model_name.into();
self
}
}