use std::sync::Arc;
use systemprompt_ai::{AiService, AiServiceProviders};
use systemprompt_database::DbPool;
use systemprompt_mcp::McpToolProvider;
use systemprompt_mcp::services::registry::RegistryService;
use systemprompt_users::{SessionRepository, UsersAiSessionProvider};
use super::composition::RepositoryBundles;
use crate::error::RuntimeResult;
pub(super) fn build_ai_service(
database: &DbPool,
repositories: &RepositoryBundles,
mcp_registry: &RegistryService,
) -> RuntimeResult<Option<Arc<AiService>>> {
let services = systemprompt_loader::ServicesBootstrap::get()?;
let tool_provider = Arc::new(McpToolProvider::new(
Arc::clone(database),
mcp_registry.clone(),
&services.ai.mcp.resilience,
));
let session_provider = Arc::new(UsersAiSessionProvider::from_repository(
SessionRepository::new(database),
));
let materializer = Arc::new(systemprompt_agent::services::ContextProviderService::new(
repositories.a2a.contexts.clone(),
));
match AiService::new(
&services.providers,
&services.ai,
AiServiceProviders {
tools: tool_provider,
sessions: session_provider,
},
&repositories.ai,
) {
Ok(service) => Ok(Some(Arc::new(
service.with_context_materializer(materializer),
))),
Err(err) => {
tracing::warn!(error = %err, "Inference is not configured; the runtime carries no AI service");
Ok(None)
},
}
}