Skip to content

Commit 74c8e83

Browse files
committed
add edits and images api
1 parent 9df914f commit 74c8e83

File tree

7 files changed

+182
-3
lines changed

7 files changed

+182
-3
lines changed

README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
An elegant Node.js library written in TypeScript for the OpenAI API.
44

5+
- [Installation](#installation)
6+
- [Example](#example)
7+
- [V1 API](#v1-api)
8+
- [Models](#models)
9+
- [Completions](#completions)
10+
- [Chat](#chat)
11+
- [Edits](#edits)
12+
- [Images](#images)
13+
514
## Installation
615

716
```bash
@@ -46,6 +55,8 @@ To use the OpenAI V1 API, you must call the `v1()` method on the client instance
4655
const v1 = client.v1();
4756
```
4857

58+
Check out the [OpenAI V1 API docs](https://platform.openai.com/docs/api-reference/introduction) for more information.
59+
4960
### Models
5061

5162
List all available models:
@@ -88,3 +99,46 @@ const chat = await v1.chat.create({
8899
]
89100
});
90101
```
102+
103+
### Edits
104+
105+
Create an edit:
106+
107+
```javascript
108+
const edit = await v1.edits.create({
109+
model: 'text-davinci-edit-001',
110+
input: 'I am a test',
111+
instruction: 'Make this text funny',
112+
});
113+
```
114+
115+
### Images
116+
117+
Create an image:
118+
119+
```javascript
120+
const image = await v1.images.create({
121+
prompt: 'A cute baby sea otter',
122+
n: 1,
123+
size: '512x512',
124+
});
125+
```
126+
127+
Create image edit:
128+
129+
```javascript
130+
const imageEdit = await v1.images.edit({
131+
prompt: 'Make this image funny',
132+
n: 1,
133+
size: '512x512',
134+
}, '/path/to/image.png');
135+
```
136+
137+
Create image variation:
138+
139+
```javascript
140+
const imageVariation = await v1.images.variation({
141+
n: 1,
142+
size: '512x512',
143+
}, '/path/to/image.png');
144+
```

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,16 @@
3434
"test": "npx mocha"
3535
},
3636
"devDependencies": {
37-
"@types/node": "latest",
3837
"@types/mocha": "latest",
38+
"@types/node": "latest",
3939
"assert": "latest",
4040
"mocha": "latest",
4141
"ts-node": "latest",
4242
"tsc-esm-fix": "latest",
4343
"typescript": "latest"
4444
},
4545
"dependencies": {
46-
"axios": "^1.3.4"
46+
"axios": "^1.3.4",
47+
"form-data": "^4.0.0"
4748
}
4849
}

pnpm-lock.yaml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ export class OpenAI {
4343
},
4444
chat: {
4545
create: v1.createChat(client)
46+
},
47+
edits: {
48+
create: v1.createEdit(client)
49+
},
50+
images: {
51+
create: v1.createImage(client),
52+
edit: v1.editImage(client),
53+
createVariation: v1.createImageVariation(client)
4654
}
4755
};
4856
}

src/v1/edits.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Usage } from ".";
2+
import { ApiClient } from "..";
3+
4+
type EditRequest = {
5+
model: string;
6+
input?: string;
7+
instruction: string;
8+
n?: number;
9+
temperature?: number;
10+
top_p?: number;
11+
};
12+
13+
type Choice = {
14+
index: number;
15+
text: string;
16+
}
17+
18+
type Edit = {
19+
object: string;
20+
created: number;
21+
choices: Choice[];
22+
usage: Usage;
23+
}
24+
25+
export function createEdit(client: ApiClient) {
26+
return async (request: EditRequest): Promise<Edit> => {
27+
return await client("edits", { method: "POST", data: request });
28+
}
29+
}

src/v1/images.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { createReadStream } from "fs";
2+
import { ApiClient } from "..";
3+
import FormData from "form-data";
4+
5+
type ImageSize = '256x256' | '512x512' | '1024x1024';
6+
7+
type ImageResponseFormat = 'url' | 'b64_json';
8+
9+
type CreateImageRequest = {
10+
prompt: string;
11+
n?: number;
12+
size?: ImageSize;
13+
response_format?: ImageResponseFormat;
14+
user?: string;
15+
};
16+
17+
type EditImageRequest = {
18+
prompt: string;
19+
n?: number;
20+
size?: ImageSize;
21+
response_format?: ImageResponseFormat;
22+
user?: string;
23+
};
24+
25+
type CreateImageVariationRequest = {
26+
n?: number;
27+
size?: ImageSize;
28+
response_format?: ImageResponseFormat;
29+
user?: string;
30+
};
31+
32+
type UrlImage = {
33+
url: string;
34+
};
35+
36+
type B64JsonImage = {
37+
b64_json: string;
38+
};
39+
40+
type ImageData = UrlImage | B64JsonImage;
41+
42+
type Image = {
43+
created: number;
44+
data: ImageData[];
45+
};
46+
47+
export function createImage(client: ApiClient) {
48+
return async (request: CreateImageRequest): Promise<Image> => {
49+
return await client("images/generations", { method: "POST", data: request });
50+
}
51+
}
52+
53+
export function editImage(client: ApiClient) {
54+
return async (request: EditImageRequest, image: string, mask?: string): Promise<Image> => {
55+
const form = new FormData();
56+
57+
for (const key in request) {
58+
form.append(key, '' + request[key as keyof EditImageRequest]);
59+
}
60+
61+
form.append('image', createReadStream(image));
62+
63+
if (mask) {
64+
form.append('mask', createReadStream(mask));
65+
}
66+
67+
return await client("images/edits", { method: "POST", data: form });
68+
}
69+
}
70+
71+
export function createImageVariation(client: ApiClient) {
72+
return async (request: CreateImageVariationRequest, image: string): Promise<Image> => {
73+
const form = new FormData();
74+
75+
for (const key in request) {
76+
form.append(key, '' + request[key as keyof CreateImageVariationRequest]);
77+
}
78+
79+
form.append('image', createReadStream(image));
80+
81+
return await client("images/variations", { method: "POST", data: form });
82+
}
83+
}

src/v1/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ export type Usage = {
66

77
export * from "./models";
88
export * from "./completions";
9-
export * from "./chat";
9+
export * from "./chat";
10+
export * from "./edits";
11+
export * from "./images";

0 commit comments

Comments
 (0)