davor / news-recommendation
This package provides AI generated recommendation tags for articles and stores them
v1.01
2025-03-04 07:44 UTC
Requires
- php: ^7.2|^8.0
- guzzlehttp/guzzle: ^6.3|^7.0.0
- intervention/image: ^2.5
- mongodb/laravel-mongodb: ^3.7|^3.9
- predis/predis: ^2.2
- dev-main
- v1.01
- v1.00
- v0.70
- v0.69
- v0.68
- v0.67
- v0.66
- v0.65
- v0.64
- v0.63
- v0.62
- v0.61
- v0.60
- v0.59
- v0.58
- v0.57
- v0.56
- v0.55
- v0.54
- v0.53
- v0.52
- v0.51
- v0.50
- v0.49
- v0.48
- v0.47
- v0.46
- v0.45
- v0.44
- v0.43
- v0.42
- v0.41
- v0.40
- v0.39
- v0.38
- v0.37
- v0.36
- v0.35
- v0.34
- v0.33
- v0.32
- v0.31
- v0.30
- v0.29
- v0.28
- v0.27
- v0.25
- v0.24
- v0.23
- v0.22
- v0.21
This package is not auto-updated.
Last update: 2025-03-04 07:47:52 UTC
README
Installation:
- composer require davor/news-recommendation
- php artisan vendor:publish --tag=config --provider="Hoks\NewsRecommendation\NewsRecommendationServiceProvider"
- Set up config/newsrecommendation.php
- Set up connection for mongodb in config/database.php
'mongodb' => [ 'driver' => 'mongodb', 'host' => env('DB_HOST_MONGO', 'mongo'), 'port' => env('DB_PORT_MONGO', 27017), 'database' => env('DB_DATABASE_MONGO', 'mongo'), 'username' => env('DB_USERNAME_MONGO'), 'password' => env('DB_PASSWORD_MONGO'), 'options' => [ 'database' => env('DB_AUTH_DATABASE', 'admin'), // Authentication database ], ],
- Shedule job on desired interval
$schedule->job(new ProcessReaders())->everyThirtyMinutes();
- Set up Redis to take data from user (see example bellow)
- Use package :D
OpenAI
This part of package is intended for communication with OpenAI.
Code example
/** * This example shows how to ask OpenAI to create prompt for creating OpenAI image */ //using facade we create client and specify uri for OpenAI API $askClient = \OpenAI::client('chat/completions'); //we ask for prompt (note that we use ['content'] to retrieve prompt) $imagePrompt = $askClient->ask('Write best prompt for creating poster of Novak Djokovic being the best tennis player ever')['content']; //using facade we create ampther client for image $imageClient = \OpenAI::client('images/generations',60,'dall-e-3'); //we retrieve image url (by default) $imageUrl = $imageClient->generateImage($imagePrompt)[0];
Set up Redis to take data from user
This is example on how to take user data and store it in Redis
Code example
Set up route
Route::post('/reader', [FrontendController::class, 'readerData'])->name('reader');
Write method in controller
use Illuminate\Support\Facades\Redis; use Illuminate\Support\Carbon; public function readerData(){ $redisKeys = Redis::keys('*'); $data = request()->validate([ 'article_id' => ['required','numeric','exists:articles,id'], 'readerID' => ['required','string'], 'publish_at' => ['required','date'] ]); $publishDate = Carbon::parse($data['publish_at']); // only take into account articles that are not older than 10 days if($publishDate > now()->subDays(10)){ //extract reader string from redis and update it $readerData = Redis::get('reader-'.$data['readerID']); if($readerData){ Redis::append('reader-'.$data['readerID'],'|'.$data['article_id']); }else{ Redis::set('reader-'.$data['readerID'],$data['article_id']); } } }
Write script on blade.php that will create user id and make ajax
<script> function generateUUID() { // Get current time in milliseconds var d = new Date().getTime(); // Define the UUID template with placeholder characters var uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"; // Replace the placeholders with random hexadecimal digits uuid = uuid.replace(/[xy]/g, function(c) { // Generate a random number between 0 and 15 var r = (d + Math.random()*16)%16 | 0; // Update value of d for the next placeholder d = Math.floor(d/16); // Convert the number to a hexadecimal digit and return it return (c=="x" ? r : (r&0x3|0x8)).toString(16); }); return uuid+'-'+{{$article['id']}}; } $(document).ready(function() { const reader = localStorage.getItem("reader"); var readerID; // if there is reader take data if(reader){ readerID = reader; }else{ //generate readerID readerID = generateUUID(); localStorage.setItem("reader",readerID); } console.log(readerID); $.ajax({ type: "POST", url: "{{route('frontend.ajax.reader')}}", data: { _token: "{{ csrf_token() }}", article_id: {{$article['id']}}, readerID : readerID, publish_at : "{{$article['publish_at']}}" } }); }); </script>