File size: 4,547 Bytes
3998131 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
"""
Public Interface for Module C (Letter Generation)
"""
import logging
from typing import List, Dict, Any
from .generator import LetterGenerator
logger = logging.getLogger(__name__)
class LetterGenerationAPI:
"""
Main API for the Letter Generation module.
"""
def __init__(self):
self.generator = LetterGenerator()
def get_available_templates(self) -> List[str]:
"""
Get a list of all available letter templates.
"""
return self.generator.loader.list_templates()
def generate_letter(self, template_name: str, user_data: Dict[str, str]) -> Dict[str, Any]:
"""
Generate a letter using structured data.
"""
try:
letter = self.generator.generate_letter(template_name, user_data)
return {
"success": True,
"letter": letter,
"method": "template_fill"
}
except Exception as e:
logger.error(f"Generation failed: {e}")
return {
"success": False,
"error": str(e)
}
def analyze_requirements(self, description: str) -> Dict[str, Any]:
"""
Analyze description to find missing information.
"""
try:
return self.generator.analyze_requirements(description)
except Exception as e:
logger.error(f"Analysis failed: {e}")
return {"success": False, "error": str(e)}
def search_template(self, query: str) -> Dict[str, Any]:
"""
Search for a suitable template based on user query.
"""
try:
# Lazy import
from .retriever import TemplateRetriever
retriever = TemplateRetriever()
results = retriever.retrieve_templates(query, k=1)
if results:
best = results[0]
return {
"success": True,
"template_name": best['filename'],
"score": best['score'],
"content": best['content'] # Optional: return content preview
}
else:
return {"success": False, "error": "No template found"}
except Exception as e:
logger.error(f"Search failed: {e}")
return {"success": False, "error": str(e)}
def get_template_details(self, template_name: str) -> Dict[str, Any]:
"""
Get details (placeholders, content) for a specific template.
"""
try:
content = self.generator.loader.load_template(template_name)
placeholders = self.generator.loader.extract_placeholders(content)
return {
"success": True,
"template_name": template_name,
"placeholders": list(placeholders),
"content": content
}
except Exception as e:
logger.error(f"Get details failed: {e}")
return {"success": False, "error": str(e)}
def fill_template(self, template_name: str, user_data: Dict[str, str]) -> Dict[str, Any]:
"""
Fill a specific template with provided data (Simple Substitution).
"""
try:
letter = self.generator.generate_letter(template_name, user_data)
return {
"success": True,
"letter": letter,
"method": "simple_fill"
}
except Exception as e:
logger.error(f"Fill failed: {e}")
return {"success": False, "error": str(e)}
def generate_smart_letter(self, description: str, template_name: str = None, additional_data: Dict[str, str] = None) -> Dict[str, Any]:
"""
Generate a letter using a natural language description (RAG-based).
Optional: template_name to skip retrieval and use specific template.
Optional: additional_data dict to fill specific missing fields.
"""
try:
# New signature: only description needed, template is retrieved automatically
result = self.generator.generate_from_description(description, additional_data, template_name)
if result['success']:
result["method"] = "rag_generation"
return result
except Exception as e:
logger.error(f"Smart generation failed: {e}")
return {
"success": False,
"error": str(e)
}
|