Give events one safe front door
You publish normalized events into an inbox where policies authenticate, authorize, retry, dead-letter, and route them. Source callbacks never call a model directly.
Worked example
See the idea in context
let mut target = AxEventTarget::new("inventory-agent", invoke_agent);
target.map_input = Some(Arc::new(|event, _|
Ok(json!({"uri": event.data["uri"]}))
));
let route = AxEventRoute {
id: "resource-wake".into(), action: "wake".into(),
r#match: json!({"types":["mcp.resource.updated"]}),
target_id: Some("inventory-agent".into()),
require_authenticated: true, ordering: "strict".into(),
debounce_ms: 0, instance_key: None,
};
let mut runtime = AxEventRuntime::new(vec![route], json!({}))?;
runtime.register_target(target);
runtime.start()?;Run itIn your own project
cargo add axllm
use axllm::{ai, ax, AxResult};
use serde_json::json;
fn main() -> AxResult<()> {
let mut llm = ai("openai", json!({"apiKey": std::env::var("OPENAI_API_KEY")?}))?;
let mut classify = ax("review:string -> sentiment:class \"positive, negative, neutral\"")?;
let result = classify.forward(&mut llm, json!({
"review": "Useful and boring in the best way."
}))?;
println!("sentiment: {}", result["sentiment"].as_str().unwrap_or_default());
Ok(())
}Set OPENAI_APIKEY in your environment before running provider-backed code.
From a clone of the ax repo:
npm run example -- rust src/examples/rust/mcp/resource_wake_agent.rsActive practice
Answer 2 in a row to learn this · attempt 1