| """ |
| 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: |
| |
| 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'] |
| } |
| 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: |
| |
| 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) |
| } |
|
|