* Fix main-methods.py: entities is a dict, use .items() and .canonical_name * Migrate docs to use CodeSnippet components - Convert quickstart.md, retain.md, recall.md, reflect.md, memory-banks.md to .mdx - Use CodeSnippet to pull code from validated example scripts - Add missing 'name' parameter to create_bank calls - Fix main-methods.py entities iteration (dict not list) - Remove retain-new.mdx demo file * Migrate existing docs to match testing pattern with code snippet and add CLI tests to the CI * Fix doc-id issue + add main-method tests * CLI fixes * Update openAPI json * Fix rust build issues * increase sleep time for Hindsight to process the document * Added a polling sleep instead of fixed * Delete immediately fails, so create the doc a earlier in the test to get the doc ready * Add debug logs * Remove debug logs
133 lines
4.1 KiB
JavaScript
133 lines
4.1 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Main Methods overview examples for Hindsight (Node.js)
|
|
* Run: node examples/api/main-methods.mjs
|
|
*/
|
|
import { HindsightClient } from '@vectorize-io/hindsight-client';
|
|
|
|
const HINDSIGHT_URL = process.env.HINDSIGHT_API_URL || 'http://localhost:8888';
|
|
|
|
// =============================================================================
|
|
// Setup (not shown in docs)
|
|
// =============================================================================
|
|
const client = new HindsightClient({ baseUrl: HINDSIGHT_URL });
|
|
|
|
// =============================================================================
|
|
// Doc Examples - Retain Section
|
|
// =============================================================================
|
|
|
|
// [docs:main-retain]
|
|
// Store a single fact
|
|
await client.retain('my-bank', 'Alice joined Google in March 2024 as a Senior ML Engineer');
|
|
|
|
// Store a conversation
|
|
const conversation = `
|
|
User: What did you work on today?
|
|
Assistant: I reviewed the new ML pipeline architecture.
|
|
User: How did it look?
|
|
Assistant: Promising, but needs better error handling.
|
|
`;
|
|
|
|
await client.retain('my-bank', conversation, {
|
|
context: 'Daily standup conversation'
|
|
});
|
|
|
|
// Batch retain multiple items
|
|
await client.retainBatch('my-bank', [
|
|
{ content: 'Bob prefers Python for data science' },
|
|
{ content: 'Alice recommends using pytest for testing' },
|
|
{ content: 'The team uses GitHub for code reviews' }
|
|
]);
|
|
// [/docs:main-retain]
|
|
|
|
|
|
// =============================================================================
|
|
// Doc Examples - Recall Section
|
|
// =============================================================================
|
|
|
|
// [docs:main-recall]
|
|
// Basic search
|
|
const results = await client.recall('my-bank', 'What does Alice do at Google?');
|
|
|
|
for (const result of results.results) {
|
|
console.log(`- ${result.text}`);
|
|
}
|
|
|
|
// Search with options
|
|
const filteredResults = await client.recall('my-bank', 'What happened last spring?', {
|
|
budget: 'high',
|
|
maxTokens: 8192,
|
|
types: ['world']
|
|
});
|
|
|
|
// Include entity information
|
|
const entityResults = await client.recall('my-bank', 'Tell me about Alice', {
|
|
includeEntities: true,
|
|
maxEntityTokens: 500
|
|
});
|
|
|
|
// Check entity details
|
|
for (const [entityId, entity] of Object.entries(entityResults.entities || {})) {
|
|
console.log(`Entity: ${entity.canonical_name}`);
|
|
console.log(`Observations: ${entity.observations}`);
|
|
}
|
|
// [/docs:main-recall]
|
|
|
|
|
|
// =============================================================================
|
|
// Doc Examples - Reflect Section
|
|
// =============================================================================
|
|
|
|
// [docs:main-reflect]
|
|
// Basic reflect
|
|
const response = await client.reflect('my-bank', 'Should we adopt TypeScript for our backend?');
|
|
|
|
console.log(response.text);
|
|
console.log('\nBased on:', (response.based_on || []).length, 'facts');
|
|
|
|
// Reflect with options
|
|
const detailedResponse = await client.reflect('my-bank', "What are Alice's strengths for the team lead role?", {
|
|
budget: 'high'
|
|
});
|
|
|
|
// See which facts influenced the response
|
|
for (const fact of detailedResponse.based_on || []) {
|
|
console.log(`- ${fact.text}`);
|
|
}
|
|
// [/docs:main-reflect]
|
|
|
|
|
|
// =============================================================================
|
|
// Doc Examples - List Memories Section
|
|
// =============================================================================
|
|
|
|
// [docs:main-list-memories]
|
|
// List all memories in a bank
|
|
const memories = await client.listMemories('my-bank', {
|
|
limit: 10
|
|
});
|
|
|
|
for (const memory of memories.items) {
|
|
console.log(`- [${memory.fact_type}] ${memory.text}`);
|
|
}
|
|
|
|
// Filter by type
|
|
const worldFacts = await client.listMemories('my-bank', {
|
|
type: 'world',
|
|
limit: 5
|
|
});
|
|
|
|
// Search within memories
|
|
const searchResults = await client.listMemories('my-bank', {
|
|
q: 'Alice',
|
|
limit: 10
|
|
});
|
|
// [/docs:main-list-memories]
|
|
|
|
|
|
// =============================================================================
|
|
// Cleanup (not shown in docs)
|
|
// =============================================================================
|
|
await fetch(`${HINDSIGHT_URL}/v1/default/banks/my-bank`, { method: 'DELETE' });
|
|
|
|
console.log('main-methods.mjs: All examples passed');
|