Skip to content

Commit f989dfe

Browse files
mxsl-grmarkpollack
authored andcommitted
Update ZhiPuAi model support
- Added additional support for ZhiPuAi models including vision model GLM-4V - Default model changed to GLM_4_Air and update documentation - Added additional unit and integration tests - Add documentation for vision model
1 parent 172c7f1 commit f989dfe

File tree

13 files changed

+409
-23
lines changed

13 files changed

+409
-23
lines changed

models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class MiniMaxApiIT {
4343
void chatCompletionEntity() {
4444
ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);
4545
ResponseEntity<ChatCompletion> response = miniMaxApi
46-
.chatCompletionEntity(new ChatCompletionRequest(List.of(chatCompletionMessage), "abab6.5g", 0.7f, false));
46+
.chatCompletionEntity(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-4-air", 0.7f, false));
4747

4848
assertThat(response).isNotNull();
4949
assertThat(response.getBody()).isNotNull();
@@ -53,7 +53,7 @@ void chatCompletionEntity() {
5353
void chatCompletionStream() {
5454
ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);
5555
Flux<ChatCompletionChunk> response = miniMaxApi
56-
.chatCompletionStream(new ChatCompletionRequest(List.of(chatCompletionMessage), "abab6.5g", 0.7f, true));
56+
.chatCompletionStream(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-4-air", 0.7f, true));
5757

5858
assertThat(response).isNotNull();
5959
assertThat(response.collectList().block()).isNotNull();

models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@
1717

1818
import org.slf4j.Logger;
1919
import org.slf4j.LoggerFactory;
20-
20+
import org.springframework.ai.chat.metadata.ChatGenerationMetadata;
2121
import org.springframework.ai.chat.model.ChatModel;
2222
import org.springframework.ai.chat.model.ChatResponse;
2323
import org.springframework.ai.chat.model.Generation;
2424
import org.springframework.ai.chat.model.StreamingChatModel;
25-
import org.springframework.ai.chat.metadata.ChatGenerationMetadata;
2625
import org.springframework.ai.chat.prompt.ChatOptions;
2726
import org.springframework.ai.chat.prompt.Prompt;
2827
import org.springframework.ai.model.ModelOptionsUtils;
@@ -287,7 +286,7 @@ private String fromMediaData(MimeType mimeType, Object mediaContentData) {
287286
if (mediaContentData instanceof byte[] bytes) {
288287
// Assume the bytes are an image. So, convert the bytes to a base64 encoded
289288
// following the prefix pattern.
290-
return String.format("data:%s;base64,%s", mimeType.toString(), Base64.getEncoder().encodeToString(bytes));
289+
return Base64.getEncoder().encodeToString(bytes);
291290
}
292291
else if (mediaContentData instanceof String text) {
293292
// Assume the text is a URLs or a base64 encoded image prefixed by the user.

models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatOptions.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@
1515
*/
1616
package org.springframework.ai.zhipuai;
1717

18-
import java.util.ArrayList;
19-
import java.util.HashSet;
20-
import java.util.List;
21-
import java.util.Set;
22-
2318
import com.fasterxml.jackson.annotation.JsonIgnore;
2419
import com.fasterxml.jackson.annotation.JsonInclude;
2520
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -33,6 +28,11 @@
3328
import org.springframework.boot.context.properties.NestedConfigurationProperty;
3429
import org.springframework.util.Assert;
3530

31+
import java.util.ArrayList;
32+
import java.util.HashSet;
33+
import java.util.List;
34+
import java.util.Set;
35+
3636
/**
3737
* ZhiPuAiChatOptions represents the options for the ZhiPuAiChat model.
3838
*

models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@
1717

1818
import org.slf4j.Logger;
1919
import org.slf4j.LoggerFactory;
20-
2120
import org.springframework.ai.image.Image;
22-
import org.springframework.ai.image.ImageModel;
2321
import org.springframework.ai.image.ImageGeneration;
22+
import org.springframework.ai.image.ImageModel;
2423
import org.springframework.ai.image.ImageOptions;
2524
import org.springframework.ai.image.ImagePrompt;
2625
import org.springframework.ai.image.ImageResponse;

models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/api/ZhiPuAiApi.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.fasterxml.jackson.annotation.JsonInclude;
1919
import com.fasterxml.jackson.annotation.JsonInclude.Include;
2020
import com.fasterxml.jackson.annotation.JsonProperty;
21-
2221
import org.springframework.ai.model.ModelDescription;
2322
import org.springframework.ai.model.ModelOptionsUtils;
2423
import org.springframework.ai.retry.RetryUtils;
@@ -49,7 +48,7 @@
4948
*/
5049
public class ZhiPuAiApi {
5150

52-
public static final String DEFAULT_CHAT_MODEL = ChatModel.GLM_3_Turbo.getValue();
51+
public static final String DEFAULT_CHAT_MODEL = ChatModel.GLM_4_Air.getValue();
5352
public static final String DEFAULT_EMBEDDING_MODEL = EmbeddingModel.Embedding_2.getValue();
5453
private static final Predicate<String> SSE_DONE_PREDICATE = "[DONE]"::equals;
5554

@@ -115,6 +114,10 @@ public ZhiPuAiApi(String baseUrl, String zhiPuAiToken, RestClient.Builder restCl
115114
*/
116115
public enum ChatModel implements ModelDescription {
117116
GLM_4("GLM-4"),
117+
GLM_4V("glm-4v"),
118+
GLM_4_Air("glm-4-air"),
119+
GLM_4_AirX("glm-4-airx"),
120+
GLM_4_Flash("glm-4-flash"),
118121
GLM_3_Turbo("GLM-3-Turbo");
119122

120123
public final String value;

models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiIT.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import org.junit.jupiter.api.Test;
1919
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
20-
2120
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletion;
2221
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionChunk;
2322
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage;
@@ -44,8 +43,8 @@ public class ZhiPuAiApiIT {
4443
@Test
4544
void chatCompletionEntity() {
4645
ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);
47-
ResponseEntity<ChatCompletion> response = zhiPuAiApi.chatCompletionEntity(
48-
new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-3-turbo", 0.7f, false));
46+
ResponseEntity<ChatCompletion> response = zhiPuAiApi
47+
.chatCompletionEntity(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-4-air", 0.7f, false));
4948

5049
assertThat(response).isNotNull();
5150
assertThat(response.getBody()).isNotNull();
@@ -55,7 +54,7 @@ void chatCompletionEntity() {
5554
void chatCompletionStream() {
5655
ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);
5756
Flux<ChatCompletionChunk> response = zhiPuAiApi
58-
.chatCompletionStream(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-3-turbo", 0.7f, true));
57+
.chatCompletionStream(new ChatCompletionRequest(List.of(chatCompletionMessage), "glm-4-air", 0.7f, true));
5958

6059
assertThat(response).isNotNull();
6160
assertThat(response.collectList().block()).isNotNull();
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright 2023 - 2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.ai.zhipuai.chat;
17+
18+
import java.util.List;
19+
20+
/**
21+
* @author Geng Rong
22+
*/
23+
public class ActorsFilms {
24+
25+
private String actor;
26+
27+
private List<String> movies;
28+
29+
public ActorsFilms() {
30+
}
31+
32+
public String getActor() {
33+
return actor;
34+
}
35+
36+
public void setActor(String actor) {
37+
this.actor = actor;
38+
}
39+
40+
public List<String> getMovies() {
41+
return movies;
42+
}
43+
44+
public void setMovies(List<String> movies) {
45+
this.movies = movies;
46+
}
47+
48+
@Override
49+
public String toString() {
50+
return "ActorsFilms{" + "actor='" + actor + '\'' + ", movies=" + movies + '}';
51+
}
52+
53+
}

0 commit comments

Comments
 (0)