kova-sdk 0.2.0

Async-first Rust library for building LLM-powered agents with tool calling, streaming, MCP, and multi-agent orchestration
Documentation

kova

Crates.io Docs.rs 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

[dependencies]
kova-sdk = "0.1"

# With OpenTelemetry tracing
kova-sdk = { version = "0.1", features = ["telemetry"] }

Or with cargo:

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

Provider Auth Thinking models
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

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

Flag Default Description
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.

[dependencies]
kova-sdk = { path = "../kova" }                                    # no OTEL
kova-sdk = { path = "../kova", features = ["telemetry"] }          # with OTEL

Documentation

Document Contents
docs/requirements.md Functional and non-functional requirements
docs/design.md Architecture, agentic loop, design decisions
docs/api-reference.md Full API with code examples for every module
docs/changelog.md Version history
docs/contributing.md Conventions, adding providers/tools, test guide