* fix: improve async batch retain with large payloads * fix: improve async batch retain with large payloads * api * api * api * api * api * Clean up perf benchmark: keep only Python files - Remove README.md and PERFORMANCE_FINDINGS.md - Remove results/ JSON files (gitignored) - Remove test_data/ directory - Keep only __init__.py and retain_perf.py * docs: explain automatic batch optimization for async retain - Add section explaining Hindsight automatically handles batch sizing - Users don't need to manually tune batch sizes with async mode - Hindsight splits large batches (>10k tokens) into optimized sub-batches - Include example showing best practices * docs: remove emojis and code example from performance page * fix: correct OperationDetails type to match API response - Change optional fields to use | null instead of ? - Fixes TypeScript compilation error in control plane build * fix: use discriminated union for OperationDetails type - Support both success and error states properly - Fixes TypeScript error when setting error state * fix: use unique document_ids in batch retain examples - Each item in a batch must have unique document_id - Update both Python and JavaScript examples - Fixes test-doc-examples CI failure * chore: trigger CI * fix: test mocking and duplicate document_ids in examples - Mock _get_pool() in test_async_retain_tags.py to avoid _initialized error - Set _initialized = True on mocked MemoryEngine instances - Fix duplicate document_ids in retain.py and retain.mjs examples * fix: properly mock async pool/connection and fix more duplicate document_ids - Use AsyncMock for pool.acquire() to fix 'can't be used in await' error - Fix duplicate document_ids in retain-async examples (retain.py and retain.mjs) - Remove batch-level document_id parameter that caused duplicates * ci: collect all doc example failures and show summary - Run all Python/Node.js/CLI examples regardless of individual failures - Collect failure list and display summary at the end - Show pass/fail count and list of failed files - Exit with failure only after running all examples * refactor: extract doc example testing to standalone script - Create scripts/test-doc-examples.sh to run all examples - Collects logs of failed examples separately - Shows full error logs only for failures at the end - Clean summary with pass/fail counts - Proper exit codes - Replaces inline bash in CI workflow * fix: doc examples - duplicate document_ids and error handling - retain.py: move document_id to item level to avoid duplicates - documents.mjs: add error handling for getDocument to show clear error message * fix: update tests for duplicate document_id validation - test_async_retain_tags: verify operation structure instead of exact UUID - test_delete_bank: use unique document_ids (team-doc-1, team-doc-2)
110 lines
3.2 KiB
Python
110 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Documents API examples for Hindsight.
|
|
Run: python examples/api/documents.py
|
|
"""
|
|
import os
|
|
import requests
|
|
|
|
HINDSIGHT_URL = os.getenv("HINDSIGHT_API_URL", "http://localhost:8888")
|
|
|
|
# =============================================================================
|
|
# Setup (not shown in docs)
|
|
# =============================================================================
|
|
from hindsight_client import Hindsight
|
|
|
|
client = Hindsight(base_url=HINDSIGHT_URL)
|
|
|
|
# =============================================================================
|
|
# Doc Examples
|
|
# =============================================================================
|
|
|
|
# [docs:document-retain]
|
|
# Retain with document ID
|
|
client.retain(
|
|
bank_id="my-bank",
|
|
content="Alice presented the Q4 roadmap...",
|
|
document_id="meeting-2024-03-15"
|
|
)
|
|
|
|
# Batch retain for a document with different sections
|
|
client.retain_batch(
|
|
bank_id="my-bank",
|
|
items=[
|
|
{"content": "Item 1: Product launch delayed to Q2", "document_id": "meeting-2024-03-15-section-1"},
|
|
{"content": "Item 2: New hiring targets announced", "document_id": "meeting-2024-03-15-section-2"},
|
|
{"content": "Item 3: Budget approved for ML team", "document_id": "meeting-2024-03-15-section-3"}
|
|
]
|
|
)
|
|
# [/docs:document-retain]
|
|
|
|
|
|
# [docs:document-update]
|
|
# Original
|
|
client.retain(
|
|
bank_id="my-bank",
|
|
content="Project deadline: March 31",
|
|
document_id="project-plan"
|
|
)
|
|
|
|
# Update (deletes old facts, creates new ones)
|
|
client.retain(
|
|
bank_id="my-bank",
|
|
content="Project deadline: April 15 (extended)",
|
|
document_id="project-plan"
|
|
)
|
|
# [/docs:document-update]
|
|
|
|
|
|
# [docs:document-get]
|
|
import asyncio
|
|
from hindsight_client_api import ApiClient, Configuration
|
|
from hindsight_client_api.api import DocumentsApi
|
|
|
|
async def get_document_example():
|
|
config = Configuration(host="http://localhost:8888")
|
|
api_client = ApiClient(config)
|
|
api = DocumentsApi(api_client)
|
|
|
|
# Get document to expand context from recall results
|
|
doc = await api.get_document(
|
|
bank_id="my-bank",
|
|
document_id="meeting-2024-03-15"
|
|
)
|
|
|
|
print(f"Document: {doc.id}")
|
|
print(f"Original text: {doc.original_text}")
|
|
print(f"Memory count: {doc.memory_unit_count}")
|
|
print(f"Created: {doc.created_at}")
|
|
|
|
asyncio.run(get_document_example())
|
|
# [/docs:document-get]
|
|
|
|
|
|
# [docs:document-delete]
|
|
from hindsight_client_api import ApiClient, Configuration
|
|
from hindsight_client_api.api import DocumentsApi
|
|
|
|
async def delete_document_example():
|
|
config = Configuration(host="http://localhost:8888")
|
|
api_client = ApiClient(config)
|
|
api = DocumentsApi(api_client)
|
|
|
|
# Delete document and all its memories
|
|
result = await api.delete_document(
|
|
bank_id="my-bank",
|
|
document_id="meeting-2024-03-15"
|
|
)
|
|
|
|
print(f"Deleted {result.memory_units_deleted} memories")
|
|
|
|
asyncio.run(delete_document_example())
|
|
# [/docs:document-delete]
|
|
|
|
|
|
# =============================================================================
|
|
# Cleanup (not shown in docs)
|
|
# =============================================================================
|
|
requests.delete(f"{HINDSIGHT_URL}/v1/default/banks/my-bank")
|
|
|
|
print("documents.py: All examples passed")
|