Formatting

This commit is contained in:
2025-12-07 03:33:51 +01:00
parent a923a760ef
commit 4eae1d6d58
24 changed files with 1003 additions and 833 deletions

View File

@@ -1,10 +1,8 @@
"""Critical tests for prompt builder - Tests that would have caught bugs."""
import pytest
from agent.registry import make_tools
from agent.prompts import PromptBuilder
from infrastructure.persistence import get_memory
from agent.registry import make_tools
class TestPromptBuilderToolsInjection:
@@ -15,20 +13,22 @@ class TestPromptBuilderToolsInjection:
tools = make_tools()
builder = PromptBuilder(tools)
prompt = builder.build_system_prompt()
# Verify each tool is mentioned
for tool_name in tools.keys():
assert tool_name in prompt, f"Tool {tool_name} not mentioned in system prompt"
assert (
tool_name in prompt
), f"Tool {tool_name} not mentioned in system prompt"
def test_tools_spec_contains_all_registered_tools(self):
"""CRITICAL: Verify build_tools_spec() returns all tools."""
tools = make_tools()
builder = PromptBuilder(tools)
specs = builder.build_tools_spec()
spec_names = {spec['function']['name'] for spec in specs}
spec_names = {spec["function"]["name"] for spec in specs}
tool_names = set(tools.keys())
assert spec_names == tool_names, f"Missing tools: {tool_names - spec_names}"
def test_tools_spec_is_not_empty(self):
@@ -36,7 +36,7 @@ class TestPromptBuilderToolsInjection:
tools = make_tools()
builder = PromptBuilder(tools)
specs = builder.build_tools_spec()
assert len(specs) > 0, "Tools spec is empty!"
def test_tools_spec_format_matches_openai(self):
@@ -44,14 +44,14 @@ class TestPromptBuilderToolsInjection:
tools = make_tools()
builder = PromptBuilder(tools)
specs = builder.build_tools_spec()
for spec in specs:
assert 'type' in spec
assert spec['type'] == 'function'
assert 'function' in spec
assert 'name' in spec['function']
assert 'description' in spec['function']
assert 'parameters' in spec['function']
assert "type" in spec
assert spec["type"] == "function"
assert "function" in spec
assert "name" in spec["function"]
assert "description" in spec["function"]
assert "parameters" in spec["function"]
class TestPromptBuilderMemoryContext:
@@ -61,29 +61,29 @@ class TestPromptBuilderMemoryContext:
"""Verify current topic is included in prompt."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.stm.set_topic("test_topic")
prompt = builder.build_system_prompt()
assert "test_topic" in prompt
def test_prompt_includes_extracted_entities(self, memory):
"""Verify extracted entities are included in prompt."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.stm.set_entity("test_key", "test_value")
prompt = builder.build_system_prompt()
assert "test_key" in prompt
def test_prompt_includes_search_results(self, memory_with_search_results):
"""Verify search results are included in prompt."""
tools = make_tools()
builder = PromptBuilder(tools)
prompt = builder.build_system_prompt()
assert "Inception" in prompt
assert "LAST SEARCH" in prompt
@@ -91,15 +91,13 @@ class TestPromptBuilderMemoryContext:
"""Verify active downloads are included in prompt."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.episodic.add_active_download({
"task_id": "123",
"name": "Test Movie",
"progress": 50
})
memory.episodic.add_active_download(
{"task_id": "123", "name": "Test Movie", "progress": 50}
)
prompt = builder.build_system_prompt()
assert "ACTIVE DOWNLOADS" in prompt
assert "Test Movie" in prompt
@@ -107,33 +105,33 @@ class TestPromptBuilderMemoryContext:
"""Verify recent errors are included in prompt."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.episodic.add_error("test_action", "test error message")
prompt = builder.build_system_prompt()
assert "RECENT ERRORS" in prompt or "error" in prompt.lower()
def test_prompt_includes_configuration(self, memory):
"""Verify configuration is included in prompt."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.ltm.set_config("download_folder", "/test/downloads")
prompt = builder.build_system_prompt()
assert "CONFIGURATION" in prompt or "download_folder" in prompt
def test_prompt_includes_language(self, memory):
"""Verify language is included in prompt."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.stm.set_language("fr")
prompt = builder.build_system_prompt()
assert "fr" in prompt or "LANGUAGE" in prompt
@@ -145,7 +143,7 @@ class TestPromptBuilderStructure:
tools = make_tools()
builder = PromptBuilder(tools)
prompt = builder.build_system_prompt()
assert len(prompt) > 0
assert prompt.strip() != ""
@@ -154,7 +152,7 @@ class TestPromptBuilderStructure:
tools = make_tools()
builder = PromptBuilder(tools)
prompt = builder.build_system_prompt()
assert "assistant" in prompt.lower() or "help" in prompt.lower()
def test_system_prompt_includes_rules(self):
@@ -162,7 +160,7 @@ class TestPromptBuilderStructure:
tools = make_tools()
builder = PromptBuilder(tools)
prompt = builder.build_system_prompt()
assert "RULES" in prompt or "IMPORTANT" in prompt
def test_system_prompt_includes_examples(self):
@@ -170,16 +168,16 @@ class TestPromptBuilderStructure:
tools = make_tools()
builder = PromptBuilder(tools)
prompt = builder.build_system_prompt()
assert "EXAMPLES" in prompt or "example" in prompt.lower()
def test_tools_description_format(self):
"""Verify tools are properly formatted in description."""
tools = make_tools()
builder = PromptBuilder(tools)
description = builder._format_tools_description()
# Should have tool names and descriptions
for tool_name, tool in tools.items():
assert tool_name in description
@@ -190,9 +188,9 @@ class TestPromptBuilderStructure:
"""Verify episodic context is properly formatted."""
tools = make_tools()
builder = PromptBuilder(tools)
context = builder._format_episodic_context()
assert "LAST SEARCH" in context
assert "Inception" in context
@@ -200,12 +198,12 @@ class TestPromptBuilderStructure:
"""Verify STM context is properly formatted."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.stm.set_topic("test_topic")
memory.stm.set_entity("key", "value")
context = builder._format_stm_context()
assert "TOPIC" in context or "test_topic" in context
assert "ENTITIES" in context or "key" in context
@@ -213,11 +211,11 @@ class TestPromptBuilderStructure:
"""Verify config context is properly formatted."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.ltm.set_config("test_key", "test_value")
context = builder._format_config_context()
assert "CONFIGURATION" in context
assert "test_key" in context
@@ -229,10 +227,10 @@ class TestPromptBuilderEdgeCases:
"""Verify prompt works with empty memory."""
tools = make_tools()
builder = PromptBuilder(tools)
# Memory is empty
prompt = builder.build_system_prompt()
# Should still have base content
assert len(prompt) > 0
assert "assistant" in prompt.lower()
@@ -240,18 +238,18 @@ class TestPromptBuilderEdgeCases:
def test_prompt_with_empty_tools(self):
"""Verify prompt handles empty tools dict."""
builder = PromptBuilder({})
prompt = builder.build_system_prompt()
# Should still generate a prompt
assert len(prompt) > 0
def test_tools_spec_with_empty_tools(self):
"""Verify tools spec handles empty tools dict."""
builder = PromptBuilder({})
specs = builder.build_tools_spec()
assert isinstance(specs, list)
assert len(specs) == 0
@@ -259,11 +257,11 @@ class TestPromptBuilderEdgeCases:
"""Verify prompt handles unicode in memory."""
tools = make_tools()
builder = PromptBuilder(tools)
memory.stm.set_entity("movie", "Amélie 🎬")
prompt = builder.build_system_prompt()
assert "Amélie" in prompt
assert "🎬" in prompt
@@ -271,13 +269,13 @@ class TestPromptBuilderEdgeCases:
"""Verify prompt handles many search results."""
tools = make_tools()
builder = PromptBuilder(tools)
# Add many results
results = [{"name": f"Movie {i}", "seeders": i} for i in range(20)]
memory.episodic.store_search_results("test", results, "torrent")
prompt = builder.build_system_prompt()
# Should include some results but not all (to avoid huge prompts)
assert "Movie 0" in prompt or "Movie 1" in prompt
# Should indicate there are more