NewRelease 0.12.3 is out: Engine v0.12.3, Dashboard 0.5.2, Helm 0.12.3, the four SDKs, CLI 0.8.2 and MCP 0.12.3Release 0.12.3 is outSee what's new →

Go SDK

v0.12.3 · Go 1.21+

dakera-go is the Go client for the Dakera REST API. This page covers installation, client setup and the main calls (memories, sessions, search, knowledge graph, administration) for Go developers integrating Dakera into services and agents.

pkg.go.dev · GitHub

Current releasegithub.com/dakera-ai/dakera-go v0.12.3released 2026-10-22 · release train 0.12.3

  • ImportDocument, ImportAttachmentDocument, WaitForDocumentJob, ListDocuments, GetDocument, DeleteDocument.
  • RecallRequest.NeighborhoodMode and IncludeSummaries, ContextMemories on the response, MatchedText on results.
  • Retries never replay a write; the client honours HTTPS_PROXY / NO_PROXY; ClientOptions.Transport.

go get github.com/dakera-ai/dakera-go@v0.12.3 What changed → All current versions →

go get github.com/dakera-ai/dakera-go@v0.12.3

The current release is v0.12.3. It uses only the Go standard library at runtime. Every method takes a context.Context first; the snippets below assume ctx := context.Background().

Client setup

import (
    "os"
    "time"

    dakera "github.com/dakera-ai/dakera-go"
)

// Keep the URL and key out of source code:
// DAKERA_API_URL=http://<YOUR_SERVER_IP>:3000
// DAKERA_API_KEY=your-api-key

serverURL := os.Getenv("DAKERA_API_URL")
if serverURL == "" {
    serverURL = "http://localhost:3000"
}

client := dakera.NewClientWithOptions(dakera.ClientOptions{
    BaseURL: serverURL,
    APIKey:  os.Getenv("DAKERA_API_KEY"),
    Timeout: 30 * time.Second, // the default
})

dakera.NewClient(baseURL) creates a client without a key. ClientOptions also accepts ConnectTimeout, MaxRetries, RetryBackoff (*dakera.RetryConfig) and extra Headers.

Memory operations

importance := float32(0.8)
stored, err := client.StoreMemory(ctx, "my-agent", dakera.StoreMemoryRequest{
    Content:    "User is learning Rust",
    Importance: &importance,
    Tags:       []string{"learning"},
})
memID := stored.Memory.ID

recalled, err := client.Recall(ctx, "my-agent", dakera.RecallRequest{
    Query: "which programming language is the user learning?",
    TopK:  10,
})
for _, m := range recalled.Memories {
    fmt.Printf("%s (score: %.2f)\n", m.Content, m.Score)
}

memory, err := client.GetMemory(ctx, "my-agent", memID)
err = client.Forget(ctx, "my-agent", memID)

Sessions

session, err := client.StartSession(ctx, dakera.StartSessionRequest{
    AgentID:  "my-agent",
    Metadata: map[string]interface{}{"task": "review"},
})

_, err = client.StoreMemory(ctx, "my-agent", dakera.StoreMemoryRequest{
    Content:   "Found 2 issues",
    SessionID: session.ID,
})

ended, err := client.EndSession(ctx, session.ID)
fmt.Println(ended.MemoryCount)

sessions, err := client.ListSessions(ctx, nil)

EndSession takes only the session ID; v0.12.3 does not send a summary.

ChatMemorySession — LLM chat helper

ChatMemorySession wraps the session and memory calls for LLM chat loops. Create it with NewChatMemorySession, store turns with Store, recall context with Recall, and end the session with Close.

session, err := dakera.NewChatMemorySession(ctx, client, "chat-agent", nil)
if err != nil {
    return err
}
defer session.Close(ctx) // ends the session

session.Store(ctx, "user", "What is the capital of France?")
session.Store(ctx, "assistant", "The capital of France is Paris.")
memories, err := session.Recall(ctx, "capital cities", 5)

Text vectors

// Upsert documents; the server embeds the text
_, err := client.UpsertText(ctx, "docs", []dakera.TextDocument{
    {ID: "doc-001", Text: "Quarterly revenue report", Metadata: map[string]interface{}{"source": "finance"}},
}, nil)

// Query by natural language
res, err := client.QueryText(ctx, "docs", "revenue trends", &dakera.TextQueryOptions{TopK: 5})
for _, r := range res.Results {
    fmt.Println(r.ID, r.Score)
}

// Several text queries in one request
batch, err := client.BatchQueryText(ctx, "docs", []string{"revenue report", "product roadmap"},
    &dakera.BatchTextQueryOptions{TopK: 5})

For raw vectors use Upsert, Query, Fetch and Delete.

Namespace management

_, err := client.CreateNamespace(ctx, "production", &dakera.CreateNamespaceOptions{
    Dimensions: 1024,
    IndexType:  "hnsw",
})

names, err := client.ListNamespaces(ctx) // []string

err = client.DeleteNamespace(ctx, "old-namespace")

Knowledge graph

depth := 2
graph, err := client.KnowledgeGraph(ctx, dakera.KnowledgeGraphRequest{
    AgentID:  "my-agent",
    MemoryID: memID,
    Depth:    &depth,
})

network, err := client.CrossAgentNetwork(ctx, dakera.CrossAgentNetworkRequest{
    AgentIDs: []string{"agent-a", "agent-b"},
})

// Preview duplicates without merging
dupes, err := client.Deduplicate(ctx, dakera.DeduplicateRequest{
    AgentID: "my-agent",
    DryRun:  true,
})
// Index documents for BM25
_, err := client.IndexDocuments(ctx, "docs", []dakera.DocumentInput{
    {ID: "doc-1", Text: "Quarterly revenue report"},
})

// BM25 search
hits, err := client.FulltextSearch(ctx, "docs", "revenue", &dakera.FullTextSearchOptions{TopK: 5})

// Hybrid: pass a query vector to blend vector and BM25 scores;
// with a nil vector the server answers with BM25 only
results, err := client.HybridSearch(ctx, "docs", queryVector /* []float32 */, "revenue trends",
    &dakera.HybridSearchOptions{TopK: 10, VectorWeight: 0.7})

Entity extraction and feedback

// Extract entities (nil = the server's default entity types)
entities, err := client.ExtractEntities(ctx, "Alice met Bob at Google HQ", nil)

// Feedback on a recalled memory
_, err = client.FeedbackMemory(ctx, memID, "my-agent", dakera.FeedbackSignalUpvote)
summary, err := client.GetAgentFeedbackSummary(ctx, "my-agent")

Import, export and API keys

// Export: format "mem0", "zep", "jsonl" or "csv"; agent, namespace and limit are optional
export, err := client.ExportMemories(ctx, "jsonl", "my-agent", "", 0)

// Import from Mem0 format
_, err = client.ImportMemories(ctx, mem0Data, "mem0", "my-agent", "")

// Namespace-scoped API key
days := 90
key, err := client.CreateNamespaceKey(ctx, "production", dakera.CreateNamespaceKeyRequest{
    Name:          "reader",
    ExpiresInDays: &days,
})

Global keys with a scope (read, write, admin, super_admin) are created with CreateKey and need a super_admin key.

Batch operations

maxImp := float32(0.3)
resp, err := client.BatchForget(ctx, dakera.BatchForgetRequest{
    AgentID: "my-agent",
    Filter: dakera.BatchMemoryFilter{
        Tags:          []string{"obsolete"},
        MaxImportance: &maxImp,
    },
})
fmt.Printf("Deleted %d memories\n", resp.DeletedCount)

Health probes

ready, err := client.HealthReady(ctx) // GET /health/ready: storage and models loaded
live, err := client.HealthLive(ctx)   // GET /health/live: process alive

Gate traffic on HealthReady: while a v0.12.0 server loads its models, /health and /health/ready answer 503.

Vector bulk operations

filter := map[string]interface{}{"source": "finance"}

// Update metadata of every vector matching a filter
_, err := client.BulkUpdateVectors(ctx, "docs", filter, map[string]interface{}{"reviewed": true})

// Delete every vector matching a filter
_, err = client.BulkDeleteVectors(ctx, "docs", filter)

// Count vectors (nil filter = all)
count, err := client.CountVectors(ctx, "docs", nil)

Full-text index management

stats, err := client.FulltextStats(ctx, "docs")
fmt.Printf("Documents: %d, unique terms: %d\n", stats.DocumentCount, stats.UniqueTerms)

_, err = client.FulltextDelete(ctx, "docs", []string{"doc-001"})

TTL and storage

ttl, err := client.AdminTtlStats(ctx)
tiers, err := client.AdminStorageTierOverview(ctx)
typeStats, err := client.AdminMemoryTypeStats(ctx) // episodic, semantic, procedural, working

Agent consolidation

_, err := client.ConsolidateAgent(ctx, "my-agent")

log, err := client.GetConsolidationLog(ctx, "my-agent")

enabled := true
_, err = client.PatchConsolidationConfig(ctx, "my-agent", dakera.ConsolidationConfigPatch{
    Enabled: &enabled,
})

Namespace config

config, err := client.GetNamespaceEntityConfig(ctx, "production")
extractor, err := client.GetNamespaceExtractor(ctx, "production")

// Turn entity extraction on (PATCH /v1/namespaces/{ns}/config)
_, err = client.ConfigureNamespaceNer(ctx, "production", dakera.NamespaceNerConfig{
    ExtractEntities: true,
    EntityTypes:     []string{"person", "organization", "location"},
})

// Migrate namespaces to a new embedding dimension
_, err = client.AdminMigrateNamespaceDimensions(ctx, dakera.MigrateNamespaceDimensionsRequest{
    Namespaces:      []string{"production"},
    TargetDimension: 1024,
})

Admin and ops

cluster, err := client.ClusterStatus(ctx)

// Maintenance mode
_, err = client.AdminEnableMaintenance(ctx, dakera.EnableMaintenanceRequest{Reason: "scheduled upgrade"})
_, err = client.AdminDisableMaintenance(ctx, dakera.DisableMaintenanceRequest{})

// Quotas
quotas, err := client.AdminListQuotas(ctx)
maxVectors := uint64(100000)
_, err = client.AdminSetQuota(ctx, "production", dakera.SetQuotaRequest{
    Config: dakera.QuotaConfig{MaxVectors: &maxVectors},
})

// Slow query log
slow, err := client.SlowQueries(ctx, &dakera.SlowQueryOptions{Limit: 20})

// Backups
backup, err := client.CreateBackup(ctx, true) // include data
backups, err := client.ListBackups(ctx)

// Diagnostics, jobs, compaction, shutdown
diag, err := client.OpsDiagnostics(ctx)
jobs, err := client.OpsListJobs(ctx)
_, err = client.OpsCompact(ctx, dakera.CompactionRequest{Namespace: "production"})
_, err = client.OpsShutdown(ctx)

On a v0.12.0 server these routes need an admin key with no namespace restriction; restoring, uploading or downloading a backup needs super_admin. See Upgrading to v0.12.

AutoPilot and decay (admin)

status, err := client.AutopilotStatus(ctx)

on, threshold := true, float32(0.93)
_, err = client.AutopilotUpdateConfig(ctx, dakera.AutoPilotConfigRequest{
    Enabled:        &on,
    DedupThreshold: &threshold,
})

// Trigger a cycle: "dedup", "consolidate" or "all"
_, err = client.AutopilotTrigger(ctx, "dedup")

decay, err := client.DecayConfig(ctx)
halfLife := 720.0 // hours
_, err = client.DecayUpdateConfig(ctx, dakera.DecayConfigUpdateRequest{
    HalfLifeHours: &halfLife,
})

Memory policy

episodic, working := int64(604800), int64(3600)
_, err := client.SetMemoryPolicy(ctx, "production", dakera.MemoryPolicy{
    EpisodicTTLSeconds: &episodic,
    WorkingTTLSeconds:  &working,
})

policy, err := client.GetMemoryPolicy(ctx, "production")

SSE streaming

events, err := client.StreamMemoryEvents(ctx)
if err != nil {
    return err
}
for ev := range events {
    if ev.Err != nil {
        log.Println(ev.Err)
        continue
    }
    fmt.Printf("%s: %s\n", ev.Event.EventType, ev.Event.AgentID)
}

SubscribeAgentMemories(ctx, agentID, tags) filters the same stream to one agent. On a v0.12.0 server /v1/events/stream needs an admin key with no namespace restriction.

Error handling

import "errors"

_, err := client.GetMemory(ctx, "my-agent", "mem-abc")
if err != nil {
    var notFound *dakera.NotFoundError
    var rateLimit *dakera.RateLimitError
    switch {
    case errors.As(err, &notFound):
        fmt.Println("Not found")
    case errors.As(err, &rateLimit):
        fmt.Printf("Rate limited — retry after %d s\n", rateLimit.RetryAfter)
    default:
        fmt.Printf("Error: %v\n", err)
    }
}

Error types: *DakeraError, *ConnectionError, *NotFoundError, *ValidationError, *RateLimitError, *ServerError, *AuthenticationError, *AuthorizationError, *TimeoutError. Calls return (result, error); deletes such as Forget and DeleteNamespace return only error.

Compatibility with v0.12.0

dakera-go v0.12.1 is the release aligned with Dakera v0.12.0 (it also works against v0.11.108 servers). Against a v0.12.0 server, note:

See Upgrading to v0.12 for the full list of behavior changes.

See also: REST API reference · Quickstart · Python SDK · TypeScript SDK · Rust SDK

Go and Dakera in production

go get github.com/dakera-ai/dakera-go adds a Go client with typed errors, context support, retries with backoff and no runtime dependencies beyond the standard library. It speaks the REST API.

Get Started → REST API Reference →
Stay sharp on agent memory
Benchmark results, SDK releases, and production patterns. Under 500 words per issue.
✓ You're in. First issue lands soon — watch for Dakera in your inbox.