diff --git a/README.md b/README.md index 08a2ef7..64b0e1f 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ OpenAiService is versatile in its setup options, as demonstrated in the `example example package. ```java -//1. Use the default baseUrl, automatically configured service; initially fetches BaseURL from environment variable (key: OPENAI_API_BASE_URL), defaults to "https://api.openai.com/" if not found. +//1. Use the default baseUrl, automatically configured service; initially fetches BaseURL from environment variable (key: OPENAI_API_BASE_URL), defaults to "https://api.openai.com/v1/" if not found. OpenAiService openAiService = new OpenAiService(API_KEY); //2. Use a custom baseUrl with the standard configuration OpenAiService openAiService1 = new OpenAiService(API_KEY, BASE_URL); diff --git a/client/src/main/java/com/theokanning/openai/client/OpenAiApi.java b/client/src/main/java/com/theokanning/openai/client/OpenAiApi.java index 005cf2d..0e28ae6 100644 --- a/client/src/main/java/com/theokanning/openai/client/OpenAiApi.java +++ b/client/src/main/java/com/theokanning/openai/client/OpenAiApi.java @@ -50,92 +50,92 @@ public interface OpenAiApi { - @GET("v1/models") + @GET("models") Single> listModels(); - @GET("/v1/models/{model_id}") + @GET("models/{model_id}") Single getModel(@Path("model_id") String modelId); - @POST("/v1/completions") + @POST("completions") Single createCompletion(@Body CompletionRequest request); @Streaming - @POST("/v1/completions") + @POST("completions") Call createCompletionStream(@Body CompletionRequest request); - @POST("/v1/chat/completions") + @POST("chat/completions") Single createChatCompletion(@Body ChatCompletionRequest request); @Streaming - @POST("/v1/chat/completions") + @POST("chat/completions") Call createChatCompletionStream(@Body ChatCompletionRequest request); - @POST("/v1/edits") + @POST("edits") Single createEdit(@Body EditRequest request); - @POST("/v1/embeddings") + @POST("embeddings") Single createEmbeddings(@Body EmbeddingRequest request); - @GET("/v1/files") + @GET("files") Single> listFiles(); @Multipart - @POST("/v1/files") + @POST("files") Single uploadFile(@Part("purpose") RequestBody purpose, @Part MultipartBody.Part file); - @DELETE("/v1/files/{file_id}") + @DELETE("files/{file_id}") Single deleteFile(@Path("file_id") String fileId); - @GET("/v1/files/{file_id}") + @GET("files/{file_id}") Single retrieveFile(@Path("file_id") String fileId); @Streaming - @GET("/v1/files/{file_id}/content") + @GET("files/{file_id}/content") Single retrieveFileContent(@Path("file_id") String fileId); - @POST("/v1/fine_tuning/jobs") + @POST("fine_tuning/jobs") Single createFineTuningJob(@Body FineTuningJobRequest request); - @GET("/v1/fine_tuning/jobs") + @GET("fine_tuning/jobs") Single> listFineTuningJobs(); - @GET("/v1/fine_tuning/jobs/{fine_tuning_job_id}") + @GET("fine_tuning/jobs/{fine_tuning_job_id}") Single retrieveFineTuningJob(@Path("fine_tuning_job_id") String fineTuningJobId); - @POST("/v1/fine_tuning/jobs/{fine_tuning_job_id}/cancel") + @POST("fine_tuning/jobs/{fine_tuning_job_id}/cancel") Single cancelFineTuningJob(@Path("fine_tuning_job_id") String fineTuningJobId); - @GET("/v1/fine_tuning/jobs/{fine_tuning_job_id}/events") + @GET("fine_tuning/jobs/{fine_tuning_job_id}/events") Single> listFineTuningJobEvents(@Path("fine_tuning_job_id") String fineTuningJobId); - @POST("/v1/completions") + @POST("completions") Single createFineTuneCompletion(@Body CompletionRequest request); - @DELETE("/v1/models/{fine_tune_id}") + @DELETE("models/{fine_tune_id}") Single deleteFineTune(@Path("fine_tune_id") String fineTuneId); - @POST("/v1/images/generations") + @POST("images/generations") Single createImage(@Body CreateImageRequest request); - @POST("/v1/images/edits") + @POST("images/edits") Single createImageEdit(@Body RequestBody requestBody); - @POST("/v1/images/variations") + @POST("images/variations") Single createImageVariation(@Body RequestBody requestBody); - @POST("/v1/audio/transcriptions") + @POST("audio/transcriptions") Single createTranscription(@Body RequestBody requestBody); - @POST("/v1/audio/translations") + @POST("audio/translations") Single createTranslation(@Body RequestBody requestBody); - @POST("/v1/audio/speech") + @POST("audio/speech") Single createSpeech(@Body CreateSpeechRequest requestBody); - @POST("/v1/moderations") + @POST("moderations") Single createModeration(@Body ModerationRequest request); /** @@ -144,7 +144,7 @@ public interface OpenAiApi { * @return */ @Deprecated - @GET("v1/dashboard/billing/subscription") + @GET("dashboard/billing/subscription") Single subscription(); /** @@ -156,182 +156,185 @@ public interface OpenAiApi { * @return Consumption amount information. */ @Deprecated - @GET("v1/dashboard/billing/usage") + @GET("dashboard/billing/usage") Single billingUsage(@Query("start_date") LocalDate starDate, @Query("end_date") LocalDate endDate); @Headers({"OpenAI-Beta: assistants=v1"}) - @POST("/v1/assistants") + @POST("assistants") Single createAssistant(@Body AssistantRequest request); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/assistants") + @GET("assistants") Single> listAssistants(@QueryMap Map filterRequest); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/assistants/{assistant_id}") + @GET("assistants/{assistant_id}") Single retrieveAssistant(@Path("assistant_id") String assistantId); @Headers({"OpenAI-Beta: assistants=v1"}) - @POST("/v1/assistants/{assistant_id}") + @POST("assistants/{assistant_id}") Single modifyAssistant(@Path("assistant_id") String assistantId, @Body ModifyAssistantRequest request); @Headers({"OpenAI-Beta: assistants=v1"}) - @DELETE("/v1/assistants/{assistant_id}") + @DELETE("assistants/{assistant_id}") Single deleteAssistant(@Path("assistant_id") String assistantId); //---- + @Headers({"OpenAI-Beta: assistants=v1"}) + @POST("assistants/{assistant_id}/files") + Single createAssistantFile(@Path("assistant_id") String assistantId, @Body AssistantFileRequest fileRequest); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/assistants/{assistant_id}/files/{file_id}") + @GET("assistants/{assistant_id}/files/{file_id}") Single retrieveAssistantFile(@Path("assistant_id") String assistantId, @Path("file_id") String fileId); @Headers({"OpenAI-Beta: assistants=v1"}) - @DELETE("/v1/assistants/{assistant_id}/files/{file_id}") + @DELETE("assistants/{assistant_id}/files/{file_id}") Single deleteAssistantFile(@Path("assistant_id") String assistantId, @Path("file_id") String fileId); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/assistants/{assistant_id}/files") + @GET("assistants/{assistant_id}/files") Single> listAssistantFiles(@Path("assistant_id") String assistantId, @QueryMap Map filterRequest); //--- @Headers({"OpenAI-Beta: assistants=v1"}) - @POST("/v1/threads") + @POST("threads") Single createThread(@Body ThreadRequest request); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/threads/{thread_id}") + @GET("threads/{thread_id}") Single retrieveThread(@Path("thread_id") String threadId); @Headers({"OpenAI-Beta: assistants=v1"}) - @POST("/v1/threads/{thread_id}") + @POST("threads/{thread_id}") Single modifyThread(@Path("thread_id") String threadId, @Body ThreadRequest request); @Headers({"OpenAI-Beta: assistants=v1"}) - @DELETE("/v1/threads/{thread_id}") + @DELETE("threads/{thread_id}") Single deleteThread(@Path("thread_id") String threadId); @Headers({"OpenAI-Beta: assistants=v1"}) - @POST("/v1/threads/{thread_id}/messages") + @POST("threads/{thread_id}/messages") Single createMessage(@Path("thread_id") String threadId, @Body MessageRequest request); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/threads/{thread_id}/messages/{message_id}") + @GET("threads/{thread_id}/messages/{message_id}") Single retrieveMessage(@Path("thread_id") String threadId, @Path("message_id") String messageId); @Headers({"OpenAI-Beta: assistants=v1"}) - @POST("/v1/threads/{thread_id}/messages/{message_id}") + @POST("threads/{thread_id}/messages/{message_id}") Single modifyMessage(@Path("thread_id") String threadId, @Path("message_id") String messageId, @Body ModifyMessageRequest request); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/threads/{thread_id}/messages") + @GET("threads/{thread_id}/messages") Single> listMessages(@Path("thread_id") String threadId); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/threads/{thread_id}/messages") + @GET("threads/{thread_id}/messages") Single> listMessages(@Path("thread_id") String threadId, @QueryMap Map filterRequest); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/threads/{thread_id}/messages/{message_id}/files/{file_id}") + @GET("threads/{thread_id}/messages/{message_id}/files/{file_id}") Single retrieveMessageFile(@Path("thread_id") String threadId, @Path("message_id") String messageId, @Path("file_id") String fileId); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/threads/{thread_id}/messages/{message_id}/files") + @GET("threads/{thread_id}/messages/{message_id}/files") Single> listMessageFiles(@Path("thread_id") String threadId, @Path("message_id") String messageId); @Headers({"OpenAI-Beta: assistants=v1"}) - @GET("/v1/threads/{thread_id}/messages/{message_id}/files") + @GET("threads/{thread_id}/messages/{message_id}/files") Single> listMessageFiles(@Path("thread_id") String threadId, @Path("message_id") String messageId, @QueryMap Map filterRequest); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/threads/{thread_id}/runs") + @POST("threads/{thread_id}/runs") Single createRun(@Path("thread_id") String threadId, @Body RunCreateRequest runCreateRequest); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/threads/{thread_id}/runs/{run_id}") + @GET("threads/{thread_id}/runs/{run_id}") Single retrieveRun(@Path("thread_id") String threadId, @Path("run_id") String runId); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/threads/{thread_id}/runs/{run_id}") + @POST("threads/{thread_id}/runs/{run_id}") Single modifyRun(@Path("thread_id") String threadId, @Path("run_id") String runId, @Body Map metadata); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/threads/{thread_id}/runs") + @GET("threads/{thread_id}/runs") Single> listRuns(@Path("thread_id") String threadId, @QueryMap Map listSearchParameters); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/threads/{thread_id}/runs/{run_id}/submit_tool_outputs") + @POST("threads/{thread_id}/runs/{run_id}/submit_tool_outputs") Single submitToolOutputs(@Path("thread_id") String threadId, @Path("run_id") String runId, @Body SubmitToolOutputsRequest submitToolOutputsRequest); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/threads/{thread_id}/runs/{run_id}/cancel") + @POST("threads/{thread_id}/runs/{run_id}/cancel") Single cancelRun(@Path("thread_id") String threadId, @Path("run_id") String runId); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/threads/runs") + @POST("threads/runs") Single createThreadAndRun(@Body CreateThreadAndRunRequest createThreadAndRunRequest); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/threads/{thread_id}/runs/{run_id}/steps/{step_id}") + @GET("threads/{thread_id}/runs/{run_id}/steps/{step_id}") Single retrieveRunStep(@Path("thread_id") String threadId, @Path("run_id") String runId, @Path("step_id") String stepId); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/threads/{thread_id}/runs/{run_id}/steps") + @GET("threads/{thread_id}/runs/{run_id}/steps") Single> listRunSteps(@Path("thread_id") String threadId, @Path("run_id") String runId, @QueryMap Map listSearchParameters); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/vector_stores") + @POST("vector_stores") Single createVectorStore(@Body VectorStoreRequest request); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/vector_stores") + @GET("vector_stores") Single> listVectorStores(@QueryMap Map filterRequest); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/vector_stores/{vector_store_id}") + @GET("vector_stores/{vector_store_id}") Single retrieveVectorStore(@Path("vector_store_id") String vectorStoreId); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/vector_stores/{vector_store_id}") + @POST("vector_stores/{vector_store_id}") Single modifyVectorStore(@Path("vector_store_id") String vectorStoreId, @Body ModifyVectorStoreRequest request); @Headers("OpenAI-Beta: assistants=v1") - @DELETE("/v1/vector_stores/{vector_store_id}") + @DELETE("vector_stores/{vector_store_id}") Single deleteVectorStore(@Path("vector_store_id") String vectorStoreId); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/vector_stores/{vector_store_id}/files") + @POST("vector_stores/{vector_store_id}/files") Single createVectorStoreFile(@Path("vector_store_id") String vectorStoreId, @Body AssistantFileRequest fileRequest); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/vector_stores/{vector_store_id}/files") + @GET("vector_stores/{vector_store_id}/files") Single> listVectorStoreFiles(@Path("vector_store_id") String vectorStoreId, @QueryMap Map filterRequest); @Headers("OpenAI-Beta: assistants=v1") - @DELETE("/v1/vector_stores/{vector_store_id}/files/{file_id}") + @DELETE("vector_stores/{vector_store_id}/files/{file_id}") Single deleteVectorStoreFile(@Path("vector_store_id") String vectorStoreId, @Path("file_id") String fileId); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/vector_stores/{vector_store_id}/file_batches") + @POST("vector_stores/{vector_store_id}/file_batches") Single createVectorStoreFileBatch(@Path("vector_store_id") String vectorStoreId, @Body VectorStoreFilesBatchRequest request); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}") + @GET("vector_stores/{vector_store_id}/file_batches/{batch_id}") Single retrieveVectorStoreFileBatch(@Path("vector_store_id") String vectorStoreId, @Path("batch_id") String batchId); @Headers("OpenAI-Beta: assistants=v1") - @POST("/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}/cancel") + @POST("vector_stores/{vector_store_id}/file_batches/{batch_id}/cancel") Single cancelVectorStoreFileBatch(@Path("vector_store_id") String vectorStoreId, @Path("batch_id") String batchId); @Headers("OpenAI-Beta: assistants=v1") - @GET("/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}/files") + @GET("vector_stores/{vector_store_id}/file_batches/{batch_id}/files") Single> listVectorStoreFilesInBatch(@Path("vector_store_id") String vectorStoreId, @Path("batch_id") String batchId, @QueryMap Map filterRequest); } diff --git a/example/src/main/java/example/ServiceCreateExample.java b/example/src/main/java/example/ServiceCreateExample.java index 9f9d2d7..37c3fac 100644 --- a/example/src/main/java/example/ServiceCreateExample.java +++ b/example/src/main/java/example/ServiceCreateExample.java @@ -17,11 +17,11 @@ **/ public class ServiceCreateExample { - private static final String BASE_URL = "https://api.openai.com"; + private static final String BASE_URL = "https://api.openai.com/v1/"; private static final String API_KEY = "sk-1234567890"; public static void main(String[] args) { - //1.使用默认的baseUrl,默认配置service,这里会默认先从环境变量中获取BaseURL(key:OPENAI_API_BASE_URL),如果没有则使用默认的"https://api.openai.com/"; + //1.使用默认的baseUrl,默认配置service,这里会默认先从环境变量中获取BaseURL(key:OPENAI_API_BASE_URL),如果没有则使用默认的"https://api.openai.com/v1/"; OpenAiService openAiService = new OpenAiService(API_KEY); //2. 使用自定义的baseUrl,默认配置配置service OpenAiService openAiService1 = new OpenAiService(API_KEY, BASE_URL); diff --git a/service/src/main/java/com/theokanning/openai/service/OpenAiService.java b/service/src/main/java/com/theokanning/openai/service/OpenAiService.java index 1b625fe..d196d33 100644 --- a/service/src/main/java/com/theokanning/openai/service/OpenAiService.java +++ b/service/src/main/java/com/theokanning/openai/service/OpenAiService.java @@ -58,7 +58,7 @@ public class OpenAiService { - private static final String DEFAULT_BASE_URL = "https://api.openai.com/"; + private static final String DEFAULT_BASE_URL = "https://api.openai.com/v1/"; private static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(10); private static final ObjectMapper mapper = defaultObjectMapper(); @@ -93,7 +93,7 @@ public OpenAiService(final String token, final Duration timeout) { * * @param token OpenAi token string "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" * @param timeout http read timeout, Duration.ZERO means no timeout - * @param baseUrl OpenAi API base URL, default is "https://api.openai.com/" + * @param baseUrl OpenAi API base URL, default is "https://api.openai.com/v1/" */ public OpenAiService(final String token, final Duration timeout, String baseUrl) { ObjectMapper mapper = defaultObjectMapper();