Skip to content

Commit 01d91b2

Browse files
committed
Support create images
1 parent bda7ae5 commit 01d91b2

File tree

13 files changed

+251
-3
lines changed

13 files changed

+251
-3
lines changed

.github/workflows/publish-maven.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66

77
jobs:
88
release:
9-
runs-on: ubuntu-18.04
9+
runs-on: ubuntu-latest
1010
steps:
1111
- name: Check out Git repository
1212
uses: actions/checkout@v2

docs/docs/released.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ hide:
55
- navigation
66
---
77

8+
### 1.3.0
9+
10+
---
11+
12+
- Support azure proxy
13+
- Supports automatic resource release
14+
815
### 1.2.0
916

1017
---

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>org.devlive.sdk</groupId>
77
<artifactId>openai-java-sdk</artifactId>
8-
<version>1.3.0</version>
8+
<version>1.4.0-SNAPSHOT</version>
99

1010
<name>openai-java-sdk</name>
1111
<description>

src/main/java/org/devlive/sdk/openai/DefaultApi.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import io.reactivex.Single;
44
import org.devlive.sdk.openai.entity.CompletionChatEntity;
55
import org.devlive.sdk.openai.entity.CompletionEntity;
6+
import org.devlive.sdk.openai.entity.ImageEntity;
67
import org.devlive.sdk.openai.entity.ModelEntity;
78
import org.devlive.sdk.openai.entity.UserKeyEntity;
89
import org.devlive.sdk.openai.response.CompleteChatResponse;
910
import org.devlive.sdk.openai.response.CompleteResponse;
11+
import org.devlive.sdk.openai.response.ImageResponse;
1012
import org.devlive.sdk.openai.response.ModelResponse;
1113
import org.devlive.sdk.openai.response.UserKeyResponse;
1214
import retrofit2.http.Body;
@@ -56,4 +58,10 @@ Single<CompleteChatResponse> fetchChatCompletions(@Url String url,
5658
*/
5759
@POST(value = "dashboard/user/api_keys")
5860
Single<UserKeyResponse> fetchCreateUserAPIKey(@Body UserKeyEntity configure);
61+
62+
/**
63+
* Creates an image given a prompt.
64+
*/
65+
@POST
66+
Single<ImageResponse> fetchImagesGenerations(@Url String url, @Body ImageEntity configure);
5967
}

src/main/java/org/devlive/sdk/openai/DefaultClient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
import org.apache.commons.lang3.ObjectUtils;
66
import org.devlive.sdk.openai.entity.CompletionChatEntity;
77
import org.devlive.sdk.openai.entity.CompletionEntity;
8+
import org.devlive.sdk.openai.entity.ImageEntity;
89
import org.devlive.sdk.openai.entity.ModelEntity;
910
import org.devlive.sdk.openai.entity.UserKeyEntity;
1011
import org.devlive.sdk.openai.model.ProviderModel;
1112
import org.devlive.sdk.openai.model.UrlModel;
1213
import org.devlive.sdk.openai.response.CompleteChatResponse;
1314
import org.devlive.sdk.openai.response.CompleteResponse;
15+
import org.devlive.sdk.openai.response.ImageResponse;
1416
import org.devlive.sdk.openai.response.ModelResponse;
1517
import org.devlive.sdk.openai.response.UserKeyResponse;
1618
import org.devlive.sdk.openai.utils.ProviderUtils;
@@ -58,6 +60,12 @@ public UserKeyResponse createUserAPIKey(UserKeyEntity configure)
5860
.blockingGet();
5961
}
6062

63+
public ImageResponse createImages(ImageEntity configure)
64+
{
65+
return this.api.fetchImagesGenerations(ProviderUtils.getUrl(provider, UrlModel.FETCH_IMAGES_GENERATIONS), configure)
66+
.blockingGet();
67+
}
68+
6169
public void close()
6270
{
6371
if (ObjectUtils.isNotEmpty(this.client)) {
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package org.devlive.sdk.openai.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
import lombok.ToString;
10+
import org.apache.commons.lang3.EnumUtils;
11+
import org.apache.commons.lang3.ObjectUtils;
12+
import org.apache.commons.lang3.StringUtils;
13+
import org.devlive.sdk.openai.exception.ParamException;
14+
import org.devlive.sdk.openai.model.ImageFormatModel;
15+
import org.devlive.sdk.openai.model.ImageSizeModel;
16+
17+
@Data
18+
@Builder
19+
@ToString
20+
@NoArgsConstructor
21+
@AllArgsConstructor
22+
@JsonIgnoreProperties(ignoreUnknown = true)
23+
public class ImageEntity
24+
{
25+
/**
26+
* A text description of the desired image(s). The maximum length is 1000 characters.
27+
*/
28+
@JsonProperty(value = "prompt")
29+
private String prompt;
30+
31+
/**
32+
* The number of images to generate. Must be between 1 and 10.
33+
*/
34+
@JsonProperty(value = "n")
35+
private Integer count;
36+
37+
/**
38+
* The size of the generated images.
39+
*
40+
* @see ImageSizeModel
41+
*/
42+
@JsonProperty(value = "size")
43+
private String size;
44+
45+
/**
46+
* The format in which the generated images are returned.
47+
*
48+
* @see org.devlive.sdk.openai.model.ImageFormatModel
49+
*/
50+
@JsonProperty(value = "response_format")
51+
private String format = "url";
52+
53+
/**
54+
* A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse.
55+
*/
56+
@JsonProperty(value = "user")
57+
private String user;
58+
59+
@JsonProperty(value = "url")
60+
private String url;
61+
62+
private ImageEntity(ImageEntityBuilder builder)
63+
{
64+
if (ObjectUtils.isEmpty(builder.prompt)) {
65+
builder.prompt(null);
66+
}
67+
this.prompt = builder.prompt;
68+
69+
if (ObjectUtils.isEmpty(builder.count)) {
70+
builder.count(1);
71+
}
72+
this.count = builder.count;
73+
74+
if (ObjectUtils.isEmpty(builder.size)) {
75+
builder.size(ImageSizeModel.X_1024);
76+
}
77+
this.size = builder.size;
78+
79+
if (ObjectUtils.isEmpty(builder.format)) {
80+
builder.format(ImageFormatModel.url);
81+
}
82+
this.format = builder.format;
83+
84+
this.user = builder.user;
85+
}
86+
87+
public static class ImageEntityBuilder
88+
{
89+
public ImageEntityBuilder prompt(String prompt)
90+
{
91+
if (StringUtils.isEmpty(prompt)) {
92+
throw new ParamException("Invalid prompt must not be empty");
93+
}
94+
this.prompt = prompt;
95+
return this;
96+
}
97+
98+
public ImageEntityBuilder count(Integer count)
99+
{
100+
if (count < 1 || count > 10) {
101+
throw new ParamException(String.format("Invalid count: %s , between 1 and 10", count));
102+
}
103+
this.count = count;
104+
return this;
105+
}
106+
107+
public ImageEntityBuilder size(ImageSizeModel size)
108+
{
109+
Object instance = EnumUtils.getEnum(ImageSizeModel.class, size.name());
110+
if (ObjectUtils.isEmpty(instance)) {
111+
throw new ParamException(String.format("Invalid size: %s , Must be one of %s", size, ImageSizeModel.values()));
112+
}
113+
this.size = size.getName();
114+
return this;
115+
}
116+
117+
public ImageEntityBuilder format(ImageFormatModel format)
118+
{
119+
Object instance = EnumUtils.getEnum(ImageFormatModel.class, format.name());
120+
if (ObjectUtils.isEmpty(instance)) {
121+
throw new ParamException(String.format("Invalid format: %s , Must be one of %s", format, ImageFormatModel.values()));
122+
}
123+
this.format = format.name();
124+
return this;
125+
}
126+
127+
public ImageEntity build()
128+
{
129+
return new ImageEntity(this);
130+
}
131+
}
132+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.devlive.sdk.openai.model;
2+
3+
public enum ImageFormatModel
4+
{
5+
url,
6+
b64_json
7+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.devlive.sdk.openai.model;
2+
3+
public enum ImageSizeModel
4+
{
5+
X_256("256x256"),
6+
X_512("512x512"),
7+
X_1024("1024x1024");
8+
9+
private final String name;
10+
11+
public String getName()
12+
{
13+
return name;
14+
}
15+
16+
ImageSizeModel(String name)
17+
{
18+
this.name = name;
19+
}
20+
}

src/main/java/org/devlive/sdk/openai/model/UrlModel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ public enum UrlModel
77
FETCH_COMPLETIONS,
88
FETCH_CHAT_COMPLETIONS,
99
FETCH_USER_API_KEYS,
10-
FETCH_CREATE_USER_API_KEY
10+
FETCH_CREATE_USER_API_KEY,
11+
FETCH_IMAGES_GENERATIONS
1112
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.devlive.sdk.openai.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.Data;
6+
import org.devlive.sdk.openai.entity.ImageEntity;
7+
8+
import java.util.List;
9+
10+
@Data
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
public class ImageResponse
13+
{
14+
@JsonProperty(value = "data")
15+
private List<ImageEntity> images;
16+
}

0 commit comments

Comments
 (0)