Compare commits

..
2 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.5 9d7ce399c8 fix(memory): biographer tool type hints for Ollama (v1.3.2)
Build and Push / build (release) Successful in 51s
- Change `str | None` to `str` with empty default for memory_type
- Remove `keywords` parameter from store_insight (auto-generated anyway)
- Ollama's OpenAI API doesn't handle union types with None properly

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 15:04:10 +01:00
jpmschweitzerandClaude Opus 4.5 8e38a568ef fix(memory): add biographer to delegation wrappers (v1.3.1)
Build and Push / build (release) Successful in 50s
- Add delegate_to_biographer to household registry delegation map
- Was returning raw tools which caused Ollama "invalid message content type: nil"
- Add Qdrant host/port to .env.example

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 14:56:32 +01:00
6 changed files with 27 additions and 15 deletions
+4
View File
@@ -25,6 +25,10 @@ REDIS_MEMORY_DB=1
REDIS_BENCHMARK_DB=6
REDIS_TIMEOUT=5
# Qdrant Configuraton
QDRANT_HOST=qdrant
QDRANT_PORT=6333
# Logging
LOG_LEVEL=INFO
ENABLE_BENCHMARKS=true
+13
View File
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [1.3.2] - 2025-12-14
### Fixed
- **Memory**: Fix biographer tool type hints for Ollama compatibility (remove `| None` union types)
## [1.3.1] - 2025-12-14
### Fixed
- **Memory**: Add biographer to delegation wrappers (was returning raw tools causing Ollama error)
- **Config**: Add Qdrant host/port to .env.example
## [1.3.0] - 2025-12-14
### Fixed
+1 -1
View File
@@ -432,7 +432,7 @@ For LLM agent development guidelines and architectural decisions, see [AGENTS.md
## Version
Current version: **1.3.0** - Memory system fixes and Redis config cleanup
Current version: **1.3.2** - Biographer tool type hints fix
---
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "tatlock"
version = "1.3.0"
version = "1.3.2"
description = "OpenAI-compatible API with Ollama backend"
requires-python = ">=3.12"
dependencies = []
+6 -11
View File
@@ -25,7 +25,7 @@ logger = get_logger(__name__)
async def recall_semantic(
query: str,
memory_type: str | None = None,
memory_type: str = "",
limit: int = 5,
) -> str:
"""
@@ -64,7 +64,7 @@ async def recall_semantic(
user=user,
query_vector=query_vector,
limit=limit,
memory_type=memory_type,
memory_type=memory_type if memory_type else None,
)
if not results:
@@ -111,7 +111,6 @@ async def recall_semantic(
async def store_insight(
key: str,
value: str,
keywords: list[str] | None = None,
importance: float = 0.5,
) -> str:
"""
@@ -128,7 +127,6 @@ async def store_insight(
Args:
key: Short identifier for the memory (e.g., "car", "employer", "pet")
value: The actual information to remember
keywords: Optional keywords for better search (auto-extracted if not provided)
importance: How important is this? 0.0 (trivial) to 1.0 (critical)
Returns:
@@ -137,15 +135,12 @@ async def store_insight(
Examples:
store_insight("car", "User drives a Tesla Model 3")
store_insight("employer", "Works at Acme Corp as software engineer", importance=0.8)
store_insight("coffee", "Prefers oat milk lattes", keywords=["coffee", "drink", "preference"])
"""
try:
# Auto-generate keywords if not provided
if not keywords:
keywords = [key]
# Extract simple keywords from value
words = value.lower().split()
keywords.extend([w for w in words if len(w) > 4][:5])
# Auto-generate keywords from key and value
keywords = [key]
words = value.lower().split()
keywords.extend([w for w in words if len(w) > 4][:5])
success = await memory_service.store_fact(
key=key,
+2 -2
View File
@@ -223,12 +223,12 @@ class HouseholdRegistry:
>>> # Returns: [delegate_to_librarian, calculate, datetime, ...]
>>> # Instead of: [hybrid_search, search_wiki, create_wiki_page, ... (16 tools)]
"""
from src.agents.delegation import delegate_to_librarian
from src.agents.delegation import delegate_to_librarian, delegate_to_biographer
# Map of expert names to their delegation wrappers
delegation_wrappers = {
"librarian": delegate_to_librarian,
# Future: "memory": delegate_to_memory,
"biographer": delegate_to_biographer,
# Future: "home_automation": delegate_to_home_automation,
}