From 70898ccd4c8c6e5c0d4db4333d5f6d11639b8875 Mon Sep 17 00:00:00 2001 From: ct Date: Sat, 28 Jun 2025 21:33:30 +0800 Subject: [PATCH] Update --- app/Helpers/FirstParty/AI/OpenAI.php | 98 ++++++++++++++++++++----- app/Http/Controllers/TestController.php | 4 +- 2 files changed, 84 insertions(+), 18 deletions(-) diff --git a/app/Helpers/FirstParty/AI/OpenAI.php b/app/Helpers/FirstParty/AI/OpenAI.php index 23964f0..f93c9ea 100644 --- a/app/Helpers/FirstParty/AI/OpenAI.php +++ b/app/Helpers/FirstParty/AI/OpenAI.php @@ -12,7 +12,7 @@ public static function getMemeKeywords(string $name, string $description) $response = Http::withHeaders([ 'Content-Type' => 'application/json', - 'Authorization' => 'Bearer '.$apiKey, + 'Authorization' => 'Bearer ' . $apiKey, ])->post('https://api.openai.com/v1/responses', [ 'model' => 'gpt-4.1-nano', 'input' => [ @@ -53,18 +53,73 @@ public static function getMemeKeywords(string $name, string $description) public static function getSingleMemeGenerator($user_prompt) { - - $caption_descriptions = [ - 'A humorous, funny one-liner that starts with "When you", describes a specific visual or situational moment, avoids vagueness, and ends with no punctuation', - 'A POV meme that starts with "POV: ", clearly describes a specific scenario or feeling with high context, and ends with no punctuation', - 'A humorous, funny one-liner that starts with "I", grounded in a relatable, situational experience with visual context, and ends with no punctuation', - 'A humorous, funny one-liner that starts with "You", focused on a clear, specific reaction or moment, and ends with no punctuation', - 'A humorous, funny one-liner with no punctuation that describes a vivid, realistic scenario or reaction in a clearly defined context', + $captions = [ + [ + 'caption_description' => 'A humorous, funny one-liner meme caption that starts with "When you", describes a specific visual or situational moment, avoids vagueness, and ends with no punctuation', + 'caption_style' => 'Relatable one-liners starting with "When you"' + ], + [ + 'caption_description' => 'A POV meme that starts with "POV: ", clearly describes a specific scenario or feeling with high context, and ends with no punctuation', + 'caption_style' => 'POV-style captions (e.g., "POV: finally logging off after pretending to work for 3 hours")' + ], + [ + 'caption_description' => 'A humorous, funny one-liner meme caption that starts with "I", grounded in a relatable, situational experience with visual context, and ends with no punctuation', + 'caption_style' => 'Relatable one-liners starting with "I"' + ], + [ + 'caption_description' => 'A humorous, funny one-liner meme caption that starts with "You", focused on a clear, specific reaction or moment, and ends with no punctuation', + 'caption_style' => 'Relatable one-liners starting with "You"' + ], + [ + 'caption_description' => 'A humorous, funny one-liner meme caption with no punctuation that describes a vivid, realistic scenario or reaction in a clearly defined context', + 'caption_style' => 'Visual punchlines (e.g., "Wearing a suit and contemplating my life in the elevator")' + ], + [ + 'caption_description' => 'A juxtaposition-style one-liner meme caption expressing a contrast or contradiction in a witty, punchy way, often revealing irony or absurdity, and ends with no punctuation (e.g., "I want a salary without a job"). Start with "I" or "You" to create a sense of contrast', + 'caption_style' => 'Juxtaposition (e.g., "I want a salary without a job")' + ], + [ + 'caption_description' => 'A meme caption that starts with "TIL: ", presents a short, punchy, and ironic realization about work or life that feels meme-worthy, clearly sets up a visual or exaggerated truth, and ends with no punctuation (e.g., "TIL: rent is just a subscription to be alive")', + 'caption_style' => 'TIL captions (e.g., "TIL: rent is just a subscription to be alive")' + ], + [ + 'caption_description' => 'A meme caption that starts with "TL;DR: ", provides a blunt, dry, or brutally honest summary of a situation, ideally workplace- or life-related, and ends with no punctuation (e.g., "TL;DR: we had a meeting about having fewer meetings")', + 'caption_style' => 'TL;DR captions (e.g., "TL;DR: we had a meeting about having fewer meetings")' + ], + [ + 'caption_description' => 'A meme caption that starts with "The moment you realize", sets up an unexpected or awkward realization in a relatable work or life setting, and ends with no punctuation', + 'caption_style' => 'The moment you realize... (e.g., "The moment you realize your boss joined the call 5 minutes ago")' + ], + [ + 'caption_description' => 'A meme caption that uses the "Nobody:" format to exaggerate a reaction or absurd behavior, often with a silent or empty setup followed by an over-the-top response, and ends with no punctuation', + 'caption_style' => 'Nobody: ... (e.g., "Nobody: \nMe: sends 3 follow-up emails and panics")' + ], + [ + 'caption_description' => 'A meme caption that starts with "Me trying to", describes a personal struggle or awkward attempt to do something relatable, and ends with no punctuation', + 'caption_style' => 'Me trying to... (e.g., "Me trying to stay calm after 2 hours on hold")' + ], + [ + 'caption_description' => 'A meme caption that starts with "It\'s giving", followed by a cultural, emotional, or exaggerated vibe that humorously labels the situation, and ends with no punctuation', + 'caption_style' => 'It\'s giving... (e.g., "It\'s giving corporate despair in HD")' + ], + [ + 'caption_description' => 'A meme caption that starts with "Meanwhile", contrasts expected behavior with a chaotic or unexpected reality, and ends with no punctuation', + 'caption_style' => 'Meanwhile... (e.g., "Meanwhile: I\'m Googling how to quit politely")' + ], + [ + 'caption_description' => 'A meme caption that starts with "My toxic trait is", followed by an ironic or self-aware confession that highlights flawed logic or behavior, and ends with no punctuation', + 'caption_style' => 'My toxic trait is... (e.g., "My toxic trait is checking Slack and getting mad")' + ], ]; + + //$random_caption = $captions[rand(0, count($captions) - 1)]; + $random_caption = $captions[count($captions) - 1]; + + $response = Http::withHeaders([ 'Content-Type' => 'application/json', - 'Authorization' => 'Bearer '.env('OPENAI_API_KEY'), + 'Authorization' => 'Bearer ' . env('OPENAI_API_KEY'), ]) ->post('https://api.openai.com/v1/responses', [ 'model' => 'gpt-4.1-nano', @@ -74,7 +129,20 @@ public static function getSingleMemeGenerator($user_prompt) 'content' => [ [ 'type' => 'input_text', - 'text' => '"You are an AI meme writer for a video meme generator.\n\nYour task is to generate a JSON array containing a unique, short-form workplace-related video meme ideas.\n\nEach meme object must include the following fields, with the format shown below. Each field contains an inline description of the type of content it must generate.\n\nReturn **only** a Markdown code block containing valid JSON with inline content guidance (as strings). Do not add any commentary or explanation outside the code block.\n\n- All memes must be funny, relatable, and clearly connected to the provided topic.\n- Use realistic but exaggerated expressions and settings to match meme-style content.\n- Style should suit video formats like TikTok, Instagram Reels, or YouTube Shorts."', + 'text' => "You are an AI meme writer for a video meme generator. + + Your task is to generate a JSON array containing a unique, short-form workplace-related video meme idea. + + Each meme object must include the following fields, with the format shown below. Each field contains an inline description of the type of content it must generate. + +Only use this style for the caption: +\"{$random_caption['caption_style']}\" + + Return **only** a Markdown code block containing valid JSON with inline content guidance (as strings). Do not add any commentary or explanation outside the code block. + + All memes must be funny, relatable, and clearly connected to the provided topic. + Use realistic but exaggerated expressions and settings to match meme-style content. + Style should suit video formats like TikTok, Instagram Reels, or YouTube Shorts.", ], ], ], @@ -98,7 +166,7 @@ public static function getSingleMemeGenerator($user_prompt) 'properties' => [ 'caption' => [ 'type' => 'string', - 'description' => $caption_descriptions[rand(0, count($caption_descriptions) - 1)], + 'description' => $random_caption['caption_description'], ], 'primary_keyword_type' => [ 'type' => 'string', @@ -128,7 +196,6 @@ public static function getSingleMemeGenerator($user_prompt) 'background' => [ 'type' => 'string', 'description' => "Use this exact structure: 'Location: [setting only, e.g., empty office with cluttered desk and monitor]'. Do not mention people, animals, actions, or any living beings. No verbs. No brand names. Only interior spaces or physical locations. Examples: 'Location: quiet office cubicle with headset and papers'.", - ], 'keywords' => [ 'type' => 'array', @@ -159,19 +226,16 @@ public static function getSingleMemeGenerator($user_prompt) 'store' => true, ]); - // Get the response data $data = $response->json(); - // Check if the request was successful if ($response->successful()) { - // Handle successful response return $data; } else { - // Handle error - throw new \Exception('API request failed: '.$response->body()); + throw new \Exception('API request failed: ' . $response->body()); } } + public static function getOpenAIOutput($data) { // dump($data); diff --git a/app/Http/Controllers/TestController.php b/app/Http/Controllers/TestController.php index ddc6dad..7c1889e 100644 --- a/app/Http/Controllers/TestController.php +++ b/app/Http/Controllers/TestController.php @@ -66,7 +66,9 @@ public function populateDuration() public function writeMeme() { - $meme_response = OpenAI::getSingleMemeGenerator('Write me 1 meme about workplace stress'); + $meme_response = OpenAI::getSingleMemeGenerator('Write me 1 meme about adult life'); + + //dump($meme_response); $meme_output = json_decode(OpenAI::getOpenAIOutput($meme_response));