Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions src/main/java/com/zhipu/oapi/ClientV4.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.zhipu.oapi;

import static com.zhipu.oapi.Constants.BASE_URL;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.zhipu.oapi.core.ConfigV4;
import com.zhipu.oapi.core.cache.ICache;
import com.zhipu.oapi.core.cache.LocalCache;
Expand All @@ -12,20 +15,20 @@
import com.zhipu.oapi.core.token.GlobalTokenManager;
import com.zhipu.oapi.core.token.TokenManagerV4;
import com.zhipu.oapi.service.v4.agents.AgentsCompletionRequest;
import com.zhipu.oapi.service.v4.api.ClientApiService;
import com.zhipu.oapi.service.v4.audio.*;
import com.zhipu.oapi.service.v4.audio.AudioTranscriptionsRequest;
import com.zhipu.oapi.service.v4.batchs.*;
import com.zhipu.oapi.service.v4.deserialize.MessageDeserializeFactory;
import com.zhipu.oapi.service.v4.fine_turning.*;
import com.zhipu.oapi.service.v4.model.*;
import com.zhipu.oapi.service.v4.api.ClientApiService;
import com.zhipu.oapi.service.v4.embedding.EmbeddingApiResponse;
import com.zhipu.oapi.service.v4.embedding.EmbeddingRequest;
import com.zhipu.oapi.service.v4.embedding.EmbeddingResult;
import com.zhipu.oapi.service.v4.file.*;
import com.zhipu.oapi.service.v4.audio.*;
import com.zhipu.oapi.service.v4.fine_turning.*;
import com.zhipu.oapi.service.v4.image.CreateImageRequest;
import com.zhipu.oapi.service.v4.image.ImageApiResponse;
import com.zhipu.oapi.service.v4.image.ImageResult;
import com.zhipu.oapi.service.v4.model.*;
import com.zhipu.oapi.service.v4.tools.WebSearchApiResponse;
import com.zhipu.oapi.service.v4.tools.WebSearchParamsRequest;
import com.zhipu.oapi.service.v4.tools.WebSearchPro;
Expand All @@ -36,16 +39,21 @@
import com.zhipu.oapi.utils.OkHttps;
import com.zhipu.oapi.utils.RequestSupplier;
import com.zhipu.oapi.utils.StringUtils;

import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import io.reactivex.Single;

import lombok.Getter;
import lombok.Setter;

import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import retrofit2.Response;
import retrofit2.adapter.rxjava2.HttpException;

Expand All @@ -54,8 +62,6 @@
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static com.zhipu.oapi.Constants.BASE_URL;

// 抽象类
abstract class AbstractClientBaseService {

Expand Down Expand Up @@ -461,6 +467,20 @@ public AudioSpeechApiResponse speech(AudioSpeechRequest request){
return this.executeRequest(request, supplier, AudioSpeechApiResponse.class);
}

/**
* tts接口(Text to speech streaming)
*
* @param request
* @return
*/
public AudioSpeechStreamingApiResponse speechStreaming(AudioSpeechRequest request) {
FlowableRequestSupplier<Map<String, Object>, retrofit2.Call<ResponseBody>> supplier =
params -> chatApiService.audioSpeechStreaming(params);

return this.streamRequest(
request, supplier, AudioSpeechStreamingApiResponse.class, ObjectNode.class);
}

/**
* tts接口(语音克隆)
* @param request
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/com/zhipu/oapi/service/v4/api/ClientApiService.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,21 @@
import com.zhipu.oapi.service.v4.batchs.Batch;
import com.zhipu.oapi.service.v4.batchs.BatchCreateParams;
import com.zhipu.oapi.service.v4.batchs.BatchPage;
import com.zhipu.oapi.service.v4.embedding.EmbeddingResult;
import com.zhipu.oapi.service.v4.file.*;
import com.zhipu.oapi.service.v4.fine_turning.*;
import com.zhipu.oapi.service.v4.model.*;
import com.zhipu.oapi.service.v4.embedding.EmbeddingResult;
import com.zhipu.oapi.service.v4.image.ImageResult;
import com.zhipu.oapi.service.v4.model.*;
import com.zhipu.oapi.service.v4.tools.WebSearchPro;
import com.zhipu.oapi.service.v4.web_search.WebSearchDTO;
import com.zhipu.oapi.service.v4.web_search.WebSearchRequest;

import io.reactivex.Single;

import okhttp3.*;

import org.apache.tika.Tika;

import retrofit2.Call;
import retrofit2.Response;

Expand All @@ -36,7 +40,6 @@
import java.nio.file.Path;
import java.util.*;


public class ClientApiService extends ClientBaseService {

private final ChatApi chatApi;
Expand Down Expand Up @@ -225,6 +228,10 @@ public Single<java.io.File> audioSpeech(Map<String,Object> request) throws IOExc
return Single.just(file);
}

public Call<ResponseBody> audioSpeechStreaming(Map<String, Object> request) {
return audioApi.audioSpeechStreaming(request);
}

public Single<java.io.File> audioCustomization(Map<String,Object> request) throws IOException {
java.io.File voiceFile = (java.io.File)request.get("voice_data");
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), voiceFile);
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/com/zhipu/oapi/service/v4/api/audio/AudioApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@


import com.zhipu.oapi.service.v4.model.ModelData;

import io.reactivex.Single;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
Expand All @@ -12,7 +14,6 @@

import java.util.Map;


public interface AudioApi {

/**
Expand All @@ -23,6 +24,15 @@ public interface AudioApi {
@POST("audio/speech")
Single<ResponseBody> audioSpeech(@Body Map<String,Object> request);

/**
* tts接口(streaming Text to speech)
*
* @param request
* @return
*/
@POST("audio/speech")
@Streaming
Call<ResponseBody> audioSpeechStreaming(@Body Map<String, Object> request);

/**
* 语音克隆接口
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.zhipu.oapi.service.v4.audio;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.zhipu.oapi.service.v4.deserialize.MessageDeserializeFactory;
import com.zhipu.oapi.service.v4.deserialize.audio.AudioSpeechChoiceDeserializer;

import lombok.Getter;

import java.util.Iterator;

@Getter
@JsonDeserialize(using = AudioSpeechChoiceDeserializer.class)
public class AudioSpeechChoice extends ObjectNode {

/** 索引 */
@JsonProperty("index")
private int index;

/** 完成原因 */
@JsonProperty("finish_reason")
private String finishReason;

/** delta */
@JsonProperty("delta")
private AudioSpeechDelta delta;

public AudioSpeechChoice() {
super(JsonNodeFactory.instance);
}

public AudioSpeechChoice(ObjectNode objectNode) {
super(JsonNodeFactory.instance);
ObjectMapper objectMapper = MessageDeserializeFactory.defaultObjectMapper();

if (objectNode.get("index") != null) {
this.setIndex(objectNode.get("index").asInt());
} else {
this.setIndex(0);
}
if (objectNode.get("finish_reason") != null) {
this.setFinishReason(objectNode.get("finish_reason").asText());
} else {
this.setFinishReason(null);
}

if (objectNode.get("delta") != null) {
this.setDelta(
objectMapper.convertValue(objectNode.get("delta"), AudioSpeechDelta.class));
} else {
this.setDelta(null);
}
Iterator<String> fieldNames = objectNode.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode field = objectNode.get(fieldName);
this.set(fieldName, field);
}
}

// Setters

public void setIndex(int index) {
this.index = index;
this.put("index", index);
}

public void setFinishReason(String finishReason) {
this.finishReason = finishReason;
this.put("finish_reason", finishReason);
}

public void setDelta(AudioSpeechDelta delta) {
this.delta = delta;
this.set("delta", delta);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.zhipu.oapi.service.v4.audio;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.zhipu.oapi.service.v4.deserialize.MessageDeserializeFactory;
import com.zhipu.oapi.service.v4.deserialize.audio.AudioSpeechDeltaDeserializer;

import lombok.Getter;

import java.util.Iterator;

@Getter
@JsonDeserialize(using = AudioSpeechDeltaDeserializer.class)
public class AudioSpeechDelta extends ObjectNode {

/** 角色 */
@JsonProperty("role")
private String role;

/** 工具调用列表 */
@JsonProperty("content")
private String content;

public AudioSpeechDelta() {
super(JsonNodeFactory.instance);
}

public AudioSpeechDelta(ObjectNode objectNode) {
super(JsonNodeFactory.instance);
ObjectMapper objectMapper = MessageDeserializeFactory.defaultObjectMapper();
if (objectNode.has("role")) {
this.setRole(objectNode.get("role").asText());
} else {
this.setRole(null);
}
if (objectNode.has("content")) {
this.setContent(objectNode.get("content").asText());
} else {
this.setContent(null);
}

Iterator<String> fieldNames = objectNode.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode field = objectNode.get(fieldName);
this.set(fieldName, field);
}
}

// Getters and Setters

public void setRole(String role) {
this.role = role;
this.put("role", role);
}

public void setContent(String content) {
this.content = content;
this.put("content", content);
}
}
85 changes: 85 additions & 0 deletions src/main/java/com/zhipu/oapi/service/v4/audio/AudioSpeechPro.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.zhipu.oapi.service.v4.audio;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.zhipu.oapi.service.v4.deserialize.MessageDeserializeFactory;
import com.zhipu.oapi.service.v4.deserialize.audio.AudioSpeechProDeserializer;
import lombok.Getter;

import java.util.Iterator;
import java.util.List;

@JsonDeserialize(using = AudioSpeechProDeserializer.class)
@Getter
public final class AudioSpeechPro extends ObjectNode {

/** 创建时间 */
@JsonProperty("created")
private Integer created;

/** 选择项 */
@JsonProperty("choices")
private List<AudioSpeechChoice> choices;

/** 请求ID */
@JsonProperty("request_id")
private String requestId;


public AudioSpeechPro() {
super(JsonNodeFactory.instance);
}

public AudioSpeechPro(ObjectNode objectNode) {
super(JsonNodeFactory.instance);
ObjectMapper objectMapper = MessageDeserializeFactory.defaultObjectMapper();
if (objectNode.get("created") != null) {
this.setCreated(objectNode.get("created").asInt());
} else {
this.setCreated(null);
}

if (objectNode.get("choices") != null) {
this.setChoices(
objectMapper.convertValue(
objectNode.get("choices"),
new TypeReference<List<AudioSpeechChoice>>() {}));
} else {
this.setChoices(null);
}
if (objectNode.get("request_id") != null) {
this.setRequestId(objectNode.get("request_id").asText());
} else {
this.setRequestId(null);
}

Iterator<String> fieldNames = objectNode.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode field = objectNode.get(fieldName);
this.set(fieldName, field);
}
}

// Setters
public void setCreated(Integer created) {
this.created = created;
this.put("created", created);
}


public void setChoices(List<AudioSpeechChoice> choices) {
this.choices = choices;
this.putPOJO("choices", choices);
}

public void setRequestId(String requestId) {
this.requestId = requestId;
this.put("request_id", requestId);
}
}
Loading