use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::auth::OAuthConfig;
use crate::store::AmbientSpec;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct HeaderSpec {
pub name: String,
pub scheme: HeaderScheme,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum HeaderScheme {
Raw,
Bearer,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ProtocolId {
#[serde(rename = "openai_chat")]
OpenAiChat,
#[serde(rename = "anthropic_messages")]
AnthropicMessages,
#[serde(rename = "openai_responses")]
OpenAiResponses,
#[serde(rename = "google_generative_ai")]
GoogleGenAi,
#[serde(rename = "ollama_chat")]
OllamaChat,
#[serde(rename = "claude_code")]
ClaudeCode,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum AuthId {
#[serde(rename = "api_key")]
ApiKey,
#[serde(rename = "bearer")]
Bearer,
#[serde(rename = "oauth2")]
OAuth2,
#[serde(rename = "none")]
None,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ModelsOverride {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub query: Vec<(String, String)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub array_key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id_key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context_key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_output_key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name_key: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TransportSpec {
pub program: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub args: Vec<String>,
}
#[derive(Clone, Debug, PartialEq, Deserialize)]
pub struct Provider {
pub name: String,
pub base_url: String,
#[serde(default)]
pub exec: Option<String>,
#[serde(default)]
pub transport: Option<TransportSpec>,
pub protocol: ProtocolId,
pub auth: AuthId,
#[serde(default)]
pub api_header: Option<HeaderSpec>,
#[serde(default)]
pub beta_headers: Vec<(String, String)>,
#[serde(default)]
pub generation_query: Vec<(String, String)>,
#[serde(default)]
pub model_aliases: BTreeMap<String, String>,
#[serde(default)]
pub unsupported_body_keys: Vec<String>,
#[serde(default)]
pub models: Option<ModelsOverride>,
#[serde(default)]
pub oauth: Option<OAuthConfig>,
#[serde(default)]
pub ambient: Option<AmbientSpec>,
}