Skip to main content

ProviderRegistry

Struct ProviderRegistry 

Source
pub struct ProviderRegistry { /* private fields */ }
Expand description

Registry for managing multiple named LLM providers

The ProviderRegistry holds references to provider configurations and allows creating LLM clients for specific models or providers by name.

Implementations§

Source§

impl ProviderRegistry

Source

pub fn new() -> ProviderRegistry

Create a new empty provider registry

Source

pub fn from_config( providers: HashMap<String, ProviderConfig>, models: HashMap<String, ModelConfig>, nvidia: Option<&NvidiaConfig>, ) -> ProviderRegistry

Create a provider registry from TOML configuration

Source

pub fn reload_runtime_providers( &self, providers: Vec<RuntimeProviderEntry>, names: Vec<String>, )

Hot-swap the runtime provider map. Called by admin endpoints after mutating the DB so the new providers are visible immediately.

Source

pub fn with_catalog(self, catalog: Arc<NvidiaCatalogCache>) -> ProviderRegistry

Attach a live catalog cache (used after construction for background refresh).

Source

pub fn set_default_model(&mut self, model_name: &str)

Set the default model name

Source

pub fn register_provider(&mut self, name: &str, config: ProviderConfig)

Register a provider configuration (legacy no-op if providers are already managed).

Source

pub fn register_model(&mut self, name: &str, config: ModelConfig)

Register a model configuration (legacy backward-compat).

Source

pub fn unregister_provider(&mut self, name: &str) -> Option<ProviderConfig>

Remove a provider by name.

Source

pub fn unregister_model(&mut self, name: &str) -> Option<ModelConfig>

Remove a model by name.

Source

pub fn get_provider(&self, name: &str) -> Option<ProviderConfig>

Get a provider configuration by name.

Runtime providers are checked first and synthesized into a ProviderConfig on the fly; legacy static configs are checked second. The return value is cloned so that the caller owns it — this is required because runtime providers are materialised from the arc-swapped map rather than stored as ProviderConfig internally.

Source

pub fn get_provider_for_ctx( &self, ctx: &Arc<Context>, name: &str, ) -> Option<ProviderConfig>

Resolve a provider visible to the tenant derived from the context’s isolate namespace. Reads ctx.isolate_label(TypeId::of::<Llm>()) and strips a leading tenant:/user: prefix (mirroring ares_agent::resolver::user_id_from_ctx), delegating to crate-private tenant lookup with the derived tenant (None when unlabeled).

Source

pub fn get_model(&self, name: &str) -> Option<ModelConfig>

Get a model configuration by name. Checks explicit legacy models first, then falls back to the live catalog.

Source

pub fn provider_names(&self) -> Vec<String>

Get all provider names (legacy + runtime).

Source

pub fn model_names(&self) -> Vec<String>

Get all model names (legacy + catalog ids)

Source

pub async fn create_client_for_model( &self, model_name: &str, ) -> Result<Box<dyn LLMClient>, AppError>

Create an LLM client for a specific model by name.

Fleet-wide tenant resolution (tenant None).

Source

pub async fn create_client_for_model_ctx( &self, ctx: &Arc<Context>, model_name: &str, ) -> Result<Box<dyn LLMClient>, AppError>

Create an LLM client for a specific model by name, deriving the tenant from the context’s isolate namespace so tenant-scoped runtime providers are used when the caller holds a tenant-isolated context.

Source

pub async fn create_client_for_provider( &self, provider_name: &str, ) -> Result<Box<dyn LLMClient>, AppError>

Create an LLM client for a specific provider by name

Source

pub async fn create_client_for_resolved_provider( &self, resolved: &ResolvedProviderConfig, ) -> Result<Box<dyn LLMClient>, AppError>

Create an LLM client for an already-resolved provider/model pair.

Source

pub async fn create_default_client( &self, ) -> Result<Box<dyn LLMClient>, AppError>

Create an LLM client using the default model

Source

pub fn has_model(&self, name: &str) -> bool

Check if a model exists in the registry

Source

pub fn has_provider(&self, name: &str) -> bool

Check if a provider exists in the registry (legacy or runtime).

Source

pub fn has_provider_for_tenant( &self, name: &str, tenant_id: Option<&str>, ) -> bool

Source

pub fn get_model_capabilities( &self, model_name: &str, ) -> Option<ModelCapabilities>

Get capabilities for a registered model.

Source

pub fn models_with_capabilities(&self) -> Vec<ModelWithCapabilities>

Get all models with their capabilities.

Source

pub fn find_models( &self, requirements: &CapabilityRequirements, ) -> Vec<ModelWithCapabilities>

Find models that satisfy the given capability requirements.

Source

pub fn find_best_model( &self, requirements: &CapabilityRequirements, ) -> Option<ModelWithCapabilities>

Find the best model for the given requirements.

Source

pub async fn create_client_for_requirements( &self, requirements: &CapabilityRequirements, ) -> Result<Box<dyn LLMClient>, AppError>

Create an LLM client for the best model matching requirements.

Source

pub fn find_agent_models(&self) -> Vec<ModelWithCapabilities>

Find models suitable for agent tasks (tool calling required).

Source

pub fn find_vision_models(&self) -> Vec<ModelWithCapabilities>

Find models suitable for vision tasks.

Source

pub fn find_coding_models(&self) -> Vec<ModelWithCapabilities>

Find models suitable for coding tasks.

Source

pub fn find_local_models(&self) -> Vec<ModelWithCapabilities>

Find local-only models.

Source

pub fn list_models(&self) -> Vec<ModelInfo>

List all registered models with their provider info.

Source

pub async fn resolve_with_capability_fallback( &self, requirements: Option<CapabilityRequirements>, ) -> Result<Box<dyn LLMClient>, AppError>

Capability-aware fallback chain for Llm.

Tries create_client_for_requirements for the given requirements if Some, then falls back to create_default_client. This reuses the existing find_best_modelcreate_client_for_model chain and the coordinator’s fallback semantics without requiring a database.

Source

pub async fn resolve_with_fallback( &self, tier_or_model: &str, tenant_id: &str, pool: &Pool<Postgres>, fleet_secrets: &FleetSecrets, ) -> Result<Vec<ResolvedProviderConfig>, AppError>

Resolve a model tier or model name to concrete provider/model entries, following the fallback chain stored in fleet_secrets for the primary provider.

  1. Looks up tenant_model_tiers for the tenant + tier.
  2. Falls back to the registry’s configured models.
  3. Falls back to treating tier_or_model as a provider name.
  4. Loads the primary provider’s fallback_providers from fleet secrets and appends each resolved provider with its own concrete default model.

Trait Implementations§

Source§

impl Default for ProviderRegistry

Source§

fn default() -> ProviderRegistry

Returns the “default value” for a type. Read more
Source§

impl Service for ProviderRegistry

Source§

fn name(&self) -> &'static str

Source§

fn init( &self, _ctx: &Arc<Context>, ) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Disposable>>, CordisError>> + Send + '_>>

Source§

fn check(&self) -> bool

Availability predicate for this service instance. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> MaybeSendSync for T

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more