132 lines
6.4 KiB
PHP
132 lines
6.4 KiB
PHP
<?php
|
|
|
|
namespace App\Helpers\FirstParty\OpenAI;
|
|
|
|
use Exception;
|
|
use Illuminate\Support\Facades\Http;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
class OpenAI
|
|
{
|
|
public static function writeArticle($title, $description, $article_type, $min, $max)
|
|
{
|
|
$system_prompt = "
|
|
Using the general article structure, please create a Markdown format article on the topic given. The article should prioritize accuracy and provide genuine value to readers. Avoid making assumptions or adding unverified facts. Ensure the article is between {$min}-{$max} words. Write with 8th & 9th grade US english standard.\n\n
|
|
Structure:\n\n
|
|
Title\n
|
|
Provide a headline that captures the essence of the article's focus and is tailored to the reader's needs.\n\n
|
|
Introduction\n
|
|
Offer a brief overview or background of the topic, ensuring it's engaging and invites readers to continue reading.\n\n
|
|
Main Body\n\n
|
|
Subsection\n
|
|
Introduce foundational information about the topic, ensuring content is accurate and based on known facts. Avoid generic or speculative statements.\n\n
|
|
Subsection (if applicable)\n
|
|
If helpful, use Markdown to create tables to convey comparison of data. Ensure data is accurate and relevant to the reader.\n\n
|
|
Subsection\n
|
|
Dive deep into primary elements or facets of the topic, ensuring content is factual and offers value.\n\n
|
|
Subsection\n
|
|
Discuss real-world applications or significance, highlighting practical implications or actionable insights for the reader.\n\n
|
|
Subsection (optional)\n
|
|
Provide context or relate the topic to relevant past events or trends, making it relatable and more comprehensive.\n\n
|
|
Subsection (if applicable)\n
|
|
Predict outcomes, trends, or ramifications, but ensure predictions are rooted in known information or logical reasoning.\n\n
|
|
Subsection\n
|
|
Summarise key points or lessons, ensuring they resonate with the initial objectives of the article and provide clear takeaways.\n\n
|
|
Conclusion\n
|
|
Revisit main points and offer final thoughts or recommendations that are actionable and beneficial to the reader.\n\n
|
|
FAQs\n
|
|
Address anticipated questions or misconceptions about the topic. Prioritize questions that readers are most likely to have and provide clear, concise answers based on factual information.\n
|
|
Q: Question\n
|
|
A: Answer\n
|
|
";
|
|
|
|
$user_prompt = "Title: {$title}\nDescription: {$description}\nArticleType: {$article_type}";
|
|
|
|
return self::chatCompletion($system_prompt, $user_prompt, 'gpt-3.5-turbo');
|
|
|
|
}
|
|
|
|
public static function createNewArticleTitle($current_title, $supporting_data)
|
|
{
|
|
$system_prompt = "Based on provided article title, identify the main keyword in 1-2 words. Once identified, use the main keyword only to generate an easy-to-read unique, helpful article title.\n\n
|
|
Requirements:\n
|
|
2 descriptive photos keywords to represent article title when put together side-by-side\n
|
|
No realtime information required\n
|
|
No guides and how tos\n
|
|
No punctuation in titles especially colons :\n
|
|
90-130 characters\n\n
|
|
|
|
return in following json format {\"main_keyword\":\"(Main Keyword)\",\"title\":\"(Title in 90-130 letters)\",\"short_title\":\"(Short Title in 30-40 letters)\",\"article_type\":\"(How-tos|Guides|Interview|Review|Commentary|Feature|News|Editorial|Report|Research|Case-study|Overview|Tutorial|Update|Spotlight|Insights)\",\"description\":\"(Cliffhanger SEO description based on main keyword, do not start with action verb)\",\"photo_keywords\":[\"photo keyword 1\",\"photo keyword 2\"]}";
|
|
|
|
$user_prompt = "Article Title: {$current_title}\n Article Description: {$supporting_data}\n";
|
|
|
|
$reply = self::chatCompletion($system_prompt, $user_prompt, 'gpt-3.5-turbo');
|
|
|
|
try {
|
|
return json_decode($reply, false);
|
|
} catch (Exception $e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static function suggestArticleTitles($current_title, $supporting_data, $suggestion_counts)
|
|
{
|
|
$system_prompt = "Based on provided article title, identify the main keyword in 1-2 words. Once identified, use the main keyword only to generate {$suggestion_counts} easy-to-read unique, helpful title articles.\n\n
|
|
Requirements:\n
|
|
2 descriptive photos keywords to represent article title when put together side-by-side\n
|
|
No realtime information required\n
|
|
No guides and how tos\n
|
|
No punctuation in titles especially colons :\n
|
|
90-130 characters\n\n
|
|
|
|
return in following json format {\"main_keyword\":\"(Main Keyword)\",\"suggestions\":[{\"title\":\"(Title in 90-130 letters)\",\"short_title\":\"(Short Title in 30-40 letters)\",\"article_type\":\"(How-tos|Guides|Interview|Review|Commentary|Feature|News|Editorial|Report|Research|Case-study|Overview|Tutorial|Update|Spotlight|Insights)\",\"description\":\"(SEO description based on main keyword)\",\"photo_keywords\":[\"photo keyword 1\",\"photo keyword 2\"]}]}";
|
|
|
|
$user_prompt = "Article Title: {$current_title}\n Article Description: {$supporting_data}\n";
|
|
|
|
$reply = self::chatCompletion($system_prompt, $user_prompt, 'gpt-3.5-turbo');
|
|
|
|
try {
|
|
return json_decode($reply, false);
|
|
} catch (Exception $e) {
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
public static function chatCompletion($system_prompt, $user_prompt, $model)
|
|
{
|
|
dump($system_prompt);
|
|
dump($user_prompt);
|
|
|
|
try {
|
|
$response = Http::timeout(800)->withToken(config('platform.ai.openai.api_key'))
|
|
->post('https://api.openai.com/v1/chat/completions', [
|
|
'model' => $model,
|
|
'max_tokens' => 2500,
|
|
'messages' => [
|
|
['role' => 'system', 'content' => $system_prompt],
|
|
['role' => 'user', 'content' => $user_prompt],
|
|
],
|
|
]);
|
|
|
|
dump($response->body());
|
|
|
|
$json_response = json_decode($response->body());
|
|
|
|
$reply = $json_response?->choices[0]?->message?->content;
|
|
|
|
return $reply;
|
|
}
|
|
catch(Exception $e) {
|
|
Log::error($e->getMessage(), ['response' => $response->body()]);
|
|
inspector()->reportException($e);
|
|
}
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
}
|