Skip to content

Commit 70424ac

Browse files
authored
Merge pull request #186 from mth576380080/main
feat:增加了audio和images相关的SDK
2 parents 0ad1eef + 04ae4ac commit 70424ac

File tree

12 files changed

+564
-4
lines changed

12 files changed

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

0 commit comments

Comments
 (0)