Features: - Usage tracking system (usage_tracker.py) - Tracks input/output tokens per API call - Calculates costs with support for cache pricing - Stores data in usage_data.json (gitignored) - Integrated into llm_interface.py - Dynamic task scheduler reloading - Auto-detects YAML changes every 60s - No restart needed for new tasks - reload_tasks() method for manual refresh - Example cost tracking scheduled task - Daily API usage report - Budget tracking ($5/month target) - Disabled by default in scheduled_tasks.yaml Improvements: - Fixed tool_use/tool_result pair splitting bug (CRITICAL) - Added thread safety to agent.chat() - Fixed N+1 query problem in hybrid search - Optimized database batch queries - Added conversation history pruning (50 messages max) Updated .gitignore: - Exclude user profiles (memory_workspace/users/*.md) - Exclude usage data (usage_data.json) - Exclude vector index (vectors.usearch) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
"""Compare old keyword search vs new hybrid search."""
|
|
|
|
from memory_system import MemorySystem
|
|
|
|
print("Initializing memory system...")
|
|
memory = MemorySystem()
|
|
|
|
print("\n" + "="*70)
|
|
print("KEYWORD vs HYBRID SEARCH COMPARISON")
|
|
print("="*70)
|
|
|
|
# Test queries that benefit from semantic understanding
|
|
test_queries = [
|
|
("How do I reduce costs?", "Testing semantic understanding of 'reduce costs' -> 'cost optimization'"),
|
|
("when was I born", "Testing semantic match for birthday/birth date"),
|
|
("what database do we use", "Testing keyword match for 'SQLite'"),
|
|
("vector similarity", "Testing technical term matching"),
|
|
]
|
|
|
|
for query, description in test_queries:
|
|
print(f"\n{description}")
|
|
print(f"Query: '{query}'")
|
|
print("-" * 70)
|
|
|
|
# Keyword-only search
|
|
print("\n KEYWORD SEARCH (old):")
|
|
keyword_results = memory.search(query, max_results=2)
|
|
if keyword_results:
|
|
for i, r in enumerate(keyword_results, 1):
|
|
print(f" {i}. {r['path']}:{r['start_line']} (score: {r['score']:.3f})")
|
|
print(f" {r['snippet'][:80]}...")
|
|
else:
|
|
print(" No results found!")
|
|
|
|
# Hybrid search
|
|
print("\n HYBRID SEARCH (new):")
|
|
hybrid_results = memory.search_hybrid(query, max_results=2)
|
|
if hybrid_results:
|
|
for i, r in enumerate(hybrid_results, 1):
|
|
print(f" {i}. {r['path']}:{r['start_line']} (score: {r['score']:.3f})")
|
|
print(f" {r['snippet'][:80]}...")
|
|
else:
|
|
print(" No results found!")
|
|
|
|
print()
|
|
|
|
print("\n" + "="*70)
|
|
print(f"[OK] Hybrid search loaded with {len(memory.vector_index)} vector embeddings")
|
|
print(f"[OK] Vector index: {memory.vector_index_path}")
|
|
print(f"[OK] Database: {memory.db_path}")
|
|
print("="*70)
|
|
|
|
memory.close()
|