{"id":34234835,"url":"https://github.com/zavora-ai/adk-rust","last_synced_at":"2026-02-15T15:10:39.978Z","repository":{"id":326862645,"uuid":"1102340385","full_name":"zavora-ai/adk-rust","owner":"zavora-ai","description":"Rust Agent Development Kit (ADK-Rust): Build AI agents in Rust with modular components for models, tools, memory, realtime voice, and more. ADK-Rust is a flexible framework for developing AI agents with simplicity and power. Model-agnostic, deployment-agnostic, optimized for frontier AI models. Includes support for real-time voice agents.","archived":false,"fork":false,"pushed_at":"2026-01-09T06:14:53.000Z","size":9820,"stargazers_count":41,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-09T09:52:47.249Z","etag":null,"topics":["adk","adk-agent","adk-artifact","adk-cli","adk-google","adk-memory","adk-model","adk-rust","adk-server","adk-tool","agent-developer-kit","google-adk","google-adk-rust","openai-adk","realtime","realtime-adk","realtime-audio"],"latest_commit_sha":null,"homepage":"https://adk-rust.com/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zavora-ai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap/.gitkeep","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-23T09:24:22.000Z","updated_at":"2026-01-09T04:51:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zavora-ai/adk-rust","commit_stats":null,"previous_names":["zavora-ai/adk-rust"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/zavora-ai/adk-rust","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zavora-ai%2Fadk-rust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zavora-ai%2Fadk-rust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zavora-ai%2Fadk-rust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zavora-ai%2Fadk-rust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zavora-ai","download_url":"https://codeload.github.com/zavora-ai/adk-rust/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zavora-ai%2Fadk-rust/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28385656,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T12:01:30.995Z","status":"ssl_error","status_checked_at":"2026-01-13T12:00:09.625Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adk","adk-agent","adk-artifact","adk-cli","adk-google","adk-memory","adk-model","adk-rust","adk-server","adk-tool","agent-developer-kit","google-adk","google-adk-rust","openai-adk","realtime","realtime-adk","realtime-audio"],"created_at":"2025-12-16T02:00:40.512Z","updated_at":"2026-02-15T15:10:39.970Z","avatar_url":"https://github.com/zavora-ai.png","language":"Rust","funding_links":[],"categories":["Frameworks \u0026 Platforms | 框架与平台","Agents","Miscellaneous","⚙️ Implementations \u0026 Libraries"],"sub_categories":["Comprehensive Frameworks | 综合性框架","Frameworks"],"readme":"# ADK-Rust\n\n[![CI](https://github.com/zavora-ai/adk-rust/actions/workflows/ci.yml/badge.svg)](https://github.com/zavora-ai/adk-rust/actions/workflows/ci.yml)\n[![crates.io](https://img.shields.io/crates/v/adk-rust.svg)](https://crates.io/crates/adk-rust)\n[![docs.rs](https://docs.rs/adk-rust/badge.svg)](https://docs.rs/adk-rust)\n[![Wiki](https://img.shields.io/badge/docs-Wiki-blue)](https://github.com/zavora-ai/adk-rust/wiki)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)\n![Rust](https://img.shields.io/badge/rust-1.85%2B-orange.svg)\n\n\u003e **🎉 v0.3.1 Released!** Vertex AI Live streaming, LiveKit WebRTC bridge, OpenAI WebRTC transport, multi-provider Studio codegen, 2026 model names, and response parsing hardening. [Get started →](https://github.com/zavora-ai/adk-rust/wiki/quickstart)\n\nA comprehensive and production-ready Rust framework for building AI agents. Create powerful and high-performance AI agent systems with a flexible, modular architecture. Model-agnostic. Type-safe. Blazingly fast.\n\n## Overview\n\nADK-Rust provides a comprehensive framework for building AI agents in Rust, featuring:\n\n- **Type-safe agent abstractions** with async execution and event streaming\n- **Multiple agent types**: LLM agents, workflow agents (sequential, parallel, loop), and custom agents\n- **Realtime voice agents**: Bidirectional audio streaming with OpenAI Realtime API and Gemini Live API\n- **Tool ecosystem**: Function tools, Google Search, MCP (Model Context Protocol) integration\n- **Production features**: Session management, artifact storage, memory systems, REST/A2A APIs\n- **Developer experience**: Interactive CLI, 80+ working examples, comprehensive documentation\n\n**Status**: Production-ready, actively maintained\n\n## Architecture\n\n![ADK-Rust Architecture](assets/architecture.png)\n\nADK-Rust follows a clean layered architecture from application interface down to foundational services.\n\n## Key Features\n\n### Agent Types\n\n**LLM Agents**: Powered by large language models with tool use, function calling, and streaming responses.\n\n**Workflow Agents**: Deterministic orchestration patterns.\n- `SequentialAgent`: Execute agents in sequence\n- `ParallelAgent`: Execute agents concurrently\n- `LoopAgent`: Iterative execution with exit conditions\n\n**Custom Agents**: Implement the `Agent` trait for specialized behavior.\n\n**Realtime Voice Agents**: Build voice-enabled AI assistants with bidirectional audio streaming.\n\n**Graph Agents**: LangGraph-style workflow orchestration with state management and checkpointing.\n\n### Multi-Provider Support\n\nADK supports multiple LLM providers with a unified API:\n\n| Provider | Model Examples | Feature Flag |\n|----------|---------------|--------------|\n| Gemini | `gemini-2.5-flash`, `gemini-2.5-pro`, `gemini-3-pro`, `gemini-3-flash` | (default) |\n| OpenAI | `gpt-5-mini`, `gpt-5`, `gpt-5.1` | `openai` |\n| Anthropic | `claude-sonnet-4.5`, `claude-opus-4.5`, `claude-haiku-4.5` | `anthropic` |\n| DeepSeek | `deepseek-chat`, `deepseek-r1`, `deepseek-v3.1` | `deepseek` |\n| Groq | `llama-4-scout`, `llama-3.1-70b-versatile`, `mixtral-8x7b-32768` | `groq` |\n| Ollama | `llama3.2:3b`, `qwen2.5:7b`, `mistral:7b` | `ollama` |\n| mistral.rs | Phi-3, Mistral, Llama, Gemma, LLaVa, FLUX | git dependency |\n\nAll providers support streaming, function calling, and multimodal inputs (where available).\n\n### Tool System\n\nBuilt-in tools:\n- Function tools (custom Rust functions)\n- Google Search\n- Artifact loading\n- Loop termination\n\n**MCP Integration**: Connect to Model Context Protocol servers for extended capabilities.\n\n### Production Features\n\n- **Session Management**: In-memory and SQLite-backed sessions with state persistence\n- **Memory System**: Long-term memory with semantic search and vector embeddings\n- **Servers**: REST API with SSE streaming, A2A protocol for agent-to-agent communication\n- **Guardrails**: PII redaction, content filtering, JSON schema validation\n- **Observability**: OpenTelemetry tracing, structured logging\n\n## Core Crates\n\n| Crate | Purpose | Key Features |\n|-------|---------|--------------|\n| `adk-core` | Foundational traits and types | `Agent` trait, `Content`, `Part`, error types, streaming primitives |\n| `adk-agent` | Agent implementations | `LlmAgent`, `SequentialAgent`, `ParallelAgent`, `LoopAgent`, builder patterns |\n| `adk-skill` | AgentSkills parsing and selection | Skill markdown parser, `.skills` discovery/indexing, lexical matching, prompt injection helpers |\n| `adk-model` | LLM integrations | Gemini, OpenAI, Anthropic, DeepSeek, Groq, Ollama clients, streaming, function calling |\n| `adk-gemini` | Gemini client | Google Gemini API client with streaming and multimodal support |\n| `adk-mistralrs` | Native local inference | mistral.rs integration, ISQ quantization, LoRA adapters (git-only) |\n| `adk-tool` | Tool system and extensibility | `FunctionTool`, Google Search, MCP protocol, schema validation |\n| `adk-session` | Session and state management | SQLite/in-memory backends, conversation history, state persistence |\n| `adk-artifact` | Artifact storage system | File-based storage, MIME type handling, image/PDF/video support |\n| `adk-memory` | Long-term memory | Vector embeddings, semantic search, Qdrant integration |\n| `adk-runner` | Agent execution runtime | Context management, event streaming, session lifecycle, callbacks |\n| `adk-server` | Production API servers | REST API, A2A protocol, middleware, health checks |\n| `adk-cli` | Command-line interface | Interactive REPL, session management, MCP server integration |\n| `adk-realtime` | Real-time voice agents | OpenAI Realtime API, Gemini Live API, bidirectional audio, VAD |\n| `adk-graph` | Graph-based workflows | LangGraph-style orchestration, state management, checkpointing, human-in-the-loop |\n| `adk-browser` | Browser automation | 46 WebDriver tools, navigation, forms, screenshots, PDF generation |\n| `adk-eval` | Agent evaluation | Test definitions, trajectory validation, LLM-judged scoring, rubrics |\n| `adk-guardrail` | Input/output validation | PII redaction, content filtering, JSON schema validation |\n| `adk-auth` | Access control | Role-based permissions, SSO/OAuth, audit logging |\n| `adk-telemetry` | Observability | Structured logging, OpenTelemetry tracing, span helpers |\n| `adk-ui` | Dynamic UI generation | 28 components, 10 templates, React client, streaming updates |\n| `adk-studio` | Visual development | Drag-and-drop agent builder, code generation, live testing |\n\n## Quick Start\n\n### Installation\n\nRequires Rust 1.85 or later (Rust 2024 edition). Add to your `Cargo.toml`:\n\n```toml\n[dependencies]\nadk-rust = \"0.3.1\"\n\n# Or individual crates\nadk-core = \"0.3.1\"\nadk-agent = \"0.3.1\"\nadk-model = \"0.3.1\"  # Add features for providers: features = [\"openai\", \"anthropic\"]\nadk-tool = \"0.3.1\"\nadk-runner = \"0.3.1\"\n```\n\n**Nightly (latest features):**\n```toml\nadk-rust = { git = \"https://github.com/zavora-ai/adk-rust\", branch = \"develop\" }\n```\n\nSet your API key:\n\n```bash\n# For Gemini (default)\nexport GOOGLE_API_KEY=\"your-api-key\"\n\n# For OpenAI\nexport OPENAI_API_KEY=\"your-api-key\"\n\n# For Anthropic\nexport ANTHROPIC_API_KEY=\"your-api-key\"\n\n# For DeepSeek\nexport DEEPSEEK_API_KEY=\"your-api-key\"\n\n# For Groq\nexport GROQ_API_KEY=\"your-api-key\"\n\n# For Ollama (no key, just run: ollama serve)\n```\n\n### Basic Example (Gemini)\n\n```rust\nuse adk_rust::prelude::*;\nuse adk_rust::Launcher;\n\n#[tokio::main]\nasync fn main() -\u003e AnyhowResult\u003c()\u003e {\n    dotenvy::dotenv().ok();\n    let api_key = std::env::var(\"GOOGLE_API_KEY\")?;\n    let model = GeminiModel::new(\u0026api_key, \"gemini-2.5-flash\")?;\n\n    let agent = LlmAgentBuilder::new(\"assistant\")\n        .description(\"Helpful AI assistant\")\n        .instruction(\"You are a helpful assistant. Be concise and accurate.\")\n        .model(Arc::new(model))\n        .build()?;\n\n    Launcher::new(Arc::new(agent)).run().await?;\n    Ok(())\n}\n```\n\n### OpenAI Example\n\n```rust\nuse adk_rust::prelude::*;\nuse adk_rust::Launcher;\n\n#[tokio::main]\nasync fn main() -\u003e AnyhowResult\u003c()\u003e {\n    dotenvy::dotenv().ok();\n    let api_key = std::env::var(\"OPENAI_API_KEY\")?;\n    let model = OpenAIClient::new(OpenAIConfig::new(api_key, \"gpt-5-mini\"))?;\n\n    let agent = LlmAgentBuilder::new(\"assistant\")\n        .instruction(\"You are a helpful assistant.\")\n        .model(Arc::new(model))\n        .build()?;\n\n    Launcher::new(Arc::new(agent)).run().await?;\n    Ok(())\n}\n```\n\n### Anthropic Example\n\n```rust\nuse adk_rust::prelude::*;\nuse adk_rust::Launcher;\n\n#[tokio::main]\nasync fn main() -\u003e AnyhowResult\u003c()\u003e {\n    dotenvy::dotenv().ok();\n    let api_key = std::env::var(\"ANTHROPIC_API_KEY\")?;\n    let model = AnthropicClient::new(AnthropicConfig::new(api_key, \"claude-sonnet-4.5\"))?;\n\n    let agent = LlmAgentBuilder::new(\"assistant\")\n        .instruction(\"You are a helpful assistant.\")\n        .model(Arc::new(model))\n        .build()?;\n\n    Launcher::new(Arc::new(agent)).run().await?;\n    Ok(())\n}\n```\n\n### DeepSeek Example\n\n```rust\nuse adk_rust::prelude::*;\nuse adk_rust::Launcher;\n\n#[tokio::main]\nasync fn main() -\u003e AnyhowResult\u003c()\u003e {\n    dotenvy::dotenv().ok();\n    let api_key = std::env::var(\"DEEPSEEK_API_KEY\")?;\n\n    // Standard chat model\n    let model = DeepSeekClient::chat(api_key)?;\n\n    // Or use reasoner for chain-of-thought reasoning\n    // let model = DeepSeekClient::reasoner(api_key)?;\n\n    let agent = LlmAgentBuilder::new(\"assistant\")\n        .instruction(\"You are a helpful assistant.\")\n        .model(Arc::new(model))\n        .build()?;\n\n    Launcher::new(Arc::new(agent)).run().await?;\n    Ok(())\n}\n```\n\n### Groq Example (Ultra-Fast)\n\n```rust\nuse adk_rust::prelude::*;\nuse adk_rust::Launcher;\n\n#[tokio::main]\nasync fn main() -\u003e AnyhowResult\u003c()\u003e {\n    dotenvy::dotenv().ok();\n    let api_key = std::env::var(\"GROQ_API_KEY\")?;\n    let model = GroqClient::new(GroqConfig::llama70b(api_key))?;\n\n    let agent = LlmAgentBuilder::new(\"assistant\")\n        .instruction(\"You are a helpful assistant.\")\n        .model(Arc::new(model))\n        .build()?;\n\n    Launcher::new(Arc::new(agent)).run().await?;\n    Ok(())\n}\n```\n\n### Ollama Example (Local)\n\n```rust\nuse adk_rust::prelude::*;\nuse adk_rust::Launcher;\n\n#[tokio::main]\nasync fn main() -\u003e AnyhowResult\u003c()\u003e {\n    dotenvy::dotenv().ok();\n    // Requires: ollama serve \u0026\u0026 ollama pull llama3.2\n    let model = OllamaModel::new(OllamaConfig::new(\"llama3.2\"))?;\n\n    let agent = LlmAgentBuilder::new(\"assistant\")\n        .instruction(\"You are a helpful assistant.\")\n        .model(Arc::new(model))\n        .build()?;\n\n    Launcher::new(Arc::new(agent)).run().await?;\n    Ok(())\n}\n```\n\n### Run Examples\n\n```bash\n# Interactive console (Gemini)\ncargo run --example quickstart\n\n# OpenAI examples (requires --features openai)\ncargo run --example openai_basic --features openai\ncargo run --example openai_tools --features openai\n\n# DeepSeek examples (requires --features deepseek)\ncargo run --example deepseek_basic --features deepseek\ncargo run --example deepseek_reasoner --features deepseek\n\n# Groq examples (requires --features groq)\ncargo run --example groq_basic --features groq\n\n# Ollama examples (requires --features ollama)\ncargo run --example ollama_basic --features ollama\n\n# REST API server\ncargo run --example server\n\n# Workflow agents\ncargo run --example sequential_agent\ncargo run --example parallel_agent\n\n# See all examples\nls examples/\n```\n\n## ADK-Rust Studio\n\n[![adk-studio](https://img.shields.io/crates/v/adk-studio.svg)](https://crates.io/crates/adk-studio)\n![New](https://img.shields.io/badge/new-v0.3.0-brightgreen)\n\nA visual development environment for building AI agents with drag-and-drop. Design complex multi-agent workflows, compile to production Rust code, and test live — all from your browser.\n\n![ADK Studio — Visual Agent Builder with Debug Mode](assets/studio-hero.png)\n\n```bash\n# Install and run\ncargo install adk-studio\nadk-studio\n```\n\n**Features**:\n- Drag-and-drop canvas with LLM agents, workflow agents, and 14 action nodes\n- Execution Timeline with step-by-step replay and State Inspector\n- Debug mode with live input/output state visualization per node\n- Real-time chat with SSE streaming and event trace\n- 14 action nodes: Trigger, HTTP, Set, Transform, Switch, Loop, Merge, Wait, Code, Database, Email, Notification, RSS, File\n- Triggers: Manual, Webhook (with auth), Cron Schedule, Event (with JSONPath filters)\n- Code generation: Compile visual designs to production ADK-Rust with auto-detected dependencies\n- Build, run, and deploy executables directly from Studio\n\n## Advanced Features\n\n### Realtime Voice Agents\n\nBuild voice-enabled AI assistants using the `adk-realtime` crate:\n\n```rust\nuse adk_realtime::{RealtimeAgent, openai::OpenAIRealtimeModel, RealtimeModel};\nuse std::sync::Arc;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    let model: Arc\u003cdyn RealtimeModel\u003e = Arc::new(\n        OpenAIRealtimeModel::new(\u0026api_key, \"gpt-4o-realtime-preview-2024-12-17\")\n    );\n\n    let agent = RealtimeAgent::builder(\"voice_assistant\")\n        .model(model)\n        .instruction(\"You are a helpful voice assistant.\")\n        .voice(\"alloy\")\n        .server_vad()  // Enable voice activity detection\n        .build()?;\n\n    Ok(())\n}\n```\n\n**Supported Realtime Models**:\n| Provider | Model | Transport | Feature Flag |\n|----------|-------|-----------|--------------|\n| OpenAI | `gpt-4o-realtime-preview-2024-12-17` | WebSocket | `openai` |\n| OpenAI | `gpt-realtime` | WebSocket | `openai` |\n| OpenAI | `gpt-4o-realtime-*` | WebRTC | `openai-webrtc` |\n| Google | `gemini-live-2.5-flash-native-audio` | WebSocket | `gemini` |\n| Google | Gemini via Vertex AI | WebSocket + OAuth2 | `vertex-live` |\n| LiveKit | Any (bridge to Gemini/OpenAI) | WebRTC | `livekit` |\n\n**Features**:\n- OpenAI Realtime API and Gemini Live API support\n- Vertex AI Live with Application Default Credentials (ADC)\n- LiveKit WebRTC bridge for production-grade audio routing\n- OpenAI WebRTC transport with Opus codec and data channels\n- Bidirectional audio streaming (PCM16, G711, Opus)\n- Server-side Voice Activity Detection (VAD)\n- Real-time tool calling during voice conversations\n- Multi-agent handoffs for complex workflows\n\n**Run realtime examples**:\n```bash\n# OpenAI Realtime (WebSocket)\ncargo run --example realtime_basic --features realtime-openai\ncargo run --example realtime_tools --features realtime-openai\ncargo run --example realtime_handoff --features realtime-openai\n\n# Vertex AI Live (requires gcloud auth application-default login)\ncargo run -p adk-realtime --example vertex_live_voice --features vertex-live\ncargo run -p adk-realtime --example vertex_live_tools --features vertex-live\n\n# LiveKit Bridge (requires LiveKit server)\ncargo run -p adk-realtime --example livekit_bridge --features livekit,openai\n\n# OpenAI WebRTC (requires cmake)\ncargo run -p adk-realtime --example openai_webrtc --features openai-webrtc\n```\n\n### Graph-Based Workflows\n\nBuild complex, stateful workflows using the `adk-graph` crate (LangGraph-style):\n\n```rust\nuse adk_graph::{prelude::*, node::AgentNode};\nuse adk_agent::LlmAgentBuilder;\nuse adk_model::GeminiModel;\n\n// Create LLM agents for different tasks\nlet translator = Arc::new(LlmAgentBuilder::new(\"translator\")\n    .model(Arc::new(GeminiModel::new(\u0026api_key, \"gemini-2.5-flash\")?))\n    .instruction(\"Translate the input text to French.\")\n    .build()?);\n\nlet summarizer = Arc::new(LlmAgentBuilder::new(\"summarizer\")\n    .model(model.clone())\n    .instruction(\"Summarize the input text in one sentence.\")\n    .build()?);\n\n// Create AgentNodes with custom input/output mappers\nlet translator_node = AgentNode::new(translator)\n    .with_input_mapper(|state| {\n        let text = state.get(\"input\").and_then(|v| v.as_str()).unwrap_or(\"\");\n        adk_core::Content::new(\"user\").with_text(text)\n    })\n    .with_output_mapper(|events| {\n        let mut updates = HashMap::new();\n        for event in events {\n            if let Some(content) = event.content() {\n                let text: String = content.parts.iter()\n                    .filter_map(|p| p.text())\n                    .collect::\u003cVec\u003c_\u003e\u003e()\n                    .join(\"\");\n                updates.insert(\"translation\".to_string(), json!(text));\n            }\n        }\n        updates\n    });\n\n// Build graph with parallel execution\nlet agent = GraphAgent::builder(\"text_processor\")\n    .description(\"Translates and summarizes text in parallel\")\n    .channels(\u0026[\"input\", \"translation\", \"summary\"])\n    .node(translator_node)\n    .node(summarizer_node)  // Similar setup\n    .edge(START, \"translator\")\n    .edge(START, \"summarizer\")  // Parallel execution\n    .edge(\"translator\", \"combine\")\n    .edge(\"summarizer\", \"combine\")\n    .edge(\"combine\", END)\n    .build()?;\n\n// Execute\nlet mut input = State::new();\ninput.insert(\"input\".to_string(), json!(\"AI is transforming how we work.\"));\nlet result = agent.invoke(input, ExecutionConfig::new(\"thread-1\")).await?;\n```\n\n**Features**:\n- **AgentNode**: Wrap LLM agents as graph nodes with custom input/output mappers\n- **Parallel \u0026 Sequential**: Execute agents concurrently or in sequence\n- **Cyclic Graphs**: ReAct pattern with tool loops and iteration limiting\n- **Conditional Routing**: Dynamic routing via `Router::by_field` or custom functions\n- **Checkpointing**: Memory and SQLite backends for fault tolerance\n- **Human-in-the-Loop**: Dynamic interrupts based on state, resume from checkpoint\n- **Streaming**: Multiple modes (values, updates, messages, debug)\n\n**Run graph examples**:\n```bash\ncargo run --example graph_agent       # Parallel LLM agents with callbacks\ncargo run --example graph_workflow    # Sequential multi-agent pipeline\ncargo run --example graph_conditional # LLM-based routing\ncargo run --example graph_react       # ReAct pattern with tools\ncargo run --example graph_supervisor  # Multi-agent supervisor\ncargo run --example graph_hitl        # Human-in-the-loop approval\ncargo run --example graph_checkpoint  # State persistence\n```\n\n### Browser Automation\n\nGive agents web browsing capabilities using the `adk-browser` crate:\n\n```rust\nuse adk_browser::{BrowserSession, BrowserToolset, BrowserConfig};\n\n// Create browser session\nlet config = BrowserConfig::new().webdriver_url(\"http://localhost:4444\");\nlet session = Arc::new(BrowserSession::new(config));\n\n// Get all 46 browser tools\nlet toolset = BrowserToolset::new(session);\nlet tools = toolset.all_tools();\n\n// Add to agent\nlet mut builder = LlmAgentBuilder::new(\"web_agent\")\n    .model(model)\n    .instruction(\"Browse the web and extract information.\");\n\nfor tool in tools {\n    builder = builder.tool(tool);\n}\n\nlet agent = builder.build()?;\n```\n\n**46 Browser Tools**:\n- Navigation: `browser_navigate`, `browser_back`, `browser_forward`, `browser_refresh`\n- Extraction: `browser_extract_text`, `browser_extract_links`, `browser_extract_html`\n- Interaction: `browser_click`, `browser_type`, `browser_select`, `browser_submit`\n- Forms: `browser_fill_form`, `browser_get_form_fields`, `browser_clear_field`\n- Screenshots: `browser_screenshot`, `browser_screenshot_element`\n- JavaScript: `browser_evaluate`, `browser_evaluate_async`\n- Cookies, frames, windows, and more\n\n**Requirements**: WebDriver (Selenium, ChromeDriver, etc.)\n```bash\ndocker run -d -p 4444:4444 selenium/standalone-chrome\ncargo run --example browser_agent\n```\n\n### Agent Evaluation\n\nTest and validate agent behavior using the `adk-eval` crate:\n\n```rust\nuse adk_eval::{Evaluator, EvaluationConfig, EvaluationCriteria};\n\nlet config = EvaluationConfig::with_criteria(\n    EvaluationCriteria::exact_tools()\n        .with_response_similarity(0.8)\n);\n\nlet evaluator = Evaluator::new(config);\nlet report = evaluator\n    .evaluate_file(agent, \"tests/my_agent.test.json\")\n    .await?;\n\nassert!(report.all_passed());\n```\n\n**Evaluation Capabilities**:\n- Trajectory validation (tool call sequences)\n- Response similarity (Jaccard, Levenshtein, ROUGE)\n- LLM-judged semantic matching\n- Rubric-based scoring with custom criteria\n- Safety and hallucination detection\n- Detailed reporting with failure analysis\n\n### Local Inference with mistral.rs\n\nFor native local inference without external dependencies, use the `adk-mistralrs` crate:\n\n```rust\nuse adk_mistralrs::{MistralRsModel, MistralRsConfig, ModelSource, QuantizationLevel};\nuse adk_agent::LlmAgentBuilder;\nuse std::sync::Arc;\n\n#[tokio::main]\nasync fn main() -\u003e anyhow::Result\u003c()\u003e {\n    // Load model with ISQ quantization for reduced memory\n    let config = MistralRsConfig::builder()\n        .model_source(ModelSource::huggingface(\"microsoft/Phi-3.5-mini-instruct\"))\n        .isq(QuantizationLevel::Q4_0)\n        .paged_attention(true)\n        .build();\n\n    let model = MistralRsModel::new(config).await?;\n\n    let agent = LlmAgentBuilder::new(\"local-assistant\")\n        .instruction(\"You are a helpful assistant running locally.\")\n        .model(Arc::new(model))\n        .build()?;\n\n    Ok(())\n}\n```\n\n**Note**: `adk-mistralrs` is not on crates.io due to git dependencies. Add via:\n```toml\nadk-mistralrs = { git = \"https://github.com/zavora-ai/adk-rust\" }\n# With Metal: features = [\"metal\"]\n# With CUDA: features = [\"cuda\"]\n```\n\n**Features**: ISQ quantization, PagedAttention, multi-GPU splitting, LoRA/X-LoRA adapters, vision/speech/diffusion models, MCP integration.\n\n### Dynamic UI Generation\n\nThe `adk-ui` crate enables agents to render rich user interfaces:\n\n```rust\nuse adk_ui::{UiToolset, UI_AGENT_PROMPT};\n\nlet tools = UiToolset::all_tools(); // 10 render tools\n\nlet mut builder = LlmAgentBuilder::new(\"ui_assistant\")\n    .instruction(UI_AGENT_PROMPT);  // Tested prompt for reliable UI generation\n\nfor tool in tools {\n    builder = builder.tool(tool);\n}\n\nlet agent = builder.build()?;\n```\n\n**React Client**: `npm install @zavora-ai/adk-ui-react`\n\n**Features**: 28 components, 10 templates, dark mode, streaming updates, server-side validation\n\n\n## Building from Source\n\n### Dev Environment Setup\n\n```bash\n# Option A: Nix/devenv (reproducible — identical on Linux, macOS, CI)\ndevenv shell\n\n# Option B: Setup script (installs sccache, cmake, etc.)\n./scripts/setup-dev.sh\n\n# Option C: Manual — just install sccache for faster builds\nbrew install sccache \u0026\u0026 echo 'export RUSTC_WRAPPER=sccache' \u003e\u003e ~/.zshrc\n```\n\n### Using Make (Recommended)\n\n```bash\n# See all available commands\nmake help\n\n# Build all crates (CPU-only, works on all systems)\nmake build\n\n# Build with all features (safe - adk-mistralrs excluded)\nmake build-all\n\n# Build all examples\nmake examples\n\n# Run tests\nmake test\n\n# Run clippy lints\nmake clippy\n```\n\n### Manual Build\n\n```bash\n# Build workspace (CPU-only)\ncargo build --workspace\n\n# Build with all features (works without CUDA)\ncargo build --workspace --all-features\n\n# Build examples with common features\ncargo build --examples --features \"openai,anthropic,deepseek,ollama,groq,browser,guardrails,sso\"\n```\n\n### Local LLM with mistral.rs\n\n`adk-mistralrs` is excluded from the workspace by default to allow `--all-features` to work without CUDA toolkit. Build it explicitly:\n\n```bash\n# CPU-only (works on all systems)\nmake build-mistralrs\n# or: cargo build --manifest-path adk-mistralrs/Cargo.toml\n\n# macOS with Apple Silicon (Metal GPU)\nmake build-mistralrs-metal\n# or: cargo build --manifest-path adk-mistralrs/Cargo.toml --features metal\n\n# NVIDIA GPU (requires CUDA toolkit)\nmake build-mistralrs-cuda\n# or: cargo build --manifest-path adk-mistralrs/Cargo.toml --features cuda\n```\n\n### Running mistralrs Examples\n\n```bash\n# Build and run examples with mistralrs\ncargo run --example mistralrs_basic --features mistralrs\n\n# With Metal GPU acceleration (macOS)\ncargo run --example mistralrs_basic --features mistralrs,metal\n```\n\n## Use as Library\n\nAdd to your `Cargo.toml`:\n\n```toml\n[dependencies]\n# All-in-one crate\nadk-rust = \"0.3.1\"\n\n# Or individual crates for finer control\nadk-core = \"0.3.1\"\nadk-agent = \"0.3.1\"\nadk-model = { version = \"0.3.1\", features = [\"openai\", \"anthropic\"] }  # Enable providers\nadk-tool = \"0.3.1\"\nadk-runner = \"0.3.1\"\n\n# Optional dependencies\nadk-session = { version = \"0.3.1\", optional = true }\nadk-artifact = { version = \"0.3.1\", optional = true }\nadk-memory = { version = \"0.3.1\", optional = true }\nadk-server = { version = \"0.3.1\", optional = true }\nadk-cli = { version = \"0.3.1\", optional = true }\nadk-realtime = { version = \"0.3.1\", features = [\"openai\"], optional = true }\nadk-graph = { version = \"0.3.1\", features = [\"sqlite\"], optional = true }\nadk-browser = { version = \"0.3.1\", optional = true }\nadk-eval = { version = \"0.3.1\", optional = true }\n```\n\n## Examples\n\nSee [examples/](examples/) directory for complete, runnable examples:\n\n**Getting Started**\n- `quickstart/` - Basic agent setup and chat loop\n- `function_tool/` - Custom tool implementation\n- `multiple_tools/` - Agent with multiple tools\n- `agent_tool/` - Use agents as callable tools\n\n**OpenAI Integration** (requires `--features openai`)\n- `openai_basic/` - Simple OpenAI GPT agent\n- `openai_tools/` - OpenAI with function calling\n- `openai_workflow/` - Multi-agent workflows with OpenAI\n- `openai_structured/` - Structured JSON output\n\n**DeepSeek Integration** (requires `--features deepseek`)\n- `deepseek_basic/` - Basic DeepSeek chat\n- `deepseek_reasoner/` - Chain-of-thought reasoning mode\n- `deepseek_tools/` - Function calling with DeepSeek\n- `deepseek_caching/` - Context caching for cost reduction\n\n**Workflow Agents**\n- `sequential/` - Sequential workflow execution\n- `parallel/` - Concurrent agent execution\n- `loop_workflow/` - Iterative refinement patterns\n- `sequential_code/` - Code generation pipeline\n\n**Realtime Voice Agents** (requires `--features realtime-openai`)\n- `realtime_basic/` - Basic text-only realtime session\n- `realtime_vad/` - Voice assistant with VAD\n- `realtime_tools/` - Tool calling in realtime sessions\n- `realtime_handoff/` - Multi-agent handoffs\n\n**Vertex AI Live** (requires `--features vertex-live`)\n- `vertex_live_voice/` - Vertex AI Live voice session with ADC auth\n- `vertex_live_tools/` - Vertex AI Live with function calling (weather + time tools)\n\n**LiveKit \u0026 WebRTC**\n- `livekit_bridge/` - LiveKit WebRTC bridge to OpenAI Realtime (requires `--features livekit,openai`)\n- `openai_webrtc/` - OpenAI WebRTC transport with Opus codec (requires `--features openai-webrtc`)\n\n**Graph Workflows**\n- `graph_agent/` - GraphAgent with parallel LLM agents and callbacks\n- `graph_workflow/` - Sequential multi-agent pipeline\n- `graph_conditional/` - LLM-based classification and routing\n- `graph_react/` - ReAct pattern with tools and cycles\n- `graph_supervisor/` - Multi-agent supervisor routing\n- `graph_hitl/` - Human-in-the-loop with risk-based interrupts\n- `graph_checkpoint/` - State persistence and time travel debugging\n\n**Browser Automation**\n- `browser_basic/` - Basic browser session and tools\n- `browser_agent/` - AI agent with browser tools\n- `browser_interactive/` - Full 46-tool interactive example\n\n**Agent Evaluation**\n- `eval_basic/` - Basic evaluation setup\n- `eval_trajectory/` - Tool call trajectory validation\n- `eval_semantic/` - LLM-judged semantic matching\n- `eval_rubric/` - Rubric-based scoring\n\n**Guardrails**\n- `guardrail_basic/` - PII redaction and content filtering\n- `guardrail_schema/` - JSON schema validation\n- `guardrail_agent/` - Full agent integration with guardrails\n\n**mistral.rs Local Inference** (requires git dependency)\n- `mistralrs_basic/` - Basic text generation with local models\n- `mistralrs_tools/` - Function calling with mistral.rs\n- `mistralrs_vision/` - Image understanding with vision models\n- `mistralrs_isq/` - In-situ quantization for memory efficiency\n- `mistralrs_lora/` - LoRA adapter usage and hot-swapping\n- `mistralrs_multimodel/` - Multi-model serving\n- `mistralrs_mcp/` - MCP client integration\n\n**Dynamic UI**\n- `ui_agent/` - Agent with UI rendering tools\n- `ui_server/` - UI server with streaming updates\n- `ui_react_client/` - React client example\n\n**Production Features**\n- `load_artifacts/` - Working with images and PDFs\n- `mcp/` - Model Context Protocol integration\n- `server/` - REST API deployment\n- `a2a/` - Agent-to-Agent communication\n- `web/` - Web UI with streaming\n- `research_paper/` - Complex multi-agent workflow\n\n## Development\n\n### Testing\n\n```bash\n# Run all tests\ncargo test\n\n# Test specific crate\ncargo test --package adk-core\n\n# With output\ncargo test -- --nocapture\n```\n\n### Code Quality\n\n```bash\n# Linting\ncargo clippy\n\n# Formatting\ncargo fmt\n\n# Security audit\ncargo audit\n```\n\n### Building\n\n```bash\n# Development build\ncargo build\n\n# Optimized release build\ncargo build --release\n```\n\n## Documentation\n\n- **Wiki**: [GitHub Wiki](https://github.com/zavora-ai/adk-rust/wiki) - Comprehensive guides and tutorials\n- **API Reference**: [docs.rs/adk-rust](https://docs.rs/adk-rust) - Full API documentation\n- **Examples**: [examples/README.md](examples/README.md) - 80+ working examples with detailed explanations\n\n## Performance\n\nOptimized for production use:\n- Zero-cost abstractions with Rust's ownership model\n- Efficient async I/O via Tokio runtime\n- Minimal allocations and copying\n- Streaming responses for lower latency\n- Connection pooling and caching support\n\n## License\n\nApache 2.0 (same as Google's ADK)\n\n## Related Projects\n\n- [ADK](https://google.github.io/adk-docs/) - Google's Agent Development Kit\n- [MCP Protocol](https://modelcontextprotocol.io/) - Model Context Protocol for tool integration\n- [Gemini API](https://ai.google.dev/gemini-api/docs) - Google's multimodal AI model\n\n## Contributing\n\nContributions welcome! Please open an issue or pull request on GitHub.\n\n## Roadmap\n\n**Implemented** (v0.3.1):\n- **Vertex AI Live streaming** — `adk-gemini` refactored with `GeminiBackend` trait, pluggable `StudioBackend` (REST) and `VertexBackend` (REST SSE + gRPC fallback)\n- **Realtime audio transports** — Vertex AI Live with ADC auth, LiveKit WebRTC bridge, OpenAI WebRTC with Opus codec\n- **Realtime stabilization** — raw bytes audio transport, Gemini Live session rewrite, OpenAI SDK event alignment\n- **Multi-provider Studio codegen** — Gemini, OpenAI, Anthropic, DeepSeek, Groq, Ollama support in code generation\n- **2026 model names** — all docs, examples, and defaults updated (gemini-2.5-flash, gpt-5-mini, claude-sonnet-4.5)\n- **Response parsing hardening** — 25 tests covering Gemini edge cases (safety ratings, streaming, function calls, grounding)\n\n**Implemented** (v0.3.0):\n- **adk-gemini overhaul** — Vertex AI support (ADC, Service Accounts, WIF), v1 stable API, image generation, speech generation, thinking mode, content caching, batch processing, URL context\n- **Context compaction** — automatic conversation history summarization to stay within token limits\n- **Production hardening** — deterministic event ordering, bounded history, configurable limits across adk-core, adk-agent, adk-runner\n- **ADK Studio debug mode** — Execution Timeline with step-by-step replay, State Inspector with per-node input/output visualization\n- **Action nodes code generation** — HTTP (reqwest), Database (sqlx/mongodb/redis), Email (lettre/imap), Code (boa_engine JS sandbox) compile to production Rust\n- **14 action nodes** — Trigger, HTTP, Set, Transform, Switch, Loop, Merge, Wait, Code, Database, Email, Notification, RSS, File\n- **Triggers** — Manual, Webhook (with bearer/API key auth), Cron Schedule (with timezone), Event (with JSONPath filters)\n- **A2UI protocol support** — render_screen, render_page, render_kit tools with AG-UI and MCP Apps adapters\n- **SSO/OAuth integration** — Auth0, Okta, Azure AD, Google OIDC providers in adk-auth\n- **Plugin system** (adk-plugin) — dynamic agent/tool/model loading with hot-reload\n\n**Implemented** (v0.2.0):\n- Core framework and agent types\n- Multi-provider LLM support (Gemini, OpenAI, Anthropic, DeepSeek, Groq, Ollama)\n- Native local inference (adk-mistralrs) with ISQ quantization, LoRA adapters, vision/speech/diffusion\n- Tool system with MCP support\n- Agent Tool — use agents as callable tools\n- Session and artifact management\n- Memory system with vector embeddings\n- REST and A2A servers\n- CLI with interactive mode\n- Realtime voice agents (OpenAI Realtime API, Gemini Live API)\n- Graph-based workflows (LangGraph-style) with checkpointing and human-in-the-loop\n- Browser automation (46 WebDriver tools)\n- Agent evaluation framework with trajectory validation and LLM-judged scoring\n- Dynamic UI generation (adk-ui) with 28 components, 10 templates, React client\n- Guardrails (adk-guardrail) with PII redaction, content filtering, schema validation\n- ADK Studio — visual agent builder with drag-and-drop, code generation, live streaming\n\n**Planned** (see [docs/roadmap/](docs/roadmap/)):\n\n| Priority | Feature | Target | Status |\n|----------|---------|--------|--------|\n| 🔴 P0 | [ADK-UI vNext (A2UI + Generative UI)](docs/roadmap/adk-ui.md) | Q2-Q4 2026 | Planned |\n| 🟡 P1 | [Cloud Integrations](docs/roadmap/cloud-integrations.md) | Q2-Q3 2026 | Planned |\n| 🟢 P2 | [Enterprise Features](docs/roadmap/enterprise.md) | Q4 2026 | Planned |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzavora-ai%2Fadk-rust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzavora-ai%2Fadk-rust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzavora-ai%2Fadk-rust/lists"}