""" Prompt Registry - Centralized prompt management with override hierarchy Supports: task-level overrides → DB prompts → default fallbacks """ import logging from typing import Dict, Any, Optional from django.db import models logger = logging.getLogger(__name__) class PromptRegistry: """ Centralized prompt registry with hierarchical resolution: 1. Task-level prompt_override (if exists) 2. DB prompt for (account, function) 3. Default fallback from registry """ # Default prompts stored in registry DEFAULT_PROMPTS = { 'clustering': """You are a semantic strategist and SEO architecture engine. Your task is to analyze the provided keyword list and group them into meaningful, intent-driven topic clusters that reflect how real users search, think, and act online. Return a single JSON object with a "clusters" array. Each cluster must follow this structure: { "name": "[Descriptive cluster name — natural, SEO-relevant, clearly expressing the topic]", "description": "[1–2 concise sentences explaining what this cluster covers and why these keywords belong together]", "keywords": ["keyword 1", "keyword 2", "keyword 3", "..."] } CLUSTERING STRATEGY: 1. Keyword-first, structure-follows: - Do NOT rely on assumed categories or existing content structures. - Begin purely from the meaning, intent, and behavioral connection between keywords. 2. Use multi-dimensional grouping logic: - Group keywords by these behavioral dimensions: • Search Intent → informational, commercial, transactional, navigational • Use-Case or Problem → what the user is trying to achieve or solve • Function or Feature → how something works or what it does • Persona or Audience → who the content or product serves • Context → location, time, season, platform, or device - Combine 2–3 dimensions naturally where they make sense. 3. Model real search behavior: - Favor clusters that form natural user journeys such as: • Problem ➝ Solution • General ➝ Specific • Product ➝ Use-case • Buyer ➝ Benefit • Tool ➝ Function • Task ➝ Method - Each cluster should feel like a real topic hub users would explore in depth. 4. Avoid superficial groupings: - Do not cluster keywords just because they share words. - Do not force-fit outliers or unrelated keywords. - Exclude keywords that don't logically connect to any cluster. 5. Quality rules: - Each cluster should include between 3–10 strongly related keywords. - Never duplicate a keyword across multiple clusters. - Prioritize semantic strength, search intent, and usefulness for SEO-driven content structure. - It's better to output fewer, high-quality clusters than many weak or shallow ones. INPUT FORMAT: { "keywords": [IGNY8_KEYWORDS] } OUTPUT FORMAT: Return ONLY the final JSON object in this format: { "clusters": [ { "name": "...", "description": "...", "keywords": ["...", "...", "..."] } ] } Do not include any explanations, text, or commentary outside the JSON output. """, 'ideas': """Generate SEO-optimized, high-quality content ideas and outlines for each keyword cluster. Input: Clusters: [IGNY8_CLUSTERS] Keywords: [IGNY8_CLUSTER_KEYWORDS] Output: JSON with "ideas" array. Each cluster → 1 cluster_hub + 2–4 supporting ideas. Each idea must include: title, description, content_type, content_structure, cluster_id, estimated_word_count (1500–2200), and covered_keywords. Outline Rules: Intro: 1 hook (30–40 words) + 2 intro paragraphs (50–60 words each). 5–8 H2 sections, each with 2–3 H3s. Each H2 ≈ 250–300 words, mixed content (paragraphs, lists, tables, blockquotes). Vary section format and tone; no bullets or lists at start. Tables have columns; blockquotes = expert POV or data insight. Use depth, examples, and real context. Avoid repetitive structure. Tone: Professional editorial flow. No generic phrasing. Use varied sentence openings and realistic examples. Output JSON Example: { "ideas": [ { "title": "Best Organic Cotton Duvet Covers for All Seasons", "description": { "introduction": { "hook": "Transform your sleep with organic cotton that blends comfort and sustainability.", "paragraphs": [ {"content_type": "paragraph", "details": "Overview of organic cotton's rise in bedding industry."}, {"content_type": "paragraph", "details": "Why consumers prefer organic bedding over synthetic alternatives."} ] }, "H2": [ { "heading": "Why Choose Organic Cotton for Bedding?", "subsections": [ {"subheading": "Health and Skin Benefits", "content_type": "paragraph", "details": "Discuss hypoallergenic and chemical-free aspects."}, {"subheading": "Environmental Sustainability", "content_type": "list", "details": "Eco benefits like low water use, no pesticides."}, {"subheading": "Long-Term Cost Savings", "content_type": "table", "details": "Compare durability and pricing over time."} ] } ] }, "content_type": "post", "content_structure": "review", "cluster_id": 12, "estimated_word_count": 1800, "covered_keywords": "organic duvet covers, eco-friendly bedding, sustainable sheets" } ] }""", 'content_generation': """You are an editorial content strategist. Your task is to generate a complete JSON response object that includes all the fields listed below, based on the provided content idea, keyword cluster, and keyword list. Only the `content` field should contain HTML inside JSON object. ================== Generate a complete JSON response object matching this structure: ================== { "title": "[Blog title using the primary keyword — full sentence case]", "meta_title": "[Meta title under 60 characters — natural, optimized, and compelling]", "meta_description": "[Meta description under 160 characters — clear and enticing summary]", "content": "[HTML content — full editorial structure with

,

,

,