[workspace]
members = [".", "echo-core", "echo-macros", "echo-execution", "echo-integration", "echo-state", "echo-orchestration", "echo-tools"]
[package]
name = "echo_agent"
version = "0.1.4"
edition = "2024"
rust-version = "1.85"
license = "MIT"
description = "Production-grade AI Agent framework for Rust — ReAct engine, multi-agent, memory, streaming, MCP, IM channels, workflows"
repository = "https://github.com/EchoYue-lp/echo-agent"
homepage = "https://github.com/EchoYue-lp/echo-agent"
documentation = "https://docs.rs/echo_agent"
readme = "README.md"
keywords = ["ai", "agent", "llm", "react", "mcp"]
categories = ["development-tools", "asynchronous", "web-programming::http-client"]
exclude = [
"/skills/",
".github/",
".claude/",
".idea/",
"echo-agent.example.yaml",
"echo-agent.yaml",
".env",
".env1",
".example.env",
"mcp.json.example",
"mcp.json",
".playwright-mcp/",
"**/.DS_Store",
"Cargo.lock",
"cargo",
]
[package.metadata.docs.rs]
no-default-features = true
features = ["a2a", "mcp", "telemetry", "plan-execute", "human-loop", "handoff", "topology", "tasks", "self-reflection", "subagent", "web", "media", "sqlite", "channels", "git", "database", "rag", "chart", "content-guard", "project-rules"]
rustdoc-args = ["--cfg", "docsrs"]
[features]
default = ["full"]
full = ["a2a", "mcp", "telemetry", "plan-execute", "human-loop", "handoff", "topology", "tasks", "self-reflection", "subagent", "web", "media", "data", "sqlite", "channels", "git", "database", "rag", "chart", "content-guard", "project-rules", "shell", "files"]
a2a = ["dep:axum", "dep:jsonwebtoken"]
mcp = ["echo_integration/mcp"]
sqlite = ["echo_state/sqlite", "dep:rusqlite"]
telemetry = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp", "dep:tracing-opentelemetry"]
plan-execute = []
human-loop = ["echo_orchestration/websocket"]
handoff = []
topology = []
tasks = []
self-reflection = []
subagent = []
web = ["dep:scraper", "dep:html2text", "dep:url", "echo_tools/web"]
media = ["dep:pdf-extract", "dep:lopdf", "dep:calamine", "dep:docx-rs", "dep:encoding_rs", "echo_tools/media"]
data = ["dep:polars", "echo_tools/data"]
channels = ["echo_integration/channels"]
git = ["echo_tools/git"]
database = ["dep:sqlx", "echo_tools/database"]
rag = ["echo_tools/rag"]
chart = ["echo_tools/chart"]
content-guard = ["echo_core/guard"]
project-rules = []
shell = ["echo_tools/shell"]
files = ["echo_tools/files"]
testing = []
[dependencies]
echo_core = { version = "0.1.4", path = "echo-core", features = ["reqwest"] }
echo_macros = { version = "0.1.4", path = "echo-macros" }
echo_execution = { version = "0.1.4", path = "echo-execution" }
echo_integration = { version = "0.1.4", path = "echo-integration" }
echo_tools = { version = "0.1.4", path = "echo-tools" }
echo_state = { version = "0.1.4", path = "echo-state" }
echo_orchestration = { version = "0.1.4", path = "echo-orchestration" }
reqwest = { version = "0.12.23", features = ["json", "stream"] }
async-stream = "0.3"
tokio = { version = "1.47.1", features = ["full"] }
tokio-util = { version = "0.7", features = ["rt"] }
serde_json = "1.0.143"
serde = { version = "1.0.228", features = ["derive"] }
schemars = "0.8"
dotenvy = "0.15"
futures = "0.3"
tracing = "0.1.44"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
serde_yaml = "0.9"
uuid = { version = "1", features = ["v4"] }
regex = "1"
similar = "2"
chrono = { version = "0.4", features = ["serde"] }
shlex = "1"
async-trait = "0.1"
fastrand = "2"
base64 = "0.22"
opentelemetry = { version = "0.27", features = ["trace", "metrics"], optional = true }
opentelemetry_sdk = { version = "0.27", features = ["rt-tokio", "metrics"], optional = true }
opentelemetry-otlp = { version = "0.27", features = ["tonic", "metrics"], optional = true }
tracing-opentelemetry = { version = "0.28", optional = true }
axum = { version = "0.7", optional = true }
jsonwebtoken = { version = "9", optional = true }
scraper = { version = "0.22", optional = true }
html2text = { version = "0.14", optional = true }
url = { version = "2", optional = true }
pdf-extract = { version = "0.7", optional = true }
lopdf = { version = "0.34", optional = true }
calamine = { version = "0.26", optional = true }
docx-rs = { version = "0.4", optional = true }
encoding_rs = { version = "0.8", optional = true }
polars = { version = "0.53", features = ["lazy", "csv", "json", "parquet", "dtype-full", "strings", "is_in", "regex"], optional = true }
rusqlite = { version = "0.31", features = ["bundled"], optional = true }
sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite", "mysql", "postgres", "any"], optional = true }
[[example]]
name = "demo27_sqlite_memory"
required-features = ["sqlite"]
[[example]]
name = "comprehensive_customer_service"
required-features = ["sqlite"]
[[example]]
name = "comprehensive_personal_assistant"
required-features = ["sqlite"]
[[example]]
name = "comprehensive_data_analyst"
required-features = ["sqlite"]
[[example]]
name = "comprehensive_research_agent"
required-features = ["sqlite"]
[[example]]
name = "demo38_im_channels"
required-features = ["channels"]
[[example]]
name = "demo41_web_tools"
required-features = ["web"]
[[example]]
name = "demo42_browser_mcp"
path = "examples/demo42_playwright_mcp.rs"
required-features = ["mcp"]
[[example]]
name = "demo04_suagent"
required-features = ["testing"]
[[example]]
name = "demo12_resilience"
required-features = ["testing"]
[[example]]
name = "demo16_testing"
required-features = ["testing"]
[[example]]
name = "demo39_workflow"
required-features = ["testing"]
[[example]]
name = "demo43_data_tools"
required-features = ["testing"]
[[example]]
name = "comprehensive_enterprise"
required-features = ["testing"]
[dev-dependencies]
proptest = "1"