From 9d7ce399c85c4d462f208c0a0746f4c0a8f2bdef Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sun, 14 Dec 2025 15:04:10 +0100 Subject: [PATCH] fix(memory): biographer tool type hints for Ollama (v1.3.2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- CHANGELOG.md | 6 ++++++ README.md | 2 +- pyproject.toml | 2 +- src/agents/biographer/tools.py | 17 ++++++----------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0674617..e853ff4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ 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 diff --git a/README.md b/README.md index e3bd330..e74257e 100644 --- a/README.md +++ b/README.md @@ -432,7 +432,7 @@ For LLM agent development guidelines and architectural decisions, see [AGENTS.md ## Version -Current version: **1.3.1** - Biographer delegation fix +Current version: **1.3.2** - Biographer tool type hints fix --- diff --git a/pyproject.toml b/pyproject.toml index 22e7925..4d4b9f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tatlock" -version = "1.3.1" +version = "1.3.2" description = "OpenAI-compatible API with Ollama backend" requires-python = ">=3.12" dependencies = [] diff --git a/src/agents/biographer/tools.py b/src/agents/biographer/tools.py index 0f82bef..f9f920a 100644 --- a/src/agents/biographer/tools.py +++ b/src/agents/biographer/tools.py @@ -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,