Skip to content

Commit 0ff7bea

Browse files
author
马同徽
committed
feat:增加openAI的image和audio相关接口的封装
1 parent 0ad1eef commit 0ff7bea

File tree

12 files changed

+547
-4
lines changed

12 files changed

+547
-4
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.plexpt.chatgpt;
2+
3+
import cn.hutool.core.util.RandomUtil;
4+
import cn.hutool.http.ContentType;
5+
import cn.hutool.http.Header;
6+
import com.alibaba.fastjson.JSON;
7+
import com.plexpt.chatgpt.api.Api;
8+
import com.plexpt.chatgpt.entity.BaseResponse;
9+
import com.plexpt.chatgpt.entity.audio.AudioResponse;
10+
import com.plexpt.chatgpt.entity.audio.Transcriptions;
11+
import com.plexpt.chatgpt.exception.ChatException;
12+
import io.reactivex.Single;
13+
import lombok.*;
14+
import lombok.extern.slf4j.Slf4j;
15+
import okhttp3.OkHttpClient;
16+
import okhttp3.Request;
17+
import okhttp3.Response;
18+
import retrofit2.Retrofit;
19+
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
20+
import retrofit2.converter.jackson.JacksonConverterFactory;
21+
22+
import java.net.Proxy;
23+
import java.util.List;
24+
import java.util.Objects;
25+
import java.util.concurrent.TimeUnit;
26+
27+
/**
28+
* @Author matoooo
29+
* @Date 2023/8/25 14:12
30+
* @Description: TODO
31+
*/
32+
@Slf4j
33+
@Getter
34+
@Setter
35+
@Builder
36+
@AllArgsConstructor
37+
@NoArgsConstructor
38+
public class Audio {
39+
/**
40+
* keys
41+
*/
42+
private String apiKey;
43+
44+
private List<String> apiKeyList;
45+
/**
46+
* 自定义api host使用builder的方式构造client
47+
*/
48+
@Builder.Default
49+
private String apiHost = Api.DEFAULT_API_HOST;
50+
private Api apiClient;
51+
private OkHttpClient okHttpClient;
52+
/**
53+
* 超时 默认300
54+
*/
55+
@Builder.Default
56+
private long timeout = 300;
57+
/**
58+
* okhttp 代理
59+
*/
60+
@Builder.Default
61+
private Proxy proxy = Proxy.NO_PROXY;
62+
63+
/**
64+
* 初始化
65+
*/
66+
public Audio init() {
67+
OkHttpClient.Builder client = new OkHttpClient.Builder();
68+
client.addInterceptor(chain -> {
69+
Request original = chain.request();
70+
String key = apiKey;
71+
if (apiKeyList != null && !apiKeyList.isEmpty()) {
72+
key = RandomUtil.randomEle(apiKeyList);
73+
}
74+
75+
Request request = original.newBuilder()
76+
.header(Header.AUTHORIZATION.getValue(), "Bearer " + key)
77+
.header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue())
78+
.method(original.method(), original.body())
79+
.build();
80+
return chain.proceed(request);
81+
}).addInterceptor(chain -> {
82+
Request original = chain.request();
83+
Response response = chain.proceed(original);
84+
if (!response.isSuccessful()) {
85+
String errorMsg = response.body().string();
86+
87+
log.error("请求异常:{}", errorMsg);
88+
BaseResponse baseResponse = JSON.parseObject(errorMsg, BaseResponse.class);
89+
if (Objects.nonNull(baseResponse.getError())) {
90+
log.error(baseResponse.getError().getMessage());
91+
throw new ChatException(baseResponse.getError().getMessage());
92+
}
93+
throw new ChatException("error");
94+
}
95+
return response;
96+
});
97+
98+
client.connectTimeout(timeout, TimeUnit.SECONDS);
99+
client.writeTimeout(timeout, TimeUnit.SECONDS);
100+
client.readTimeout(timeout, TimeUnit.SECONDS);
101+
if (Objects.nonNull(proxy)) {
102+
client.proxy(proxy);
103+
}
104+
OkHttpClient httpClient = client.build();
105+
this.okHttpClient = httpClient;
106+
107+
108+
this.apiClient = new Retrofit.Builder()
109+
.baseUrl(this.apiHost)
110+
.client(okHttpClient)
111+
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
112+
.addConverterFactory(JacksonConverterFactory.create())
113+
.build()
114+
.create(Api.class);
115+
116+
return this;
117+
}
118+
119+
public AudioResponse transcriptions(Transcriptions transcriptions){
120+
Single<AudioResponse> audioResponse =
121+
this.apiClient.audioTranscriptions(transcriptions);
122+
return audioResponse.blockingGet();
123+
}
124+
public AudioResponse translations(Transcriptions transcriptions){
125+
Single<AudioResponse> audioResponse =
126+
this.apiClient.audioTranslations(transcriptions);
127+
return audioResponse.blockingGet();
128+
}
129+
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package com.plexpt.chatgpt;
2+
3+
import cn.hutool.core.util.RandomUtil;
4+
import cn.hutool.http.ContentType;
5+
import cn.hutool.http.Header;
6+
import com.alibaba.fastjson.JSON;
7+
import com.plexpt.chatgpt.api.Api;
8+
import com.plexpt.chatgpt.entity.BaseResponse;
9+
import com.plexpt.chatgpt.entity.images.Edits;
10+
import com.plexpt.chatgpt.entity.images.Generations;
11+
import com.plexpt.chatgpt.entity.images.ImagesRensponse;
12+
import com.plexpt.chatgpt.entity.images.Variations;
13+
import com.plexpt.chatgpt.exception.ChatException;
14+
import io.reactivex.Single;
15+
import lombok.*;
16+
import lombok.extern.slf4j.Slf4j;
17+
import okhttp3.OkHttpClient;
18+
import okhttp3.Request;
19+
import okhttp3.Response;
20+
import retrofit2.Retrofit;
21+
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
22+
import retrofit2.converter.jackson.JacksonConverterFactory;
23+
24+
import java.net.Proxy;
25+
import java.util.List;
26+
import java.util.Objects;
27+
import java.util.concurrent.TimeUnit;
28+
29+
/**
30+
* @Author matoooo
31+
* @Date 2023/8/25 11:08
32+
* @Description: 调用图片相关接口
33+
*/
34+
@Slf4j
35+
@Getter
36+
@Setter
37+
@Builder
38+
@AllArgsConstructor
39+
@NoArgsConstructor
40+
public class Images {
41+
/**
42+
* keys
43+
*/
44+
private String apiKey;
45+
46+
private List<String> apiKeyList;
47+
/**
48+
* 自定义api host使用builder的方式构造client
49+
*/
50+
@Builder.Default
51+
private String apiHost = Api.DEFAULT_API_HOST;
52+
private Api apiClient;
53+
private OkHttpClient okHttpClient;
54+
/**
55+
* 超时 默认300
56+
*/
57+
@Builder.Default
58+
private long timeout = 300;
59+
/**
60+
* okhttp 代理
61+
*/
62+
@Builder.Default
63+
private Proxy proxy = Proxy.NO_PROXY;
64+
65+
/**
66+
* 初始化
67+
*/
68+
public Images init() {
69+
OkHttpClient.Builder client = new OkHttpClient.Builder();
70+
client.addInterceptor(chain -> {
71+
Request original = chain.request();
72+
String key = apiKey;
73+
if (apiKeyList != null && !apiKeyList.isEmpty()) {
74+
key = RandomUtil.randomEle(apiKeyList);
75+
}
76+
77+
Request request = original.newBuilder()
78+
.header(Header.AUTHORIZATION.getValue(), "Bearer " + key)
79+
.header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue())
80+
.method(original.method(), original.body())
81+
.build();
82+
return chain.proceed(request);
83+
}).addInterceptor(chain -> {
84+
Request original = chain.request();
85+
Response response = chain.proceed(original);
86+
if (!response.isSuccessful()) {
87+
String errorMsg = response.body().string();
88+
89+
log.error("请求异常:{}", errorMsg);
90+
BaseResponse baseResponse = JSON.parseObject(errorMsg, BaseResponse.class);
91+
if (Objects.nonNull(baseResponse.getError())) {
92+
log.error(baseResponse.getError().getMessage());
93+
throw new ChatException(baseResponse.getError().getMessage());
94+
}
95+
throw new ChatException("error");
96+
}
97+
return response;
98+
});
99+
100+
client.connectTimeout(timeout, TimeUnit.SECONDS);
101+
client.writeTimeout(timeout, TimeUnit.SECONDS);
102+
client.readTimeout(timeout, TimeUnit.SECONDS);
103+
if (Objects.nonNull(proxy)) {
104+
client.proxy(proxy);
105+
}
106+
OkHttpClient httpClient = client.build();
107+
this.okHttpClient = httpClient;
108+
109+
110+
this.apiClient = new Retrofit.Builder()
111+
.baseUrl(this.apiHost)
112+
.client(okHttpClient)
113+
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
114+
.addConverterFactory(JacksonConverterFactory.create())
115+
.build()
116+
.create(Api.class);
117+
118+
return this;
119+
}
120+
121+
public ImagesRensponse generations(Generations generations){
122+
Single<ImagesRensponse> imagesRensponse =
123+
this.apiClient.imageGenerations(generations);
124+
return imagesRensponse.blockingGet();
125+
}
126+
127+
public ImagesRensponse edits(Edits edits){
128+
Single<ImagesRensponse> imagesRensponse =
129+
this.apiClient.imageEdits(edits);
130+
return imagesRensponse.blockingGet();
131+
}
132+
133+
public ImagesRensponse variations(Variations variations){
134+
Single<ImagesRensponse> imagesRensponse =
135+
this.apiClient.imageVariations(variations);
136+
return imagesRensponse.blockingGet();
137+
}
138+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.plexpt.chatgpt;
2+
3+
import com.plexpt.chatgpt.entity.images.Generations;
4+
import com.plexpt.chatgpt.entity.images.ImagesRensponse;
5+
import com.plexpt.chatgpt.util.Proxys;
6+
7+
import java.net.Proxy;
8+
import java.util.List;
9+
10+
/**
11+
* @Author matoooo
12+
* @Date 2023/8/25 14:48
13+
* @Description: TODO
14+
*/
15+
public class Test {
16+
public static void main(String[] args) {
17+
Proxy proxys = Proxys.http("127.0.0.1",10809);
18+
Images images = Images.builder()
19+
.proxy(proxys)
20+
.apiKey("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")
21+
.apiHost("https://api.openai.com/")
22+
.timeout(900)
23+
.build()
24+
.init();
25+
26+
Generations generations = Generations.ofURL("一只鲨鱼和一直蜜蜂结合成一种动物",1,"256x256");
27+
ImagesRensponse imagesRensponse = images.generations(generations);
28+
System.out.println(imagesRensponse.getCreated());
29+
System.out.println(imagesRensponse.getCode());
30+
System.out.println(imagesRensponse.getMsg());
31+
List<Object> data = imagesRensponse.getData();
32+
for(Object o:data){
33+
System.out.println(o.toString());
34+
}
35+
}
36+
}

src/main/java/com/plexpt/chatgpt/api/Api.java

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package com.plexpt.chatgpt.api;
22

3+
import com.plexpt.chatgpt.entity.audio.AudioResponse;
4+
import com.plexpt.chatgpt.entity.audio.Transcriptions;
35
import com.plexpt.chatgpt.entity.billing.CreditGrantsResponse;
46
import com.plexpt.chatgpt.entity.billing.SubscriptionData;
57
import com.plexpt.chatgpt.entity.billing.UseageResponse;
68
import com.plexpt.chatgpt.entity.chat.ChatCompletion;
79
import com.plexpt.chatgpt.entity.chat.ChatCompletionResponse;
810

11+
import com.plexpt.chatgpt.entity.images.Edits;
12+
import com.plexpt.chatgpt.entity.images.Generations;
13+
import com.plexpt.chatgpt.entity.images.ImagesRensponse;
14+
import com.plexpt.chatgpt.entity.images.Variations;
915
import io.reactivex.Single;
10-
import retrofit2.http.Body;
11-
import retrofit2.http.GET;
12-
import retrofit2.http.POST;
13-
import retrofit2.http.Query;
16+
import retrofit2.http.*;
1417

1518

1619
/**
@@ -27,6 +30,41 @@ public interface Api {
2730
@POST("v1/chat/completions")
2831
Single<ChatCompletionResponse> chatCompletion(@Body ChatCompletion chatCompletion);
2932

33+
/**
34+
* image_generations
35+
*/
36+
@POST("v1/images/generations")
37+
Single<ImagesRensponse> imageGenerations(@Body Generations generations);
38+
39+
/**
40+
* image_edits
41+
*/
42+
@Multipart
43+
@POST("v1/images/edits")
44+
Single<ImagesRensponse> imageEdits(@PartMap Edits edits);
45+
46+
47+
/**
48+
* image_variations
49+
*/
50+
@Multipart
51+
@POST("v1/images/variations")
52+
Single<ImagesRensponse> imageVariations(@PartMap Variations variations);
53+
54+
/**
55+
* audio_transcriptions
56+
*/
57+
@Multipart
58+
@POST("v1/audio/transcriptions")
59+
Single<AudioResponse> audioTranscriptions(@PartMap Transcriptions transcriptions);
60+
61+
/**
62+
* audio_translations
63+
*/
64+
@Multipart
65+
@POST("v1/audio/translations")
66+
Single<AudioResponse> audioTranslations(@PartMap Transcriptions transcriptions);
67+
3068

3169
/**
3270
* 余额查询
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.plexpt.chatgpt.entity.audio;
2+
3+
import lombok.Data;
4+
5+
/**
6+
* @Author matoooo
7+
* @Date 2023/8/25 14:18
8+
* @Description: TODO
9+
*/
10+
@Data
11+
public class AudioResponse {
12+
private String text;
13+
}

0 commit comments

Comments
 (0)