diff --git a/README.md b/README.md index 2271970..5ffca16 100644 --- a/README.md +++ b/README.md @@ -47,14 +47,14 @@ dependencies { This SDK uses the following core dependencies: -| Library | Version | -|---------|----------| -| OkHttp | 4.12.0 | -| Java JWT | 4.4.0 | -| Jackson | 2.17.2 | -| Retrofit2 | 2.11.0 | -| RxJava | 3.1.8 | -| SLF4J | 2.0.16 | +| Library | Version | +|-----------|---------| +| OkHttp3 | 3.14.9 | +| Java JWT | 4.2.2 | +| Jackson | 2.19.0 | +| Retrofit2 | 2.12.0 | +| RxJava3 | 3.1.10 | +| SLF4J | 2.0.17 | ## 🚀 Quick Start diff --git a/README_CN.md b/README_CN.md index 01f8134..37812f0 100644 --- a/README_CN.md +++ b/README_CN.md @@ -47,14 +47,14 @@ dependencies { 本SDK使用以下核心依赖库: -| 依赖库 | 版本 | -|--------|------| -| OkHttp | 4.12.0 | -| Java JWT | 4.4.0 | -| Jackson | 2.17.2 | -| Retrofit2 | 2.11.0 | -| RxJava | 3.1.8 | -| SLF4J | 2.0.16 | +| Library | Version | +|-----------|---------| +| OkHttp3 | 3.14.9 | +| Java JWT | 4.2.2 | +| Jackson | 2.19.0 | +| Retrofit2 | 2.12.0 | +| RxJava3 | 3.1.10 | +| SLF4J | 2.0.17 | ## 🚀 快速开始 diff --git a/core/pom.xml b/core/pom.xml index 45159ca..1981398 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -47,17 +47,14 @@ 8 8 UTF-8 - 2.0.11 + 2.0.17 3.14.9 - 2.18.3 - 2.9.0 - 3.1.8 + 2.19.0 + 2.12.0 + 3.1.10 4.2.2 1.18.32 - 2.9.0 5.10.2 - 1.19.8 - 5.15.0 @@ -77,7 +74,6 @@ org.slf4j slf4j-log4j12 ${slf4j.version} - pom test @@ -104,7 +100,7 @@ com.squareup.retrofit2 - adapter-rxjava2 + adapter-rxjava3 ${retrofit2.version} @@ -156,13 +152,7 @@ org.projectlombok lombok ${lombok.version} - - - - - org.apache.tika - tika-core - ${tika.version} + compile @@ -184,40 +174,6 @@ ${junit.test.version} test - - - - org.testcontainers - testcontainers - ${testcontainer.version} - test - - - org.testcontainers - mockserver - ${testcontainer.version} - test - - - org.testcontainers - junit-jupiter - ${testcontainer.version} - test - - - - - org.mock-server - mockserver-netty - ${mockserver.version} - test - - - org.mock-server - mockserver-client-java - ${mockserver.version} - test - diff --git a/core/src/main/java/ai/z/openapi/AbstractAiClient.java b/core/src/main/java/ai/z/openapi/AbstractAiClient.java index ae240d4..045e1d1 100644 --- a/core/src/main/java/ai/z/openapi/AbstractAiClient.java +++ b/core/src/main/java/ai/z/openapi/AbstractAiClient.java @@ -31,14 +31,14 @@ import ai.z.openapi.core.model.FlowableClientResponse; import ai.z.openapi.utils.FlowableRequestSupplier; import ai.z.openapi.utils.OkHttps; import ai.z.openapi.utils.RequestSupplier; -import io.reactivex.Flowable; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Single; import okhttp3.OkHttpClient; import okhttp3.ResponseBody; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import retrofit2.Retrofit; -import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; import retrofit2.converter.jackson.JacksonConverterFactory; import java.lang.reflect.InvocationTargetException; @@ -111,7 +111,7 @@ public abstract class AbstractAiClient extends AbstractClientBaseService { this.retrofit = new Retrofit.Builder().baseUrl(baseUrl) .client(httpClient) .addConverterFactory(JacksonConverterFactory.create(mapper)) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .build(); } diff --git a/core/src/main/java/ai/z/openapi/api/agents/AgentsApi.java b/core/src/main/java/ai/z/openapi/api/agents/AgentsApi.java index 484a4bf..45b1f79 100644 --- a/core/src/main/java/ai/z/openapi/api/agents/AgentsApi.java +++ b/core/src/main/java/ai/z/openapi/api/agents/AgentsApi.java @@ -3,7 +3,7 @@ package ai.z.openapi.api.agents; import ai.z.openapi.service.agents.AgentAsyncResultRetrieveParams; import ai.z.openapi.service.agents.AgentsCompletionRequest; import ai.z.openapi.service.model.ModelData; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.http.Body; diff --git a/core/src/main/java/ai/z/openapi/api/assistant/AssistantApi.java b/core/src/main/java/ai/z/openapi/api/assistant/AssistantApi.java index a93fb36..bc2575a 100644 --- a/core/src/main/java/ai/z/openapi/api/assistant/AssistantApi.java +++ b/core/src/main/java/ai/z/openapi/api/assistant/AssistantApi.java @@ -6,7 +6,7 @@ import ai.z.openapi.service.assistant.conversation.AssistantConversationUsageLis import ai.z.openapi.service.assistant.query_support.AssistantSupportStatus; import ai.z.openapi.service.assistant.conversation.AssistantConversationParameters; import ai.z.openapi.service.assistant.query_support.AssistantQuerySupportParams; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.http.Body; diff --git a/core/src/main/java/ai/z/openapi/api/audio/AudioApi.java b/core/src/main/java/ai/z/openapi/api/audio/AudioApi.java index a773c69..5839161 100644 --- a/core/src/main/java/ai/z/openapi/api/audio/AudioApi.java +++ b/core/src/main/java/ai/z/openapi/api/audio/AudioApi.java @@ -2,7 +2,7 @@ package ai.z.openapi.api.audio; import ai.z.openapi.service.audio.AudioSpeechRequest; import ai.z.openapi.service.audio.AudioTranscriptionResult; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import okhttp3.MultipartBody; import okhttp3.RequestBody; import okhttp3.ResponseBody; diff --git a/core/src/main/java/ai/z/openapi/api/batches/BatchesApi.java b/core/src/main/java/ai/z/openapi/api/batches/BatchesApi.java index 7e6c55e..bca5d90 100644 --- a/core/src/main/java/ai/z/openapi/api/batches/BatchesApi.java +++ b/core/src/main/java/ai/z/openapi/api/batches/BatchesApi.java @@ -3,7 +3,7 @@ package ai.z.openapi.api.batches; import ai.z.openapi.service.batches.Batch; import ai.z.openapi.service.batches.BatchCreateParams; import ai.z.openapi.service.batches.BatchPage; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.POST; diff --git a/core/src/main/java/ai/z/openapi/api/chat/ChatApi.java b/core/src/main/java/ai/z/openapi/api/chat/ChatApi.java index 0359bea..6ae6f6e 100644 --- a/core/src/main/java/ai/z/openapi/api/chat/ChatApi.java +++ b/core/src/main/java/ai/z/openapi/api/chat/ChatApi.java @@ -2,7 +2,7 @@ package ai.z.openapi.api.chat; import ai.z.openapi.service.model.ChatCompletionCreateParams; import ai.z.openapi.service.model.ModelData; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.http.Body; diff --git a/core/src/main/java/ai/z/openapi/api/embedding/EmbeddingApi.java b/core/src/main/java/ai/z/openapi/api/embedding/EmbeddingApi.java index 66149bd..520a048 100644 --- a/core/src/main/java/ai/z/openapi/api/embedding/EmbeddingApi.java +++ b/core/src/main/java/ai/z/openapi/api/embedding/EmbeddingApi.java @@ -2,7 +2,7 @@ package ai.z.openapi.api.embedding; import ai.z.openapi.service.embedding.EmbeddingCreateParams; import ai.z.openapi.service.embedding.EmbeddingResult; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.POST; diff --git a/core/src/main/java/ai/z/openapi/api/file/FileApi.java b/core/src/main/java/ai/z/openapi/api/file/FileApi.java index 61d52fa..fb2ef34 100644 --- a/core/src/main/java/ai/z/openapi/api/file/FileApi.java +++ b/core/src/main/java/ai/z/openapi/api/file/FileApi.java @@ -3,7 +3,7 @@ package ai.z.openapi.api.file; import ai.z.openapi.service.file.File; import ai.z.openapi.service.file.FileDeleted; import ai.z.openapi.service.file.QueryFileResult; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import okhttp3.MultipartBody; import okhttp3.ResponseBody; import retrofit2.Call; diff --git a/core/src/main/java/ai/z/openapi/api/images/ImagesApi.java b/core/src/main/java/ai/z/openapi/api/images/ImagesApi.java index ea85642..ec682c4 100644 --- a/core/src/main/java/ai/z/openapi/api/images/ImagesApi.java +++ b/core/src/main/java/ai/z/openapi/api/images/ImagesApi.java @@ -2,7 +2,7 @@ package ai.z.openapi.api.images; import ai.z.openapi.service.image.CreateImageRequest; import ai.z.openapi.service.image.ImageResult; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.POST; diff --git a/core/src/main/java/ai/z/openapi/api/tools/ToolsApi.java b/core/src/main/java/ai/z/openapi/api/tools/ToolsApi.java index d14e0c9..512b881 100644 --- a/core/src/main/java/ai/z/openapi/api/tools/ToolsApi.java +++ b/core/src/main/java/ai/z/openapi/api/tools/ToolsApi.java @@ -2,7 +2,7 @@ package ai.z.openapi.api.tools; import ai.z.openapi.service.tools.WebSearchParamsRequest; import ai.z.openapi.service.tools.WebSearchPro; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.http.Body; diff --git a/core/src/main/java/ai/z/openapi/api/videos/VideosApi.java b/core/src/main/java/ai/z/openapi/api/videos/VideosApi.java index ff20da0..8bac3ed 100644 --- a/core/src/main/java/ai/z/openapi/api/videos/VideosApi.java +++ b/core/src/main/java/ai/z/openapi/api/videos/VideosApi.java @@ -2,7 +2,7 @@ package ai.z.openapi.api.videos; import ai.z.openapi.service.videos.VideoCreateParams; import ai.z.openapi.service.videos.VideoObject; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.POST; diff --git a/core/src/main/java/ai/z/openapi/api/web_search/WebSearchApi.java b/core/src/main/java/ai/z/openapi/api/web_search/WebSearchApi.java index f868f92..684b4be 100644 --- a/core/src/main/java/ai/z/openapi/api/web_search/WebSearchApi.java +++ b/core/src/main/java/ai/z/openapi/api/web_search/WebSearchApi.java @@ -2,7 +2,7 @@ package ai.z.openapi.api.web_search; import ai.z.openapi.service.web_search.WebSearchDTO; import ai.z.openapi.service.web_search.WebSearchRequest; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.POST; diff --git a/core/src/main/java/ai/z/openapi/core/model/BiFlowableClientResponse.java b/core/src/main/java/ai/z/openapi/core/model/BiFlowableClientResponse.java index e59b538..50c27bf 100644 --- a/core/src/main/java/ai/z/openapi/core/model/BiFlowableClientResponse.java +++ b/core/src/main/java/ai/z/openapi/core/model/BiFlowableClientResponse.java @@ -1,6 +1,6 @@ package ai.z.openapi.core.model; -import io.reactivex.Flowable; +import io.reactivex.rxjava3.core.Flowable; /** * A client response that supports a reactive Flowable stream with separate body type and diff --git a/core/src/main/java/ai/z/openapi/service/AbstractClientBaseService.java b/core/src/main/java/ai/z/openapi/service/AbstractClientBaseService.java index 14a2c30..210e84e 100644 --- a/core/src/main/java/ai/z/openapi/service/AbstractClientBaseService.java +++ b/core/src/main/java/ai/z/openapi/service/AbstractClientBaseService.java @@ -13,9 +13,9 @@ import ai.z.openapi.utils.FlowableRequestSupplier; import ai.z.openapi.utils.RequestSupplier; import ai.z.openapi.utils.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.BackpressureStrategy; -import io.reactivex.Flowable; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.BackpressureStrategy; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Single; import java.util.Objects; import okhttp3.ResponseBody; import org.slf4j.Logger; diff --git a/core/src/main/java/ai/z/openapi/service/agents/AgentService.java b/core/src/main/java/ai/z/openapi/service/agents/AgentService.java index 62e0a0a..c9dbbf0 100644 --- a/core/src/main/java/ai/z/openapi/service/agents/AgentService.java +++ b/core/src/main/java/ai/z/openapi/service/agents/AgentService.java @@ -2,7 +2,7 @@ package ai.z.openapi.service.agents; import ai.z.openapi.service.model.ChatCompletionResponse; import ai.z.openapi.service.model.ModelData; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; /** * Agent completion service interface diff --git a/core/src/main/java/ai/z/openapi/service/agents/AgentServiceImpl.java b/core/src/main/java/ai/z/openapi/service/agents/AgentServiceImpl.java index 7fabf6f..60afc0d 100644 --- a/core/src/main/java/ai/z/openapi/service/agents/AgentServiceImpl.java +++ b/core/src/main/java/ai/z/openapi/service/agents/AgentServiceImpl.java @@ -6,7 +6,7 @@ import ai.z.openapi.service.model.ChatCompletionResponse; import ai.z.openapi.service.model.ModelData; import ai.z.openapi.utils.FlowableRequestSupplier; import ai.z.openapi.utils.RequestSupplier; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import okhttp3.ResponseBody; import java.util.Objects; diff --git a/core/src/main/java/ai/z/openapi/service/assistant/AssistantApiResponse.java b/core/src/main/java/ai/z/openapi/service/assistant/AssistantApiResponse.java index a88e345..538bba4 100644 --- a/core/src/main/java/ai/z/openapi/service/assistant/AssistantApiResponse.java +++ b/core/src/main/java/ai/z/openapi/service/assistant/AssistantApiResponse.java @@ -2,7 +2,7 @@ package ai.z.openapi.service.assistant; import ai.z.openapi.core.model.FlowableClientResponse; import ai.z.openapi.service.model.ChatError; -import io.reactivex.Flowable; +import io.reactivex.rxjava3.core.Flowable; import lombok.Data; /** diff --git a/core/src/main/java/ai/z/openapi/service/audio/AudioServiceImpl.java b/core/src/main/java/ai/z/openapi/service/audio/AudioServiceImpl.java index 95415ef..9c128e4 100644 --- a/core/src/main/java/ai/z/openapi/service/audio/AudioServiceImpl.java +++ b/core/src/main/java/ai/z/openapi/service/audio/AudioServiceImpl.java @@ -6,13 +6,12 @@ import ai.z.openapi.service.deserialize.MessageDeserializeFactory; import ai.z.openapi.utils.FlowableRequestSupplier; import ai.z.openapi.utils.RequestSupplier; import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import lombok.extern.slf4j.Slf4j; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; import okhttp3.ResponseBody; -import org.apache.tika.Tika; import java.io.IOException; import java.io.InputStream; @@ -128,35 +127,27 @@ public class AudioServiceImpl implements AudioService { private AudioTranscriptionResponse createTranscriptionStream(AudioTranscriptionRequest request) { FlowableRequestSupplier> supplier = params -> { - try { - java.io.File file = params.getFile(); - Tika tika = new Tika(); - String contentType = tika.detect(file); - RequestBody requestFile = RequestBody.create(MediaType.parse(contentType), file); - MultipartBody.Part fileData = MultipartBody.Part.createFormData("file", file.getName(), requestFile); + java.io.File file = params.getFile(); + String contentType = detectContentType(file); + RequestBody requestFile = RequestBody.create(MediaType.parse(contentType), file); + MultipartBody.Part fileData = MultipartBody.Part.createFormData("file", file.getName(), requestFile); - Map requestMap = new HashMap<>(); - if (params.getModel() != null) { - requestMap.put("model", RequestBody.create(MediaType.parse("text/plain"), params.getModel())); - } - if (params.getStream() != null) { - requestMap.put("stream", - RequestBody.create(MediaType.parse("text/plain"), params.getStream().toString())); - } - if (params.getRequestId() != null) { - requestMap.put("request_id", - RequestBody.create(MediaType.parse("text/plain"), params.getRequestId())); - } - if (params.getUserId() != null) { - requestMap.put("user_id", RequestBody.create(MediaType.parse("text/plain"), params.getUserId())); - } + Map requestMap = new HashMap<>(); + if (params.getModel() != null) { + requestMap.put("model", RequestBody.create(MediaType.parse("text/plain"), params.getModel())); + } + if (params.getStream() != null) { + requestMap.put("stream", + RequestBody.create(MediaType.parse("text/plain"), params.getStream().toString())); + } + if (params.getRequestId() != null) { + requestMap.put("request_id", RequestBody.create(MediaType.parse("text/plain"), params.getRequestId())); + } + if (params.getUserId() != null) { + requestMap.put("user_id", RequestBody.create(MediaType.parse("text/plain"), params.getUserId())); + } - return audioApi.audioTranscriptionStream(requestMap, fileData); - } - catch (IOException e) { - log.error("Error create transcription: {}", e.getMessage(), e); - throw new RuntimeException(e); - } + return audioApi.audioTranscriptionStream(requestMap, fileData); }; return this.zAiClient.biStreamRequest(request, supplier, AudioTranscriptionResponse.class, AudioTranscriptionChunk.class); @@ -164,35 +155,27 @@ public class AudioServiceImpl implements AudioService { private AudioTranscriptionResponse createTranscriptionBlock(AudioTranscriptionRequest request) { RequestSupplier supplier = (params) -> { - try { - java.io.File file = params.getFile(); - Tika tika = new Tika(); - String contentType = tika.detect(file); - RequestBody requestFile = RequestBody.create(MediaType.parse(contentType), file); - MultipartBody.Part fileData = MultipartBody.Part.createFormData("file", file.getName(), requestFile); + java.io.File file = params.getFile(); + String contentType = detectContentType(file); + RequestBody requestFile = RequestBody.create(MediaType.parse(contentType), file); + MultipartBody.Part fileData = MultipartBody.Part.createFormData("file", file.getName(), requestFile); - Map requestMap = new HashMap<>(); - if (params.getModel() != null) { - requestMap.put("model", RequestBody.create(MediaType.parse("text/plain"), params.getModel())); - } - if (params.getStream() != null) { - requestMap.put("stream", - RequestBody.create(MediaType.parse("text/plain"), params.getStream().toString())); - } - if (params.getRequestId() != null) { - requestMap.put("request_id", - RequestBody.create(MediaType.parse("text/plain"), params.getRequestId())); - } - if (params.getUserId() != null) { - requestMap.put("user_id", RequestBody.create(MediaType.parse("text/plain"), params.getUserId())); - } + Map requestMap = new HashMap<>(); + if (params.getModel() != null) { + requestMap.put("model", RequestBody.create(MediaType.parse("text/plain"), params.getModel())); + } + if (params.getStream() != null) { + requestMap.put("stream", + RequestBody.create(MediaType.parse("text/plain"), params.getStream().toString())); + } + if (params.getRequestId() != null) { + requestMap.put("request_id", RequestBody.create(MediaType.parse("text/plain"), params.getRequestId())); + } + if (params.getUserId() != null) { + requestMap.put("user_id", RequestBody.create(MediaType.parse("text/plain"), params.getUserId())); + } - return audioApi.audioTranscription(requestMap, fileData); - } - catch (IOException e) { - log.error("Error create transcription: {}", e.getMessage(), e); - throw new RuntimeException(e); - } + return audioApi.audioTranscription(requestMap, fileData); }; return this.zAiClient.executeRequest(request, supplier, AudioTranscriptionResponse.class); } @@ -254,4 +237,38 @@ public class AudioServiceImpl implements AudioService { } } + /** + * Detect MIME type based on file extension + * @param file the file to detect + * @return MIME type string + */ + private String detectContentType(java.io.File file) { + String fileName = file.getName().toLowerCase(); + if (fileName.endsWith(".mp3")) { + return "audio/mpeg"; + } + else if (fileName.endsWith(".wav")) { + return "audio/wav"; + } + else if (fileName.endsWith(".m4a")) { + return "audio/mp4"; + } + else if (fileName.endsWith(".aac")) { + return "audio/aac"; + } + else if (fileName.endsWith(".ogg")) { + return "audio/ogg"; + } + else if (fileName.endsWith(".flac")) { + return "audio/flac"; + } + else if (fileName.endsWith(".wma")) { + return "audio/x-ms-wma"; + } + else { + // Default to audio/mpeg for unknown audio files + return "audio/mpeg"; + } + } + } \ No newline at end of file diff --git a/core/src/main/java/ai/z/openapi/service/audio/AudioTranscriptionResponse.java b/core/src/main/java/ai/z/openapi/service/audio/AudioTranscriptionResponse.java index 4897acd..a3ed287 100644 --- a/core/src/main/java/ai/z/openapi/service/audio/AudioTranscriptionResponse.java +++ b/core/src/main/java/ai/z/openapi/service/audio/AudioTranscriptionResponse.java @@ -2,7 +2,7 @@ package ai.z.openapi.service.audio; import ai.z.openapi.core.model.BiFlowableClientResponse; import ai.z.openapi.service.model.ChatError; -import io.reactivex.Flowable; +import io.reactivex.rxjava3.core.Flowable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/core/src/main/java/ai/z/openapi/service/model/ChatCompletionResponse.java b/core/src/main/java/ai/z/openapi/service/model/ChatCompletionResponse.java index aaffb17..3a72db9 100644 --- a/core/src/main/java/ai/z/openapi/service/model/ChatCompletionResponse.java +++ b/core/src/main/java/ai/z/openapi/service/model/ChatCompletionResponse.java @@ -1,7 +1,7 @@ package ai.z.openapi.service.model; import ai.z.openapi.core.model.FlowableClientResponse; -import io.reactivex.Flowable; +import io.reactivex.rxjava3.core.Flowable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/core/src/main/java/ai/z/openapi/service/model/ResponseBodyCallback.java b/core/src/main/java/ai/z/openapi/service/model/ResponseBodyCallback.java index bf341db..95e705b 100644 --- a/core/src/main/java/ai/z/openapi/service/model/ResponseBodyCallback.java +++ b/core/src/main/java/ai/z/openapi/service/model/ResponseBodyCallback.java @@ -1,7 +1,7 @@ package ai.z.openapi.service.model; import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.FlowableEmitter; +import io.reactivex.rxjava3.core.FlowableEmitter; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Callback; diff --git a/core/src/main/java/ai/z/openapi/service/tools/WebSearchApiResponse.java b/core/src/main/java/ai/z/openapi/service/tools/WebSearchApiResponse.java index 1ace193..f2c1b92 100644 --- a/core/src/main/java/ai/z/openapi/service/tools/WebSearchApiResponse.java +++ b/core/src/main/java/ai/z/openapi/service/tools/WebSearchApiResponse.java @@ -2,7 +2,7 @@ package ai.z.openapi.service.tools; import ai.z.openapi.core.model.FlowableClientResponse; import ai.z.openapi.service.model.ChatError; -import io.reactivex.Flowable; +import io.reactivex.rxjava3.core.Flowable; import lombok.Data; @Data diff --git a/core/src/main/java/ai/z/openapi/utils/RequestSupplier.java b/core/src/main/java/ai/z/openapi/utils/RequestSupplier.java index 6b125ae..fd6882d 100644 --- a/core/src/main/java/ai/z/openapi/utils/RequestSupplier.java +++ b/core/src/main/java/ai/z/openapi/utils/RequestSupplier.java @@ -1,6 +1,6 @@ package ai.z.openapi.utils; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; /** * Functional interface for supplying single request operations using RxJava. This diff --git a/core/src/test/java/ai/z/openapi/ZaiClientTest.java b/core/src/test/java/ai/z/openapi/ZaiClientTest.java index 358f4fc..7fd307d 100644 --- a/core/src/test/java/ai/z/openapi/ZaiClientTest.java +++ b/core/src/test/java/ai/z/openapi/ZaiClientTest.java @@ -7,9 +7,7 @@ import ai.z.openapi.core.token.TokenManager; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.testcontainers.junit.jupiter.Testcontainers; -@Testcontainers public class ZaiClientTest { private final static Logger logger = LoggerFactory.getLogger(ZaiClientTest.class); diff --git a/core/src/test/java/ai/z/openapi/deserialize/DeserializeTest.java b/core/src/test/java/ai/z/openapi/deserialize/DeserializeTest.java index 23df89f..0a74195 100644 --- a/core/src/test/java/ai/z/openapi/deserialize/DeserializeTest.java +++ b/core/src/test/java/ai/z/openapi/deserialize/DeserializeTest.java @@ -11,9 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.TextNode; import ai.z.openapi.service.deserialize.MessageDeserializeFactory; import org.junit.jupiter.api.Test; -import org.testcontainers.junit.jupiter.Testcontainers; -@Testcontainers public class DeserializeTest { private final ObjectMapper mapper = MessageDeserializeFactory.defaultObjectMapper(); diff --git a/core/src/test/java/ai/z/openapi/realtime/RealtimeClientTest.java b/core/src/test/java/ai/z/openapi/realtime/RealtimeClientTest.java index 28f6dc2..a972d73 100644 --- a/core/src/test/java/ai/z/openapi/realtime/RealtimeClientTest.java +++ b/core/src/test/java/ai/z/openapi/realtime/RealtimeClientTest.java @@ -1,7 +1,6 @@ package ai.z.openapi.realtime; -import com.google.common.base.Charsets; -import com.google.common.io.Resources; +import java.nio.charset.StandardCharsets; import ai.z.openapi.service.realtime.JasonUtil; import ai.z.openapi.service.realtime.OkHttpRealtimeClient; import ai.z.openapi.service.realtime.RealtimeClientEvent; @@ -15,8 +14,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.net.URL; +import java.io.InputStream; import java.util.List; +import java.util.Scanner; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -85,10 +85,15 @@ public class RealtimeClientTest { @Test @DisplayName("Test Audio Resource File Loading") void testAudioResourceFileLoading() throws IOException { - URL resourceUrl = Resources.getResource(TEST_RESOURCE_FILE); - assertNotNull(resourceUrl, "Test resource file should exist"); + InputStream resourceStream = getClass().getClassLoader().getResourceAsStream(TEST_RESOURCE_FILE); + assertNotNull(resourceStream, "Test resource file should exist"); - List lines = Resources.readLines(resourceUrl, Charsets.UTF_8); + List lines = new java.util.ArrayList<>(); + try (Scanner scanner = new Scanner(resourceStream, StandardCharsets.UTF_8.name())) { + while (scanner.hasNextLine()) { + lines.add(scanner.nextLine()); + } + } assertNotNull(lines, "Resource lines should not be null"); assertFalse(lines.isEmpty(), "Resource file should not be empty"); @@ -102,8 +107,15 @@ public class RealtimeClientTest { @Test @DisplayName("Test JSON Event Parsing") void testJsonEventParsing() throws IOException { - URL resourceUrl = Resources.getResource(TEST_RESOURCE_FILE); - List lines = Resources.readLines(resourceUrl, Charsets.UTF_8); + InputStream resourceStream = getClass().getClassLoader().getResourceAsStream(TEST_RESOURCE_FILE); + assertNotNull(resourceStream, "Test resource file should exist"); + + List lines = new java.util.ArrayList<>(); + try (Scanner scanner = new Scanner(resourceStream, StandardCharsets.UTF_8.name())) { + while (scanner.hasNextLine()) { + lines.add(scanner.nextLine()); + } + } int parsedEventCount = 0; for (String text : lines) { @@ -137,8 +149,15 @@ public class RealtimeClientTest { logger.info("WebSocket connection established"); // Load and send test events - URL resourceUrl = Resources.getResource(TEST_RESOURCE_FILE); - List lines = Resources.readLines(resourceUrl, Charsets.UTF_8); + InputStream resourceStream = getClass().getClassLoader().getResourceAsStream(TEST_RESOURCE_FILE); + assertNotNull(resourceStream, "Test resource file should exist"); + + List lines = new java.util.ArrayList<>(); + try (Scanner scanner = new Scanner(resourceStream, StandardCharsets.UTF_8.name())) { + while (scanner.hasNextLine()) { + lines.add(scanner.nextLine()); + } + } int sentEventCount = 0; for (String text : lines) { diff --git a/core/src/test/java/ai/z/openapi/service/agents/AgentServiceTest.java b/core/src/test/java/ai/z/openapi/service/agents/AgentServiceTest.java index fc6358c..33c6d4a 100644 --- a/core/src/test/java/ai/z/openapi/service/agents/AgentServiceTest.java +++ b/core/src/test/java/ai/z/openapi/service/agents/AgentServiceTest.java @@ -9,7 +9,7 @@ import ai.z.openapi.service.model.Choice; import ai.z.openapi.service.model.ModelData; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.Single; +import io.reactivex.rxjava3.core.Single; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/ai/z/openapi/service/chat/ChatServiceTest.java b/core/src/test/java/ai/z/openapi/service/chat/ChatServiceTest.java index a48396e..c6cc14d 100644 --- a/core/src/test/java/ai/z/openapi/service/chat/ChatServiceTest.java +++ b/core/src/test/java/ai/z/openapi/service/chat/ChatServiceTest.java @@ -20,11 +20,9 @@ import ai.z.openapi.service.model.QueryModelResultResponse; import ai.z.openapi.service.model.WebSearch; import ai.z.openapi.service.model.params.CodeGeexExtra; import ai.z.openapi.service.model.params.CodeGeexTarget; -import ai.z.openapi.service.videos.VideoCreateParams; -import ai.z.openapi.service.videos.VideosResponse; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.io.FileUtils; +import java.nio.file.Files; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.DisplayName; @@ -297,7 +295,7 @@ public class ChatServiceTest { void testAudioWithAudio() throws IOException { String requestId = String.format(REQUEST_ID_TEMPLATE, System.currentTimeMillis()); String file = ClassLoader.getSystemResource("asr.wav").getFile(); - byte[] bytes = FileUtils.readFileToByteArray(new File(file)); + byte[] bytes = Files.readAllBytes(new File(file).toPath()); Base64.Encoder encoder = Base64.getEncoder(); String audioBytes = encoder.encodeToString(bytes); diff --git a/core/src/test/java/ai/z/openapi/service/videos/VideosServiceTest.java b/core/src/test/java/ai/z/openapi/service/videos/VideosServiceTest.java index c7f843f..7bd7aff 100644 --- a/core/src/test/java/ai/z/openapi/service/videos/VideosServiceTest.java +++ b/core/src/test/java/ai/z/openapi/service/videos/VideosServiceTest.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.IOException; import java.util.Base64; -import org.apache.commons.io.FileUtils; +import java.nio.file.Files; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.DisplayName; @@ -197,7 +197,7 @@ public class VideosServiceTest { void testVideoGenerationWithImage() throws IOException { String requestId = String.format(REQUEST_ID_TEMPLATE, System.currentTimeMillis()); String file = ClassLoader.getSystemResource("image_to_video.png").getFile(); - byte[] bytes = FileUtils.readFileToByteArray(new File(file)); + byte[] bytes = Files.readAllBytes(new File(file).toPath()); Base64.Encoder encoder = Base64.getEncoder(); String imageUrl = encoder.encodeToString(bytes); VideoCreateParams request = VideoCreateParams.builder() diff --git a/samples/src/main/ai.z.openapi.samples/FunctionCallingExample.java b/samples/src/main/ai.z.openapi.samples/FunctionCallingExample.java index 8c8cdf6..b3abf97 100644 --- a/samples/src/main/ai.z.openapi.samples/FunctionCallingExample.java +++ b/samples/src/main/ai.z.openapi.samples/FunctionCallingExample.java @@ -28,7 +28,7 @@ public class FunctionCallingExample { } public static void main(String[] args) { - ZaiClient client = ZaiClient.builder().apiKey("your_api_key").build(); + ZaiClient client = ZaiClient.builder().build(); // Define function tools Map properties = new HashMap<>();