Skip to content

Commit d8bbec8

Browse files
authored
[Release] Released for 1.2.0 (#10)
2 parents 33f03ae + 6018b29 commit d8bbec8

File tree

12 files changed

+250
-23
lines changed

12 files changed

+250
-23
lines changed

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,30 @@
1818

1919
</div>
2020

21+
# How to use?
22+
23+
```java
24+
<properties>
25+
<openai.version>LATEST</openai.version>
26+
</properties>
27+
28+
<dependencies>
29+
<dependency>
30+
<groupId>org.devlive.sdk</groupId>
31+
<artifactId>openai-java-sdk</artifactId>
32+
<version>${openai.version}</version>
33+
<exclusions>
34+
<exclusion>
35+
<groupId>org.slf4j</groupId>
36+
<artifactId>slf4j-simple</artifactId>
37+
</exclusion>
38+
</exclusions>
39+
</dependency>
40+
</dependencies>
41+
```
42+
43+
`LATEST` By default the latest version will be used.
44+
2145
# Feature
2246

2347
---

docs/docs/reference/users.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
title: User
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+
### List keys
19+
20+
---
21+
22+
Lists the currently available api keys, and provides basic information about each one such as the owner and availability.
23+
24+
```java
25+
client.getKeys();
26+
```
27+
28+
Returns:
29+
30+
```json
31+
{
32+
"object": "list",
33+
"data": [
34+
{
35+
"sensitive_id": "sk-xxx",
36+
"object": "api_key",
37+
"name": "Open API Key",
38+
"created": 1688363358,
39+
"last_use": 1688522702,
40+
"publishable": false
41+
}
42+
]
43+
}
44+
```
45+
46+
### Create a key
47+
48+
---
49+
50+
Create a new key.
51+
52+
```java
53+
UserKeyEntity configure=UserKeyEntity.builder()
54+
.name("Create first key")
55+
.action("create")
56+
.build();
57+
client.createUserAPIKey(configure)
58+
```
59+
60+
Return:
61+
62+
```json
63+
{
64+
"result": "success",
65+
"key": {
66+
"sensitive_id": "sk-xxx",
67+
"object": "api_key",
68+
"name": "Test",
69+
"created": 1688525108,
70+
"last_use": null,
71+
"publishable": false
72+
}
73+
}
74+
```

docs/docs/released.md

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

8+
### 1.2.0
9+
10+
---
11+
12+
- Support report error message
13+
- Supports custom `OkHttpClient`
14+
- Add a default interceptor
15+
- Support list api keys
16+
- Support create new api key
17+
818
### 1.1.0
919

1020
---

docs/mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ markdown_extensions:
4444
nav:
4545
- index.md
4646
- Reference:
47+
- reference/users.md
4748
- reference/models.md
4849
- reference/completions.md
4950
- reference/completions_chat.md

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.2.0-SNAPSHOT</version>
8+
<version>1.2.0</version>
99

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

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import org.devlive.sdk.openai.entity.CompletionChatEntity;
55
import org.devlive.sdk.openai.entity.CompletionEntity;
66
import org.devlive.sdk.openai.entity.ModelEntity;
7+
import org.devlive.sdk.openai.entity.UserKeyEntity;
78
import org.devlive.sdk.openai.response.CompleteChatResponse;
89
import org.devlive.sdk.openai.response.CompleteResponse;
910
import org.devlive.sdk.openai.response.ModelResponse;
11+
import org.devlive.sdk.openai.response.UserKeyResponse;
1012
import retrofit2.http.Body;
1113
import retrofit2.http.GET;
1214
import retrofit2.http.POST;
@@ -39,4 +41,16 @@ public interface DefaultApi
3941
*/
4042
@POST(value = "v1/chat/completions")
4143
Single<CompleteChatResponse> fetchChatCompletions(@Body CompletionChatEntity configure);
44+
45+
/**
46+
* Get all keys
47+
*/
48+
@GET(value = "dashboard/user/api_keys")
49+
Single<UserKeyResponse> fetchUserAPIKeys();
50+
51+
/**
52+
* Create a key for the given
53+
*/
54+
@POST(value = "dashboard/user/api_keys")
55+
Single<UserKeyResponse> fetchCreateUserAPIKey(@Body UserKeyEntity configure);
4256
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import org.devlive.sdk.openai.entity.CompletionChatEntity;
44
import org.devlive.sdk.openai.entity.CompletionEntity;
55
import org.devlive.sdk.openai.entity.ModelEntity;
6+
import org.devlive.sdk.openai.entity.UserKeyEntity;
67
import org.devlive.sdk.openai.response.CompleteChatResponse;
78
import org.devlive.sdk.openai.response.CompleteResponse;
89
import org.devlive.sdk.openai.response.ModelResponse;
10+
import org.devlive.sdk.openai.response.UserKeyResponse;
911

1012
public abstract class DefaultClient
1113
{
@@ -34,4 +36,16 @@ public CompleteChatResponse createChatCompletion(CompletionChatEntity configure)
3436
return this.api.fetchChatCompletions(configure)
3537
.blockingGet();
3638
}
39+
40+
public UserKeyResponse getKeys()
41+
{
42+
return this.api.fetchUserAPIKeys()
43+
.blockingGet();
44+
}
45+
46+
public UserKeyResponse createUserAPIKey(UserKeyEntity configure)
47+
{
48+
return this.api.fetchCreateUserAPIKey(configure)
49+
.blockingGet();
50+
}
3751
}

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

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import okhttp3.OkHttpClient;
99
import org.apache.commons.lang3.ObjectUtils;
1010
import org.apache.commons.lang3.StringUtils;
11-
import org.devlive.sdk.openai.exception.ParamException;
1211
import org.devlive.sdk.openai.interceptor.DefaultInterceptor;
1312
import retrofit2.Retrofit;
1413
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
@@ -102,30 +101,21 @@ public OpenAiClientBuilder unit(TimeUnit unit)
102101

103102
public OpenAiClientBuilder client(OkHttpClient client)
104103
{
105-
DefaultInterceptor interceptor = new DefaultInterceptor();
106-
interceptor.setApiKey(this.apiKey);
107104
if (ObjectUtils.isEmpty(client)) {
108105
log.warn("No client, creating default client");
109106
client = new OkHttpClient.Builder()
110-
.addInterceptor(interceptor)
111107
.connectTimeout(this.timeout, this.unit)
112108
.writeTimeout(this.timeout, this.unit)
113109
.readTimeout(this.timeout, this.unit)
114110
.callTimeout(this.timeout, this.unit)
115111
.build();
116112
}
117-
118-
if (client.interceptors().size() <= 0) {
119-
throw new ParamException("No interceptors available");
120-
}
121-
122-
long count = client.interceptors()
123-
.stream()
124-
.filter(inter -> inter instanceof DefaultInterceptor)
125-
.count();
126-
if (count <= 0) {
127-
throw new ParamException("Must inject DefaultInterceptor");
128-
}
113+
// Add default interceptor
114+
DefaultInterceptor interceptor = new DefaultInterceptor();
115+
interceptor.setApiKey(this.apiKey);
116+
client = client.newBuilder()
117+
.addInterceptor(interceptor)
118+
.build();
129119
this.client = client;
130120
return this;
131121
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.devlive.sdk.openai.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
5+
import com.fasterxml.jackson.annotation.JsonProperty;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Data;
9+
import lombok.NoArgsConstructor;
10+
import lombok.ToString;
11+
12+
@Data
13+
@Builder
14+
@ToString
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
@JsonIgnoreProperties(ignoreUnknown = true)
18+
public class UserKeyEntity
19+
{
20+
@JsonProperty(value = "sensitive_id")
21+
private String sensitiveId;
22+
23+
@JsonProperty(value = "object")
24+
private String object;
25+
26+
@JsonProperty(value = "name")
27+
private String name;
28+
29+
@JsonProperty(value = "created")
30+
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
31+
private String createTime;
32+
33+
@JsonProperty(value = "last_use")
34+
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
35+
private String lastUseTime;
36+
37+
@JsonProperty(value = "publishable")
38+
private Boolean publishable;
39+
40+
/**
41+
* When creating a key use
42+
*/
43+
@JsonProperty(value = "action")
44+
private String action;
45+
}

src/main/java/org/devlive/sdk/openai/interceptor/DefaultInterceptor.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import lombok.extern.slf4j.Slf4j;
77
import okhttp3.Interceptor;
88
import okhttp3.Request;
9+
import okhttp3.RequestBody;
910
import okhttp3.Response;
1011
import okhttp3.ResponseBody;
12+
import okio.Buffer;
1113
import org.apache.commons.lang3.ObjectUtils;
1214
import org.apache.commons.lang3.StringUtils;
1315
import org.devlive.sdk.openai.exception.AuthorizedException;
@@ -50,6 +52,14 @@ public Response intercept(Chain chain) throws IOException
5052

5153
Request original = chain.request();
5254
Request request = this.headers(original);
55+
56+
RequestBody requestBody = request.body();
57+
if (ObjectUtils.isNotEmpty(requestBody)) {
58+
Buffer buffer = new Buffer();
59+
requestBody.writeTo(buffer);
60+
log.debug("Request body {}", buffer.readUtf8());
61+
}
62+
5363
Response response = chain.proceed(request);
5464
if (!response.isSuccessful()) {
5565
log.error("Failed to intercept request");
@@ -72,7 +82,7 @@ public Response intercept(Chain chain) throws IOException
7282
}
7383

7484
// Has error
75-
if (response.code() == 404 || response.code() == 400) {
85+
if (response.code() == 404 || response.code() == 400 || response.code() == 403) {
7686
ResponseBody body = response.body();
7787
if (ObjectUtils.isEmpty(body)) {
7888
throw new NullPointerException("Failed to intercept request because no body");

0 commit comments

Comments
 (0)