use crate::acceleration::AccelerationMode;
use crate::model_handle::ModelHandle;
use crate::session::InferenceSession;
use latexsnipper_ast::Diagnostic;
use latexsnipper_foundation::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RuntimeDiagnostics {
pub runtime: String,
pub available: bool,
pub selected_provider: String,
pub available_providers: Vec<String>,
#[serde(default)]
pub diagnostics: Vec<Diagnostic>,
}
pub trait RuntimeBackend: Send + Sync {
fn create_session(
&self,
handle: &ModelHandle,
acceleration: AccelerationMode,
) -> Result<Box<dyn InferenceSession>>;
fn create_session_with_threads(
&self,
handle: &ModelHandle,
acceleration: AccelerationMode,
_max_threads: usize,
) -> Result<Box<dyn InferenceSession>> {
self.create_session(handle, acceleration)
}
fn clear_sessions(&self) {
}
fn name(&self) -> &str;
fn is_available(&self) -> bool;
fn selected_provider(&self) -> String {
self.name().to_string()
}
fn available_providers(&self) -> Vec<String> {
if self.is_available() {
vec![self.name().to_string()]
} else {
Vec::new()
}
}
fn provider_diagnostics(&self) -> Vec<Diagnostic> {
Vec::new()
}
fn runtime_diagnostics(&self) -> RuntimeDiagnostics {
RuntimeDiagnostics {
runtime: self.name().to_string(),
available: self.is_available(),
selected_provider: self.selected_provider(),
available_providers: self.available_providers(),
diagnostics: self.provider_diagnostics(),
}
}
}