Files
LLMUtils/test_simplified.py
2025-09-16 16:51:50 +02:00

130 lines
3.9 KiB
Python

#!/usr/bin/env python3
"""Test the simplified prompt manager that relies on Jinja2's built-in handling"""
from pathlib import Path
from jinja2 import UndefinedError, DebugUndefined
from src.llmutils.prompt_manager_simple import PromptManager
# Create test prompts directory
test_dir = Path("test_prompts")
test_dir.mkdir(exist_ok=True)
# Create templates
greeting = test_dir / "greeting.md"
greeting.write_text("Hello {{ name }}, you are {{ age }} years old!")
# Template with optional variables using default filter
flexible = test_dir / "flexible.md"
flexible.write_text("""# Report for {{ title }}
Status: {{ status | default('Unknown') }}
{% if error is defined %}
Error: {{ error }}
{% endif %}
Author: {{ author | default('System') }}""")
# Create a schema file
schema_file = test_dir / "flexible.json"
schema_file.write_text("""{
"type": "object",
"properties": {
"title": {"type": "string"},
"status": {"type": "string"},
"error": {"type": "string"},
"author": {"type": "string"}
},
"required": ["title"]
}""")
# Configure PromptManager
PromptManager.configure(path=test_dir)
print("=" * 70)
print("Testing Simplified Prompt Manager")
print("=" * 70)
# Test 1: Normal usage with all variables
print("\n1. Normal usage with all variables:")
print("-" * 40)
prompt = PromptManager.get_prompt("greeting")
filled = prompt.fill(name="Alice", age=30)
print(filled)
# Test 2: Missing required variable (will raise error)
print("\n2. Missing required variable (should raise error):")
print("-" * 40)
prompt = PromptManager.get_prompt("greeting")
try:
filled = prompt.fill(name="Bob") # Missing 'age'
print(filled)
except UndefinedError as e:
print(f"✓ Error raised as expected: {e}")
# Test 3: Template with defaults and conditionals
print("\n3. Template with optional variables (using defaults and conditionals):")
print("-" * 40)
prompt = PromptManager.get_prompt("flexible")
filled = prompt.fill(title="Daily Report") # Only required variable
print(filled)
# Test 4: Same template with all variables
print("\n4. Same template with all variables provided:")
print("-" * 40)
prompt = PromptManager.get_prompt("flexible")
filled = prompt.fill(
title="Error Report",
status="Failed",
error="Database connection timeout",
author="Admin"
)
print(filled)
# Test 5: Pre-fill on retrieval
print("\n5. Pre-fill on retrieval:")
print("-" * 40)
prompt = PromptManager.get_prompt("greeting", name="Charlie", age=25)
print(prompt.prompt) # Already filled
# Test 6: Schema is automatically loaded
print("\n6. Schema automatically loaded:")
print("-" * 40)
prompt = PromptManager.get_prompt("flexible")
if prompt.schema:
print(f"✓ Schema found: {prompt.schema}")
else:
print("✗ No schema")
# Test 7: Configure with DebugUndefined
print("\n7. Using DebugUndefined mode:")
print("-" * 40)
PromptManager.configure(undefined=DebugUndefined)
PromptManager.reload_prompts() # Clear cache
prompt = PromptManager.get_prompt("greeting")
filled = prompt.fill(name="Debug") # Missing 'age' - will show as undefined
print(filled)
# Test 8: List available prompts
print("\n8. List available prompts:")
print("-" * 40)
prompts = PromptManager.list_prompts()
for name, info in prompts.items():
print(f"- {name}: {'has schema' if info['has_schema'] else 'no schema'}")
print("\n" + "=" * 70)
print("Benefits of this simplified approach:")
print("-" * 70)
print("✓ Jinja2 handles undefined variables for us")
print("✓ No need for complex variable extraction and validation")
print("✓ Users can choose undefined behavior (strict, debug, silent)")
print("✓ Templates can use Jinja2's built-in features for optional vars:")
print(" - {{ var | default('value') }}")
print(" - {% if var is defined %}")
print("✓ Schemas are automatically loaded if present")
print("✓ Much simpler and cleaner codebase")
print("=" * 70)
# Cleanup
import shutil
shutil.rmtree(test_dir)