- Add POST /podcast/pre-estimate endpoint for cost estimation before analysis - Enhance cost_estimator.py with multi-model support (gemini, audio, voice clone, image, video) - Add detailed cost breakdown (llm, audio, media costs + per-phase breakdown) - Remove redundant pricing seeding from init_alpha_subscription_tiers.py - Add SSOT pricing via PricingService.initialize_default_pricing() - Update TopicUrlInput tooltip to show estimate details - Add debug logging for pricing seeding and pre-estimate - Clean up verbose podcast mode debug logs in app.py
187 lines
7.0 KiB
Python
187 lines
7.0 KiB
Python
"""
|
|
Website-aware prompts for podcast topic enhancement.
|
|
|
|
This module provides prompts for enhancing podcast topics with optional
|
|
website extraction data for richer context.
|
|
"""
|
|
|
|
from typing import Dict, Any, Optional
|
|
from string import Template
|
|
|
|
|
|
# Standard prompt for when no website data is available
|
|
STANDARD_ENHANCE_PROMPT = Template("""">You are a creative podcast producer. Generate 3 distinct, compelling podcast episode concepts from the raw idea.
|
|
|
|
${bible_context}
|
|
|
|
RAW IDEA/KEYWORDS: "$idea"
|
|
|
|
TASK:
|
|
Generate 3 different enhanced versions, each with a unique angle:
|
|
1. Professional & Expert-led angle (focus on authority, insights, and expertise)
|
|
2. Storytelling & Human interest angle (focus on narratives, emotions, and personal connections)
|
|
3. Trendy & Contemporary angle (focus on current trends, modern perspectives, and relevance)
|
|
|
|
Each version should be 2-3 sentences, audience-focused, and align with host persona if provided.
|
|
|
|
Return JSON with:
|
|
- enhanced_ideas: array of 3 strings, each string being a complete episode pitch (NOT objects, just plain strings)
|
|
- rationales: array of 3 strings explaining the approach for each version
|
|
|
|
IMPORTANT: enhanced_ideas must be an array of plain strings, NOT objects. Example:
|
|
{
|
|
"enhanced_ideas": [
|
|
"Your expert guide to AI advancement: A practical look at how AI is transforming industries...",
|
|
"The human stories behind AI innovation: From Silicon Valley to your daily life...",
|
|
"AI in 2026: What's trending and what's next in artificial intelligence..."
|
|
],
|
|
"rationales": [
|
|
"Professional approach focusing on expertise and authority",
|
|
"Storytelling approach emphasizing human connection",
|
|
"Contemporary approach highlighting current relevance"
|
|
]
|
|
}
|
|
""")
|
|
|
|
|
|
# Website-aware prompt for when website data is available
|
|
WEBSITE_AWARE_ENHANCE_PROMPT = Template("""">You are a creative podcast producer. Generate 3 distinct, compelling podcast episode concepts from the raw idea, enriched with website content analysis.
|
|
|
|
${bible_context}
|
|
|
|
WEBSITE CONTENT ANALYSIS:
|
|
${website_context}
|
|
|
|
RAW IDEA/KEYWORDS: "$idea"
|
|
|
|
TASK:
|
|
Generate 3 different enhanced versions, each with a unique angle, that INCORPORATE the website content context:
|
|
1. Professional & Expert-led angle (focus on authority, insights, and expertise from the website)
|
|
2. Storytelling & Human interest angle (focus on narratives, emotions, and personal connections tied to the brand)
|
|
3. Trendy & Contemporary angle (focus on current trends, modern perspectives, and relevance leveraging the site's focus areas)
|
|
|
|
Each version should:
|
|
- Be 2-3 sentences
|
|
- Reference specific elements from the website content when relevant
|
|
- Be audience-focused and align with host persona if provided
|
|
- NOT just repeat the website summary - create fresh podcast angles
|
|
|
|
Return JSON with:
|
|
- enhanced_ideas: array of 3 strings, each string being a complete episode pitch (NOT objects, just plain strings)
|
|
- rationales: array of 3 strings explaining the approach for each version
|
|
|
|
IMPORTANT: enhanced_ideas must be an array of plain strings, NOT objects. Example:
|
|
{
|
|
"enhanced_ideas": [
|
|
"Your expert guide to AI advancement: A practical look at how AI is transforming industries...",
|
|
"The human stories behind AI innovation: From Silicon Valley to your daily life...",
|
|
"AI in 2026: What's trending and what's next in artificial intelligence..."
|
|
],
|
|
"rationales": [
|
|
"Professional approach focusing on expertise and authority",
|
|
"Storytelling approach emphasizing human connection",
|
|
"Contemporary approach highlighting current relevance"
|
|
]
|
|
}
|
|
""")
|
|
|
|
|
|
def get_enhance_topic_prompt(
|
|
idea: str,
|
|
bible_context: str = "",
|
|
website_data: Optional[Dict[str, Any]] = None
|
|
) -> str:
|
|
"""
|
|
Returns the appropriate prompt based on available context.
|
|
|
|
Args:
|
|
idea: The raw podcast idea or keywords
|
|
bible_context: Optional Podcast Bible context string
|
|
website_data: Optional website extraction data
|
|
|
|
Returns:
|
|
Formatted prompt string with appropriate context
|
|
"""
|
|
# Build bible context section
|
|
bible_section = f"USER PERSONALIZATION CONTEXT (Podcast Bible):\n{bible_context}\n" if bible_context else ""
|
|
|
|
if website_data:
|
|
# Build website context section
|
|
website_context_parts = []
|
|
if website_data.get('url'):
|
|
website_context_parts.append(f"Source: {website_data.get('url')}")
|
|
if website_data.get('title'):
|
|
website_context_parts.append(f"Company/Organization: {website_data.get('title')}")
|
|
if website_data.get('summary'):
|
|
website_context_parts.append(f"About: {website_data.get('summary')}")
|
|
if website_data.get('highlights'):
|
|
highlights_str = ', '.join(website_data.get('highlights', [])[:3])
|
|
website_context_parts.append(f"Key Highlights: {highlights_str}")
|
|
if website_data.get('subpages'):
|
|
subpages_str = ', '.join([
|
|
sp.get('title', sp.get('url', ''))
|
|
for sp in website_data.get('subpages', [])[:3]
|
|
])
|
|
website_context_parts.append(f"Subpages: {subpages_str}")
|
|
|
|
website_context_str = "\n".join(website_context_parts)
|
|
|
|
return WEBSITE_AWARE_ENHANCE_PROMPT.substitute(
|
|
idea=idea,
|
|
bible_context=bible_section,
|
|
website_context=website_context_str
|
|
)
|
|
else:
|
|
return STANDARD_ENHANCE_PROMPT.substitute(
|
|
idea=idea,
|
|
bible_context=bible_section
|
|
)
|
|
|
|
|
|
def format_website_context(website_data: Dict[str, Any]) -> str:
|
|
"""
|
|
Format website data for inclusion in progress messages.
|
|
|
|
Args:
|
|
website_data: Website extraction data
|
|
|
|
Returns:
|
|
Formatted string describing what's being used
|
|
"""
|
|
parts = []
|
|
|
|
if website_data.get('title'):
|
|
parts.append(f"• {website_data['title']}")
|
|
|
|
if website_data.get('summary'):
|
|
summary_preview = website_data['summary'][:100]
|
|
parts.append(f"• Summary: {summary_preview}...")
|
|
|
|
if website_data.get('highlights'):
|
|
parts.append(f"• {len(website_data['highlights'])} key highlights")
|
|
|
|
if website_data.get('subpages'):
|
|
parts.append(f"• {len(website_data['subpages'])} subpages analyzed")
|
|
|
|
if website_data.get('url'):
|
|
parts.append(f"• Source: {website_data['url']}")
|
|
|
|
return "\n".join(parts) if parts else "Basic website analysis"
|
|
|
|
if website_data.get('title'):
|
|
parts.append(f"• {website_data['title']}")
|
|
|
|
if website_data.get('summary'):
|
|
summary_preview = website_data['summary'][:100]
|
|
parts.append(f"• Summary: {summary_preview}...")
|
|
|
|
if website_data.get('highlights'):
|
|
parts.append(f"• {len(website_data['highlights'])} key highlights")
|
|
|
|
if website_data.get('subpages'):
|
|
parts.append(f"• {len(website_data['subpages'])} subpages analyzed")
|
|
|
|
if website_data.get('url'):
|
|
parts.append(f"• Source: {website_data['url']}")
|
|
|
|
return "\n".join(parts) if parts else "Basic website analysis" |