127 lines
6.2 KiB
PHP
127 lines
6.2 KiB
PHP
<?php
|
||
|
||
namespace App\Helpers\FirstParty\AI;
|
||
|
||
use Illuminate\Support\Facades\Http;
|
||
|
||
class OpenAI
|
||
{
|
||
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',
|
||
];
|
||
|
||
|
||
$response = Http::withHeaders([
|
||
'Content-Type' => 'application/json',
|
||
'Authorization' => 'Bearer ' . env('OPENAI_API_KEY'),
|
||
])
|
||
->post('https://api.openai.com/v1/responses', [
|
||
'model' => 'gpt-4.1-nano',
|
||
'input' => [
|
||
[
|
||
'role' => 'system',
|
||
'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."',
|
||
],
|
||
],
|
||
],
|
||
[
|
||
'role' => 'user',
|
||
'content' => [
|
||
[
|
||
'type' => 'input_text',
|
||
'text' => $user_prompt,
|
||
],
|
||
],
|
||
],
|
||
],
|
||
'text' => [
|
||
'format' => [
|
||
'type' => 'json_schema',
|
||
'name' => 'meme_generator_single_1',
|
||
'strict' => true,
|
||
'schema' => [
|
||
'type' => 'object',
|
||
'properties' => [
|
||
'caption' => [
|
||
'type' => 'string',
|
||
'description' => $caption_descriptions[rand(0, count($caption_descriptions) - 1)],
|
||
],
|
||
'meme_keywords' => [
|
||
'type' => 'array',
|
||
'description' => 'Array of 3–5 tags that describe only internal emotional states (e.g., "anxiety", "burnout", "imposter syndrome", "joy", "excitement", "confusion", "awkwardness"). Avoid external concepts, situations, or behaviors like "familylife" or "comparison". Only include pure feelings.',
|
||
'items' => [
|
||
'type' => 'string',
|
||
],
|
||
],
|
||
'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',
|
||
'description' => 'Relevant lowercase tags for the meme (e.g., "burnout", "email fail", "meetings")',
|
||
'items' => [
|
||
'type' => 'string',
|
||
],
|
||
],
|
||
],
|
||
'required' => [
|
||
'caption',
|
||
'meme_keywords',
|
||
'background',
|
||
'keywords',
|
||
],
|
||
'additionalProperties' => false,
|
||
],
|
||
],
|
||
],
|
||
'reasoning' => (object) [],
|
||
'tools' => [],
|
||
'temperature' => 1,
|
||
'max_output_tokens' => 2048,
|
||
'top_p' => 1,
|
||
'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());
|
||
}
|
||
}
|
||
|
||
public static function getOpenAIOutput($data)
|
||
{
|
||
//dump($data);
|
||
|
||
$output = null;
|
||
|
||
$response_type = data_get($data, 'output.0.content.0.type', null);
|
||
|
||
if ($response_type === 'output_text') {
|
||
$output = data_get($data, 'output.0.content.0.text', null);
|
||
} else if ($response_type === 'refusal') {
|
||
$output = data_get($data, 'output.0.content.0.refusal', null);
|
||
}
|
||
|
||
return $output;
|
||
}
|
||
}
|