Arbiter
Multi-agent framework for design, simulation, and auditing.
Install / Use
/learn @harnesslabs/ArbiterREADME
<p align="center"> <a href="https://discord.gg/qEwPr3GMP2"><img src="https://img.shields.io/discord/1363153354338861247?style=flat&logo=discord&logoColor=white&label=Discord&color=5865F2" alt="Discord"></a> <a href="https://x.com/harnesslabs"><img src="https://badgen.net/badge/icon/twitter?icon=twitter&label" alt="Twitter"></a> <img src="https://visitor-badge.laobi.icu/badge?page_id=arbiter" alt="Visitors"> </p>A Rust-based multi-agent framework.
Overview
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.
Core Concepts
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.
Quick Example
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
}
}
Documentation
For an in-depth dive into Arbiter's design, extensive examples, and API specifics, please check out our MDBook Documentation.
Contributing
We welcome community contributions! Please see our Contributing Guidelines to get started.
Related Skills
himalaya
354.5kCLI to manage emails via IMAP/SMTP. Use `himalaya` to list, read, write, reply, forward, search, and organize emails from the terminal. Supports multiple accounts and message composition with MML (MIME Meta Language).
taskflow
354.5kUse when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
coding-agent
354.5kDelegate coding tasks to Codex, Claude Code, or Pi agents via background process
tavily
354.5kTavily web search, content extraction, and research tools.
