Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 116 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@
- [Audio Resource](#audio-resource)
- [Embeddings Resource](#embeddings-resource)
- [Files Resource](#files-resource)
- [FineTunes Resource](#finetunes-resource)
- [FineTuning Resource](#finetuning-resource)
- [Moderations Resource](#moderations-resource)
- [Images Resource](#images-resource)
- [Edits Resource (deprecated)](#edits-resource)
- [FineTunes Resource (deprecated)](#finetunes-resource-deprecated)
- [Edits Resource (deprecated)](#edits-resource-deprecated)
- [Meta Information](#meta-information)
- [Testing](#testing)
- [Services](#services)
Expand Down Expand Up @@ -481,7 +482,119 @@ Returns the contents of the specified file.
$client->files()->download($file); // '{"prompt": "<prompt text>", ...'
```

### `FineTunes` Resource
### `FineTuning` Resource

#### `create job`

Creates a job that fine-tunes a specified model from a given dataset.

```php
$response = $client->fineTuning()->createJob([
'training_file' => 'file-abc123',
'validation_file' => null,
'model' => 'gpt-3.5-turbo',
'hyperparameters' => [
'n_epochs' => 4,
],
'suffix' => null,
]);

$response->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine_tuning.job'
$response->model; // 'gpt-3.5-turbo-0613'
$response->fineTunedModel; // null
// ...

$response->toArray(); // ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]
```

#### `list jobs`

List your organization's fine-tuning jobs.

```php
$response = $client->fineTuning()->listJobs();

$response->object; // 'list'

foreach ($response->data as $result) {
$result->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
$result->object; // 'fine_tuning.job'
// ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]
```

#### `retrieve job`

Get info about a fine-tuning job.

```php
$response = $client->fineTuning()->retrieveJob('ft-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine_tuning.job'
$response->model; // 'gpt-3.5-turbo-0613'
$response->createdAt; // 1614807352
$response->finishedAt; // 1692819450
$response->fineTunedModel; // 'ft:gpt-3.5-turbo-0613:jwe-dev::7qnxQ0sQ'
$response->organizationId; // 'org-jwe45798ASN82s'
$response->resultFiles[0]; // 'file-1bl05WrhsKDDEdg8XSP617QF'
$response->status; // 'succeeded'
$response->validationFile; // null
$response->trainingFile; // 'file-abc123'
$response->trainedTokens; // 5049

$response->hyperparameters->nEpochs; // 9

$response->toArray(); // ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]
```

#### `cancel job`

Immediately cancel a fine-tune job.

```php
$response = $client->fineTuning()->cancelJob('ft-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine_tuning.job'
// ...
$response->status; // 'cancelled'
// ...

$response->toArray(); // ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]
```

#### `list job events`

Get status updates for a fine-tuning job.

```php
$response = $client->fineTuning()->listJobEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->object; // 'list'

foreach ($response->data as $result) {
$result->object; // 'fine_tuning.job.event'
$result->createdAt; // 1614807352
// ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]
```

You can pass additional parameters to the `listJobEvents` method to narrow down the results.

```php
$response = $client->fineTuning()->listJobEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F', [
'limit' => 3, // Number of events to retrieve (Default: 20)
'after' => 'ftevent-kLPSMIcsqshEUEJVOVBVcHlP', // Identifier for the last event from the previous pagination request.
]);
```

### `FineTunes` Resource (deprecated)

#### `create`

Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"guzzlehttp/psr7": "^2.5.0",
"laravel/pint": "^1.10.3",
"nunomaduro/collision": "^7.7.0",
"pestphp/pest": "dev-develop as 2.6.2",
"pestphp/pest": "^2.16.0",
"pestphp/pest-plugin-arch": "^2.2.1",
"pestphp/pest-plugin-mock": "^2.0.0",
"pestphp/pest-plugin-type-coverage": "^2.0.0",
Expand Down
13 changes: 13 additions & 0 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use OpenAI\Resources\Embeddings;
use OpenAI\Resources\Files;
use OpenAI\Resources\FineTunes;
use OpenAI\Resources\FineTuning;
use OpenAI\Resources\Images;
use OpenAI\Resources\Models;
use OpenAI\Resources\Moderations;
Expand Down Expand Up @@ -98,10 +99,22 @@ public function models(): Models
return new Models($this->transporter);
}

/**
* Manage fine-tuning jobs to tailor a model to your specific training data.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning
*/
public function fineTuning(): FineTuning
{
return new FineTuning($this->transporter);
}

/**
* Manage fine-tuning jobs to tailor a model to your specific training data.
*
* @see https://platform.openai.com/docs/api-reference/fine-tunes
* @deprecated OpenAI has deprecated this endpoint and will stop working by January 4, 2024.
* https://openai.com/blog/gpt-3-5-turbo-fine-tuning-and-api-updates#updated-gpt-3-models
*/
public function fineTunes(): FineTunes
{
Expand Down
12 changes: 12 additions & 0 deletions src/Contracts/ClientContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use OpenAI\Contracts\Resources\EmbeddingsContract;
use OpenAI\Contracts\Resources\FilesContract;
use OpenAI\Contracts\Resources\FineTunesContract;
use OpenAI\Contracts\Resources\FineTuningContract;
use OpenAI\Contracts\Resources\ImagesContract;
use OpenAI\Contracts\Resources\ModelsContract;
use OpenAI\Contracts\Resources\ModerationsContract;
Expand Down Expand Up @@ -48,6 +49,8 @@ public function audio(): AudioContract;
* Given a prompt and an instruction, the model will return an edited version of the prompt.
*
* @see https://platform.openai.com/docs/api-reference/edits
* @deprecated OpenAI has deprecated this endpoint and will stop working by January 4, 2024.
* https://openai.com/blog/gpt-4-api-general-availability#deprecation-of-the-edits-api
*/
public function edits(): EditsContract;

Expand All @@ -65,10 +68,19 @@ public function files(): FilesContract;
*/
public function models(): ModelsContract;

/**
* Manage fine-tuning jobs to tailor a model to your specific training data.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning
*/
public function fineTuning(): FineTuningContract;

/**
* Manage fine-tuning jobs to tailor a model to your specific training data.
*
* @see https://platform.openai.com/docs/api-reference/fine-tunes
* @deprecated OpenAI has deprecated this endpoint and will stop working by January 4, 2024.
* https://openai.com/blog/gpt-3-5-turbo-fine-tuning-and-api-updates#updated-gpt-3-models
*/
public function fineTunes(): FineTunesContract;

Expand Down
51 changes: 51 additions & 0 deletions src/Contracts/Resources/FineTuningContract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

namespace OpenAI\Contracts\Resources;

use OpenAI\Responses\FineTuning\ListJobEventsResponse;
use OpenAI\Responses\FineTuning\ListJobsResponse;
use OpenAI\Responses\FineTuning\RetrieveJobResponse;

interface FineTuningContract
{
/**
* Creates a job that fine-tunes a specified model from a given dataset.
*
* Response includes details of the enqueued job including job status and the name of the fine-tuned models once complete.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning/create
*
* @param array<string, mixed> $parameters
*/
public function createJob(array $parameters): RetrieveJobResponse;

/**
* List your organization's fine-tuning jobs.
*
* @see TODO: There is no official documentation yet
*/
public function listJobs(): ListJobsResponse;

/**
* Get info about a fine-tuning job.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning/retrieve
*/
public function retrieveJob(string $jobId): RetrieveJobResponse;

/**
* Immediately cancel a fine-tune job.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning/cancel
*/
public function cancelJob(string $jobId): RetrieveJobResponse;

/**
* Get status updates for a fine-tuning job.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning/list-events
*
* @param array<string, mixed> $parameters
*/
public function listJobEvents(string $jobId, array $parameters = []): ListJobEventsResponse;
}
10 changes: 10 additions & 0 deletions src/Enums/FineTuning/FineTuningEventLevel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace OpenAI\Enums\FineTuning;

enum FineTuningEventLevel: string
{
case Info = 'info';
case Warning = 'warn';
case Error = 'error';
}
98 changes: 98 additions & 0 deletions src/Resources/FineTuning.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<?php

declare(strict_types=1);

namespace OpenAI\Resources;

use OpenAI\Contracts\Resources\FineTuningContract;
use OpenAI\Responses\FineTuning\ListJobEventsResponse;
use OpenAI\Responses\FineTuning\ListJobsResponse;
use OpenAI\Responses\FineTuning\RetrieveJobResponse;
use OpenAI\ValueObjects\Transporter\Payload;
use OpenAI\ValueObjects\Transporter\Response;

final class FineTuning implements FineTuningContract
{
use Concerns\Transportable;

/**
* Creates a job that fine-tunes a specified model from a given dataset.
*
* Response includes details of the enqueued job including job status and the name of the fine-tuned models once complete.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning/create
*
* @param array<string, mixed> $parameters
*/
public function createJob(array $parameters): RetrieveJobResponse
{
$payload = Payload::create('fine_tuning/jobs', $parameters);

/** @var Response<array{id: string, object: string, model: string, created_at: int, finished_at: ?int, fine_tuned_model: ?string, hyperparameters: array{n_epochs: int}, organization_id: string, result_files: array<int, string>, status: string, validation_file: ?string, training_file: string, trained_tokens: ?int}> $response */
$response = $this->transporter->requestObject($payload);

return RetrieveJobResponse::from($response->data(), $response->meta());
}

/**
* List your organization's fine-tuning jobs.
*
* @see TODO: There is no official documentation yet
*/
public function listJobs(): ListJobsResponse
{
$payload = Payload::list('fine_tuning/jobs');

/** @var Response<array{object: string, data: array<int, array{id: string, object: string, model: string, created_at: int, finished_at: ?int, fine_tuned_model: ?string, hyperparameters: array{n_epochs: int}, organization_id: string, result_files: array<int, string>, status: string, validation_file: ?string, training_file: string, trained_tokens: ?int}>}> $response */
$response = $this->transporter->requestObject($payload);

return ListJobsResponse::from($response->data(), $response->meta());
}

/**
* Gets info about the fine-tune job.
*
* @see https://platform.openai.com/docs/api-reference/fine-tunes/list
*/
public function retrieveJob(string $jobId): RetrieveJobResponse
{
$payload = Payload::retrieve('fine_tuning/jobs', $jobId);

/** @var Response<array{id: string, object: string, model: string, created_at: int, finished_at: ?int, fine_tuned_model: ?string, hyperparameters: array{n_epochs: int}, organization_id: string, result_files: array<int, string>, status: string, validation_file: ?string, training_file: string, trained_tokens: ?int}> $response */
$response = $this->transporter->requestObject($payload);

return RetrieveJobResponse::from($response->data(), $response->meta());
}

/**
* Immediately cancel a fine-tune job.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning/cancel
*/
public function cancelJob(string $jobId): RetrieveJobResponse
{
$payload = Payload::cancel('fine_tuning/jobs', $jobId);

/** @var Response<array{id: string, object: string, model: string, created_at: int, finished_at: ?int, fine_tuned_model: ?string, hyperparameters: array{n_epochs: int}, organization_id: string, result_files: array<int, string>, status: string, validation_file: ?string, training_file: string, trained_tokens: ?int}> $response */
$response = $this->transporter->requestObject($payload);

return RetrieveJobResponse::from($response->data(), $response->meta());
}

/**
* Get status updates for a fine-tuning job.
*
* @see https://platform.openai.com/docs/api-reference/fine-tuning/list-events
*
* @param array<string, mixed> $parameters
*/
public function listJobEvents(string $jobId, array $parameters = []): ListJobEventsResponse
{
$payload = Payload::retrieve('fine_tuning/jobs', $jobId, '/events', $parameters);

/** @var Response<array{object: string, data: array<int, array{object: string, id: string, created_at: int, level: string, message: string, data: array{step: int, train_loss: float, train_mean_token_accuracy: float}|null, type: string}>}> $response */
$response = $this->transporter->requestObject($payload);

return ListJobEventsResponse::from($response->data(), $response->meta());
}
}
Loading