vv-agent-rs
vv-agent-rs is the Rust workspace for the vv-agent crate: an embeddable
agent runtime, SDK, CLI, tool system, memory layer, and workspace abstraction
for model-driven automation.
It is designed around explicit agent control flow. A task is not considered
done because the model wrote a final-looking sentence; the model must call
task_finish to complete or ask_user to pause for user input. This keeps
CLI runs, SDK sessions, background runs, and distributed execution on the same
result contract.
Architecture
AgentRuntime
├── LLM client # vv-llm backed chat client, endpoint resolution, streaming
├── CycleRunner # one model turn: prompt, response, tool-call plan
├── ToolOrchestrator # tool policy, approval, dispatch, timeout, telemetry
├── RuntimeHookManager # before/after hooks for LLM, tools, and memory
├── MemoryManager # context budgeting, compaction, artifacts, session memory
├── RunHandle / RunEvent # live control, typed events, event-store replay
├── RuntimeExecutionBackend # run scheduling
│ ├── InlineBackend # synchronous default
│ ├── ThreadBackend # non-blocking task submission
│ └── DistributedBackend # checkpointed cycles with pluggable dispatch
└── WorkspaceBackend # file/object I/O boundary for tools
├── LocalWorkspaceBackend
├── MemoryWorkspaceBackend
└── S3WorkspaceBackend
Provider request building, endpoint transport, retries, streaming deltas, token
limits, usage accounting, and provider-specific protocol details are delegated
to the published vv-llm crate. vv-agent focuses on agent execution: prompts,
tools, hooks, memory, sessions, workspace access, and orchestration.
Setup
Run commands from this repository root:
Most real-model examples and the CLI read a local vv-llm settings file. Keep
the credential-bearing file untracked:
# Fill endpoint keys in local_settings.json.
The default settings path is local_settings.json. You can override it with
VV_AGENT_LOCAL_SETTINGS for examples or --settings-file for the CLI.
Quick Start
CLI
CLI flags:
| Flag | Purpose |
|---|---|
--prompt |
Required user task. |
--backend |
Backend key under LLM_SETTINGS.backends. |
--model |
Model key under the selected backend. |
--settings-file |
Local vv-llm settings file. |
--workspace |
Directory exposed to workspace tools. |
--max-cycles |
Maximum runtime cycles before stopping. |
--language |
Prompt/tool guidance locale. |
--agent-type |
Optional agent profile type such as computer. |
--verbose |
Emit per-cycle runtime events. |
Agent + Runner SDK
Use Agent + Runner for new embedded applications. Agent
describes instructions, model, tools, handoffs, hooks, and defaults. Runner
owns model providers, workspace defaults, and execution. RunConfig overrides
one run without changing the agent definition, including the public
ExecutionMode for inline, threaded, or distributed execution.
use ;
async
Sessions keep conversation history across runner calls:
use ;
let session = new;
runner
.run_with_config
.await?;
let result = runner
.run_with_config
.await?;
Live Runs and Events
Runner::run() and run_with_config() are the one-shot entrypoints. Use
Runner::start() when an application needs live UI/server control: subscribe
to events, approve pending tools, cancel a run, or await the final result from
one RunHandle. Runner::stream() is a convenience wrapper over start() for
typed live events.
use ;
let handle = runner
.start
.await?;
let mut events = handle.events;
while let Some = events.next.await
let result = handle.result.await?;
Each RunEvent is a v1 envelope with event_id, run_id, trace_id,
optional session and parent identifiers, timing, metadata, and a typed
RunEventPayload. JsonlRunEventStore can append events and replay a run,
including child events linked by parent run id.
Live tool approval uses ApprovalProvider and the handle-owned broker. The
model-facing ask_user tool remains for requesting user input as part of the
conversation. Host applications can also attach ContextProvider values for
ordered prompt fragments and MemoryProvider values for external search, save,
and compaction lifecycle hooks.
App Server
Use the App Server when a product shell needs to drive vv-agent over a stable
JSON-RPC protocol instead of linking directly to runtime internals. It supports
stdio JSONL transport, thread and turn lifecycle requests, live item
notifications, approval server requests, replay, schema generation, and a typed
Rust test client.
See crates/vv-agent/docs/app_server.md for protocol examples and client
responsibilities.
Low-Level Runtime
Use the runtime directly only when you need to assemble the LLM client, prompt,
tool registry, workspace, and run controls yourself. New embedded applications
should start with Agent + Runner.
use PathBuf;
use build_vv_llm_from_local_settings;
use ;
use ;
See crates/vv-agent/examples/01_quick_start.rs for a complete low-level
runtime version with event logging.
Core Capabilities
| Area | What vv-agent provides |
|---|---|
| Runtime | Multi-cycle model execution, explicit terminal states, live RunHandle, cancellation, typed events, event replay, and max-cycle handling. |
| Tools | Built-in tools plus a ToolOrchestrator path for policy, approval, dispatch, timeout, and telemetry. |
| SDK | Agent, Runner, RunConfig, ModelSettings, typed tools, Agent::as_tool(), RunEvent, providers, and Session. |
| Memory | Token budgeting, prompt-too-long retries, micro and full compaction, artifact-backed large tool results, image trimming, session memory, and external provider hooks. |
| Hooks | Rust RuntimeHook implementations can inspect or patch LLM calls, tool calls, memory compaction, and run lifecycle behavior. |
| Sub-agents | Runtime-backed sub-task creation, batch submission, background status queries with wait-for-completion support, continuation, steering, and inherited streaming callbacks. |
| Skills | Skill directory discovery, frontmatter parsing, validation, prompt rendering with budget limits, activation, and activation history. |
| Workspace | Local, in-memory, and S3 object-store backends behind one WorkspaceBackend boundary. |
Execution Backends
The public SDK selects scheduling through ExecutionMode. Lower-level runtime
backend structs remain available for advanced integrations:
| Backend | Use case |
|---|---|
ExecutionMode::Inline |
Default synchronous execution in the current process. |
ExecutionMode::Threaded |
Submit runs without blocking the caller. |
ExecutionMode::Distributed |
Checkpointed cycle execution with serializable runtime recipes and pluggable dispatch. |
Checkpointed runs can store state in memory, SQLite, or Redis. The optional
apalis feature adds an Apalis job bridge for applications that already use
Apalis workers:
The distributed API also has an inline fallback, which is useful for local
development and tests. See crates/vv-agent/examples/23_distributed_backend.rs.
Workspace Backends
All built-in file tools go through WorkspaceBackend. That keeps local files,
memory-backed files, and S3-compatible object storage on the same tool contract.
find_files and search_files include safety defaults for large workspaces:
bounded result counts, hidden/dependency directory filtering, explicit ignored
path inclusion, and local rg acceleration when available.
Examples
The numbered examples are the best way to explore the public API:
See crates/vv-agent/examples/README.md for the full example index covering
Agent + Runner, runtime hooks, custom tools, handoffs, live approval,
background tasks, tracing, sub-agent pipelines, skills, streaming, cancellation,
state stores, execution backends, workspace backends, and temporary tool
injection.
Live Smoke Tests
Live tests are opt-in and use a local settings file without printing
credentials. By default they read the untracked
crates/vv-agent/tests/dev_settings.json; start from
crates/vv-agent/tests/dev_settings.example.json.
VV_AGENT_RUN_LIVE_TESTS=1 \
VV_AGENT_RUN_LIVE_TESTS=1 \
The live suite exercises direct runtime completion, SDK completion,
ask_user, todo updates, memory notes, skill activation, workspace tools,
image reading, safe edit_file recovery, foreground and background shell
commands, sub-agent waiting/status checks, and configured sub-agent delegation.
Verification
Run the standard checks from vv-agent-rs/:
Focused checks that are useful while editing public docs and examples:
Repository Layout
vv-agent-rs/
Cargo.toml
crates/vv-agent/
src/
cli/ # CLI entrypoint and task construction
config/ # LLM settings loading and model resolution
llm/ # LLM trait, scripted test client, vv-llm client bridge
memory/ # compaction, artifacts, session memory, token budgeting
prompt/ # system prompt sections and prompt-cache metadata
agent.rs # public Agent builder
runner.rs # public Runner over runtime execution
run_config.rs
model.rs
model_settings.rs
sessions.rs
runtime/ # agent runtime, hooks, backends, cancellation, sub-agents
skills/ # skill discovery, parsing, validation, activation
tools/ # registry, schemas, dispatcher, built-in handlers
workspace/ # local, memory, and S3 workspace backends
examples/
tests/
docs/
Additional design notes live under docs/, especially docs/architecture.md
and docs/model-settings.md.