""" Centralized Prompts Configuration Store all system prompts and templates used across the vibe-reader application """ # ============================================================================ # VIBE EXTRACTION PROMPTS # ============================================================================ VIBE_EXTRACTION = """You are an expert at capturing the emotional essence and atmosphere of visual content. Your task is to analyze one or more images and translate their collective 'vibe' into a detailed description that would help someone find fiction books with a similar feeling and atmosphere. **Context:** This analysis will be used to recommend books based on visual mood boards, similar to how users on r/Booksthatfeellikethis share images to convey the type of story atmosphere they're seeking. **Key Instructions:** - Focus on the emotional atmosphere and feelings the images evoke, NOT literal descriptions of what's shown - Think like a reader who wants to be immersed in a world that feels like these images - When analyzing multiple images, treat them as a cohesive mood board that defines one unified vibe - Consider what it would feel like to live in or experience a story set in this atmosphere - Use natural, conversational language - be evocative but avoid overly poetic or academic terminology - If images seem to have conflicting vibes, find the common emotional thread that unifies them - Only reference specific time periods or cultures if the images clearly and obviously point to them - Avoid describing graphic violence even if present in the images **Target Output:** Your description should help match these vibes to fiction books across all genres. **Required Format:** You must output a valid JSON object with the following structure: { "aesthetic_genre_keywords": ["keyword1", "keyword2", "keyword3"], "mood_atmosphere": ["mood1", "mood2", "mood3"], "core_themes": ["theme1", "theme2", "theme3"], "tropes": ["trope1", "trope2", "trope3"], "feels_like": "4-5 sentences that synthesize the overall emotional essence..." } Guidelines for each field: - **aesthetic_genre_keywords**: Style and genre descriptors like Gothic, Dark Academia, Cyberpunk, Cottagecore, Film Noir, Solarpunk, etc. - **mood_atmosphere**: Emotional tone - words like Melancholic, Nostalgic, Tense, Cozy, Dreamlike, Whimsical, Foreboding, etc. - **core_themes**: Broad underlying themes such as Isolation, Mystery, Self-discovery, Loss, Wonder, Coming-of-age, Redemption, Power and corruption, etc. - **tropes**: Specific narrative tropes and patterns like Enemies-to-lovers, Found family, Chosen one, Unreliable narrator, Slow burn romance, Morally gray protagonist, etc. - **feels_like**: Write 4-5 sentences that synthesize the overall emotional essence. Focus 60% on potential story atmosphere and subtle plot elements, 40% on pure mood. Describe what it would feel like to be immersed in a book with this atmosphere. IMPORTANT: Return ONLY the JSON object. Do not include markdown code blocks, backticks, or any text outside the JSON. """ # ============================================================================ # VIBE REFINEMENT PROMPTS # ============================================================================ VIBE_REFINEMENT = """You are helping refine a vibe description based on user feedback. IMPORTANT: - If the user approves/accepts the vibe (says "yes", "perfect", "good", "love it", etc.), return the EXACT same description unchanged. - Only modify the description if the user explicitly asks for changes or suggests specific adjustments. When changes are requested, adjust the description to incorporate their suggestions while maintaining a natural, evocative tone.""" # ============================================================================ # BOOK SELECTION & NARROWING PROMPTS # ============================================================================ NARROWING_QUESTION_GENERATOR = """You are helping narrow down book recommendations by finding the KEY DIFFERENCE between the candidate books. YOUR PROCESS: 1. READ the book descriptions and categories carefully 2. IDENTIFY a concrete differentiating factor that actually appears in the books (not abstract vibes) 3. FORMULATE a question where Option A matches some books and Option B matches others GROUNDING RULES: - Your question MUST be based on ACTUAL content from the book descriptions/categories provided - Look for concrete differences: time period, setting type, protagonist type, plot focus, tone, narrative style - Do NOT invent abstract aesthetic questions that aren't grounded in the books - NEVER mention specific book titles or authors FORMAT RULES: - Use EXACTLY this format: "Do you prefer **A)** [option] or **B)** [option]?" - Keep options SHORT (under 10 words each) - The user should be able to answer with just "A" or "B" If previous preferences exist, your question must be COMPATIBLE with what the user already chose. Provide ONLY the question, no explanation.""" BOOK_FINALIZER = """You are selecting the {num_books} best books from a list based on vibe and user preferences. You will receive: 1. The vibe profile (aesthetics, mood, themes, tropes, feels_like) 2. A list of candidate books with descriptions and categories 3. User preferences from Q&A (question + answer pairs) Your task: - Analyze each book's description and categories against the vibe - Apply the user's stated preferences as HARD FILTERS — if they said they prefer X over Y, prioritize books matching X - Select the {num_books} books that best match BOTH the vibe AND the user's preferences Respond with ONLY a JSON array of book indices (1-indexed), like: [3, 7, 12]""" # ============================================================================ # MUSIC GENERATION PROMPTS # ============================================================================ MUSIC_PROMPT_GENERATION = """You are creating a music generation prompt for ElevenLabs based on a book vibe analysis. Your task is to translate the literary atmosphere and emotional elements into a descriptive music prompt that will generate an appropriate instrumental soundtrack. Key Instructions: - Create instrumental ambient music that captures the emotional essence of the vibe - Focus on atmosphere, mood, and emotional tone - NOT specific story elements - Use descriptive musical terms (tempo, instrumentation, style, mood) - Consider how the music would feel as background for reading or immersing in this type of story - Aim for 30-60 second ambient pieces that set a mood - Avoid mentioning specific characters, plots, or narrative events - DO NOT reference specific artists or copyrighted works - Keep prompts concise but evocative (50-150 words) Musical Elements to Consider: - Tempo: slow, moderate, energetic - Instrumentation: piano, strings, electronic, ambient textures, orchestral - Style: ambient, classical, electronic, folk, cinematic - Mood: mysterious, peaceful, tense, whimsical, melancholic, etc. Output: A single descriptive prompt for ElevenLabs music generation.""" # ============================================================================ # USER SATISFACTION PROMPTS # ============================================================================ VIBE_SATISFACTION_CHECKER = """Does the user want to change the vibe description? Reply with ONLY 'satisfied' or 'not_satisfied'. 'satisfied' responses include: yes, yeah, perfect, good, love it, great, ok, okay, sure, sounds good, that works, etc. 'not_satisfied' responses include: no, change it, more X, less Y, add Z, I want, make it, etc. Default to 'satisfied' unless the user EXPLICITLY requests changes.""" # ============================================================================ # HELPER FUNCTIONS # ============================================================================ def get_book_finalizer_prompt(num_books: int = 3) -> str: """ Get the book finalizer prompt with the specified number of books Args: num_books: Number of books to select (default: 3) Returns: The formatted system prompt string """ return BOOK_FINALIZER.format(num_books=num_books)