use sim_kernel::{Error, Result, Symbol};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BackendDescriptor {
pub address: String,
pub head: String,
pub runner: Symbol,
pub fixture: bool,
}
impl BackendDescriptor {
pub fn is_runner_backed(&self) -> bool {
!self.fixture && self.head != "gateway"
}
pub fn is_gateway(&self) -> bool {
self.head == "gateway"
}
}
pub fn resolve_atom_address(address: &str) -> Result<BackendDescriptor> {
let Some((head, _)) = address.split_once('/') else {
return Err(model_not_found(address));
};
if !KNOWN_PROVIDER_PREFIXES.contains(&head) {
return Err(model_not_found(address));
}
Ok(BackendDescriptor {
address: address.to_owned(),
head: head.to_owned(),
runner: Symbol::new(address.to_owned()),
fixture: head == "fixture",
})
}
fn model_not_found(address: &str) -> Error {
Error::Eval(format!("model_not_found: {address}"))
}
const KNOWN_PROVIDER_PREFIXES: &[&str] = &[
"openai",
"anthropic",
"ollama",
"lm-studio",
"lemonade",
"process",
"runner",
"agent",
"skill",
"sim",
"fixture",
"gateway",
];
pub fn provider_prefixes() -> &'static [&'static str] {
KNOWN_PROVIDER_PREFIXES
}