Skip to content

Commit 5e05fba

Browse files
committed
image edits route for openai
1 parent 40c60d8 commit 5e05fba

File tree

5 files changed

+93
-1
lines changed

5 files changed

+93
-1
lines changed

src/handlers/imageEditsHandler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { Context } from 'hono';
1515
*/
1616
export async function imageEditsHandler(c: Context): Promise<Response> {
1717
try {
18-
let request = await c.req.json();
18+
let request = await c.req.raw.formData();
1919
let requestHeaders = Object.fromEntries(c.req.raw.headers);
2020
const camelCaseConfig = constructConfigFromRequestHeaders(requestHeaders);
2121

src/providers/azure-openai/api.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ const AzureOpenAIAPIConfig: ProviderAPIConfig = {
9696
case 'imageGenerate': {
9797
return `/deployments/${deploymentId}/images/generations?api-version=${apiVersion}`;
9898
}
99+
case 'imageEdit': {
100+
return `/deployments/${deploymentId}/images/edits?api-version=${apiVersion}`;
101+
}
99102
case 'createSpeech': {
100103
return `/deployments/${deploymentId}/audio/speech?api-version=${apiVersion}`;
101104
}

src/providers/openai/api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ const OpenAIAPIConfig: ProviderAPIConfig = {
3838
return '/embeddings';
3939
case 'imageGenerate':
4040
return '/images/generations';
41+
case 'imageEdit':
42+
return '/images/edits';
4143
case 'createSpeech':
4244
return '/audio/speech';
4345
case 'createTranscription':

src/providers/openai/imageEdits.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { OPEN_AI } from '../../globals';
2+
import { ErrorResponse, ImageGenerateResponse, ProviderConfig } from '../types';
3+
import { OpenAIErrorResponseTransform } from './utils';
4+
5+
export const OpenAIImageEditConfig: ProviderConfig = {
6+
image: {
7+
param: 'image',
8+
required: true,
9+
},
10+
prompt: {
11+
param: 'prompt',
12+
required: true,
13+
},
14+
background: {
15+
param: 'background',
16+
},
17+
input_fidelity: {
18+
param: 'input_fidelity',
19+
},
20+
mask: {
21+
param: 'mask',
22+
},
23+
model: {
24+
param: 'model',
25+
default: 'dall-e-2',
26+
},
27+
n: {
28+
param: 'n',
29+
min: 1,
30+
max: 10,
31+
},
32+
output_compression: {
33+
param: 'output_compression',
34+
min: 0,
35+
max: 100,
36+
},
37+
output_format: {
38+
param: 'output_format',
39+
},
40+
partial_images: {
41+
param: 'partial_images',
42+
min: 0,
43+
max: 3,
44+
},
45+
quality: {
46+
param: 'quality',
47+
},
48+
response_format: {
49+
param: 'response_format',
50+
},
51+
size: {
52+
param: 'size',
53+
},
54+
stream: {
55+
param: 'stream',
56+
},
57+
user: {
58+
param: 'user',
59+
},
60+
};
61+
62+
interface OpenAIImageObject {
63+
b64_json?: string; // The base64-encoded JSON of the generated image, if response_format is b64_json.
64+
url?: string; // The URL of the generated image, if response_format is url (default).
65+
revised_prompt?: string; // The prompt that was used to generate the image, if there was any revision to the prompt.
66+
}
67+
68+
interface OpenAIImageGenerateResponse extends ImageGenerateResponse {
69+
data: OpenAIImageObject[];
70+
}
71+
72+
export const OpenAIImageEditResponseTransform: (
73+
response: OpenAIImageGenerateResponse | ErrorResponse,
74+
responseStatus: number
75+
) => ImageGenerateResponse | ErrorResponse = (response, responseStatus) => {
76+
if (responseStatus !== 200 && 'error' in response) {
77+
return OpenAIErrorResponseTransform(response, OPEN_AI);
78+
}
79+
80+
return response;
81+
};

src/providers/openai/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,18 @@ import {
4646
OpenAIListInputItemsResponseTransformer,
4747
} from '../open-ai-base';
4848
import { OPEN_AI } from '../../globals';
49+
import {
50+
OpenAIImageEditConfig,
51+
OpenAIImageEditResponseTransform,
52+
} from './imageEdits';
4953

5054
const OpenAIConfig: ProviderConfigs = {
5155
complete: OpenAICompleteConfig,
5256
embed: OpenAIEmbedConfig,
5357
api: OpenAIAPIConfig,
5458
chatComplete: OpenAIChatCompleteConfig,
5559
imageGenerate: OpenAIImageGenerateConfig,
60+
imageEdit: OpenAIImageEditConfig,
5661
createSpeech: OpenAICreateSpeechConfig,
5762
createTranscription: {},
5863
createTranslation: {},
@@ -77,6 +82,7 @@ const OpenAIConfig: ProviderConfigs = {
7782
chatComplete: OpenAIChatCompleteResponseTransform,
7883
// 'stream-chatComplete': OpenAIChatCompleteResponseTransform,
7984
imageGenerate: OpenAIImageGenerateResponseTransform,
85+
imageEdit: OpenAIImageEditResponseTransform,
8086
createSpeech: OpenAICreateSpeechResponseTransform,
8187
createTranscription: OpenAICreateTranscriptionResponseTransform,
8288
createTranslation: OpenAICreateTranslationResponseTransform,

0 commit comments

Comments
 (0)