Skip to main content

ServerBuilder

Struct ServerBuilder 

Source
pub struct ServerBuilder { /* private fields */ }
Expand description

Builder for constructing an ADK server with custom routes.

ServerBuilder allows registering additional Axum routers alongside the built-in REST, A2A, and UI routes. Custom routes benefit from the same middleware stack (auth, CORS, tracing, timeout, security headers) as the built-in routes.

§Example

use adk_server::{ServerBuilder, ServerConfig};
use axum::{Router, routing::get};

let config = ServerConfig::new(agent, session_service);

let app = ServerBuilder::new(config)
    .add_api_routes(
        Router::new()
            .route("/projects", get(list_projects))
            .route("/projects/{id}", get(get_project))
    )
    .add_api_routes(
        Router::new()
            .route("/automations", get(list_automations))
    )
    .with_a2a("http://localhost:8080")
    .build();

let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await?;
axum::serve(listener, app).await?;

Implementations§

Source§

impl ServerBuilder

Source

pub fn new(config: ServerConfig) -> Self

Create a new server builder with the given configuration.

Source

pub fn add_api_routes(self, routes: Router) -> Self

Add custom routes nested under /api.

These routes are merged into the API router and benefit from the auth middleware layer. Multiple calls accumulate routes.

§Example
builder.add_api_routes(
    Router::new()
        .route("/projects", get(list_projects))
        .route("/projects/{id}", get(get_project))
)
Source

pub fn add_root_routes(self, routes: Router) -> Self

Add custom routes at the root level (not nested under /api).

These routes are merged at the top level of the application, alongside the UI and A2A routes. They receive the full middleware stack (CORS, tracing, timeout, security headers) but NOT the auth middleware.

Use this for routes that need their own auth handling or public endpoints.

Source

pub fn with_a2a(self, base_url: impl Into<String>) -> Self

Enable A2A protocol support at the specified base URL.

The base URL is used to construct the agent card’s endpoint URL.

Source

pub fn enable_shutdown_endpoint(self) -> Self

Enable the POST /api/shutdown endpoint for graceful shutdown.

When enabled, the server exposes a shutdown endpoint that triggers graceful shutdown: stops accepting new connections, completes in-flight requests, and then exits. Use build_with_shutdown to get the ShutdownHandle for wiring into axum::serve().with_graceful_shutdown().

The endpoint is protected by the auth middleware when a RequestContextExtractor is configured.

Source

pub fn build(self) -> Router

Build the final Axum router with all routes and middleware applied.

Source

pub fn build_with_shutdown(self) -> (Router, ShutdownHandle)

Build the final Axum router and return a ShutdownHandle.

Use this when enable_shutdown_endpoint() is set. Pass the handle’s signal to axum::serve().with_graceful_shutdown().

§Example
let (app, shutdown_handle) = ServerBuilder::new(config)
    .enable_shutdown_endpoint()
    .build_with_shutdown();

let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await?;
axum::serve(listener, app)
    .with_graceful_shutdown(shutdown_handle.signal())
    .await?;

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,