pub trait Invocable: Send + Sync {
// Required methods
fn spec(&self) -> &InvocableSpec;
fn invoke<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
request: InvocableRequest,
ctx: &'life1 mut CapabilityContext<'life2>,
) -> Pin<Box<dyn Future<Output = Result<InvocableResult, CapabilityError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait;
}Expand description
A capability that the model can invoke during a conversation turn.
Implement this trait to expose custom functionality – database queries,
API calls, file operations, code execution – to the agentic loop. Each
implementor provides a spec describing the capability
and an async invoke method that performs the work.
The agentkit loop discovers invocables through a CapabilityProvider
and presents them to the model alongside regular tools.
§Example
use agentkit_capabilities::{
CapabilityContext, CapabilityError, CapabilityName, Invocable,
InvocableOutput, InvocableRequest, InvocableResult, InvocableSpec,
};
use async_trait::async_trait;
use serde_json::json;
struct CurrentTime {
spec: InvocableSpec,
}
impl CurrentTime {
fn new() -> Self {
Self {
spec: InvocableSpec::new(
CapabilityName::new("current_time"),
"Return the current UTC time",
json!({ "type": "object" }),
),
}
}
}
#[async_trait]
impl Invocable for CurrentTime {
fn spec(&self) -> &InvocableSpec {
&self.spec
}
async fn invoke(
&self,
_request: InvocableRequest,
_ctx: &mut CapabilityContext<'_>,
) -> Result<InvocableResult, CapabilityError> {
Ok(InvocableResult::text("2026-03-22T12:00:00Z"))
}
}Required Methods§
Sourcefn spec(&self) -> &InvocableSpec
fn spec(&self) -> &InvocableSpec
Returns the specification that describes this capability to the model.
Sourcefn invoke<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
request: InvocableRequest,
ctx: &'life1 mut CapabilityContext<'life2>,
) -> Pin<Box<dyn Future<Output = Result<InvocableResult, CapabilityError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn invoke<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
request: InvocableRequest,
ctx: &'life1 mut CapabilityContext<'life2>,
) -> Pin<Box<dyn Future<Output = Result<InvocableResult, CapabilityError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Executes the capability with the given request and context.
§Arguments
request- The invocation request containing the model-provided input and session identifiers.ctx- The shared capability context for this turn.
§Errors
Returns CapabilityError if the capability is unavailable, the input
is invalid, or execution fails.