Rust SDK

v0.11.75 · Rust 1.70+ · async

GitHub · docs.rs · Changelog

# Cargo.toml
[dependencies]
dakera-client = "0.11"
tokio = { version = "1", features = ["full"] }

Client setup

use dakera_client::{DakeraClient, Config};

// Recommended: configure via env vars
// DAKERA_URL=http://<YOUR_SERVER_IP>:3300
// DAKERA_API_KEY=your-api-key

let client = DakeraClient::new(Config {
    base_url: std::env::var("DAKERA_URL")
        .unwrap_or_else(|_| "http://localhost:3300".into()),
    api_key: std::env::var("DAKERA_API_KEY").ok(),
    ..Default::default()
})?;

Memory operations

use dakera_client::memory::{StoreRequest, RecallRequest};

client.memories().store(StoreRequest {
    agent_id: "my-agent".into(), content: "User is learning Rust".into(),
    importance: Some(0.8), tags: vec!["learning".into()], ..Default::default()
}).await?;

let memories = client.memories().recall(RecallRequest {
    agent_id: "my-agent".into(), query: "programming languages".into(),
    top_k: Some(10), ..Default::default()
}).await?;

let session = client.sessions().start(StartRequest {
    agent_id: "my-agent".into(), ..Default::default()
}).await?;

Vector operations

use dakera_client::vectors::{UpsertRequest, QueryRequest};

// Upsert a vector
client.vectors().upsert(UpsertRequest {
    namespace: "my-namespace".into(),
    id: "doc-001".into(),
    text: "quarterly revenue report".into(),
    metadata: serde_json::json!({ "source": "finance" }),
    ..Default::default()
}).await?;

// Query vectors
let results = client.vectors().query(QueryRequest {
    namespace: "my-namespace".into(),
    text: "revenue trends".into(),
    top_k: Some(5),
    ..Default::default()
}).await?;

Namespace management

use dakera_client::namespaces::CreateRequest;

// Create namespace
client.namespaces().create(CreateRequest {
    name: "production".into(),
    index_type: Some("hnsw".into()),
    dimension: Some(1024),
    ..Default::default()
}).await?;

// List namespaces
let ns_list = client.namespaces().list().await?;

// Delete namespace
client.namespaces().delete("old-namespace").await?;

gRPC transport

# Enable in Cargo.toml
dakera-client = { version = "0.11", features = ["grpc"] }
let client = DakeraClient::grpc(GrpcConfig {
    endpoint: "http://localhost:50051".into(),
    ..Default::default()
})?;

Knowledge graph

use dakera_client::knowledge::{GraphRequest, DeduplicateRequest};

// Build knowledge graph from seed
let graph = client.knowledge().graph(GraphRequest {
    agent_id: "my-agent".into(), memory_id: "mem-abc".into(),
    depth: Some(2), ..Default::default()
}).await?;

// Deduplicate (preview)
let dupes = client.knowledge().deduplicate(DeduplicateRequest {
    agent_id: "my-agent".into(), threshold: Some(0.93), dry_run: Some(true),
}).await?;

Full-text & hybrid search

// Full-text search
let results = client.vectors().fulltext_search("docs", "revenue", 5).await?;

// Hybrid search (vector + BM25)
let results = client.vectors().hybrid_search(HybridRequest {
    namespace: "docs".into(), text: "revenue trends".into(),
    vector_weight: Some(0.7), ..Default::default()
}).await?;

Entity extraction & feedback

// Extract entities
let entities = client.extract_entities("Alice met Bob at Google HQ", None).await?;

// Feedback loop
client.memories().feedback("mem-abc", "upvote").await?;
let summary = client.agents().feedback_summary("my-agent").await?;

Import, export & streaming

// Export memories
let data = client.export_memories("my-agent", "jsonl").await?;

// Stream memory events (SSE)
let mut stream = client.stream_memory_events("my-agent", None).await?;
while let Some(event) = stream.next().await {
    println!("{:?}", event?);
}

Batch operations

use dakera_client::memory::{BatchForgetRequest, BatchForgetFilter};

// Batch forget — remove memories matching filters
let resp = client.batch_forget(BatchForgetRequest {
    agent_id: "my-agent".into(),
    filter: BatchForgetFilter { tags: Some(vec!["obsolete".into()]), ..Default::default() },
}).await?;

// Batch query text — multi-query in one call
let results = client.vectors().batch_query_text("docs", vec![
    ("revenue report", 5),
    ("product roadmap", 3),
]).await?;

Health probes

// Readiness probe (dependencies healthy)
let ready = client.health_ready().await?;

// Liveness probe (process alive)
let live = client.health_live().await?;

Vector bulk operations

// Bulk update vectors by ID
client.vectors().bulk_update("docs", vec![
    BulkUpdateItem { id: "doc-001".into(), metadata: json!({ "reviewed": true }) },
]).await?;

// Bulk delete vectors by ID
client.vectors().bulk_delete("docs", vec!["doc-003".into(), "doc-004".into()]).await?;

// Count vectors in a namespace
let count = client.vectors().count("docs").await?;

Full-text index management

// Get full-text index stats
let stats = client.vectors().fulltext_stats("docs").await?;

// Delete a full-text document by ID
client.vectors().fulltext_delete("docs", "doc-001").await?;

TTL & storage

// TTL engine stats
let ttl = client.ttl_stats().await?;

// Storage tier overview
let tiers = client.storage_tier_overview().await?;

// Memory type stats
let type_stats = client.memory_type_stats().await?;

Agent consolidation

// Trigger consolidation
client.agents().consolidate("my-agent").await?;

// Get consolidation log
let log = client.agents().consolidation_log("my-agent").await?;

// Patch consolidation config
client.agents().patch_consolidation_config("my-agent", ConsolidationConfig {
    threshold: Some(0.9), max_batch: Some(100), ..Default::default()
}).await?;

Namespace config

// Get entity extraction config
let config = client.namespaces().get_entity_config("production").await?;

// Get namespace extractor
let extractor = client.namespaces().get_extractor("production").await?;

// Migrate namespace dimensions (e.g. 768 → 1024)
client.namespaces().migrate_dimensions("production", 1024).await?;

Admin & ops

// Cluster status
let cluster = client.cluster_status().await?;

// Maintenance mode
client.admin_enable_maintenance("scheduled upgrade").await?;
client.admin_disable_maintenance().await?;

// Quota management
let quotas = client.get_quotas().await?;

// Slow query log
let slow = client.slow_queries(Some(20)).await?;

// Backups
let backup = client.create_backup(true).await?;
let backups = client.list_backups().await?;

// Ops diagnostics
let diag = client.ops_diagnostics().await?;

// List background jobs
let jobs = client.ops_list_jobs().await?;

// Trigger compaction
client.ops_compact("production").await?;

// Graceful shutdown
client.ops_shutdown().await?;

Autopilot & decay (admin)

// AutoPilot status
let status = client.autopilot_status().await?;

// Update AutoPilot config
client.autopilot_update_config(AutoPilotConfigRequest {
    enabled: Some(true), dedup_threshold: Some(0.93), ..Default::default()
}).await?;

// Trigger dedup cycle
client.autopilot_trigger("dedup").await?;

// Decay engine
let decay = client.decay_config().await?;
client.decay_update_config(DecayConfigUpdateRequest {
    half_life_days: Some(30), ..Default::default()
}).await?;

Memory policy

// Set namespace memory lifecycle policy
client.namespaces().set_memory_policy("production", MemoryPolicy {
    episodic_ttl_seconds: Some(604800),
    working_ttl_seconds: Some(3600),
    ..Default::default()
}).await?;

// Get current policy
let policy = client.namespaces().get_memory_policy("production").await?;

Builder pattern & configuration

use dakera_client::{DakeraClient, RetryConfig};
use std::time::Duration;

let client = DakeraClient::builder("http://localhost:3300")
    .api_key("your-key")
    .timeout(Duration::from_secs(30))
    .retry_config(RetryConfig {
        max_retries: 3, base_delay: Duration::from_millis(500),
        max_delay: Duration::from_secs(10), jitter: true,
    })
    .build()?;

Error handling

use dakera_client::{DakeraError, ErrorKind};

match client.memories().get("mem-abc").await {
    Ok(memory) => println!("{}", memory.content),
    Err(DakeraError { kind: ErrorKind::NotFound, .. }) => println!("Not found"),
    Err(DakeraError { kind: ErrorKind::RateLimited, .. }) => println!("Rate limited"),
    Err(e) => eprintln!("Error: {e}"),
}

Error variants: Unauthorized, NotFound, Validation, RateLimited, ServerError, Connection, Timeout. All carry kind and message.