Architecture

How the widget, backend, and wallets fit together.

AOMI Architecture

AOMI is an AI-powered blockchain operations assistant that transforms natural language into Web3 operations. Built with a streaming-first, modular design, it enables conversational interactions for querying blockchain state, executing swaps, calling smart contracts, and sending transactions.

System Overview

Crate Dependency Graph

The workspace is organized into binary crates (executables) and library crates (shared functionality):

Core Crates

aomi-chat

The heart of LLM orchestration. Manages agent creation, streaming completions, and system events.

ComponentPurpose
ChatAppMain application wrapper
ChatAppBuilderBuilder pattern for app configuration
stream_completionAsync generator for LLM responses
SystemEventQueueThread-safe event buffer
ChatCommandStreaming response variants

aomi-backend

Session and history management for multi-user scenarios.

ComponentPurpose
SessionManagerManages concurrent sessions
SessionStatePer-session state machine
HistoryBackendPluggable persistence
ChatMessageMessage representation

aomi-tools

Centralized tool management via IO Scheduler pattern.

ComponentPurpose
ToolSchedulerGlobal tool registry and executor
ToolApiHandlerPer-request handler
ToolResultStreamStreaming tool results
AomiApiToolTool trait for single-result tools
MultiStepApiToolTool trait for streaming tools

aomi-anvil

Anvil fork management for transaction simulation.

ComponentPurpose
ForkProviderManaged or external fork
AnvilInstanceSpawned Anvil process
ForkSnapshotFork state capture

aomi-scripts

Forge script generation and execution.

ComponentPurpose
ForgeExecutorDependency-aware executor
ScriptAssemblerScript generation
SourceFetcherBackground contract fetching
ExecutionPlanOperation grouping

aomi-eval

Evaluation framework for testing agent behavior.

ComponentPurpose
EvalHarnessTest runner
EvalCaseTest case definition
AssertionBalance/state assertions

Data Flow

Message Processing

System Events Flow

Key Patterns

Builder Pattern

All agentic applications use the builder pattern for flexible configuration:

let app = ChatAppBuilder::new(&preamble).await?
    .add_tool(GetContractABI)?
    .add_tool(SimulateTransaction)?
    .add_docs_tool(sender, None).await?
    .build(skip_mcp, system_events, sender).await?;

Trait-Based Abstractions

Core components use traits for testability and extensibility:

Streaming-First Design

All LLM responses and tool results stream via async generators:

Event Bus Architecture

The SystemEventQueue acts as a central event bus:

External Integrations

ServiceCratePurpose
Anthropic Claudeaomi-chatLLM inference
MCP Serveraomi-mcpExtended tool protocol
Etherscanaomi-toolsContract data
Brave Searchaomi-toolsWeb search
BAML Serveraomi-bamlStructured AI outputs
Alchemy/Infuraaomi-toolsRPC endpoints

Configuration

Environment Variables

VariableRequiredPurpose
ANTHROPIC_API_KEYYesClaude API access
DATABASE_URLYesPostgreSQL/SQLite connection
BRAVE_SEARCH_API_KEYNoWeb search
ETHERSCAN_API_KEYNoContract data
ALCHEMY_API_KEYNoRPC endpoints
BAML_SERVER_URLNoStructured AI

Network Configuration

Networks are configured via config.yaml:

networks:
  ethereum:
    rpc_url: "https://eth-mainnet.g.alchemy.com/v2/{key}"
    chain_id: 1
  base:
    rpc_url: "https://base-mainnet.g.alchemy.com/v2/{key}"
    chain_id: 8453

Build & Run

# Development
cargo run --bin backend     # HTTP API server
cargo run --bin cli         # Interactive CLI
cargo run --bin tui         # Terminal UI

# Testing
cargo test --all            # All tests
cargo test --package aomi-tools  # Specific crate

# Production
docker build --target backend-runtime -t aomi-backend .

On this page