aiclient-api 0.1.0

A unified AI gateway daemon exposing OpenAI-compatible and Anthropic-compatible API endpoints, backed by GitHub Copilot and Kiro (AWS CodeWhisperer)
Documentation
use super::Provider;
use crate::server::state::AppState;
use anyhow::{bail, Result};
use std::sync::Arc;

pub async fn resolve_provider(
    state: &AppState,
    model: &str,
    header_provider: Option<&str>,
) -> Result<(Arc<dyn Provider>, String)> {
    let providers = state.providers.read().await;
    let config = state.config.load();

    if let Some((prefix, actual_model)) = model.split_once('/') {
        if let Some(provider) = providers.get(prefix) {
            return Ok((provider.clone(), actual_model.to_string()));
        }
        bail!("Provider '{}' not found", prefix);
    }

    if let Some(name) = header_provider {
        if let Some(provider) = providers.get(name) {
            return Ok((provider.clone(), model.to_string()));
        }
        bail!("Provider '{}' not found", name);
    }

    let default_name = &config.default_provider;
    if let Some(provider) = providers.get(default_name.as_str()) {
        return Ok((provider.clone(), model.to_string()));
    }

    bail!("No provider available for model '{}'", model)
}