Laravel项目中的OpenAI API(后端实现不起作用)

wyyhbhjk  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(329)

我正在尝试使用这个API:https://github.com/openai-php/laravel在个人Laravel项目中。
我真的不知道我的代码中目前有什么问题,我能说的是,下面详细介绍的代码让我的消息显示在聊天框中,但在我的POST请求中返回错误419:XHR POST http://127.0.0.1:8000/send以及Fetch error: Server error
使用路由器和控制器,而是将直接API端点提供给JavaScript时,我设法获得了对我的消息的JSON响应...
请注意,我真的很想让后端部分工作,而不仅仅是在JS中做它。此外,我不想使用jQuery,但如果它可能有帮助,我会。

JavaScript:

//CSRF TOKEN
    const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
    const xhr = new XMLHttpRequest();
    xhr.open('GET', 'https://api.openai.com/v1/chat/completions', true);
    xhr.setRequestHeader('X-CSRF-TOKEN', csrfToken);

    const button = document.getElementById('button-submit');
    const chatWindow = document.getElementById('chat-window');
    const url = '{{ url('send') }}';

//API FETCH ON BUTTON CLICK
    button.addEventListener('click', function (){
        const input = document.getElementById('input').value;

        chatWindow.innerHTML += `<div class="messages-user">
        <div class="__user">
            <p>${input}</p>
        </div>
        <img src="{{ asset('/images/avatar.png') }}" alt="Avatar">
        <div style="clear: both"></div>
        </div>`;

        fetch(url, {
            method: 'POST',
            body: JSON.stringify(input),
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer "MY_OPENAI_KEY"'
            }
        }).then(function(response) {
            if (response.ok) {
                return response.text();
            } else {
                throw new Error('Server error.');
            }
        }).then(function(data) {
            chatWindow.innerHTML += `<div class="messages-bot">
                            <div class="__bot">
                                <p>${data}</p>
                            </div>
                            <img src="{{ asset('/images/chatbot.png') }}" alt="Avatar">
                            </div>
                            `;
        }).catch(function(error) {
            console.log('Fetch error:', error.message);
        });
    });

web.php:

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ChatBotController;

Route::get(‘/’, function () {
    return view(‘welcome’);
});

Route::post(‘send’, [ChatBotController::class, ‘sendChat’]);

控制器:

public function sendChat(Request $request){
    $result = OpenAI::completions()->create([
        ‘max-token’ => 100,
        ‘model’ => ‘text-davinci-003’,
        ‘prompt’ => $request->input
    ]);

    $response = array_reduce(
        $result->toArray()['choices'],
        fn(string $result, array $choice) => $result . $choice['text'], ""
    );
    
    return $response;
}

谢谢你的时间!

zqdjd7g9

zqdjd7g91#

在laravel中,th 419 error,意味着csrf token字段没有重新发送或不正确。在这种情况下,你可能不需要使用crsf token进行API调用。所以你需要移动这行代码:

Route::post('send', [ChatBotController::class, ‘sendChat’]);

从web.php(使用csrf保护)到laravel项目中routes文件夹下的api.php文件。
此时,您需要调用/api/send端点,而不是/send端点

相关问题