use std::sync::Arc;
use crate::core::exceptions::OperonError;
use crate::core::registry::ResourceHub;
use crate::providers::auth::KeycloakTokenProvider;
use crate::providers::embeddings::BaseEmbedder;
use crate::providers::llms::BaseLLM;
use crate::providers::onnx::OnnxInferenceBackend;
use crate::providers::registry::{
EmbeddingResource, KeycloakResource, LlmResource, OnnxResource, RerankerResource,
};
use crate::providers::rerankers::BaseReranker;
pub fn resolve_hub() -> Result<Arc<ResourceHub>, OperonError> {
ResourceHub::instance()
}
pub fn resolve_llm(key: &str) -> Result<Arc<dyn BaseLLM>, OperonError> {
let hub = resolve_hub()?;
let full = format!("llm:{}", key);
let instance = hub.get(&full)?;
let wrapper: Arc<LlmResource> = instance.downcast::<LlmResource>().map_err(|_| {
OperonError::ResourceHub(format!(
"resource '{}' is not an LLM (downcast failed)",
full
))
})?;
Ok(wrapper.0.clone())
}
pub fn resolve_embedder(key: &str) -> Result<Arc<dyn BaseEmbedder>, OperonError> {
let hub = resolve_hub()?;
let full = format!("embedding:{}", key);
let instance = hub.get(&full)?;
let wrapper: Arc<EmbeddingResource> =
instance.downcast::<EmbeddingResource>().map_err(|_| {
OperonError::ResourceHub(format!(
"resource '{}' is not an Embedder (downcast failed)",
full
))
})?;
Ok(wrapper.0.clone())
}
pub fn resolve_reranker(key: &str) -> Result<Arc<dyn BaseReranker>, OperonError> {
let hub = resolve_hub()?;
let full = format!("reranking:{}", key);
let instance = hub.get(&full)?;
let wrapper: Arc<RerankerResource> = instance.downcast::<RerankerResource>().map_err(|_| {
OperonError::ResourceHub(format!(
"resource '{}' is not a Reranker (downcast failed)",
full
))
})?;
Ok(wrapper.0.clone())
}
pub fn resolve_onnx(key: &str) -> Result<Arc<dyn OnnxInferenceBackend>, OperonError> {
let hub = resolve_hub()?;
let full = format!("onnx:{}", key);
let instance = hub.get(&full)?;
let wrapper: Arc<OnnxResource> = instance.downcast::<OnnxResource>().map_err(|_| {
OperonError::ResourceHub(format!(
"resource '{}' is not an Onnx backend (downcast failed)",
full
))
})?;
Ok(wrapper.0.clone())
}
pub fn resolve_keycloak(key: &str) -> Result<Arc<KeycloakTokenProvider>, OperonError> {
let hub = resolve_hub()?;
let full = format!("keycloak:{}", key);
let instance = hub.get(&full)?;
let wrapper: Arc<KeycloakResource> = instance.downcast::<KeycloakResource>().map_err(|_| {
OperonError::ResourceHub(format!(
"resource '{}' is not a Keycloak provider (downcast failed)",
full
))
})?;
Ok(wrapper.0.clone())
}