This is a clone of ChatGPT with support for text, voice, translate, image, stream and beautiful UI, made with Laravel 10 using the ChatGPT and Audio (Whisper model) API, as well as Inertia + Vue3 + Tailwind CSS:
support text && voice
support stream
support image
final, support custom openai api key:
1、PHP HTTP Server
php artisan serve npm run dev2、Docker
git clone https://github.com/geekr-dev/geekchat.git cd geekchat cp .env.example .env # config OPENAI_API_KEY docker-compose up -d docker exec -it geekchat_laravel.test_1 bash composer install npm install npm run build exit docker-compose build --no-cache docker-compose up -dAfter that, you can view GeekChat by http://localhost in your local browser.
detail tutorial:https://geekr.dev/posts/chatgpt-website-by-laravel-10
I implement stream with EventSource and curl, you can use it to receive stream response from OpenAI API.
Frontend:
ChatAPI.chatMessage(message).then(response => { ... return response.json(); }).then(data => { ... const eventSource = new EventSource(`/stream?chat_id=${data.chat_id}`); eventSource.onmessage = function (e) { ... if (e.data == "[DONE]") { eventSource.close(); } else { let word = JSON.parse(e.data).choices[0].delta.content if (word !== undefined) { state.messages[state.messages.length - 1].content += JSON.parse(e.data).choices[0].delta.content } } }; eventSource.onerror = function (e) { eventSource.close(); ... }; }).catch(error => { ... });Backend:
use App\Facades\OpenAI; use Symfony\Component\HttpFoundation\StreamedResponse; ... $params = [ 'model' => 'gpt-3.5-turbo', 'messages' => $messages, 'stream' => true, ]; $response = new StreamedResponse(function () use ($request, $params) { $respData = ''; OpenAI::chat($params, function ($ch, $data) use (&$respData) { $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode >= 400) { echo "data: [ERROR] $httpCode"; } else { echo $data; } ob_flush(); flush(); return strlen($data); }); ... }); $response->headers->set('Content-Type', 'text/event-stream'); $response->headers->set('Cache-Control', 'no-cache'); $response->headers->set('X-Accel-Buffering', 'no'); return $response;Warning: Due to the use of functions such as
header,ob_flush, andflush, this does not support PHP HTTP servers driven by persistent memory mechanisms like Swoole or RoadRunner. It's important to keep this in mind when deploying to a production environment.



