Skip to content

Commit

Permalink
Support create image HamaWhiteGG#146
Browse files Browse the repository at this point in the history
  • Loading branch information
HamaWhiteGG committed Dec 7, 2023
1 parent 58b8738 commit b0b7463
Show file tree
Hide file tree
Showing 9 changed files with 365 additions and 0 deletions.
12 changes: 12 additions & 0 deletions openai-client/src/main/java/com/hw/openai/OpenAiClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import com.hw.openai.entity.completions.CompletionResp;
import com.hw.openai.entity.embeddings.Embedding;
import com.hw.openai.entity.embeddings.EmbeddingResp;
import com.hw.openai.entity.image.CreateImageRequest;
import com.hw.openai.entity.image.ImageResp;
import com.hw.openai.entity.models.Model;
import com.hw.openai.entity.models.ModelResp;
import com.hw.openai.exception.OpenAiException;
Expand Down Expand Up @@ -313,6 +315,16 @@ public EmbeddingResp createEmbedding(Embedding embedding) {
: execute(service.createEmbedding(embedding));
}

/**
* Creates an image given a prompt.
*
* @param request the create image request
* @return the image result response
*/
public ImageResp createImage(CreateImageRequest request) {
return execute(service.createImage(request));
}

/**
* Checks if the Openai API type matches Azure or Azure AD.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hw.openai.entity.image;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Data;

/**
* @author HamaWhite
*/
@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CreateImageRequest {

/**
* A text description of the desired image(s).
* The maximum length is 1000 characters for dall-e-2 and 4000 characters for dall-e-3.
*/
@NotBlank
private String prompt;

/**
* The model to use for image generation.
*/
@Builder.Default
private String model = "dall-e-2";

/**
* The number of images to generate. Must be between 1 and 10. For dall-e-3, only n=1 is supported.
*/
@Builder.Default
private Integer n = 1;

/**
* The quality of the image that will be generated. hd creates images with finer details and greater consistency
* across the image. This param is only supported for dall-e-3.
*/
@Builder.Default
private String quality = "standard";

/**
* The format in which the generated images are returned. Must be one of url or b64_json.
*/
@JsonProperty("response_format")
@Builder.Default
private ImageResponseFormat responseFormat = ImageResponseFormat.URL;

/**
* The size of the generated images. Must be one of 256x256, 512x512, or 1024x1024 for dall-e-2.
* Must be one of 1024x1024, 1792x1024, or 1024x1792 for dall-e-3 models.
*/
@Builder.Default
private String size = "1024x1024";

/**
* The style of the generated images. Must be one of vivid or natural.
* Vivid causes the model to lean towards generating hyper-real and dramatic images.
* Natural causes the model to produce more natural, less hyper-real looking images.
* This param is only supported for dall-e-3.
*/
@Builder.Default
@JsonProperty("style")
private ImageStyle imageStyle = ImageStyle.NATURAL;

/**
* A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse.
*/
private String user;
}
47 changes: 47 additions & 0 deletions openai-client/src/main/java/com/hw/openai/entity/image/Image.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hw.openai.entity.image;

import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Data;

/**
* @author HamaWhite
*/
@Data
public class Image {

/**
* The base64-encoded JSON of the generated image, if response_format is b64_json.
*/
@JsonProperty("b64_json")
private String base64Json;

/**
* The URL of the generated image, if response_format is url (default).
*/
private String url;

/**
* The prompt that was used to generate the image, if there was any revision to the prompt.
*/
@JsonProperty("revised_prompt")
private String revisedPrompt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hw.openai.entity.image;

import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Data;

import java.util.List;

/**
* @author HamaWhite
*/
@Data
public class ImageResp {

/**
* The creation time in epoch seconds.
*/
Long created;

/**
* List of image results.
*/
@JsonProperty("data")
List<Image> images;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hw.openai.entity.image;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

/**
* @author HamaWhite
*/
public enum ImageResponseFormat {

URL("url"),

BASE64_JSON("b64_json");

private final String value;

ImageResponseFormat(String value) {
this.value = value;
}

@JsonValue
public String getValue() {
return value;
}

@JsonCreator
public static ImageResponseFormat fromValue(String value) {
for (ImageResponseFormat item : ImageResponseFormat.values()) {
if (item.value.equalsIgnoreCase(value)) {
return item;
}
}
throw new IllegalArgumentException("Invalid value: " + value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hw.openai.entity.image;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

/**
* @author HamaWhite
*/
public enum ImageStyle {

VIVID("vivid"),

NATURAL("natural");

private final String value;

ImageStyle(String value) {
this.value = value;
}

@JsonValue
public String getValue() {
return value;
}

@JsonCreator
public static ImageStyle fromValue(String value) {
for (ImageStyle item : ImageStyle.values()) {
if (item.value.equalsIgnoreCase(value)) {
return item;
}
}
throw new IllegalArgumentException("Invalid value: " + value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import com.hw.openai.entity.completions.CompletionResp;
import com.hw.openai.entity.embeddings.Embedding;
import com.hw.openai.entity.embeddings.EmbeddingResp;
import com.hw.openai.entity.image.CreateImageRequest;
import com.hw.openai.entity.image.ImageResp;
import com.hw.openai.entity.models.Model;
import com.hw.openai.entity.models.ModelResp;

Expand Down Expand Up @@ -142,4 +144,11 @@ Single<EmbeddingResp> createEmbedding(@Path("deploymentId") String deploymentId,
@Query("api-version") String apiVersion,
@Body Embedding embedding);

/**
* Creates an image given a prompt.
* @param request the create image request
* @return A Single emitting the response containing the generated image.
*/
@POST("images/generations")
Single<ImageResp> createImage(@Body CreateImageRequest request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class OpenAiClientTest {
@BeforeAll
static void setup() {
client = OpenAiClient.builder()
.requestTimeout(30)
.build()
.init();
}
Expand Down
Loading

0 comments on commit b0b7463

Please sign in to comment.