Skip to main content

EngineApi

Struct EngineApi 

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

Engine API facade — model catalog introspection + config writes + routing.

Holds a shared reference to the live config (behind RwLock) and the path to config.toml so write operations can persist to disk. Routing stats are shared with AgentRuntime via Arc<RoutingStats>.

When config writes change the model or API key, EngineApi rebuilds OxiosEngine via [EngineHandle] so the runtime picks up the change on the next agent execution (hot-swap, no restart required).

Implementations§

Source§

impl EngineApi

Source

pub fn new( config: Arc<RwLock<OxiosConfig>>, config_path: PathBuf, routing_stats: Arc<RoutingStats>, engine_handle: Arc<EngineHandle>, ) -> Self

Create a new EngineApi.

  • config — shared config store (backed by RwLock)
  • config_path — path to config.toml for persistence
  • routing_stats — shared stats tracker (shared with AgentRuntime)
  • engine_handle — hot-swap handle for live engine replacement
Source

pub fn routing_stats(&self) -> Arc<RoutingStats>

Get the shared RoutingStats reference (for AgentRuntime wiring).

Source

pub fn engine_handle(&self) -> &Arc<EngineHandle>

Get a reference to the engine handle.

Source

pub fn role_routing(&self) -> RoleRoutingConfig

RFC-032: Get the current role routing config (role → model mapping).

Source

pub fn model_for_role(&self, role: &str) -> Option<String>

RFC-032: Resolve the model ID for a given role, if configured. Reads the LIVE config under its shared RwLock so updates take effect immediately. Returns None when the role is not in the mapping.

Source

pub fn set_role_routing(&self, role_routing: RoleRoutingConfig) -> Result<()>

RFC-032: Update role routing config and persist to config.toml.

Source

pub fn providers(&self) -> Vec<ProviderInfo>

List all available providers from the oxi-sdk catalog.

Reads provider/model counts from the live catalog (runtime models.dev refresh + user overrides) when wired into the engine, falling back to the static registry otherwise.

Filters out hidden/internal providers (those flagged with hidden: true in [PROVIDER_META]) and augments each entry with credential status, display name, and description.

Providers without a [PROVIDER_META] entry are shown by default — a new provider landing in oxi-sdk should be available to users even before its metadata is added here.

Source

pub fn models(&self, provider: &str, query: Option<&str>) -> Vec<ModelInfo>

List models for a given provider, optionally filtered by a query.

Reads from the live catalog (runtime models.dev refresh + user overrides) when wired into the engine, falling back to the static registry (embedded snapshot) otherwise.

Source

pub fn search_models(&self, query: &str) -> Vec<ModelInfo>

Search models across all providers.

Uses the live catalog’s search_sync when available, else the static registry.

Source

pub fn config(&self) -> EngineConfigResponse

Get the current engine configuration + credential status + routing.

Source

pub fn routing_stats_snapshot(&self) -> RoutingStatsSnapshot

Source

pub fn fallback_history(&self, limit: usize) -> Vec<FallbackEvent>

Get recent fallback history.

Source

pub fn set_model(&self, model_id: &str) -> Result<()>

Set the default model in config.toml.

Updates both the in-memory config and the on-disk file, then hot-swaps the runtime engine so the next agent execution uses the new model.

Source

pub fn set_api_key(&self, provider: &str, key: &str) -> Result<()>

Set an API key for a provider.

Stores the key via CredentialStore (→ ~/.oxi/auth.json) and also updates config.toml’s [engine].api_key when the provider matches the current default model. Hot-swaps the runtime engine afterward.

Source

pub fn clear_api_key(&self, provider: &str) -> Result<()>

Clear an API key for a provider.

Removes the key from config.toml’s [engine].api_key (when the provider matches the current default model) and rebuilds the engine so the credential is dropped from the running process. The key in ~/.oxi/auth.json must be removed separately via CredentialStore::delete.

Source

pub fn delete_api_key(&self, provider: &str) -> Result<()>

Delete a provider’s API key entirely.

Removes the credential from both the auth store (~/.oxi/auth.json) and config.toml (when the provider matches the current default). Hot-swaps the runtime engine so the credential is dropped immediately.

Note: keys sourced from environment variables (OXIOS_<PROVIDER>_API_KEY or provider-native vars) cannot be removed via this method — they persist as long as the env var is set. The caller should check the credential source before offering a “remove” action.

Source

pub fn set_provider_options(&self, opts: &ProviderOptions) -> Result<()>

Update provider options in config.toml.

Persists the options and makes them available for the next agent run. They are passed through to AgentLoopConfig::provider_options.

Source

pub fn set_routing(&self, update: RoutingUpdate) -> Result<()>

Update routing configuration in config.toml.

Only the fields provided in update are changed; others are left untouched. Changes are persisted to disk immediately.

Source

pub async fn validate_key( &self, provider: &str, api_key: &str, ) -> ValidateKeyResult

Validate an API key by making a real minimal completion request.

Sends a 1-token “Hi” request to the provider’s API. If the key is invalid or expired, the provider returns an auth error.

Source

pub async fn validate_stored_key(&self, provider: &str) -> ValidateKeyResult

Validate the stored API key for a provider.

Resolves the key from the credential store (env var → config → auth.json) and validates it via a real API call. Returns valid: false with a descriptive message when no key is found.

Source

pub fn estimate_cost( model_id: &str, input_tokens: u64, output_tokens: u64, ) -> f64

Estimate cost for a model invocation.

Trait Implementations§

Source§

impl Debug for EngineApi

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. 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 = Infallible

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