Skip to main content

adk_cli/
serve.rs

1//! Legacy serve entry point.
2//!
3//! New code should use [`Launcher`](crate::Launcher) instead, which provides
4//! the same server with additional configuration options (security, memory,
5//! artifacts, graceful shutdown, etc.).
6
7use adk_core::AgentLoader;
8use adk_server::{ServerConfig, create_app, shutdown_signal};
9use adk_session::InMemorySessionService;
10use anyhow::Result;
11use std::sync::Arc;
12use tracing::warn;
13
14/// Start a web server with the given agent loader.
15///
16/// This is a convenience wrapper kept for backward compatibility with
17/// existing examples. Prefer [`Launcher`](crate::Launcher) for new code.
18pub async fn run_serve(agent_loader: Arc<dyn AgentLoader>, port: u16) -> Result<()> {
19    let span_exporter = match adk_telemetry::init_with_adk_exporter("adk-server") {
20        Ok(exporter) => Some(exporter),
21        Err(e) => {
22            warn!("failed to initialize telemetry: {e}");
23            None
24        }
25    };
26
27    let session_service = Arc::new(InMemorySessionService::new());
28
29    let mut config = ServerConfig::new(agent_loader, session_service);
30
31    if let Some(exporter) = span_exporter {
32        config = config.with_span_exporter(exporter);
33    }
34
35    let app = create_app(config);
36
37    let addr = format!("0.0.0.0:{port}");
38    let listener = tokio::net::TcpListener::bind(&addr).await?;
39
40    println!("ADK Server starting on http://localhost:{port}");
41    println!("Press Ctrl+C to stop");
42
43    axum::serve(listener, app).with_graceful_shutdown(shutdown_signal()).await?;
44
45    Ok(())
46}