<?php namespace App\Jobs\Form; use App\Console\Commands\GenerateTemplate; use App\Http\Requests\AiGenerateFormRequest; use App\Models\Forms\AI\AiFormCompletion; use App\Service\OpenAi\GptCompleter; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Str; class GenerateAiForm implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct(public AiFormCompletion $completion) { } /** * Execute the job. * * @return void */ public function handle() { $this->completion->update([ 'status' => AiFormCompletion::STATUS_PROCESSING ]); $completer = (new GptCompleter(config('services.openai.api_key'))) ->setSystemMessage('You are a robot helping to generate forms.'); try { $completer->completeChat([ ["role" => "user", "content" => Str::of(GenerateTemplate::FORM_STRUCTURE_PROMPT) ->replace('[REPLACE]', $this->completion->form_prompt)->toString()] ], 3000); $this->completion->update([ 'status' => AiFormCompletion::STATUS_COMPLETED, 'result' => $this->cleanOutput($completer->getArray()) ]); } catch (\Exception $e) { $this->completion->update([ 'status' => AiFormCompletion::STATUS_FAILED, 'result' => $e->getMessage() ]); } } public function generateForm(AiGenerateFormRequest $request) { $completer = (new GptCompleter(config('services.openai.api_key'))) ->setSystemMessage('You are a robot helping to generate forms.'); $completer->completeChat([ ["role" => "user", "content" => Str::of(GenerateTemplate::FORM_STRUCTURE_PROMPT) ->replace('[REPLACE]', $request->form_prompt)->toString()] ], 3000); return $this->success([ 'message' => 'Form successfully generated!', 'form' => $this->cleanOutput($completer->getArray()) ]); } private function cleanOutput($formData) { // Add property uuids foreach ($formData['properties'] as &$property) { $property['id'] = Str::uuid()->toString(); } return $formData; } }