Go SDK

Official Go client for Memoid

Installation

go get github.com/memoid/memoid-go

Quick Start

package main

import (
    "fmt"
    "github.com/memoid/memoid-go"
)

func main() {
    client := memoid.NewClient("your-api-key")

    // Add memory
    result, _ := client.Add(&memoid.AddRequest{
        Messages: []memoid.Message{
            {Role: "user", Content: "I love hiking"},
        },
        UserID: "user_123",
    })

    // Search
    results, _ := client.Search(&memoid.SearchRequest{
        Query:  "hobbies",
        UserID: "user_123",
    })

    for _, r := range results {
        fmt.Printf("%s (score: %.2f)\n", r.Memory, r.Score)
    }
}

Client Configuration

client := memoid.NewClient("your-api-key",
    memoid.WithBaseURL("https://api.memoid.dev"),
    memoid.WithTimeout(30 * time.Second),
)

Memory Operations

Add Memories

result, err := client.Add(&memoid.AddRequest{
    Messages: []memoid.Message{
        {Role: "user", Content: "My name is Alex"},
        {Role: "assistant", Content: "Nice to meet you!"},
    },
    UserID:       "user_123",
    AgentID:      "assistant_1",  // Optional
    Metadata:     map[string]any{"source": "chat"},
    Infer:        true,  // Extract facts
    ExtractGraph: false, // Extract entities
})

if err != nil {
    log.Fatal(err)
}

for _, m := range result.Memories {
    fmt.Printf("Added: %s\n", m.Memory)
}

List Memories

memories, err := client.List(&memoid.ListRequest{
    UserID: "user_123",
    Limit:  50,
})

for _, m := range memories {
    fmt.Printf("%s: %s\n", m.ID, m.Memory)
}

Get Memory

memory, err := client.Get("mem_abc123")
fmt.Println(memory.Memory)

Update Memory

err := client.Update("mem_abc123", &memoid.UpdateRequest{
    Memory:   "Updated text",
    Metadata: map[string]any{"updated": true},
})

Delete Memory

err := client.Delete("mem_abc123")

Delete All

err := client.DeleteAll(&memoid.DeleteAllRequest{
    UserID: "user_123",
})

Search

results, err := client.Search(&memoid.SearchRequest{
    Query:     "What does the user like?",
    UserID:    "user_123",
    Limit:     10,
    Threshold: 0.7,
})

for _, r := range results {
    fmt.Printf("%s (score: %.2f)\n", r.Memory, r.Score)
}

Knowledge Graph

Extract Knowledge

result, err := client.ExtractKnowledge(&memoid.ExtractRequest{
    Text:  "John works at Acme Corp",
    Store: true,
})

for _, e := range result.Entities {
    fmt.Printf("Entity: %s (%s)\n", e.Name, e.Type)
}

Add Entity

err := client.AddEntity(&memoid.Entity{
    Name: "Acme Corp",
    Type: "organization",
    Attributes: map[string]any{"industry": "tech"},
})

Add Relationship

err := client.AddRelationship(&memoid.Relationship{
    Source:   "John",
    Relation: "works_at",
    Target:   "Acme Corp",
})

Query Graph

result, err := client.GraphQuery(&memoid.GraphQueryRequest{
    Entity: "John",
    Depth:  2,
})

for _, e := range result.Entities {
    fmt.Println(e.Name)
}

Error Handling

result, err := client.Add(&memoid.AddRequest{...})
if err != nil {
    switch e := err.(type) {
    case *memoid.RateLimitError:
        fmt.Printf("Rate limited. Retry after %d seconds\n", e.RetryAfter)
    case *memoid.APIError:
        fmt.Printf("API error: %s\n", e.Message)
    default:
        fmt.Printf("Error: %v\n", err)
    }
}

Complete Example

package main

import (
    "context"
    "fmt"
    "strings"

    "github.com/memoid/memoid-go"
    "github.com/sashabaranov/go-openai"
)

func main() {
    memory := memoid.NewClient("memoid-key")
    ai := openai.NewClient("openai-key")

    reply := chat(memory, ai, "user_123", "What are my hobbies?")
    fmt.Println(reply)
}

func chat(memory *memoid.Client, ai *openai.Client, userID, message string) string {
    // Get context
    results, _ := memory.Search(&memoid.SearchRequest{
        Query:  message,
        UserID: userID,
        Limit:  5,
    })

    var contextLines []string
    for _, r := range results {
        contextLines = append(contextLines, "- "+r.Memory)
    }
    context := strings.Join(contextLines, "\n")

    // Generate response
    resp, _ := ai.CreateChatCompletion(
        context.Background(),
        openai.ChatCompletionRequest{
            Model: openai.GPT4,
            Messages: []openai.ChatCompletionMessage{
                {Role: "system", Content: "Context:\n" + context},
                {Role: "user", Content: message},
            },
        },
    )

    reply := resp.Choices[0].Message.Content

    // Store conversation
    memory.Add(&memoid.AddRequest{
        Messages: []memoid.Message{
            {Role: "user", Content: message},
            {Role: "assistant", Content: reply},
        },
        UserID: userID,
    })

    return reply
}