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

我目前正在尝试在个人 Laravel 项目中使用这个 API:https://github.com/openai-php/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;}

感谢您的关注!


回答:

在 Laravel 中,419 错误表示 CSRF 令牌字段未被重新发送或不正确。在这种情况下,您可能不需要为 API 调用使用 CSRF 令牌。因此,您需要将以下代码行:

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

从 web.php 文件(使用 CSRF 保护)移动到 Laravel 项目中 routes 文件夹下的 api.php 文件中。

此时,您需要调用 /api/send 端点而不是 /send 端点

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注