omniference 0.3.2

A multi-protocol inference engine with provider adapters
Documentation
//! Example of a standalone Omniference server
//!
//! This demonstrates how to run Omniference as a standalone HTTP server
//! with OpenAI-compatible API endpoints.

use omniference::{
	server::OmniferenceServer,
	types::{ProviderConfig, ProviderEndpoint, ProviderKind},
};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
	// Load .env if present
	let _ = dotenvy::dotenv();
	// Initialize logging
	tracing_subscriber::fmt().with_env_filter(tracing_subscriber::EnvFilter::from_default_env()).init();

	println!("🚀 Standalone Omniference Server");
	println!("=================================");

	// Create and configure server
	let mut server = OmniferenceServer::new();

	// Add Ollama provider
	println!("📡 Adding Ollama provider...");
	let ollama_base = std::env::var("OLLAMA_BASE_URL").unwrap_or_else(|_| "http://localhost:11434".to_string());
	server
		.add_provider(ProviderConfig {
			name: "ollama".to_string(),
			endpoint: ProviderEndpoint {
				kind: ProviderKind::OpenAICompat,
				base_url: ollama_base,
				api_key: None,
				extra_headers: std::collections::BTreeMap::new(),
				timeout: Some(30000),
			},
			enabled: true,
			catalog_provider_slug: None,
		})
		.await
		.map_err(|e| anyhow::anyhow!(e))?;

	println!("✅ Ollama provider configured");

	// Alternative: Using builder pattern
	/*
	let mut server = omniference::server::OmniferenceServerBuilder::new()
		.with_adapter(Arc::new(OllamaAdapter))
		.build();

	server.add_provider(provider_config).await?;
	*/

	// Server configuration
	let addr = std::env::var("SERVER_ADDR").unwrap_or_else(|_| "127.0.0.1:8080".to_string());

	println!("\n🌐 Starting server on {}", addr);
	println!("📋 Available endpoints:");
	println!("   POST /api/openai/v1/responses");
	println!("   POST /api/openai-compatible/v1/chat/completions");
	println!("   GET  /api/openai/v1/models");
	println!("   GET  /api/openai-compatible/v1/models");

	println!("\n🔍 Example curl commands:");
	println!("   # List models:");
	println!("   curl http://localhost:8080/api/openai/v1/models");
	println!();
	println!("   # Responses request:");
	println!("   curl -X POST http://localhost:8080/api/openai/v1/responses \\");
	println!("     -H 'Content-Type: application/json' \\");
	println!("     -d '{{");
	println!("       \"model\": \"llama3.2\",");
	println!("       \"input\": \"Hello!\"");
	println!("     }}'");

	// Run the server
	server.run(&addr).await?;

	Ok(())
}