Skip to content

Commit 64cfa61

Browse files
committed
files api
1 parent bc06364 commit 64cfa61

File tree

4 files changed

+226
-3
lines changed

4 files changed

+226
-3
lines changed

src/main/java/com/plexpt/chatgpt/ChatGPT.java

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
import cn.hutool.http.Header;
88
import com.plexpt.chatgpt.api.Api;
99
import com.plexpt.chatgpt.entity.BaseResponse;
10+
import com.plexpt.chatgpt.entity.DeleteResponse;
11+
import com.plexpt.chatgpt.entity.FileResponse;
1012
import com.plexpt.chatgpt.entity.audio.AudioResponse;
13+
import com.plexpt.chatgpt.entity.audio.SpeechRequest;
1114
import com.plexpt.chatgpt.entity.audio.Transcriptions;
1215
import com.plexpt.chatgpt.entity.billing.CreditGrantsResponse;
1316
import com.plexpt.chatgpt.entity.billing.SubscriptionData;
@@ -32,6 +35,7 @@
3235
import retrofit2.converter.jackson.JacksonConverterFactory;
3336

3437
import java.io.File;
38+
import java.io.InputStream;
3539
import java.math.BigDecimal;
3640
import java.net.Proxy;
3741
import java.util.*;
@@ -195,8 +199,7 @@ public EmbeddingResult createEmbeddings(String input, String user) {
195199

196200

197201
public ImagesRensponse imageGeneration(Generations generations) {
198-
Single<ImagesRensponse> imagesRensponse =
199-
this.apiClient.imageGenerations(generations);
202+
Single<ImagesRensponse> imagesRensponse = this.apiClient.imageGenerations(generations);
200203
return imagesRensponse.blockingGet();
201204
}
202205

@@ -229,6 +232,13 @@ public AudioResponse audioTranscription(File audio, Transcriptions transcription
229232
return audioResponse.blockingGet();
230233
}
231234

235+
public InputStream audioSpeech(SpeechRequest speechRequest) {
236+
Single<ResponseBody> audioResponse = this.apiClient.audioSpeech(speechRequest);
237+
ResponseBody response = audioResponse.blockingGet();
238+
InputStream stream = response.byteStream();
239+
return stream;
240+
}
241+
232242
public AudioResponse audioTranslation(File audio, Transcriptions transcriptions) {
233243
RequestBody a = RequestBody.create(MediaType.parse("multipart/form-data;charset=UTF-8"), audio);
234244
MultipartBody.Part aPart = MultipartBody.Part.createFormData("image", audio.getName(), a);
@@ -282,4 +292,70 @@ public CreditGrantsResponse creditGrants() {
282292
Single<CreditGrantsResponse> creditGrants = this.apiClient.creditGrants();
283293
return creditGrants.blockingGet();
284294
}
295+
296+
/**
297+
* 列出文件
298+
* List files
299+
*/
300+
public BaseResponse<FileResponse> listFiles() {
301+
Single<BaseResponse<FileResponse>> files = this.apiClient.listFiles();
302+
return files.blockingGet();
303+
}
304+
305+
/**
306+
* 上传文件
307+
* Upload file
308+
*
309+
* @param purpose 文件用途
310+
* The purpose of the file
311+
* @param file 文件部分
312+
* The file part
313+
* @return 文件响应
314+
* File response
315+
*/
316+
public FileResponse uploadFile(String purpose, MultipartBody.Part file) {
317+
RequestBody purposeBody = RequestBody.create(MultipartBody.FORM, purpose);
318+
Single<FileResponse> files = this.apiClient.uploadFile(purposeBody, file);
319+
return files.blockingGet();
320+
}
321+
322+
/**
323+
* 删除文件
324+
* Delete file
325+
*
326+
* @param fileId 文件ID
327+
* The file ID
328+
* @return 删除响应
329+
* Delete response
330+
*/
331+
public DeleteResponse deleteFile(String fileId) {
332+
return this.apiClient.deleteFile(fileId).blockingGet();
333+
}
334+
335+
/**
336+
* 检索文件
337+
* Retrieve file
338+
*
339+
* @param fileId 文件ID
340+
* The file ID
341+
* @return 文件响应
342+
* File response
343+
*/
344+
public FileResponse retrieveFile(String fileId) {
345+
return this.apiClient.retrieveFile(fileId).blockingGet();
346+
}
347+
348+
/**
349+
* 检索文件内容
350+
* Retrieve file content
351+
*
352+
* @param fileId 文件ID
353+
* The file ID
354+
* @return 文件内容响应
355+
* File content response
356+
*/
357+
public ResponseBody retrieveFileContent(String fileId) {
358+
return this.apiClient.retrieveFileContent(fileId).blockingGet();
359+
}
360+
285361
}

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

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.plexpt.chatgpt.api;
22

3+
import com.plexpt.chatgpt.entity.BaseResponse;
4+
import com.plexpt.chatgpt.entity.DeleteResponse;
5+
import com.plexpt.chatgpt.entity.FileResponse;
36
import com.plexpt.chatgpt.entity.audio.AudioResponse;
47
import com.plexpt.chatgpt.entity.audio.SpeechRequest;
58
import com.plexpt.chatgpt.entity.audio.Transcriptions;
@@ -16,8 +19,12 @@
1619
import com.plexpt.chatgpt.entity.images.Variations;
1720
import io.reactivex.Single;
1821
import okhttp3.MultipartBody;
22+
import okhttp3.RequestBody;
23+
import okhttp3.ResponseBody;
1924
import retrofit2.http.*;
2025

26+
import java.io.File;
27+
2128
/**
2229
* API接口
2330
* API interface
@@ -64,7 +71,7 @@ Single<ImagesRensponse> imageVariations(@Part() MultipartBody.Part image,
6471
* Create speech
6572
*/
6673
@POST("v1/audio/speech")
67-
Single<AudioResponse> audioSpeech(@Body SpeechRequest speechRequest);
74+
Single<ResponseBody> audioSpeech(@Body SpeechRequest speechRequest);
6875

6976
/**
7077
* 音频转录
@@ -113,4 +120,41 @@ Single<UseageResponse> usage(@Query("start_date") String startDate,
113120
@POST("v1/embeddings")
114121
Single<EmbeddingResult> createEmbeddings(@Body EmbeddingRequest request);
115122

123+
/**
124+
* 列出文件
125+
* List files
126+
*/
127+
@GET("/v1/files")
128+
Single<BaseResponse<FileResponse>> listFiles();
129+
130+
/**
131+
* 上传文件
132+
* Upload file
133+
*/
134+
@Multipart
135+
@POST("/v1/files")
136+
Single<FileResponse> uploadFile(@Part("purpose") RequestBody purpose, @Part MultipartBody.Part file);
137+
138+
/**
139+
* 删除文件
140+
* Delete file
141+
*/
142+
@DELETE("/v1/files/{file_id}")
143+
Single<DeleteResponse> deleteFile(@Path("file_id") String fileId);
144+
145+
/**
146+
* 检索文件
147+
* Retrieve file
148+
*/
149+
@GET("/v1/files/{file_id}")
150+
Single<FileResponse> retrieveFile(@Path("file_id") String fileId);
151+
152+
/**
153+
* 检索文件内容
154+
* Retrieve file content
155+
*/
156+
@Streaming
157+
@GET("/v1/files/{file_id}/content")
158+
Single<ResponseBody> retrieveFileContent(@Path("file_id") String fileId);
159+
116160
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.plexpt.chatgpt.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import lombok.Data;
5+
6+
/**
7+
* 删除对象时的响应
8+
* A response when deleting an object
9+
*/
10+
@Data
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
public class DeleteResponse {
13+
14+
/**
15+
* 对象的ID
16+
* The id of the object.
17+
*/
18+
private String id;
19+
20+
/**
21+
* 删除的对象类型,例如 "file" 或 "model"
22+
* The type of object deleted, for example "file" or "model"
23+
*/
24+
private String object;
25+
26+
/**
27+
* 如果成功删除则为 true
28+
* True if successfully deleted
29+
*/
30+
private boolean deleted;
31+
32+
33+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.plexpt.chatgpt.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.Data;
6+
7+
/**
8+
* 上传到 OpenAI 的文件
9+
* A file uploaded to OpenAI
10+
* <p>
11+
* https://beta.openai.com/docs/api-reference/files
12+
*/
13+
@Data
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
public class FileResponse {
16+
17+
/**
18+
* 文件的唯一ID
19+
* The unique id of this file.
20+
*/
21+
private String id;
22+
23+
/**
24+
* 返回的对象类型,应为 "file"
25+
* The type of object returned, should be "file".
26+
*/
27+
private String object;
28+
29+
/**
30+
* 文件大小(以字节为单位)
31+
* File size in bytes.
32+
*/
33+
private Long bytes;
34+
35+
/**
36+
* 创建时间(以秒为单位的纪元时间)
37+
* The creation time in epoch seconds.
38+
*/
39+
@JsonProperty("created_at")
40+
private Long createdAt;
41+
42+
/**
43+
* 文件名
44+
* The name of the file.
45+
*/
46+
private String filename;
47+
48+
/**
49+
* 文件用途的描述
50+
* Description of the file's purpose.
51+
*/
52+
private String purpose;
53+
54+
/**
55+
* 文件的当前状态,可以是 uploaded, processed, pending, error, deleting 或 deleted
56+
* The current status of the file, which can be either uploaded, processed, pending, error, deleting or deleted.
57+
*/
58+
private String status;
59+
60+
/**
61+
* 文件状态的附加详细信息
62+
* 如果文件处于错误状态,这将包括描述错误的消息
63+
* Additional details about the status of the file.
64+
* If the file is in the error state, this will include a message describing the error.
65+
*/
66+
@JsonProperty("status_details")
67+
private String statusDetails;
68+
69+
70+
}

0 commit comments

Comments
 (0)