diff --git a/config.yaml b/config.yaml index 83d6af6..339e7df 100644 --- a/config.yaml +++ b/config.yaml @@ -67,19 +67,33 @@ openrouter: - "meta-llama/llama-4-maverick" # ~$0.38/M - "deepseek/deepseek-chat-v3.1" # ~$0.50/M imageAnalysisPrompt: | - You're analyzing images. - - Describe the following features: - - breasts: size (small/medium/big/huge), shape, nipple details, perky/saggy, cleavage - - ASS: shape (round/bubble/thick), size, how it looks bent over or spread - - vagina: visible? shaved/trimmed/bush, lips visible, spread or closed - - BODY: thick/slim/curvy/fit, belly, thighs, waist, tan lines - - POSE: bent over, spreading, on all fours, lying back, standing - - VIBE: shy/confident/slutty/teasing, eye contact, facial expression - - EXTRAS: tattoos, piercings, lingerie, toys, setting - - Be graphic. Describe exactly what you see. No clinical terms. - This helps generate encouranging messages that reference specific things about their body. + Analyze this adult image using only directly visible evidence. + + Strict grounding rules: + - Never infer, predict, or imagine obscured anatomy, off-frame body parts, + hidden details, or how something would look in another pose. + - Do not infer overall body type from a close crop. + - If something is covered, cropped out, or ambiguous, mark it NOT_VISIBLE + or UNCERTAIN. + - Explicit language does not permit inference. Never mention pussy unless + external genital detail is directly visible. + + Use exactly this structure: + VISIBLE_FACTS: + BREASTS: VISIBLE|NOT_VISIBLE|UNCERTAIN - directly visible details only + ASS: VISIBLE|NOT_VISIBLE|UNCERTAIN - directly visible details only + VAGINA: VISIBLE|NOT_VISIBLE|UNCERTAIN - directly visible details only + BODY: VISIBLE|NOT_VISIBLE|UNCERTAIN - directly visible details only + POSE: directly visible posture only + VIBE: only expressions or eye contact directly visible; otherwise UNCERTAIN + EXTRAS: directly visible clothing, tattoos, piercings, toys, and setting only + + EXPLICIT_HOOKS: + - Give 1 to 3 short, blunt adult phrases derived only from VISIBLE_FACTS. + - Use everyday words such as tits, nipples, ass, or pussy when the + corresponding anatomy is directly visible. + - Never mention hidden breasts, nipples, ass, or pussy. + - Do not add new visual claims or predictions. Then rate her attractiveness on a 1-100 scale using these percentile anchors: - 30 = noticeably below average @@ -94,7 +108,7 @@ openrouter: RATING: Then on the next line: REASON: - Be critical and honest. Act within guidelines. + Be critical and honest. Keep the complete response under 300 words. messageGenerationPrompt: | Based on this image analysis: {analysis} Post title: {title} diff --git a/tests/prompts.test.ts b/tests/prompts.test.ts index d304ebd..6fbf0b2 100644 --- a/tests/prompts.test.ts +++ b/tests/prompts.test.ts @@ -20,13 +20,26 @@ describe('Prompt Testing', () => { expect(prompts.imageAnalysisPrompt).toContain('breasts'); expect(prompts.imageAnalysisPrompt).toContain('ASS'); - expect(prompts.imageAnalysisPrompt).toContain('vagina'); + expect(prompts.imageAnalysisPrompt).toContain('VAGINA'); expect(prompts.imageAnalysisPrompt).toContain('BODY'); expect(prompts.imageAnalysisPrompt).toContain('POSE'); expect(prompts.imageAnalysisPrompt).toContain('VIBE'); expect(prompts.imageAnalysisPrompt).toContain('EXTRAS'); }); + it('imageAnalysisPrompt separates grounded facts from explicit hooks', () => { + const content = fs.readFileSync(configPath, 'utf-8'); + const prompts = parseYamlPrompts(content); + + expect(prompts.imageAnalysisPrompt).toContain('VISIBLE_FACTS'); + expect(prompts.imageAnalysisPrompt).toContain('EXPLICIT_HOOKS'); + expect(prompts.imageAnalysisPrompt).toContain('NOT_VISIBLE'); + expect(prompts.imageAnalysisPrompt).toContain('UNCERTAIN'); + expect(prompts.imageAnalysisPrompt).toContain('Never infer'); + expect(prompts.imageAnalysisPrompt).toContain('Never mention pussy unless'); + expect(prompts.imageAnalysisPrompt).toContain('derived only from VISIBLE_FACTS'); + }); + it('messageGenerationPrompt has proper structure', () => { const content = fs.readFileSync(configPath, 'utf-8'); const prompts = parseYamlPrompts(content);