gaise-api 0.1.1

Axum HTTP server for GAISe — exposes /v1/instruct, /v1/instruct/stream, and /v1/embeddings
Documentation
use std::sync::Arc;
use tracing::info;
use gaise_api::{create_app, AppState};
use gaise_client::{GaiseClientService, GaiseClientConfig};
use gaise_core::logging::ConsoleGaiseLogger;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt::init();

    let ollama_url = std::env::var("OLLAMA_URL").ok();
    let vertexai_api_url = std::env::var("VERTEXAI_API_URL").ok();
    let vertexai_sa_path = std::env::var("VERTEXAI_SA_PATH").ok();
    let openai_api_url = std::env::var("OPENAI_API_URL").ok();
    let openai_api_key = std::env::var("OPENAI_API_KEY").ok();
    let bedrock_region = std::env::var("BEDROCK_REGION").ok();
    let anthropic_api_url = std::env::var("ANTHROPIC_API_URL").ok();
    let anthropic_api_key = std::env::var("ANTHROPIC_API_KEY").ok();
    let gemini_api_url = std::env::var("GEMINI_API_URL").ok();
    let gemini_api_key = std::env::var("GEMINI_API_KEY").ok();

    let vertexai_sa = vertexai_sa_path.and_then(|path| {
        let sa_json = std::fs::read_to_string(path).ok()?;
        serde_json::from_str(&sa_json).ok()
    });

    let config = GaiseClientConfig {
        ollama_url,
        vertexai_api_url,
        vertexai_sa,
        openai_api_url,
        openai_api_key,
        bedrock_region,
        anthropic_api_url,
        anthropic_api_key,
        gemini_api_url,
        gemini_api_key,
        logger: Some(Arc::new(ConsoleGaiseLogger::default())),
    };

    let state = Arc::new(AppState {
        client_service: GaiseClientService::new(config),
    });

    let app = create_app(state);

    let port = std::env::var("GAISE_PORT").unwrap_or_else(|_| "3000".to_string());
    let addr = format!("0.0.0.0:{}", port);
    let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
    info!("Listening on {}", listener.local_addr().unwrap());
    axum::serve(listener, app).await.unwrap();
}