loopsmith_core/config/
providers.rs1use super::graph::Tier;
4use super::yes;
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7use std::collections::BTreeMap;
8
9#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
14#[serde(deny_unknown_fields)]
15pub struct ProviderSpec {
16 pub id: String,
17 pub kind: ProviderKind,
18 #[serde(default)]
19 pub tiers: Vec<Tier>,
20 pub command: String,
21 #[serde(default)]
22 pub args: Vec<String>,
23 #[serde(default)]
24 pub model: Option<String>,
25 #[serde(default)]
28 pub requires_env: Vec<String>,
29 #[serde(default)]
30 pub timeout_seconds: Option<u64>,
31 #[serde(default)]
33 pub prompt_on_stdin: bool,
34 #[serde(default)]
38 pub usage_regex: Option<String>,
39 #[serde(default)]
41 pub cost_per_1k_tokens: Option<f64>,
42}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
48#[serde(rename_all = "snake_case")]
49pub enum ProviderKind {
50 #[serde(
51 rename = "claude_code",
52 alias = "claude-code",
53 alias = "claude",
54 alias = "claudecode"
55 )]
56 ClaudeCode,
57 #[serde(alias = "Ollama")]
58 Ollama,
59 #[serde(rename = "grok_cli", alias = "grok-cli", alias = "grok")]
60 GrokCli,
61 #[serde(rename = "grok_build", alias = "grok-build")]
62 GrokBuild,
63 #[serde(alias = "Hermes")]
64 Hermes,
65 #[serde(
66 rename = "openai",
67 alias = "open_ai",
68 alias = "open-ai",
69 alias = "OpenAI"
70 )]
71 OpenAi,
72 #[serde(alias = "google_gemini", alias = "google-gemini", alias = "Gemini")]
73 Gemini,
74 #[serde(alias = "BYOK", alias = "custom")]
76 Byok,
77 #[serde(alias = "MCP")]
79 Mcp,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
83#[serde(deny_unknown_fields)]
84pub struct ProviderRouting {
85 #[serde(default)]
86 pub providers: Vec<ProviderSpec>,
87 #[serde(default)]
89 pub cascade: BTreeMap<String, Vec<String>>,
90 #[serde(default = "yes")]
92 pub enforce_judge_independence: bool,
93}