The Go SDK is a thin HTTP client. Standard library only — no external dependencies.
Install
go get github.com/major7apps/pensyve-goRequires a running Pensyve REST API server. See the REST API Quick Start to set one up.
Initialize
package main
import (
"context"
"fmt"
"log"
"time"
pensyve "github.com/major7apps/pensyve-go"
)
func main() {
client := pensyve.NewClient(pensyve.Config{
BaseURL: "http://localhost:8000",
Timeout: 10 * time.Second,
})
ctx := context.Background()
// check the server is up
health, err := client.Health(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Println(health.Status) // "ok"
}Timeout defaults to 30 seconds if zero.
Remember
mem, err := client.Remember(ctx, "alice", "Prefers Go over Python", 0.9)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s: %s (confidence=%.1f)\n", mem.MemoryType, mem.Content, mem.Confidence)
// semantic: Prefers Go over Python (confidence=0.9)Recall
memories, err := client.Recall(ctx, "language preferences", &pensyve.RecallOptions{
Entity: "alice",
Limit: 5,
Types: []string{"semantic"},
})
if err != nil {
log.Fatal(err)
}
for _, m := range memories {
fmt.Printf("[%s] %s (score=%.2f)\n", m.MemoryType, m.Content, m.Score)
}Pass nil for default options (limit 5, no filters).
Episodes
Track multi-turn interactions with StartEpisode:
ep, err := client.StartEpisode(ctx, []string{"alice", "assistant"})
if err != nil {
log.Fatal(err)
}
ep.AddMessage(ctx, "user", "I always use dark mode")
ep.AddMessage(ctx, "assistant", "Noted for future sessions")
ep.SetOutcome("success")
memoriesCreated, err := ep.End(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Memories created: %d\n", memoriesCreated)SetOutcome is optional. Valid values: "success", "failure", "partial".
Entities
Create or retrieve entities explicitly:
entity, err := client.Entity(ctx, "alice", "user")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Entity %s (id=%s, kind=%s)\n", entity.Name, entity.ID, entity.Kind)Forget
// Soft delete
count, err := client.Forget(ctx, "alice", false)
// Hard delete
count, err := client.Forget(ctx, "alice", true)
fmt.Printf("Forgotten: %d\n", count)Consolidation
result, err := client.Consolidate(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("promoted=%d decayed=%d archived=%d\n",
result.Promoted, result.Decayed, result.Archived)Types
type Entity struct {
ID string `json:"id"`
Name string `json:"name"`
Kind string `json:"kind"` // "agent", "user", "team", "tool"
}
type Memory struct {
ID string `json:"id"`
Content string `json:"content"`
MemoryType string `json:"memory_type"` // "episodic", "semantic", "procedural"
Confidence float64 `json:"confidence"`
Stability float64 `json:"stability"`
Score float64 `json:"score,omitempty"`
}
type RecallOptions struct {
Entity string
Limit int
Types []string
}
type ConsolidateResult struct {
Promoted int `json:"promoted"`
Decayed int `json:"decayed"`
Archived int `json:"archived"`
}Error Handling
API errors return *pensyve.PensyveError with the HTTP status code and detail message:
_, err := client.Entity(ctx, "nobody", "user")
if err != nil {
var pe *pensyve.PensyveError
if errors.As(err, &pe) {
fmt.Printf("API error: HTTP %d — %s\n", pe.Status, pe.Detail)
} else {
fmt.Printf("Network error: %v\n", err)
}
}Authentication
If the server has PENSYVE_API_KEYS set, pass your key in the config:
client := pensyve.NewClient(pensyve.Config{
BaseURL: "http://localhost:8000",
APIKey: "your-api-key",
})The SDK sends it as the X-Pensyve-Key header on every request. When no key is set, the header is omitted.