use crate::router::Router;
use crate::service::{DiscoveryError, DiscoveryReport, OmniferenceService, ProviderRegistrationError};
use crate::types::{ChatRequestIR, DiscoveredModel, ImageRequestIR, ImageResponse, ProviderConfig};
use futures_util::StreamExt;
pub struct OmniferenceEngine {
service: OmniferenceService,
}
impl OmniferenceEngine {
pub fn new() -> Self {
Self {
service: OmniferenceService::new(),
}
}
pub fn with_router(router: Router) -> Self {
Self {
service: OmniferenceService::with_router(router),
}
}
pub async fn register_provider(&mut self, provider: ProviderConfig) -> Result<(), ProviderRegistrationError> {
self.service.register_provider(provider).await
}
pub async fn discover_models(&mut self) -> Result<Vec<DiscoveredModel>, DiscoveryError> {
self.service.discover_models().await
}
pub async fn discover_models_report(&mut self) -> Result<DiscoveryReport, DiscoveryError> {
self.service.discover_models_report().await
}
pub async fn discover_models_for_provider(&self, provider_name: &str) -> Result<Vec<DiscoveredModel>, DiscoveryError> {
self.service.discover_models_for_provider(provider_name).await
}
pub async fn discover_models_for_provider_report(&self, provider_name: &str) -> Result<DiscoveryReport, DiscoveryError> {
self.service.discover_models_for_provider_report(provider_name).await
}
pub async fn get_model(&self, model_id: &str) -> Option<DiscoveredModel> {
self.service.get_model(model_id).await
}
pub async fn get_provider(&self, name: &str) -> Option<ProviderConfig> {
self.service.get_provider(name).await
}
pub async fn list_providers(&self) -> Vec<ProviderConfig> {
self.service.list_providers().await
}
pub async fn list_models(&self) -> Vec<DiscoveredModel> {
self.service.list_models().await
}
pub async fn chat(
&self,
request: ChatRequestIR,
) -> Result<impl futures_util::Stream<Item = crate::stream::StreamEvent> + Send + Unpin, crate::adapter::InferenceError> {
self.service.chat(request).await
}
pub async fn chat_complete(&self, request: ChatRequestIR) -> Result<String, crate::adapter::InferenceError> {
let stream = self.chat(request).await?;
let mut content = String::new();
tokio::pin!(stream);
while let Some(event) = stream.next().await {
match event {
crate::stream::StreamEvent::TextDelta { content: chunk } => {
content.push_str(&chunk);
}
crate::stream::StreamEvent::FinalMessage { content: final_content, .. } => {
content.push_str(&final_content);
}
crate::stream::StreamEvent::Error { code, message } => {
return Err(crate::adapter::InferenceError::from_stream_error(code, message));
}
crate::stream::StreamEvent::Done => {
break;
}
_ => {}
}
}
Ok(content)
}
pub async fn image(&self, request: ImageRequestIR) -> Result<ImageResponse, crate::adapter::InferenceError> {
self.service.image(request).await
}
pub fn service(&self) -> &OmniferenceService {
&self.service
}
}
impl Default for OmniferenceEngine {
fn default() -> Self {
Self::new()
}
}