* feat: independent versioning for integrations
- Add per-integration changelog pages at /changelog/integrations/<name>
- Move main changelog to changelog/index.md (URL unchanged)
- Add --integration flag to generate-changelog for LLM-based per-integration changelog generation
- Add scripts/release-integration.sh <name> <version> for cutting integration releases
- Add .github/workflows/release-integration.yml to publish on integrations/** tags
- Remove integrations from main release.sh and release.yml cycle
* fix: add agno and hermes integration docs to version-0.4 for production build
* chore: apply ruff formatting to generate_changelog.py
* feat: add 4-tab code parity across all documentation examples
Every code snippet Tabs block now has Python, Node.js, CLI, and Go variants.
Raw HTTP/curl tabs replaced with proper SDK calls.
New example files:
- Go: retain.go, recall.go, reflect.go, memory-banks.go, directives.go,
mental-models.go, documents.go, main-methods.go
- Shell: memory-banks.sh, directives.sh, mental-models.sh
- Node.js: mental-models.mjs
Extended example files with missing sections:
- recall.mjs/sh: world/experience/observation types, token-budget, all tag modes
- reflect.sh: reflect-with-params, reflect-disposition, reflect-sources, reflect-with-tags
- reflect.mjs: reflect-with-tags, fixed reflect-sources API usage
- retain.mjs/sh: retain-conversation, retain-batch, retain-files-batch
SDK/CLI additions:
- TypeScript: getMentalModelHistory method
- CLI recall: --tags, --tags-match flags
- CLI reflect: --tags, --tags-match, --include-facts flags
- CLI directive update: --is-active flag
- CLI bank set-config: --retain-mission, --retain-extraction-mode,
--observations-mission, --reflect-mission, --disposition-* flags
Build validation:
- scripts/check-code-parity.mjs validates 4-tab parity across all MDX files
- Integrated into npm run build — fails if any Tabs block is missing a variant
* fix: fix doc examples for Go, Node.js, CLI + add mental model with-id examples
- Fix Go Budget constants: BUDGET_HIGH/LOW/MID → HIGH/LOW/MID
- Fix Go documents.go: ListDocuments returns []map[string]interface{}, use map access
- Fix Go retain.go: use correct relative path for sample.pdf
- Fix Node.js createMentalModel: use positional args (name, sourceQuery) not object
- Add CLI 'history' subcommand for mental models (api.rs, main.rs, mental_model.rs)
- Rebuild TypeScript/Python clients to support id param in createMentalModel
- Add create-mental-model-with-id examples across all 4 languages and docs
* fix: move id param to end of create_mental_model signature for backwards compat
217 lines
6.9 KiB
Go
217 lines
6.9 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
|
|
hindsight "github.com/vectorize-io/hindsight/hindsight-clients/go"
|
|
)
|
|
|
|
func main() {
|
|
apiURL := os.Getenv("HINDSIGHT_API_URL")
|
|
if apiURL == "" {
|
|
apiURL = "http://localhost:8888"
|
|
}
|
|
|
|
cfg := hindsight.NewConfiguration()
|
|
cfg.Servers = hindsight.ServerConfigurations{{URL: apiURL}}
|
|
client := hindsight.NewAPIClient(cfg)
|
|
ctx := context.Background()
|
|
|
|
// =============================================================================
|
|
// Setup (not shown in docs)
|
|
// =============================================================================
|
|
for _, content := range []string{
|
|
"Alice works at Google as a software engineer",
|
|
"Alice loves hiking on weekends",
|
|
"Bob is a data scientist who works with Alice",
|
|
} {
|
|
client.MemoryAPI.RetainMemories(ctx, "my-bank").
|
|
RetainRequest(hindsight.RetainRequest{
|
|
Items: []hindsight.MemoryItem{{Content: content}},
|
|
}).Execute()
|
|
}
|
|
|
|
// =============================================================================
|
|
// Doc Examples
|
|
// =============================================================================
|
|
|
|
// [docs:recall-basic]
|
|
response, _, _ := client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What does Alice do?",
|
|
}).Execute()
|
|
|
|
// response.Results is a slice of RecallResult, each with:
|
|
// - Id: fact ID
|
|
// - Text: the extracted fact
|
|
// - Type: "world", "experience", or "observation"
|
|
// - Context: context label set during retain
|
|
// - Tags: []string of tags
|
|
// - Entities: []string of entity names linked to this fact
|
|
// - OccurredStart: ISO datetime of when the event started
|
|
// - OccurredEnd: ISO datetime of when the event ended
|
|
// - MentionedAt: ISO datetime of when the fact was retained
|
|
// - DocumentId: document this fact belongs to
|
|
for _, r := range response.GetResults() {
|
|
fmt.Println(r.GetText())
|
|
}
|
|
// [/docs:recall-basic]
|
|
|
|
// [docs:recall-with-options]
|
|
budgetHigh := hindsight.HIGH
|
|
maxTokens := int32(8000)
|
|
traceTrue := true
|
|
detailedResponse, _, _ := client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What does Alice do?",
|
|
Types: []string{"world", "experience"},
|
|
Budget: &budgetHigh,
|
|
MaxTokens: &maxTokens,
|
|
Trace: &traceTrue,
|
|
}).Execute()
|
|
|
|
for _, r := range detailedResponse.GetResults() {
|
|
fmt.Println("-", r.GetText())
|
|
}
|
|
// [/docs:recall-with-options]
|
|
|
|
// [docs:recall-world-only]
|
|
// Only world facts (objective information)
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "Where does Alice work?",
|
|
Types: []string{"world"},
|
|
}).Execute()
|
|
// [/docs:recall-world-only]
|
|
|
|
// [docs:recall-experience-only]
|
|
// Only experience (conversations and events)
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What have I recommended?",
|
|
Types: []string{"experience"},
|
|
}).Execute()
|
|
// [/docs:recall-experience-only]
|
|
|
|
// [docs:recall-observations-only]
|
|
// Only observations (consolidated knowledge)
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What patterns have I learned?",
|
|
Types: []string{"observation"},
|
|
}).Execute()
|
|
// [/docs:recall-observations-only]
|
|
|
|
// [docs:recall-source-facts]
|
|
// Recall observations and include their source facts
|
|
maxSFTokens := int32(4096)
|
|
sfOpts := hindsight.SourceFactsIncludeOptions{MaxTokens: &maxSFTokens}
|
|
obsResponse, _, _ := client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What patterns have I learned about Alice?",
|
|
Types: []string{"observation"},
|
|
Include: &hindsight.IncludeOptions{
|
|
SourceFacts: *hindsight.NewNullableSourceFactsIncludeOptions(&sfOpts),
|
|
},
|
|
}).Execute()
|
|
|
|
for _, obs := range obsResponse.GetResults() {
|
|
fmt.Printf("Observation: %s\n", obs.GetText())
|
|
for _, factID := range obs.GetSourceFactIds() {
|
|
if fact, ok := obsResponse.GetSourceFacts()[factID]; ok {
|
|
fmt.Printf(" - [%s] %s\n", fact.GetType(), fact.GetText())
|
|
}
|
|
}
|
|
}
|
|
// [/docs:recall-source-facts]
|
|
|
|
// [docs:recall-budget-levels]
|
|
budgetLow := hindsight.LOW
|
|
// Quick lookup
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "Alice's email",
|
|
Budget: &budgetLow,
|
|
}).Execute()
|
|
|
|
// Deep exploration
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "How are Alice and Bob connected?",
|
|
Budget: &budgetHigh,
|
|
}).Execute()
|
|
// [/docs:recall-budget-levels]
|
|
|
|
// [docs:recall-token-budget]
|
|
// Fill up to 4K tokens of context with relevant memories
|
|
mt4k := int32(4096)
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What do I know about Alice?",
|
|
MaxTokens: &mt4k,
|
|
}).Execute()
|
|
|
|
// Smaller budget for quick lookups
|
|
mt500 := int32(500)
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "Alice's email",
|
|
MaxTokens: &mt500,
|
|
}).Execute()
|
|
// [/docs:recall-token-budget]
|
|
|
|
// [docs:recall-with-tags]
|
|
// Filter recall to only memories tagged for a specific user
|
|
tagsMatch := "any"
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What feedback did the user give?",
|
|
Tags: []string{"user:alice"},
|
|
TagsMatch: &tagsMatch,
|
|
}).Execute()
|
|
// [/docs:recall-with-tags]
|
|
|
|
// [docs:recall-tags-strict]
|
|
// Strict mode: only return memories that have matching tags (exclude untagged)
|
|
tagsMatchStrict := "any_strict"
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What did the user say?",
|
|
Tags: []string{"user:alice"},
|
|
TagsMatch: &tagsMatchStrict,
|
|
}).Execute()
|
|
// [/docs:recall-tags-strict]
|
|
|
|
// [docs:recall-tags-all]
|
|
// AND matching: require ALL specified tags to be present
|
|
tagsMatchAll := "all_strict"
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "What bugs were reported?",
|
|
Tags: []string{"user:alice", "bug-report"},
|
|
TagsMatch: &tagsMatchAll,
|
|
}).Execute()
|
|
// [/docs:recall-tags-all]
|
|
|
|
// [docs:recall-tags-all-mode]
|
|
// AND matching, includes untagged memories
|
|
tagsMatchAllMode := "all"
|
|
client.MemoryAPI.RecallMemories(ctx, "my-bank").
|
|
RecallRequest(hindsight.RecallRequest{
|
|
Query: "communication tools",
|
|
Tags: []string{"user:alice", "team"},
|
|
TagsMatch: &tagsMatchAllMode,
|
|
}).Execute()
|
|
// [/docs:recall-tags-all-mode]
|
|
|
|
// =============================================================================
|
|
// Cleanup (not shown in docs)
|
|
// =============================================================================
|
|
req, _ := http.NewRequest("DELETE", fmt.Sprintf("%s/v1/default/banks/my-bank", apiURL), nil)
|
|
http.DefaultClient.Do(req)
|
|
|
|
fmt.Println("recall.go: All examples passed")
|
|
}
|