Skip to content

Commit dc93097

Browse files
committed
[OpenAi] Support create completion
1 parent 34ce645 commit dc93097

9 files changed

Lines changed: 124 additions & 54 deletions

File tree

docs/docs/reference/completions.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
---
2+
title: Completions
3+
---
4+
5+
!!! Note
6+
7+
Please build the client before calling, the build code is as follows:
8+
9+
```java
10+
OpenAiClient client = OpenAiClient.builder()
11+
.apiHost("https://api.openai.com")
12+
.apiKey(System.getProperty("openai.token"))
13+
.build();
14+
```
15+
16+
`System.getProperty("openai.token")` is the key to access the API authorization.
17+
18+
### Create completion
19+
20+
---
21+
22+
Creates a completion for the provided prompt and parameters.
23+
24+
```java
25+
CompletionEntity configure = CompletionEntity.builder()
26+
.model(CompleteModel.TEXT_DAVINCI_003.getName())
27+
.prompt("How to create a completion")
28+
.temperature(2D)
29+
.build();
30+
client.createCompletion(configure);
31+
```
32+
33+
Body:
34+
35+
| Name | Type | Required |
36+
|:------------------:|:--------------:|----------|
37+
| `model` | `String` | Yes |
38+
| `prompt` | `String` | Yes |
39+
| `temperature` | `Number` | No |
40+
| `maxTokens` | `Number` | No |
41+
| `topP` | `Number` | No |
42+
| `bestOf` | `Number` | No |
43+
| `frequencyPenalty` | `Number` | No |
44+
| `presencePenalty` | `Number` | No |
45+
| `stop` | `List<String>` | No |
46+
47+
Returns:
48+
49+
```json
50+
{
51+
"id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
52+
"object": "text_completion",
53+
"created": 1589478378,
54+
"model": "text-davinci-003",
55+
"choices": [
56+
{
57+
"text": "\n\nThis is indeed a test",
58+
"index": 0,
59+
"logprobs": null,
60+
"finish_reason": "length"
61+
}
62+
],
63+
"usage": {
64+
"prompt_tokens": 5,
65+
"completion_tokens": 7,
66+
"total_tokens": 12
67+
}
68+
}
69+
```

docs/mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ nav:
4545
- index.md
4646
- Reference:
4747
- reference/models.md
48+
- reference/completions.md
4849
- powered_by.md

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.devlive.sdk.openai;
22

33
import io.reactivex.Single;
4-
import org.devlive.sdk.openai.entity.CompleteEntity;
4+
import org.devlive.sdk.openai.entity.CompletionEntity;
55
import org.devlive.sdk.openai.entity.ModelEntity;
66
import org.devlive.sdk.openai.response.CompleteResponse;
77
import org.devlive.sdk.openai.response.ModelResponse;
@@ -30,5 +30,5 @@ public interface DefaultApi
3030
* Creates a completion for the provided prompt and parameters.
3131
*/
3232
@POST(value = "v1/completions")
33-
Single<CompleteResponse> fetchCompletions(@Body CompleteEntity configure);
33+
Single<CompleteResponse> fetchCompletions(@Body CompletionEntity configure);
3434
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.devlive.sdk.openai;
22

3-
import org.devlive.sdk.openai.entity.CompleteEntity;
3+
import org.devlive.sdk.openai.entity.CompletionEntity;
44
import org.devlive.sdk.openai.entity.ModelEntity;
55
import org.devlive.sdk.openai.response.CompleteResponse;
66
import org.devlive.sdk.openai.response.ModelResponse;
@@ -21,7 +21,7 @@ ModelEntity getModel(String model)
2121
.blockingGet();
2222
}
2323

24-
CompleteResponse createComplete(CompleteEntity configure)
24+
CompleteResponse createCompletion(CompletionEntity configure)
2525
{
2626
return this.api.fetchCompletions(configure)
2727
.blockingGet();

src/main/java/org/devlive/sdk/openai/entity/CompleteEntity.java renamed to src/main/java/org/devlive/sdk/openai/entity/CompletionEntity.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.apache.commons.lang3.ObjectUtils;
1010
import org.apache.commons.lang3.StringUtils;
1111
import org.devlive.sdk.openai.exception.ParamException;
12-
import org.devlive.sdk.openai.model.CompleteModel;
12+
import org.devlive.sdk.openai.model.CompletionModel;
1313
import org.devlive.sdk.openai.utils.EnumsUtils;
1414

1515
import java.util.List;
@@ -19,7 +19,7 @@
1919
@ToString
2020
@AllArgsConstructor
2121
@JsonIgnoreProperties(ignoreUnknown = true)
22-
public class CompleteEntity
22+
public class CompletionEntity
2323
{
2424
@JsonProperty(value = "model")
2525
private String model;
@@ -48,10 +48,10 @@ public class CompleteEntity
4848
@JsonProperty(value = "stop")
4949
private List<String> stop;
5050

51-
private CompleteEntity(CompleteEntityBuilder builder)
51+
private CompletionEntity(CompletionEntityBuilder builder)
5252
{
5353
if (ObjectUtils.isEmpty(builder.model)) {
54-
builder.model(CompleteModel.TEXT_DAVINCI_003.getName());
54+
builder.model(CompletionModel.TEXT_DAVINCI_003.getName());
5555
}
5656
this.model = builder.model;
5757

@@ -92,18 +92,18 @@ private CompleteEntity(CompleteEntityBuilder builder)
9292
this.stop = builder.stop;
9393
}
9494

95-
public static class CompleteEntityBuilder
95+
public static class CompletionEntityBuilder
9696
{
97-
public CompleteEntityBuilder model(String model)
97+
public CompletionEntityBuilder model(String model)
9898
{
9999
if (StringUtils.isEmpty(model)) {
100-
model = CompleteModel.TEXT_DAVINCI_003.getName();
100+
model = CompletionModel.TEXT_DAVINCI_003.getName();
101101
}
102102
this.model = model;
103103
return this;
104104
}
105105

106-
public CompleteEntityBuilder prompt(String prompt)
106+
public CompletionEntityBuilder prompt(String prompt)
107107
{
108108
if (StringUtils.isEmpty(prompt)) {
109109
throw new ParamException("Invalid prompt must not be empty");
@@ -112,7 +112,7 @@ public CompleteEntityBuilder prompt(String prompt)
112112
return this;
113113
}
114114

115-
public CompleteEntityBuilder temperature(Double temperature)
115+
public CompletionEntityBuilder temperature(Double temperature)
116116
{
117117
if (temperature < 0 || temperature > 2) {
118118
throw new ParamException(String.format("Invalid temperature: %s , between 0 and 2", temperature));
@@ -121,17 +121,17 @@ public CompleteEntityBuilder temperature(Double temperature)
121121
return this;
122122
}
123123

124-
public CompleteEntityBuilder maxTokens(Integer maxTokens)
124+
public CompletionEntityBuilder maxTokens(Integer maxTokens)
125125
{
126-
CompleteModel completeModel = EnumsUtils.getCompleteModel(this.model);
127-
if (ObjectUtils.isNotEmpty(this.model) && maxTokens > completeModel.getMaxTokens()) {
128-
throw new ParamException(String.format("Invalid maxTokens: %s, Cannot be larger than the model default configuration %s", maxTokens, completeModel.getMaxTokens()));
126+
CompletionModel completionModel = EnumsUtils.getCompleteModel(this.model);
127+
if (ObjectUtils.isNotEmpty(this.model) && maxTokens > completionModel.getMaxTokens()) {
128+
throw new ParamException(String.format("Invalid maxTokens: %s, Cannot be larger than the model default configuration %s", maxTokens, completionModel.getMaxTokens()));
129129
}
130130
this.maxTokens = maxTokens;
131131
return this;
132132
}
133133

134-
public CompleteEntityBuilder frequencyPenalty(Double frequencyPenalty)
134+
public CompletionEntityBuilder frequencyPenalty(Double frequencyPenalty)
135135
{
136136
if (frequencyPenalty < -2.0 || frequencyPenalty > 2.0) {
137137
throw new ParamException(String.format("Invalid frequencyPenalty: %s , between -2.0 and 2.0", frequencyPenalty));
@@ -140,7 +140,7 @@ public CompleteEntityBuilder frequencyPenalty(Double frequencyPenalty)
140140
return this;
141141
}
142142

143-
public CompleteEntityBuilder presencePenalty(Double presencePenalty)
143+
public CompletionEntityBuilder presencePenalty(Double presencePenalty)
144144
{
145145
if (presencePenalty < -2.0 || presencePenalty > 2.0) {
146146
throw new ParamException(String.format("Invalid presencePenalty: %s , between -2.0 and 2.0", presencePenalty));
@@ -149,9 +149,9 @@ public CompleteEntityBuilder presencePenalty(Double presencePenalty)
149149
return this;
150150
}
151151

152-
public CompleteEntity build()
152+
public CompletionEntity build()
153153
{
154-
return new CompleteEntity(this);
154+
return new CompletionEntity(this);
155155
}
156156
}
157157
}

src/main/java/org/devlive/sdk/openai/model/CompleteModel.java renamed to src/main/java/org/devlive/sdk/openai/model/CompletionModel.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.devlive.sdk.openai.model;
22

3-
public enum CompleteModel
3+
public enum CompletionModel
44
{
55
TEXT_DAVINCI_003("text-davinci-003",
66
"Most capable model in the GPT-3 series. Can perform any task the other GPT-3 models can, often with higher quality, longer output and better instruction-following. It can process up to 4,000 tokens per request.",
@@ -16,7 +16,7 @@ public enum CompleteModel
1616
private final String strengths;
1717
private final int maxTokens;
1818

19-
CompleteModel(String name, String description, String strengths, int maxTokens)
19+
CompletionModel(String name, String description, String strengths, int maxTokens)
2020
{
2121
this.name = name;
2222
this.description = description;

src/main/java/org/devlive/sdk/openai/utils/EnumsUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.devlive.sdk.openai.utils;
22

3-
import org.devlive.sdk.openai.model.CompleteModel;
3+
import org.devlive.sdk.openai.model.CompletionModel;
44

55
import java.util.Arrays;
66
import java.util.Optional;
@@ -11,9 +11,9 @@ private EnumsUtils()
1111
{
1212
}
1313

14-
public static CompleteModel getCompleteModel(final String name)
14+
public static CompletionModel getCompleteModel(final String name)
1515
{
16-
Optional<CompleteModel> optional = Arrays.stream(CompleteModel.values())
16+
Optional<CompletionModel> optional = Arrays.stream(CompletionModel.values())
1717
.filter(item -> item.getName().equals(name))
1818
.findFirst();
1919
return optional.isPresent() ? optional.get() : null;

src/test/java/org/devlive/sdk/openai/OpenAiClientTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.devlive.sdk.openai;
22

3-
import org.devlive.sdk.openai.entity.CompleteEntity;
3+
import org.devlive.sdk.openai.entity.CompletionEntity;
44
import org.devlive.sdk.openai.exception.AuthorizedException;
5-
import org.devlive.sdk.openai.model.CompleteModel;
5+
import org.devlive.sdk.openai.model.CompletionModel;
66
import org.junit.Assert;
77
import org.junit.Before;
88
import org.junit.Test;
@@ -49,13 +49,13 @@ public void testGetModel()
4949
}
5050

5151
@Test
52-
public void testCreateComplete()
52+
public void testCreateCompletion()
5353
{
54-
CompleteEntity configure = CompleteEntity.builder()
55-
.model(CompleteModel.TEXT_DAVINCI_003.getName())
56-
.prompt("How to create a complete")
54+
CompletionEntity configure = CompletionEntity.builder()
55+
.model(CompletionModel.TEXT_DAVINCI_003.getName())
56+
.prompt("How to create a completion")
5757
.temperature(2D)
5858
.build();
59-
Assert.assertTrue(client.createComplete(configure).getChoices().size() > 0);
59+
Assert.assertTrue(client.createCompletion(configure).getChoices().size() > 0);
6060
}
6161
}

0 commit comments

Comments
 (0)