130 lines
3.9 KiB
Python
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) |