use super::anthropic::resolve_anthropic_oauth_access_token;
use super::codex::{DEFAULT_CODEX_BASE_URL, resolve_codex_access_token};
use super::{XAI_OAUTH_PROVIDER, is_xai_oauth_alias};
fn env_nonempty(key: &str) -> bool {
std::env::var(key)
.ok()
.is_some_and(|v| !v.trim().is_empty())
}
fn anthropic_key_from_env() -> bool {
env_nonempty("ANTHROPIC_API_KEY") || env_nonempty("ANTHROPIC_AUTH_TOKEN")
}
fn openai_key_from_env() -> bool {
env_nonempty("OPENAI_API_KEY")
}
pub fn provider_needs_xai_credentials(provider: &str) -> bool {
let p = provider.to_ascii_lowercase();
matches!(p.as_str(), "xai" | "grok" | "super-grok" | "super_grok") || is_xai_oauth_alias(&p)
}
pub const EDGECRAB_XAI_AUTH_MODE_ENV: &str = "EDGECRAB_XAI_AUTH_MODE";
pub const EDGECRAB_XAI_AUTH_MODE_OAUTH: &str = "oauth";
pub const EDGECRAB_XAI_AUTH_MODE_KEY: &str = "api_key";
pub async fn inject_subscription_oauth_env(provider: &str) -> Result<(), String> {
let canonical = provider.to_ascii_lowercase();
match canonical.as_str() {
"anthropic" | "claude-pro" | "claude" => {
if !anthropic_key_from_env()
&& let Some(token) = resolve_anthropic_oauth_access_token().await?
{
unsafe { std::env::set_var("ANTHROPIC_API_KEY", token) };
}
}
"openai-codex" | "chatgpt-pro" | "codex" => {
if !openai_key_from_env()
&& let Some(token) = resolve_codex_access_token().await?
{
unsafe { std::env::set_var("OPENAI_API_KEY", token) };
}
}
_ if provider_needs_xai_credentials(&canonical) => {}
_ => {}
}
let _ = XAI_OAUTH_PROVIDER; Ok(())
}
pub fn xai_auth_mode_label() -> &'static str {
match std::env::var(EDGECRAB_XAI_AUTH_MODE_ENV).as_deref() {
Ok(EDGECRAB_XAI_AUTH_MODE_OAUTH) => "oauth",
Ok(EDGECRAB_XAI_AUTH_MODE_KEY) => "api_key",
_ if env_nonempty("XAI_API_KEY") => "api_key",
_ => "missing",
}
}
pub fn prepare_openai_codex_compatible_env() {
if !env_nonempty("OPENAI_COMPATIBLE_BASE_URL") {
unsafe { std::env::set_var("OPENAI_COMPATIBLE_BASE_URL", DEFAULT_CODEX_BASE_URL) };
}
if !env_nonempty("OPENAI_COMPATIBLE_API_KEY")
&& let Ok(key) = std::env::var("OPENAI_API_KEY")
&& !key.trim().is_empty()
{
unsafe { std::env::set_var("OPENAI_COMPATIBLE_API_KEY", key.trim()) };
}
}