--- sidebar_position: 2 --- # Search Facts Retrieve memories using multi-strategy search. import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; ## Basic Search ```python from hindsight_client import Hindsight client = Hindsight(base_url="http://localhost:8888") results = client.recall( bank_id="my-bank", query="What does Alice do?" ) for r in results: print(f"{r['text']} (score: {r['weight']:.2f})") ``` ```typescript import { HindsightClient } from '@hindsight/client'; const client = new HindsightClient({ baseUrl: 'http://localhost:8888' }); const results = await client.recall('my-bank', 'What does Alice do?'); for (const r of results) { console.log(`${r.text} (score: ${r.weight})`); } ``` ```bash hindsight memory search my-bank "What does Alice do?" ``` ## Search Parameters | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `query` | string | required | Natural language query | | `types` | list | all | Filter: `world`, `agent`, `opinion` | | `budget` | string | "mid" | Budget level: "low", "mid", "high" | | `max_tokens` | int | 4096 | Token budget for results | ```python results = client.recall( bank_id="my-bank", query="What does Alice do?", types=["world", "agent"], budget="high", max_tokens=8000 ) ``` ```typescript const results = await client.recall('my-bank', 'What does Alice do?', { budget: 'high', maxTokens: 8000 }); ``` ## Full-Featured Search For more control, use the full-featured recall method: ```python # Full response with trace info response = client.recall_memories( bank_id="my-bank", query="What does Alice do?", types=["world", "agent"], budget="high", max_tokens=8000, trace=True, include_entities=True, max_entity_tokens=500 ) # Access results for r in response["results"]: print(f"{r['text']} (score: {r['weight']:.2f})") # Access entity observations (if include_entities=True) if "entities" in response: for entity in response["entities"]: print(f"Entity: {entity['name']}") ``` ```typescript // Full response with trace info const response = await client.recallMemories('my-bank', { query: 'What does Alice do?', types: ['world', 'agent'], budget: 'high', maxTokens: 8000, trace: true }); // Access results for (const r of response.results) { console.log(`${r.text} (score: ${r.weight})`); } ``` ## Temporal Queries Hindsight automatically detects time expressions and activates temporal search: ```python # These queries activate temporal-graph retrieval results = client.recall(bank_id="my-bank", query="What did Alice do last spring?") results = client.recall(bank_id="my-bank", query="What happened in June?") results = client.recall(bank_id="my-bank", query="Events from last year") ``` ```bash hindsight memory search my-bank "What did Alice do last spring?" hindsight memory search my-bank "What happened between March and May?" ``` Supported temporal expressions: | Expression | Parsed As | |------------|-----------| | "last spring" | March 1 - May 31 (previous year) | | "in June" | June 1-30 (current/nearest year) | | "last year" | Jan 1 - Dec 31 (previous year) | | "last week" | 7 days ago - today | | "between March and May" | March 1 - May 31 | ## Filter by Fact Type Search specific memory networks: ```python # Only world facts (objective information) world_facts = client.recall( bank_id="my-bank", query="Where does Alice work?", types=["world"] ) # Only agent facts (memory bank's own experiences) agent_facts = client.recall( bank_id="my-bank", query="What have I recommended?", types=["agent"] ) # Only opinions (formed beliefs) opinions = client.recall( bank_id="my-bank", query="What do I think about Python?", types=["opinion"] ) # World and agent facts (exclude opinions) facts = client.recall( bank_id="my-bank", query="What happened?", types=["world", "agent"] ) ``` ```bash hindsight memory search my-bank "Python" --fact-type opinion hindsight memory search my-bank "Alice" --fact-type world,agent ``` ## How Search Works Search runs four strategies in parallel: ```mermaid graph LR Q[Query] --> S[Semantic
Vector similarity] Q --> K[Keyword
BM25 exact match] Q --> G[Graph
Entity traversal] Q --> T[Temporal
Time-filtered] S --> RRF[RRF Fusion] K --> RRF G --> RRF T --> RRF RRF --> CE[Cross-Encoder
Rerank] CE --> R[Results] ``` | Strategy | When it helps | |----------|---------------| | **Semantic** | Conceptual matches, paraphrasing | | **Keyword** | Names, technical terms, exact phrases | | **Graph** | Related entities, indirect connections | | **Temporal** | "last spring", "in June", time ranges | ## Response Format ```python { "results": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "text": "Alice works at Google as a software engineer", "context": "career discussion", "event_date": "2024-01-15T10:00:00Z", "weight": 0.95, "fact_type": "world" } ] } ``` | Field | Description | |-------|-------------| | `id` | Unique memory ID | | `text` | Memory content | | `context` | Original context (if provided) | | `event_date` | When the event occurred | | `weight` | Relevance score (0-1) | | `fact_type` | `world`, `agent`, or `opinion` | ## Budget Levels The `budget` parameter controls graph traversal depth: - **"low" (100 nodes)**: Fast, shallow search — good for simple lookups - **"mid" (300 nodes)**: Balanced — default for most queries - **"high" (600 nodes)**: Deep exploration — finds indirect connections ```python # Quick lookup results = client.recall(bank_id="my-bank", query="Alice's email", budget="low") # Deep exploration results = client.recall(bank_id="my-bank", query="How are Alice and Bob connected?", budget="high") ``` ```typescript // Quick lookup const results = await client.recall('my-bank', "Alice's email", { budget: 'low' }); // Deep exploration const deep = await client.recall('my-bank', 'How are Alice and Bob connected?', { budget: 'high' }); ```