A Rust-based multi-agent framework.
Arbiter is a Rust-based, event-driven multi-agent framework that lets developers orchestrate strongly-typed, high-performance simulations and networked systems.
Arbiter provides the foundational types and traits for building actor-based systems with pluggable networking and lifecycle management. It is designed around a lightweight actor model tailored for discrete-event simulation, automated trading, and complex distributed systems.
Arbiter's architecture is built around several key traits and structs that make agent development straightforward:
Actor: The core execution unit. Contains the agent's internal state and logic.LifeCycle: A trait defining the start, stop, and snapshot behavior of an actor.Handler<M>: A trait used to implement message-handling logic for specific message types.Network: A generalized trait for instantiating and managing connections between parts of the system.Runtime: Manages the execution context of the actors, mediating subscriptions and routing messages.
Here is a glimpse of how you can build a simple actor with Arbiter that handles Ping messages:
use arbiter::prelude::*;
#[derive(Debug, Clone)]
pub struct Ping;
#[derive(Debug, Clone)]
pub struct Counter {
pub count: usize,
}
// Define the actor's lifecycle
impl LifeCycle for Counter {
type Snapshot = usize;
type StartMessage = ();
type StopMessage = ();
fn on_start(&mut self) -> Self::StartMessage {}
fn on_stop(&mut self) -> Self::StopMessage {}
fn snapshot(&self) -> Self::Snapshot { self.count }
}
// Implement message passing logic
impl Handler<Ping> for Counter {
type Reply = ();
fn handle(&mut self, _message: &Ping) -> Option<Self::Reply> {
self.count += 1;
println!("Counter received Ping. Total: {}", self.count);
None
}
}For an in-depth dive into Arbiter's design, extensive examples, and API specifics, please check out our MDBook Documentation.
We welcome community contributions! Please see our Contributing Guidelines to get started.
