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<>();