openai-php / client

⚡️ OpenAI PHP is a supercharged community-maintained PHP API client that allows you to interact with OpenAI API.
MIT License
4.56k stars 466 forks source link

[Bug]: Warning: Undefined array key "code" in Responses/FineTuning/RetrieveJobResponseError.php on line 42 #362

Open alek-s-andr opened 3 months ago

alek-s-andr commented 3 months ago

Description

A am getting the error when run any method on the $openAIClient->fineTuning() endpoint, for example $openAIClient->fineTuning()->createJob($params);. This run leads to fatal error: PHP Fatal error: Uncaught TypeError: OpenAI\Responses\FineTuning\RetrieveJobResponseError::__construct(): Argument #1 ($code) must be of type string, null given, called in vendor/openai-php/client/src/Responses/FineTuning/RetrieveJobResponseError.php on line 37 and defined in vendor/openai-php/client/src/Responses/FineTuning/RetrieveJobResponseError.php:20

2024-03-29-13-14-15

Steps To Reproduce

Run $openAIClient->fineTuning()->retrieveJob('ftjob-...');

OpenAI PHP Client Version

v0.8.4

PHP Version

8.1.27

Notes

https://platform.openai.com/docs/api-reference/fine-tuning/object I did a little research and found out that the returned fine-tuning job object from OpenAI API actually contains the parameter error which contains other object with key error (but this is not mentioned in the OpenAI documentation) in the absence of an error:

2024-03-29-12-44-08

alek-s-andr commented 3 months ago

I created a PR with a fix for this issue: https://github.com/openai-php/client/pull/363

BrainPackIO commented 3 months ago

Here is how you can create a completely new install that recreates this error. I have also included the fix

php -v

PHP 8.2.12 (cli) (built: Oct 24 2023 21:15:15) (ZTS Visual C++ 2019 x64) Copyright (c) The PHP Group Zend Engine v4.2.12, Copyright (c) Zend Technologies

composer require openai-php/client

composer dump-autoload    

nano index.php

Paste this:

<?php
require __DIR__ . '/vendor/autoload.php';

$client = OpenAI::client('insert-your-key-here');

$response = $client->fineTuning()->listJobs();
?>

php index.php

Error Response:

PHP Warning: Undefined array key "code" in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 35

Warning: Undefined array key "code" in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 35 PHP Warning: Undefined array key "param" in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 36

Warning: Undefined array key "param" in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 36 PHP Warning: Undefined array key "message" in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 37

Warning: Undefined array key "message" in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 37 PHP Fatal error: Uncaught TypeError: OpenAI\Responses\FineTuning\RetrieveJobResponseError::__construct(): Argument #1 ($code) must be of type string, null given, called in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 34 and defined in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php:20 Stack trace:

0 vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php(34): OpenAI\Responses\FineTuning\RetrieveJobResponseError->__construct(NULL, NULL, NULL)

1 vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponse.php(70): OpenAI\Responses\FineTuning\RetrieveJobResponseError::from(Array)

2 vendor\openai-php\client\src\Responses\FineTuning\ListJobsResponse.php(45): OpenAI\Responses\FineTuning\RetrieveJobResponse::from(Array, Object(OpenAI\Responses\Meta\MetaInformation))

3 [internal function]: OpenAI\Responses\FineTuning\ListJobsResponse::OpenAI\Responses\FineTuning{closure}(Array)

4 vendor\openai-php\client\src\Responses\FineTuning\ListJobsResponse.php(45): array_map(Object(Closure), Array)

5 vendor\openai-php\client\src\Resources\FineTuning.php(51): OpenAI\Responses\FineTuning\ListJobsResponse::from(Array, Object(OpenAI\Responses\Meta\MetaInformation))

6 index.php(6): OpenAI\Resources\FineTuning->listJobs()

7 {main}

thrown in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 20

Fatal error: Uncaught TypeError: OpenAI\Responses\FineTuning\RetrieveJobResponseError::__construct(): Argument #1 ($code) must be of type string, null given, called in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 34 and defined in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php:20 Stack trace:

0 vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php(34): OpenAI\Responses\FineTuning\RetrieveJobResponseError->__construct(NULL, NULL, NULL)

1 vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponse.php(70): OpenAI\Responses\FineTuning\RetrieveJobResponseError::from(Array)

2 vendor\openai-php\client\src\Responses\FineTuning\ListJobsResponse.php(45): OpenAI\Responses\FineTuning\RetrieveJobResponse::from(Array, Object(OpenAI\Responses\Meta\MetaInformation))

3 [internal function]: OpenAI\Responses\FineTuning\ListJobsResponse::OpenAI\Responses\FineTuning{closure}(Array)

4 vendor\openai-php\client\src\Responses\FineTuning\ListJobsResponse.php(45): array_map(Object(Closure), Array)

5 vendor\openai-php\client\src\Resources\FineTuning.php(51): OpenAI\Responses\FineTuning\ListJobsResponse::from(Array, Object(OpenAI\Responses\Meta\MetaInformation))

6 index.php(6): OpenAI\Resources\FineTuning->listJobs()

7 {main}

thrown in vendor\openai-php\client\src\Responses\FineTuning\RetrieveJobResponseError.php on line 20

Fix:

Inside file src\Responses\FineTuning\RetrieveJobResponseError.php

Change:

private function __construct(
    public readonly string $code,
    public readonly ?string $param,
    public readonly string $message,
) {
}

To:

private function __construct(
    public readonly ?string $code,
    public readonly ?string $param,
    public readonly ?string $message,
) {
}

Change:

return new self(
    $attributes['code'],
    $attributes['param'],
    $attributes['message'],
);

To:

return new self(
    $attributes['code'] ?? null,
    $attributes['param'] ?? null,
    $attributes['message'] ?? null,
);