# kova
[](https://crates.io/crates/kova-sdk)
[](https://docs.rs/kova-sdk)
[](LICENSE)
Async-first Rust library for building LLM-powered agents. Trait-based architecture with pluggable providers, tool calling, memory, streaming, thinking-model support, MCP integration, multi-agent orchestration, and telemetry.
## Installation
```toml
[dependencies]
kova-sdk = "0.1"
# With OpenTelemetry tracing
kova-sdk = { version = "0.1", features = ["telemetry"] }
```
Or with cargo:
```bash
cargo add kova-sdk
```
## Architecture
```
kova
├── agent # Agent + AgentBuilder — the main orchestration loop
├── provider # LlmProvider trait + OpenAI / Bedrock / Gemini / Ollama implementations
├── tool # Tool trait + thread-safe ToolRegistry
├── memory # MemoryStore trait + InMemoryStore
├── mcp # MCP client (stdio / HTTP+SSE) + McpTool adapter
├── orchestrator # Multi-agent patterns (sequential, parallel, router)
├── streaming # StreamingHandler trait + SSE parser
├── telemetry # TelemetryConfig + MetricsCollector
├── models # Shared data types (messages, content blocks, events)
└── error # Unified KovaError enum
```
## Providers
| `OpenAiCompatibleProvider` | Bearer token | `with_reasoning_effort("high")` for o-series models |
| `BedrockProvider` | SigV4 (explicit / profile / default chain) | `with_additional_model_request_fields(json!({"budgetTokens": N}))` for Claude |
| `GeminiProvider` | `x-goog-api-key` | `with_thinking_budget(N)` for `gemini-3.5-*` models etc |
| `OllamaProvider` | None (local) | `with_think(OllamaThink::High)` for `qwen3`, `deepseek-r1`, etc. |
Chain-of-thought output from thinking models is returned in `ModelResponse::thinking` and never stored in conversation history. During streaming it arrives as `StreamEvent::ThinkingDelta`; in blocking mode the agent forwards it to any registered `StreamingHandler`.
## Quick Start
```rust
use std::sync::Arc;
use kova_sdk::agent::AgentBuilder;
use kova_sdk::provider::openai::{OpenAiCompatibleProvider, OpenAiProviderConfig};
#[tokio::main]
async fn main() -> Result<(), kova_sdk::error::KovaError> {
let config = OpenAiProviderConfig::new("http://127.0.0.1:1234", "my-model");
let provider = Arc::new(OpenAiCompatibleProvider::new(config)?);
let agent = AgentBuilder::new().provider(provider).build()?;
let reply = agent.chat("conv-1", "Hello!").await?;
println!("{reply}");
Ok(())
}
```
## Feature Flags
| `telemetry` | off | Adds OpenTelemetry dependencies; enables OTLP/Jaeger/stdout span export |
Without the `telemetry` feature, `TelemetryConfig::init()` installs a lightweight `tracing_subscriber` — zero OTEL overhead.
```toml
[dependencies]
kova-sdk = { path = "../kova" } # no OTEL
kova-sdk = { path = "../kova", features = ["telemetry"] } # with OTEL
```
## Documentation
| [docs/requirements.md](docs/requirements.md) | Functional and non-functional requirements |
| [docs/design.md](docs/design.md) | Architecture, agentic loop, design decisions |
| [docs/api-reference.md](docs/api-reference.md) | Full API with code examples for every module |
| [docs/changelog.md](docs/changelog.md) | Version history |
| [docs/contributing.md](docs/contributing.md) | Conventions, adding providers/tools, test guide |