Skip to content

Commit 7abb501

Browse files
committed
[Breaking] ZhipuAi: mark @Depreactaed and @internal, make modelName mandatory
1 parent bb0d569 commit 7abb501

File tree

13 files changed

+166
-164
lines changed

13 files changed

+166
-164
lines changed

models/langchain4j-community-zhipu-ai/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
<properties>
2525
<jjwt.version>0.12.6</jjwt.version>
26-
<guava.version>32.0.0-jre</guava.version>
26+
<guava.version>33.1.0-jre</guava.version>
2727
</properties>
2828

2929
<dependencies>

models/langchain4j-community-zhipu-ai/src/main/java/dev/langchain4j/community/model/zhipu/AuthorizationUtils.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import com.google.common.cache.Cache;
88
import com.google.common.cache.CacheBuilder;
9+
import dev.langchain4j.Internal;
910
import io.jsonwebtoken.Jwts;
1011
import io.jsonwebtoken.security.MacAlgorithm;
1112
import java.lang.reflect.Constructor;
@@ -15,8 +16,13 @@
1516
import java.util.Map;
1617
import javax.crypto.spec.SecretKeySpec;
1718

19+
@Internal
1820
class AuthorizationUtils {
1921

22+
private AuthorizationUtils() throws InstantiationException {
23+
throw new InstantiationException("Can not instantiate utility class");
24+
}
25+
2026
private static final long expireMillis = 1000 * 60 * 30;
2127
private static final String id = "HS256";
2228
private static final String jcaName = "HmacSHA256";
@@ -43,8 +49,6 @@ class AuthorizationUtils {
4349
.expireAfterWrite(Duration.ofMillis(expireMillis))
4450
.build();
4551

46-
private AuthorizationUtils() {}
47-
4852
public static String getToken(String apiKey) {
4953
String token = getOrDefault(cache.getIfPresent(apiKey), generateToken(apiKey));
5054
return "Bearer " + token;
Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static dev.langchain4j.model.output.FinishReason.STOP;
1010
import static dev.langchain4j.model.output.FinishReason.TOOL_EXECUTION;
1111

12+
import dev.langchain4j.Internal;
1213
import dev.langchain4j.agent.tool.ToolExecutionRequest;
1314
import dev.langchain4j.agent.tool.ToolSpecification;
1415
import dev.langchain4j.community.model.zhipu.chat.AssistantMessage;
@@ -45,10 +46,11 @@
4546
import java.util.List;
4647
import java.util.stream.Collectors;
4748

48-
class DefaultZhipuAiHelper {
49+
@Internal
50+
class InternalZhipuAiHelper {
4951

50-
static final String FINISH_REASON_SENSITIVE = "sensitive";
51-
static final String FINISH_REASON_OTHER = "other";
52+
private static final String FINISH_REASON_SENSITIVE = "sensitive";
53+
private static final String FINISH_REASON_OTHER = "other";
5254

5355
static List<Embedding> toEmbed(List<EmbeddingResponse> response) {
5456
return response.stream()
@@ -83,24 +85,24 @@ private static Parameters toFunctionParameters(ToolSpecification toolSpecificati
8385
}
8486

8587
static List<Message> toZhipuAiMessages(List<ChatMessage> messages) {
86-
return messages.stream().map(DefaultZhipuAiHelper::toZhipuAiMessage).collect(Collectors.toList());
88+
return messages.stream().map(InternalZhipuAiHelper::toZhipuAiMessage).collect(Collectors.toList());
8789
}
8890

8991
private static Message toZhipuAiMessage(ChatMessage message) {
9092

91-
if (message instanceof final SystemMessage systemMessage) {
93+
if (message instanceof SystemMessage systemMessage) {
9294
return dev.langchain4j.community.model.zhipu.chat.SystemMessage.builder()
9395
.content(systemMessage.text())
9496
.build();
9597
}
9698

97-
if (message instanceof final UserMessage userMessage) {
99+
if (message instanceof UserMessage userMessage) {
98100
if (userMessage.hasSingleText()) {
99101
return dev.langchain4j.community.model.zhipu.chat.UserMessage.from(userMessage.singleText());
100102
}
101103
List<Content> contents = new ArrayList<>(userMessage.contents().size());
102104
userMessage.contents().forEach(content -> {
103-
if (content instanceof final TextContent textContent) {
105+
if (content instanceof TextContent textContent) {
104106
contents.add(dev.langchain4j.community.model.zhipu.chat.TextContent.builder()
105107
.text(textContent.text())
106108
.build());
@@ -117,7 +119,7 @@ private static Message toZhipuAiMessage(ChatMessage message) {
117119
return dev.langchain4j.community.model.zhipu.chat.UserMessage.from(contents);
118120
}
119121

120-
if (message instanceof final AiMessage aiMessage) {
122+
if (message instanceof AiMessage aiMessage) {
121123
if (!aiMessage.hasToolExecutionRequests()) {
122124
return AssistantMessage.builder().content(aiMessage.text()).build();
123125
}
@@ -138,7 +140,7 @@ private static Message toZhipuAiMessage(ChatMessage message) {
138140
.build();
139141
}
140142

141-
if (message instanceof final ToolExecutionResultMessage resultMessage) {
143+
if (message instanceof ToolExecutionResultMessage resultMessage) {
142144
return ToolMessage.builder().content(resultMessage.text()).build();
143145
}
144146

@@ -198,7 +200,7 @@ static ChatCompletionResponse toChatErrorResponse(Throwable throwable) {
198200
* error code see <a href="https://open.bigmodel.cn/dev/api/error-code/error-code-v4">error codes document</a>
199201
*/
200202
private static ChatCompletionChoice toChatErrorChoice(Throwable throwable) {
201-
if (throwable instanceof final HttpException httpException) {
203+
if (throwable instanceof HttpException httpException) {
202204
String message = httpException.getMessage();
203205
if (Utils.isNullOrBlank(message)) {
204206
return ChatCompletionChoice.builder()
@@ -240,7 +242,7 @@ static String getFinishReason(Object o) {
240242
return FINISH_REASON_SENSITIVE;
241243
}
242244
}
243-
if (o instanceof final ZhipuAiException exception) {
245+
if (o instanceof ZhipuAiException exception) {
244246
if ("1301".equals(exception.getCode())) {
245247
return FINISH_REASON_SENSITIVE;
246248
}

models/langchain4j-community-zhipu-ai/src/main/java/dev/langchain4j/community/model/zhipu/Json.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package dev.langchain4j.community.model.zhipu;
22

3+
import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
4+
35
import com.fasterxml.jackson.core.JsonProcessingException;
46
import com.fasterxml.jackson.core.type.TypeReference;
57
import com.fasterxml.jackson.databind.ObjectMapper;
8+
import dev.langchain4j.Internal;
69

7-
import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
8-
10+
@Internal
911
class Json {
10-
static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
11-
.enable(INDENT_OUTPUT);
12+
13+
private Json() throws InstantiationException {
14+
throw new InstantiationException("Can not instantiate utility class");
15+
}
16+
17+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().enable(INDENT_OUTPUT);
1218

1319
static String toJson(Object o) {
1420
try {

models/langchain4j-community-zhipu-ai/src/main/java/dev/langchain4j/community/model/zhipu/ZhipuAiChatModel.java

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,43 @@
11
package dev.langchain4j.community.model.zhipu;
22

3-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.aiMessageFrom;
4-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.finishReasonFrom;
5-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.isSuccessFinishReason;
6-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.toTools;
7-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.toZhipuAiMessages;
8-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.tokenUsageFrom;
9-
import static dev.langchain4j.community.model.zhipu.chat.ChatCompletionModel.GLM_4_FLASH;
3+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.aiMessageFrom;
4+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.finishReasonFrom;
5+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.isSuccessFinishReason;
6+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.toTools;
7+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.toZhipuAiMessages;
8+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.tokenUsageFrom;
109
import static dev.langchain4j.community.model.zhipu.chat.ToolChoiceMode.AUTO;
1110
import static dev.langchain4j.internal.RetryUtils.withRetry;
11+
import static dev.langchain4j.internal.Utils.copy;
1212
import static dev.langchain4j.internal.Utils.getOrDefault;
1313
import static dev.langchain4j.internal.Utils.isNullOrEmpty;
14+
import static dev.langchain4j.internal.ValidationUtils.ensureNotNull;
1415
import static dev.langchain4j.spi.ServiceHelper.loadFactories;
15-
import static java.util.Collections.emptyList;
1616

1717
import dev.langchain4j.agent.tool.ToolSpecification;
1818
import dev.langchain4j.community.model.zhipu.chat.ChatCompletionModel;
1919
import dev.langchain4j.community.model.zhipu.chat.ChatCompletionRequest;
2020
import dev.langchain4j.community.model.zhipu.chat.ChatCompletionResponse;
2121
import dev.langchain4j.community.model.zhipu.spi.ZhipuAiChatModelBuilderFactory;
2222
import dev.langchain4j.data.message.ChatMessage;
23-
import dev.langchain4j.internal.ValidationUtils;
2423
import dev.langchain4j.model.chat.ChatModel;
2524
import dev.langchain4j.model.chat.listener.ChatModelListener;
2625
import dev.langchain4j.model.chat.request.ChatRequest;
2726
import dev.langchain4j.model.chat.request.ChatRequestParameters;
2827
import dev.langchain4j.model.chat.response.ChatResponse;
2928
import dev.langchain4j.model.output.FinishReason;
3029
import java.time.Duration;
31-
import java.util.ArrayList;
3230
import java.util.List;
33-
import org.slf4j.Logger;
34-
import org.slf4j.LoggerFactory;
3531

3632
/**
3733
* Represents an ZhipuAi language model with a chat completion interface, such as glm-3-turbo and glm-4.
3834
* You can find description of parameters <a href="https://open.bigmodel.cn/dev/api">here</a>.
3935
*/
4036
public class ZhipuAiChatModel implements ChatModel {
4137

42-
private static final Logger log = LoggerFactory.getLogger(ZhipuAiChatModel.class);
43-
44-
private final Double temperature;
45-
private final Double topP;
46-
private final String model;
47-
private final Integer maxRetries;
48-
private final Integer maxToken;
49-
private final List<String> stops;
5038
private final ZhipuAiClient client;
5139
private final List<ChatModelListener> listeners;
40+
private final Integer maxRetries;
5241

5342
private final ChatRequestParameters defaultRequestParameters;
5443

@@ -68,13 +57,8 @@ public ZhipuAiChatModel(
6857
Duration connectTimeout,
6958
Duration readTimeout,
7059
Duration writeTimeout) {
71-
this.temperature = getOrDefault(temperature, 0.7);
72-
this.topP = topP;
73-
this.stops = stops;
74-
this.model = getOrDefault(model, GLM_4_FLASH.toString());
7560
this.maxRetries = getOrDefault(maxRetries, 3);
76-
this.maxToken = getOrDefault(maxToken, 512);
77-
this.listeners = listeners == null ? emptyList() : new ArrayList<>(listeners);
61+
this.listeners = copy(listeners);
7862
this.client = ZhipuAiClient.builder()
7963
.baseUrl(getOrDefault(baseUrl, "https://open.bigmodel.cn/"))
8064
.apiKey(apiKey)
@@ -86,11 +70,11 @@ public ZhipuAiChatModel(
8670
.logResponses(getOrDefault(logResponses, false))
8771
.build();
8872
this.defaultRequestParameters = ChatRequestParameters.builder()
89-
.temperature(this.temperature)
73+
.temperature(getOrDefault(temperature, 0.7))
9074
.topP(topP)
9175
.stopSequences(stops)
92-
.modelName(this.model)
93-
.maxOutputTokens(this.maxToken)
76+
.modelName(ensureNotNull(model, "model"))
77+
.maxOutputTokens(getOrDefault(maxToken, 512))
9478
.build();
9579
}
9680

@@ -178,7 +162,6 @@ public ZhipuAiChatModelBuilder model(ChatCompletionModel model) {
178162
}
179163

180164
public ZhipuAiChatModelBuilder model(String model) {
181-
ValidationUtils.ensureNotBlank(model, "model");
182165
this.model = model;
183166
return this;
184167
}
@@ -233,6 +216,10 @@ public ZhipuAiChatModelBuilder listeners(List<ChatModelListener> listeners) {
233216
return this;
234217
}
235218

219+
/**
220+
* @deprecated This method is deprecated due to {@link ZhipuAiClient} use {@link dev.langchain4j.http.client.HttpClient} as an http client.
221+
*/
222+
@Deprecated(since = "1.0.0-beta4", forRemoval = true)
236223
public ZhipuAiChatModelBuilder callTimeout(Duration callTimeout) {
237224
this.callTimeout = callTimeout;
238225
return this;
@@ -248,6 +235,10 @@ public ZhipuAiChatModelBuilder readTimeout(Duration readTimeout) {
248235
return this;
249236
}
250237

238+
/**
239+
* @deprecated This method is deprecated due to {@link ZhipuAiClient} use {@link dev.langchain4j.http.client.HttpClient} as an http client.
240+
*/
241+
@Deprecated(since = "1.0.0-beta4", forRemoval = true)
251242
public ZhipuAiChatModelBuilder writeTimeout(Duration writeTimeout) {
252243
this.writeTimeout = writeTimeout;
253244
return this;

models/langchain4j-community-zhipu-ai/src/main/java/dev/langchain4j/community/model/zhipu/ZhipuAiClient.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package dev.langchain4j.community.model.zhipu;
22

3-
import static com.google.common.net.HttpHeaders.AUTHORIZATION;
4-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.finishReasonFrom;
5-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.specificationsFrom;
6-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.toZhipuAiException;
7-
import static dev.langchain4j.community.model.zhipu.DefaultZhipuAiHelper.tokenUsageFrom;
8-
import static dev.langchain4j.community.model.zhipu.Json.OBJECT_MAPPER;
3+
import static dev.langchain4j.community.model.zhipu.AuthorizationUtils.getToken;
4+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.finishReasonFrom;
5+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.specificationsFrom;
6+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.toZhipuAiException;
7+
import static dev.langchain4j.community.model.zhipu.InternalZhipuAiHelper.tokenUsageFrom;
8+
import static dev.langchain4j.community.model.zhipu.Json.fromJson;
99
import static dev.langchain4j.http.client.HttpMethod.POST;
1010
import static dev.langchain4j.internal.Utils.isNotNullOrBlank;
1111
import static dev.langchain4j.internal.Utils.isNullOrEmpty;
@@ -76,7 +76,7 @@ ChatCompletionResponse chatCompletion(ChatCompletionRequest request) {
7676
.url(baseUrl, "api/paas/v4/chat/completions")
7777
.method(POST)
7878
.addHeader("Content-Type", "application/json")
79-
.addHeader(AUTHORIZATION, AuthorizationUtils.getToken(apiKey))
79+
.addHeader("Authorization", getToken(apiKey))
8080
.body(Json.toJson(request))
8181
.build();
8282

@@ -95,7 +95,7 @@ EmbeddingResponse embedAll(EmbeddingRequest request) {
9595
.url(baseUrl, "api/paas/v4/embeddings")
9696
.method(POST)
9797
.addHeader("Content-Type", "application/json")
98-
.addHeader(AUTHORIZATION, AuthorizationUtils.getToken(apiKey))
98+
.addHeader("Authorization", getToken(apiKey))
9999
.body(Json.toJson(request))
100100
.build();
101101
try {
@@ -120,7 +120,7 @@ void streamingChatCompletion(ChatCompletionRequest request, StreamingChatRespons
120120
.url(baseUrl, "api/paas/v4/chat/completions")
121121
.method(POST)
122122
.addHeader("Content-Type", "application/json")
123-
.addHeader(AUTHORIZATION, AuthorizationUtils.getToken(apiKey))
123+
.addHeader("Authorization", getToken(apiKey))
124124
.body(Json.toJson(request))
125125
.build();
126126
ServerSentEventListener eventListener = new ServerSentEventListener() {
@@ -153,7 +153,7 @@ public void onEvent(final ServerSentEvent event) {
153153
handler.onCompleteResponse(response);
154154
} else {
155155
try {
156-
chatCompletionResponse = OBJECT_MAPPER.readValue(data, ChatCompletionResponse.class);
156+
chatCompletionResponse = fromJson(data, ChatCompletionResponse.class);
157157
ChatCompletionChoice zhipuChatCompletionChoice =
158158
chatCompletionResponse.getChoices().get(0);
159159
String chunk = zhipuChatCompletionChoice.getDelta().getContent();
@@ -233,7 +233,7 @@ ImageResponse imagesGeneration(ImageRequest request) {
233233
.url(baseUrl, "api/paas/v4/images/generations")
234234
.method(POST)
235235
.addHeader("Content-Type", "application/json")
236-
.addHeader(AUTHORIZATION, AuthorizationUtils.getToken(apiKey))
236+
.addHeader("Authorization", getToken(apiKey))
237237
.body(Json.toJson(request))
238238
.build();
239239
try {

0 commit comments

Comments
 (0)