use crate::router::Router;
use crate::service::OmniferenceService;
use crate::types::{ChatRequestIR, DiscoveredModel, 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<(), String> {
self.service.register_provider(provider).await
}
pub async fn discover_models(&mut self) -> Result<Vec<DiscoveredModel>, String> {
self.service.discover_models().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, String> {
self.service.chat(request).await
}
pub async fn chat_complete(&self, request: ChatRequestIR) -> Result<String, String> {
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(format!("{}: {}", code, message));
}
crate::stream::StreamEvent::Done => {
break;
}
_ => {}
}
}
Ok(content)
}
pub fn service(&self) -> &OmniferenceService {
&self.service
}
}
impl Default for OmniferenceEngine {
fn default() -> Self {
Self::new()
}
}