agent-works
Batteries-included Agent toolbox built on agent-base.
agent-works adds production-ready capabilities on top of the agent-base runtime kernel: loop guards for model misbehavior, MCP multi-server management, Skills with progressive disclosure, a Focus module for structured LLM extraction, multi-agent orchestration with fork_history, and a CLI REPL loop — all behind feature flags. Pick what you need.
Relationship with agent-base
agent-base Pure runtime kernel (~12 deps, trait interfaces only)
↑
agent-works Batteries-included toolbox (wraps agent-base + enhancements)
- Use
agent-basealone when you only need the runtime (LLM + tools + middleware). - Use
agent-workswhen you want MCP, Skills, Focus, multi-agent, and CLI — and still get everything from agent-base through re-exports. - Switching from
agent-basetoagent-worksis a one-line import change.
Installation
[]
= { = "0.1.7", = ["full"] }
Or pick specific features:
= { = "0.1.7", = ["mcp", "skill"] }
Feature Flags
| Feature | Description | Extra deps |
|---|---|---|
mcp |
McpHUb — multi-server MCP with HTTP + stdio transport |
— |
skill |
Skill trait + LazySkillPrompter / FullDetailPrompter + SkillDetailTool + SkillLoader |
— |
prompt_skill |
PromptSkill — skill definitions from prompt files |
serde_yaml |
yaml_skill |
YamlSkill — skill definitions from YAML files |
serde_yaml |
hot-reload |
Hot-reload skill definitions on file change | notify, prompt_skill |
cli |
CliRepl (generic REPL loop) + CliEventPrinter (terminal event output) |
— |
focus |
Structured LLM extraction modules | — |
compression |
Context-compression presets for the react loop | — |
multi_agent |
MultiAgentRuntime: child lifecycle, mailboxes, control-plane gates |
— |
loom-check |
Swap the control-plane atomics for loom and run model checks (cargo test --features multi_agent,loom-check --lib loom) |
loom |
full |
All of the above (except loom-check) |
— |
All types from agent-base are re-exported (AgentBuilder, AgentRuntime, Tool, Middleware, ...), so you only need to depend on agent-works.
Quick Start
Skills
Skills package tools + descriptions into reusable units with progressive disclosure:
use Arc;
use ;
use ;
use async_trait;
use ;
// 1. Define tools
;
// 2. Pack into a Skill
;
// 3. Build with agent-works AgentBuilder
let runtime = new
.system_prompt
.register_skill // auto-registers tools, injects prompt, adds detail tool
.build?;
The builder automatically:
- Registers skill tools and detects name conflicts
- Injects skill brief descriptions into the system prompt (via
LazySkillPrompter) - Registers
SkillDetailToolfor on-demand detailed prompt loading
Focus — Structured LLM Extraction
Focus provides a clean API for extracting structured data from LLM responses:
use Arc;
use Duration;
use Focus;
use Deserialize;
let focus = new;
let output = focus
.
.await?;
println!;
Multi-Agent (multi_agent)
MultiAgentRuntime coordinates child agents: a lifecycle registry, per-child
mailboxes, event bridging to the parent bus, and control-plane gates (spawn
budget, live concurrency, token spend). The LLM-facing tools — spawn_agent,
send_message, wait_agent, list_agents, close_agent — ship in
phi-kernel-tools; this is the layer directly beneath them:
use Duration;
use ;
let runtime = new;
// Spawn: a rejected spawn (limit, duplicate name, no identity) is an Err.
let child = runtime.child
.system_prompt
.spawn
.await?;
println!;
// Work order, then the child's answer.
child.task?;
match child.wait.await
child.close?; // teardown is async: slot + mailbox release on task exit
- Identity:
preset(researcher/coder/reviewer/tester, seeChildPreset) orsystem_prompt; presets carry a prompt and a tool whitelist. Legacytask_name/message/agent_typecall shapes still parse (serde aliases). - Context bridge:
.fork_history("all" | "3" | "none", parent_session)inherits the parent conversation into the child session. - Control plane (
MultiAgentConfig::control):max_spawns(cumulative, with commit/rollback tickets),max_concurrency(live),child_max_tokens,task_timeout,autonomy(Auto|Manual—Manualfloors permissions and excludes write tools),write_tools. - Permissions are deployment config, not LLM choices:
child_permission_mode,child_excluded_tools,child_read_only.
Runnable and offline end to end:
cargo run --example multi_agent --features multi_agent.
MCP Multi-Server
use *;
let mut hub = new;
hub.add_server;
hub.connect_all.await?;
// Discover tools from all servers
let all_tools = hub.discover_all.await?;
// Register into the agent runtime
let mut tools = runtime.tools_mut;
hub.register_all;
CLI REPL
use ;
// Default (stdout)
let mut printer = new;
// Or capture output for testing
let mut printer = with_writer;
let mut repl = new;
// Register custom shell commands
repl.register_shell_command;
repl.run.await?;
Tool Enforcement
The ToolEnforcementMiddleware (inherited from agent-base) nudges the LLM to actually call tools instead of just describing what it would do:
use ToolEnforcementMiddleware;
use ToolEnforcementConfig;
let runtime = new
.register_tool
.middleware
.build?;
Guard — Loop Protection
Guards protect the agent loop from model misbehavior (reasoning-only responses, empty responses, incomplete answers). Without a guard the runtime still works; with one it's smarter.
use ;
// No guard — NoopGuard injected automatically, no intervention
let runtime = new.build?;
// DefaultGuard with defaults — handles reasoning_only, empty_response, text_only
let runtime = new
.guard
.build?;
// DefaultGuard with LLM judge — verifies task completion on text-only responses
let config = DefaultGuardConfig ;
let runtime = new
.guard
.build?;
Custom guards implement the ReactLoopGuard trait:
use ;
;
Examples
# Guard system — DefaultGuard, NoopGuard, custom guards
# Skills with progressive disclosure
# MCP multi-server connection
# CLI REPL + event printer
# Multi-agent fan-out / collect / teardown (offline, stub LLM)
Module Structure
src/
├── lib.rs # Re-exports agent-base + feature-gated modules
├── builder.rs # AgentBuilder wrapper with skill integration
├── handle.rs # AgentHandle — high-level agent lifecycle
├── guard/ # DefaultGuard + ReactLoopGuard trait
├── mcp/ # McpHUb + McpClient (HTTP + stdio transport)
├── skill/ # Skill trait + prompter strategies + detail tool
├── focus/ # Focus — structured LLM extraction
├── multi_agent/ # MultiAgentRuntime + control plane (gates, mailbox, presets)
└── cli/ # CliRepl + CliEventPrinter<W>
License
MIT