pub mod circuit_breaker;
pub mod client;
pub mod context;
pub mod dep_enrichment;
pub mod models;
pub mod prompts;
pub mod provider;
pub mod registry;
pub mod review_context;
pub mod types;
pub use circuit_breaker::CircuitBreaker;
pub use client::{AiClient, AuthMethod, is_free_model, resolve_anthropic_credential};
pub use dep_enrichment::enrich_dep_releases;
pub use models::{AiModel, ModelProvider};
pub use provider::AiProvider;
pub use registry::{PROVIDER_ANTHROPIC, ProviderConfig, all_providers, get_provider};
pub use types::{CreateIssueResponse, CreditsStatus, DepReleaseNote, TriageResponse};
use crate::history::AiStats;
#[derive(Debug, Clone)]
pub struct AiResponse {
pub triage: TriageResponse,
pub stats: AiStats,
}
pub fn setup_primary_client(config: &crate::config::AppConfig) -> anyhow::Result<AiClient> {
if config.ai.provider == PROVIDER_ANTHROPIC
&& let Some(client) = resolve_anthropic_credential(&config.ai)
{
return Ok(client);
}
AiClient::new(&config.ai.provider, &config.ai)
}
#[cfg(not(target_arch = "wasm32"))]
pub async fn create_issue(
title: &str,
body: &str,
repo: &str,
) -> anyhow::Result<(CreateIssueResponse, AiStats)> {
let config = crate::config::load_config()?;
let client = setup_primary_client(&config)?;
client.create_issue(title, body, repo).await
}