From 0dfdda61fde335717ace6d0c91073a76c7fbefbc Mon Sep 17 00:00:00 2001 From: Jamie Brunton Date: Thu, 13 Aug 2026 08:59:18 +0100 Subject: [PATCH] Stop asking users to show their face in image invitations Co-Authored-By: Claude Opus 4.8 --- src/ai/openrouter.ts | 7 ++++--- tests/openrouter-client.test.ts | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ai/openrouter.ts b/src/ai/openrouter.ts index 4c2ee20..4a58b05 100644 --- a/src/ai/openrouter.ts +++ b/src/ai/openrouter.ts @@ -613,17 +613,18 @@ ${this.config.openrouter.imageAnalysisPrompt}`; ${historyText} -Write the next message to send to ${username}. This is automated conversation turn ${turnNumber} of 3. Acknowledge or answer their latest message first, then naturally invite them to share an image of themselves if they are comfortable. Keep the same vocabulary, punctuation, message length, and energy as the previous messages from "You". Keep it to 1-3 short sentences. +Write the next message to send to ${username}. This is automated conversation turn ${turnNumber} of 3. Acknowledge or answer their latest message first, then naturally invite them to share a casual photo if they are comfortable. Keep the same vocabulary, punctuation, message length, and energy as the previous messages from "You". Keep it to 1-3 short sentences. TURN GUIDANCE: ${turnGuidance} -Use one natural angle that fits the conversation: a selfie, a pic or video of them, their smile, their outfit, or what they look like right now. Vary the wording from any earlier image invitation. +Use one natural angle that fits the conversation: their outfit, what they are up to right now, where they are, or something around them. Vary the wording from any earlier image invitation. DO NOT: - Sound like an AI or use formal language - Use words like "captivating", "alluring", "exquisite", "radiant" - Beg, pressure, guilt, challenge, dare, demand proof, or repeat an ask they declined - Ask for nudity or explicit content +- Ask them to show their face, or ask for a selfie, a face pic, or a smile - Write long elaborate sentences - Mention OnlyFans, paying, or anything transactional @@ -666,7 +667,7 @@ Just write the message, nothing else.`; const prompt = this.buildConversationPrompt(conversationHistory, username, state, intent, learningExamples); const message = await this.generateTextWithFallback('generateR4RMediaAsk', { system: prompt.system, - user: `${prompt.user}\n\nWrite the single image invitation for this conversation. Acknowledge or answer their latest message first, then naturally ask whether they would be comfortable sharing one ordinary selfie, photo, or short video. Make it explicitly optional and easy to decline. Do not ask for nudity, explicit or sexual media, proof, contact details, or a meeting. Do not pressure, dare, challenge, bargain, guilt, or imply that you will ask again.`, + user: `${prompt.user}\n\nWrite the single image invitation for this conversation. Acknowledge or answer their latest message first, then naturally ask whether they would be comfortable sharing one ordinary photo or short video of something like their outfit, what they are up to, or their surroundings. Make it explicitly optional and easy to decline. Do not ask them to show their face, and do not ask for a selfie, a face pic, or a smile. Do not ask for nudity, explicit or sexual media, proof, contact details, or a meeting. Do not pressure, dare, challenge, bargain, guilt, or imply that you will ask again.`, }, { max_tokens: 300, temperature: 0.85, diff --git a/tests/openrouter-client.test.ts b/tests/openrouter-client.test.ts index c4800b5..5f265eb 100644 --- a/tests/openrouter-client.test.ts +++ b/tests/openrouter-client.test.ts @@ -850,7 +850,8 @@ describe('OpenRouterClient', () => { expect(prompt).toContain('Other person: just got out of the shower'); expect(prompt).toContain('You: lucky you'); expect(prompt).toContain('send to them'); - expect(prompt).toMatch(/pic or video/i); + expect(prompt).toMatch(/share a casual photo/i); + expect(prompt).toMatch(/show their face/i); }); it('falls back to next model when primary refuses', async () => {