Skip to content

Commit

Permalink
Add fine-tunes api
Browse files Browse the repository at this point in the history
  • Loading branch information
joyqi committed Mar 9, 2023
1 parent fbd6b8a commit 4d9e646
Show file tree
Hide file tree
Showing 10 changed files with 174 additions and 12 deletions.
58 changes: 58 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
An elegant Node.js library written in TypeScript for the OpenAI API.

- [Installation](#installation)
- [Features](#features)
- [Example](#example)
- [V1 API](#v1-api)
- [Models](#models)
Expand All @@ -13,13 +14,30 @@ An elegant Node.js library written in TypeScript for the OpenAI API.
- [Embeddings](#embeddings)
- [Audio](#audio)
- [Files](#files)
- [Fine-tunes](#fine-tunes)
- [Moderations](#moderations)

## Installation

```bash
npm install node-openai
```

### Features

| API | Supported |
| --- | --- |
| [Models](https://platform.openai.com/docs/api-reference/models) ||
| [Completions](https://platform.openai.com/docs/api-reference/completions) ||
| [Chat](https://platform.openai.com/docs/api-reference/chat) ||
| [Edits](https://platform.openai.com/docs/api-reference/edits) ||
| [Images](https://platform.openai.com/docs/api-reference/images) ||
| [Embeddings](https://platform.openai.com/docs/api-reference/embeddings) ||
| [Audio](https://platform.openai.com/docs/api-reference/audio) ||
| [Files](https://platform.openai.com/docs/api-reference/files) ||
| [Fine-tunes](https://platform.openai.com/docs/api-reference/fine-tunes) ||
| [Moderations](https://platform.openai.com/docs/api-reference/moderations) ||

## Example

For Node.js (CommonJS):
Expand Down Expand Up @@ -74,6 +92,12 @@ Retrieve a model:
const model = await api.models.retrieve('davinci');
```

Delete fine-tuned model:

```javascript
const model = await api.models.delete('curie:ft-acmeco-2021-03-03-21-44-20');
```

### Completions

Create a completion:
Expand Down Expand Up @@ -209,6 +233,40 @@ Retrieve a file's contents:
const content = await api.files.retrieveContents('file-123');
```

### Fine-tunes

Create fine-tune:

```javascript
const fineTune = await api.fineTunes.create({
training_file: 'file-123',
});
```

List fine-tunes:

```javascript
const fineTunes = await api.fineTunes.list();
```

Retrieve fine-tune:

```javascript
const fineTune = await api.fineTunes.retrieve('ft-AF1WoRqd3aJAHsqc9NY7iL8F');
```

Cancel fine-tune:

```javascript
const fineTune = await api.fineTunes.cancel('ft-AF1WoRqd3aJAHsqc9NY7iL8F');
```

List fine-tune's events:

```javascript
const events = await api.fineTunes.listEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F');
```

### Moderations

Create moderation:
Expand Down
10 changes: 9 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ export class OpenAI {
return {
models: {
list: v1.listModels(client),
retrieve: v1.retrieveModel(client)
retrieve: v1.retrieveModel(client),
delete: v1.deleteModel(client),
},
completions: {
create: v1.createCompletion(client)
Expand Down Expand Up @@ -66,6 +67,13 @@ export class OpenAI {
delete: v1.deleteFile(client),
retrieveContent: v1.retrieveFileContent(client)
},
fineTunes: {
create: v1.createFineTune(client),
list: v1.listFineTunes(client),
retrieve: v1.retrieveFineTune(client),
cancel: v1.cancelFineTune(client),
listEvents: v1.listFineTuneEvents(client),
},
moderations: {
create: v1.createModeration(client)
},
Expand Down
2 changes: 1 addition & 1 deletion src/v1/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ type Choice = {

type Chat = {
id: string;
object: string;
object: "chat.completion";
created: number;
choices: Choice[];
usage: Usage;
Expand Down
2 changes: 1 addition & 1 deletion src/v1/completions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ type Choice = {

type Completion = {
id: string;
object: string;
object: "text_completion";
created: number;
model: string;
choices: Choice[];
Expand Down
2 changes: 1 addition & 1 deletion src/v1/edits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type Choice = {
};

type Edit = {
object: string;
object: "edit";
created: number;
choices: Choice[];
usage: Usage;
Expand Down
4 changes: 2 additions & 2 deletions src/v1/embeddings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ type EmbeddingRequest = {
};

type Embedding = {
object: string;
object: "embedding";
embedding: number[];
index: number;
};

type EmbeddingList = {
object: string;
object: "list";
data: Embedding[];
model: string;
usage: Omit<Usage, "completion_tokens">;
Expand Down
6 changes: 3 additions & 3 deletions src/v1/files.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { createReadStream } from "fs";
import { ApiClient } from "..";
import FormData from "form-data";

type File = {
export type File = {
id: string;
object: string;
object: "file";
bytes: number;
created_at: number;
filename: string;
Expand All @@ -19,7 +19,7 @@ type DeletedFile = {

type FileList = {
data: File[];
object: string;
object: "list";
};

export function listFiles(client: ApiClient) {
Expand Down
83 changes: 83 additions & 0 deletions src/v1/fine-tunes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { ApiClient } from "..";
import { File } from "./files";

type FineTuneHyperparameters = {
learning_rate_multiplier: number;
prompt_loss_weight: number;
batch_size: number;
n_epochs: number;
};

type FineTuneRequest = {
training_file: string;
validation_file?: string;
model?: string;
compute_classification_metrics?: boolean;
classification_n_classes?: number;
classification_positive_class?: string;
classification_betas?: number[];
suffix?: string;
} & FineTuneHyperparameters;

type FineTuneEvent = {
object: "fine-tune-event";
created_at: number;
level: string;
message: string;
}

type FineTune = {
id: string;
object: "fine-tune";
model: string;
created_at: number;
fine_tuned_model: string | null;
hyperparameters: FineTuneHyperparameters;
organization_id: string;
result_files: File[];
status: string;
validation_files: File[];
training_files: File[];
updated_at: number;
events: FineTuneEvent[];
};

type FineTuneList = {
object: "list";
data: Omit<FineTune, 'events'>[];
};

type FineTuneEvents = {
object: "list";
data: FineTuneEvent[];
};

export function createFineTune(client: ApiClient) {
return async (fineTuneRequest: FineTuneRequest): Promise<FineTune> => {
return await client("fine-tunes", { method: "POST", data: fineTuneRequest });
}
}

export function retrieveFineTune(client: ApiClient) {
return async (id: string): Promise<FineTune> => {
return await client(`fine-tunes/${id}`, { method: "GET" });
}
}

export function listFineTunes(client: ApiClient) {
return async (): Promise<FineTuneList> => {
return await client("fine-tunes", { method: "GET" });
}
}

export function cancelFineTune(client: ApiClient) {
return async (id: string): Promise<FineTune> => {
return await client(`fine-tunes/${id}/cancel`, { method: "POST" });
}
}

export function listFineTuneEvents(client: ApiClient) {
return async (id: string): Promise<FineTuneEvents> => {
return await client(`fine-tunes/${id}/events`, { method: "GET" });
}
}
3 changes: 2 additions & 1 deletion src/v1/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ export * from "./images";
export * from "./embeddings";
export * from "./audio";
export * from "./files";
export * from "./moderations";
export * from "./moderations";
export * from "./fine-tunes";
16 changes: 14 additions & 2 deletions src/v1/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,22 @@ type Permission = {

type Model = {
id: string;
object: string;
object: "model";
owned_by: string;
permission: Permission[];
root: string;
parent: string | null;
};

type DeletedModel = {
id: string;
object: "model";
deleted: boolean;
};

type ModelList = {
data: Model[];
object: string;
object: "list";
};

export function listModels(client: ApiClient) {
Expand All @@ -40,4 +46,10 @@ export function retrieveModel(client: ApiClient) {
return async (id: string): Promise<Model> => {
return await client(`models/${id}`, { method: "GET" });
}
}

export function deleteModel(client: ApiClient) {
return async (id: string): Promise<DeletedModel> => {
return await client(`models/${id}`, { method: "DELETE" });
}
}

0 comments on commit 4d9e646

Please sign in to comment.