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 serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Format {
    OpenAI,
    Anthropic,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum AccountType {
    #[default]
    Individual,
    Business,
    Enterprise,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
    #[serde(default = "default_format")]
    pub default_format: Format,
    #[serde(default = "default_provider")]
    pub default_provider: String,
    #[serde(default)]
    pub api_key: String,
    #[serde(default = "default_vscode_version")]
    pub vscode_version: String,
    #[serde(default)]
    pub server: ServerConfig,
    #[serde(default)]
    pub providers: HashMap<String, ProviderConfig>,
    #[serde(default)]
    pub logging: LogConfig,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerConfig {
    #[serde(default = "default_host")]
    pub host: String,
    #[serde(default = "default_port")]
    pub port: u16,
    #[serde(default)]
    pub rate_limit_seconds: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ProviderConfig {
    #[serde(rename = "copilot")]
    Copilot {
        #[serde(default = "default_true")]
        enabled: bool,
        #[serde(default)]
        account_type: AccountType,
        enterprise_url: Option<String>,
    },
    #[serde(rename = "kiro")]
    Kiro {
        #[serde(default = "default_true")]
        enabled: bool,
        #[serde(default = "default_region")]
        region: String,
        idc_region: Option<String>,
    },
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogConfig {
    #[serde(default = "default_log_level")]
    pub level: String,
    #[serde(default)]
    pub file: String,
}

fn default_format() -> Format { Format::OpenAI }
fn default_provider() -> String { "copilot".to_string() }
fn default_vscode_version() -> String { "1.110.1".to_string() }
fn default_host() -> String { "127.0.0.1".to_string() }
fn default_port() -> u16 { 9090 }
fn default_true() -> bool { true }
fn default_region() -> String { "us-east-1".to_string() }
fn default_log_level() -> String { "info".to_string() }

impl Default for Config {
    fn default() -> Self {
        Config {
            default_format: default_format(),
            default_provider: default_provider(),
            api_key: String::new(),
            vscode_version: default_vscode_version(),
            server: ServerConfig::default(),
            providers: HashMap::new(),
            logging: LogConfig::default(),
        }
    }
}

impl Default for ServerConfig {
    fn default() -> Self {
        ServerConfig { host: default_host(), port: default_port(), rate_limit_seconds: 0 }
    }
}

impl Default for LogConfig {
    fn default() -> Self { LogConfig { level: default_log_level(), file: String::new() } }
}