aether-llm 0.7.0

Multi-provider LLM abstraction layer for the Aether AI agent framework
Documentation
use async_openai::config::{Config, OpenAIConfig};
use reqwest::header::{AUTHORIZATION, HeaderMap};
use secrecy::SecretString;

use crate::ProviderAuthMode;

#[derive(Clone, Debug)]
pub struct AetherOpenAiConfig {
    inner: OpenAIConfig,
    auth_mode: ProviderAuthMode,
}

impl AetherOpenAiConfig {
    pub fn new(inner: OpenAIConfig, auth_mode: ProviderAuthMode) -> Self {
        Self { inner, auth_mode }
    }
}

impl Config for AetherOpenAiConfig {
    fn headers(&self) -> HeaderMap {
        let mut headers = self.inner.headers();
        if self.auth_mode == ProviderAuthMode::None {
            headers.remove(AUTHORIZATION);
        }
        headers
    }

    fn url(&self, path: &str) -> String {
        self.inner.url(path)
    }

    fn query(&self) -> Vec<(&str, &str)> {
        self.inner.query()
    }

    fn api_base(&self) -> &str {
        self.inner.api_base()
    }

    fn api_key(&self) -> &SecretString {
        self.inner.api_key()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn default_auth_keeps_authorization_header() {
        let config = AetherOpenAiConfig::new(OpenAIConfig::new().with_api_key("token"), ProviderAuthMode::Default);
        assert!(config.headers().contains_key(AUTHORIZATION));
    }

    #[test]
    fn none_auth_removes_authorization_header() {
        let config = AetherOpenAiConfig::new(OpenAIConfig::new().with_api_key("token"), ProviderAuthMode::None);
        assert!(!config.headers().contains_key(AUTHORIZATION));
    }
}