pub struct RequestHandler { /* private fields */ }a2a-v1 and server only.Expand description
Shared dispatch layer for A2A v1.0.0 operations.
Maps operation names to executor/store calls. Used by both the JSON-RPC handler and the REST handler.
When constructed with a adk_runner::RunnerConfig via RequestHandler::with_runner,
message_send and message_stream invoke the agent through the ADK Runner
for real LLM generation. Without a runner config, they perform state
transitions only (useful for protocol-level testing).
Implementations§
Source§impl RequestHandler
impl RequestHandler
Sourcepub fn new(
executor: Arc<V1Executor>,
task_store: Arc<dyn TaskStore>,
push_sender: Arc<dyn PushNotificationSender>,
agent_card: Arc<RwLock<CachedAgentCard>>,
) -> RequestHandler
pub fn new( executor: Arc<V1Executor>, task_store: Arc<dyn TaskStore>, push_sender: Arc<dyn PushNotificationSender>, agent_card: Arc<RwLock<CachedAgentCard>>, ) -> RequestHandler
Creates a new request handler without a runner (stub mode).
Sourcepub fn with_runner(
executor: Arc<V1Executor>,
task_store: Arc<dyn TaskStore>,
push_sender: Arc<dyn PushNotificationSender>,
agent_card: Arc<RwLock<CachedAgentCard>>,
runner_config: Arc<RunnerConfig>,
) -> RequestHandler
pub fn with_runner( executor: Arc<V1Executor>, task_store: Arc<dyn TaskStore>, push_sender: Arc<dyn PushNotificationSender>, agent_card: Arc<RwLock<CachedAgentCard>>, runner_config: Arc<RunnerConfig>, ) -> RequestHandler
Creates a new request handler with a runner for real LLM invocation.
Sourcepub async fn message_send(&self, msg: Message) -> Result<Task, A2aError>
pub async fn message_send(&self, msg: Message) -> Result<Task, A2aError>
Sends a message, creating a task and processing it through the executor.
When a runner config is present, invokes the agent through the ADK Runner for real LLM generation. The LLM response is recorded as an artifact on the task. Without a runner, performs state transitions only.
§Errors
Returns an error if task creation, state transitions, or store operations fail.
Sourcepub async fn message_stream(
&self,
msg: Message,
) -> Result<Pin<Box<dyn Stream<Item = Result<StreamResponse, A2aError>> + Send>>, A2aError>
pub async fn message_stream( &self, msg: Message, ) -> Result<Pin<Box<dyn Stream<Item = Result<StreamResponse, A2aError>> + Send>>, A2aError>
Sends a streaming message, returning a stream of SSE events.
Drives the agent and translates its events as they arrive:
| Agent event | A2A event |
|---|---|
| first, before any output | Task, then TaskStatusUpdateEvent — Working |
content with partial = true | TaskArtifactUpdateEvent — append, not last chunk |
content with partial = false | TaskArtifactUpdateEvent — final chunk |
| stream ends | TaskStatusUpdateEvent — Completed |
| stream errors | TaskStatusUpdateEvent — Failed |
Chunks of one response share an artifact ID so a client can reassemble them, which is the same contract adk-python and adk-go implement over their A2A SDKs.
With no runner configured the task is created and completed without agent output, which keeps discovery-only deployments working.
§Errors
Returns an error if task creation fails. Failures once streaming has begun are reported
as a Failed status event, since the response has already started.
Sourcepub async fn tasks_get(
&self,
task_id: &str,
history_len: Option<u32>,
) -> Result<Task, A2aError>
pub async fn tasks_get( &self, task_id: &str, history_len: Option<u32>, ) -> Result<Task, A2aError>
Retrieves a task by ID from the task store.
Optionally limits the number of history messages returned.
§Errors
Returns A2aError::TaskNotFound if the task does not exist.
Sourcepub async fn tasks_cancel(&self, task_id: &str) -> Result<Task, A2aError>
pub async fn tasks_cancel(&self, task_id: &str) -> Result<Task, A2aError>
Cancels a task by transitioning it to CANCELED state.
Validates that the task is not already in a terminal state before canceling.
§Errors
Returns A2aError::TaskNotFound if the task does not exist, or
A2aError::TaskNotCancelable if the task is in a terminal state.
Sourcepub async fn tasks_list(
&self,
params: ListTasksParams,
) -> Result<Vec<Task>, A2aError>
pub async fn tasks_list( &self, params: ListTasksParams, ) -> Result<Vec<Task>, A2aError>
Lists tasks matching the given parameters.
Supports filtering by context_id, state, and pagination via page_size.
Sourcepub async fn tasks_subscribe(
&self,
task_id: &str,
) -> Result<Pin<Box<dyn Stream<Item = Result<StreamResponse, A2aError>> + Send>>, A2aError>
pub async fn tasks_subscribe( &self, task_id: &str, ) -> Result<Pin<Box<dyn Stream<Item = Result<StreamResponse, A2aError>> + Send>>, A2aError>
Returns the current state of a task as a short stream, then closes.
Important: this is a point-in-time snapshot, not a live subscription. It emits the task and its current status and then ends; it does not deliver subsequent updates. A client that needs live updates should use
message/stream, which streams the agent’s events as they are produced.
A real re-attach would require a per-task event queue that outlives the request, which the A2A SDKs in adk-python and adk-go provide and this hand-rolled server does not yet.
§Errors
Returns A2aError::TaskNotFound if the task does not exist, or
A2aError::TaskNotCancelable if the task already reached a terminal state.
Sourcepub async fn push_config_create(
&self,
task_id: &str,
config: TaskPushNotificationConfig,
) -> Result<TaskPushNotificationConfig, A2aError>
pub async fn push_config_create( &self, task_id: &str, config: TaskPushNotificationConfig, ) -> Result<TaskPushNotificationConfig, A2aError>
Creates a push notification configuration for a task.
Assigns a server-generated config ID and stores the config on the task.
§Errors
Returns A2aError::TaskNotFound if the task does not exist.
Sourcepub async fn push_config_get(
&self,
task_id: &str,
config_id: &str,
) -> Result<TaskPushNotificationConfig, A2aError>
pub async fn push_config_get( &self, task_id: &str, config_id: &str, ) -> Result<TaskPushNotificationConfig, A2aError>
Retrieves a push notification configuration by task ID and config ID.
§Errors
Returns A2aError::TaskNotFound if the task or config does not exist.
Sourcepub async fn push_config_list(
&self,
task_id: &str,
) -> Result<Vec<TaskPushNotificationConfig>, A2aError>
pub async fn push_config_list( &self, task_id: &str, ) -> Result<Vec<TaskPushNotificationConfig>, A2aError>
Lists all push notification configurations for a task.
§Errors
Returns A2aError::TaskNotFound if the task does not exist.
Sourcepub async fn push_config_delete(
&self,
task_id: &str,
config_id: &str,
) -> Result<(), A2aError>
pub async fn push_config_delete( &self, task_id: &str, config_id: &str, ) -> Result<(), A2aError>
Deletes a push notification configuration.
§Errors
Returns A2aError::TaskNotFound if the task or config does not exist.
Sourcepub async fn agent_card_extended(&self) -> Result<AgentCard, A2aError>
pub async fn agent_card_extended(&self) -> Result<AgentCard, A2aError>
Returns the extended agent card.
§Errors
Returns A2aError::ExtendedAgentCardNotConfigured if no card is set.
Sourcepub fn executor(&self) -> &Arc<V1Executor> ⓘ
pub fn executor(&self) -> &Arc<V1Executor> ⓘ
Returns a reference to the underlying executor.
Sourcepub fn task_store(&self) -> &Arc<dyn TaskStore> ⓘ
pub fn task_store(&self) -> &Arc<dyn TaskStore> ⓘ
Returns a reference to the underlying task store.
Auto Trait Implementations§
impl !Freeze for RequestHandler
impl !RefUnwindSafe for RequestHandler
impl !UnwindSafe for RequestHandler
impl Send for RequestHandler
impl Sync for RequestHandler
impl Unpin for RequestHandler
impl UnsafeUnpin for RequestHandler
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreimpl<T> MaybeSend for Twhere
T: Send,
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.