use super::graph::Tier;
use super::yes;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ProviderSpec {
pub id: String,
pub kind: ProviderKind,
#[serde(default)]
pub tiers: Vec<Tier>,
pub command: String,
#[serde(default)]
pub args: Vec<String>,
#[serde(default)]
pub model: Option<String>,
#[serde(default)]
pub requires_env: Vec<String>,
#[serde(default)]
pub timeout_seconds: Option<u64>,
#[serde(default)]
pub prompt_on_stdin: bool,
#[serde(default)]
pub usage_regex: Option<String>,
#[serde(default)]
pub cost_per_1k_tokens: Option<f64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProviderKind {
#[serde(
rename = "claude_code",
alias = "claude-code",
alias = "claude",
alias = "claudecode"
)]
ClaudeCode,
#[serde(alias = "Ollama")]
Ollama,
#[serde(rename = "grok_cli", alias = "grok-cli", alias = "grok")]
GrokCli,
#[serde(rename = "grok_build", alias = "grok-build")]
GrokBuild,
#[serde(alias = "Hermes")]
Hermes,
#[serde(
rename = "openai",
alias = "open_ai",
alias = "open-ai",
alias = "OpenAI"
)]
OpenAi,
#[serde(alias = "google_gemini", alias = "google-gemini", alias = "Gemini")]
Gemini,
#[serde(alias = "BYOK", alias = "custom")]
Byok,
#[serde(alias = "MCP")]
Mcp,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(deny_unknown_fields)]
pub struct ProviderRouting {
#[serde(default)]
pub providers: Vec<ProviderSpec>,
#[serde(default)]
pub cascade: BTreeMap<String, Vec<String>>,
#[serde(default = "yes")]
pub enforce_judge_independence: bool,
}