# Deterministic Document Generation via Template Engines

Category: Document Generation
Stack: Jinja2, Pydantic v2, MLflow, Typst

## Overview
Strict separation of concerns: language models output validated JSON schemas while template engines compile formal enterprise documents.

## The Problem
Prompting models to write full formal documents (RFPs, legal contracts, executive summaries) introduces formatting volatility, missing disclosures, and unvalidated outputs.

## Production Rule
Separate business logic from presentation. Restrict language models to structured JSON outputs conforming to strict Pydantic schemas. Use deterministic Jinja2 templates to compile final artifacts.

## Code / Specification
File: `template_compiler.py`

```architecture pattern
from pydantic import BaseModel, Field
from jinja2 import Template

class SectionContent(BaseModel):
    title: str = Field(description="Section heading")
    summary: str = Field(description="Executive summary in 2 sentences")
    key_metrics: list[str] = Field(description="Bullet points with quantitative findings")

DOCUMENT_TEMPLATE = """
# {{ data.title }}

## Executive Summary
{{ data.summary }}

## Key Findings
{% for metric in data.key_metrics %}
- {{ metric }}
{% endfor %}
"""

def render_document(extracted_json: dict) -> str:
    validated = SectionContent.model_validate(extracted_json)
    template = Template(DOCUMENT_TEMPLATE)
    return template.render(data=validated)
```
