Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Zhipu Qingliu Agent implementation #47

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8d6972c
[FEATURE] Add Zhipu Qingliu Agent implementation
cuiwei4j Jan 9, 2025
d55200f
[FEATURE] Add Zhipu Qingliu Agent Test
cuiwei4j Jan 9, 2025
09c3265
fix: history_session_record HTTP method changed from POST to GET, and…
cuiwei4j Jan 9, 2025
22e4a6c
fix: Add appId verification to the test cases. At the same time, hand…
cuiwei4j Jan 10, 2025
085a3e1
Remove comments to prevent the failure of packaging the doc.
cuiwei4j Jan 10, 2025
b5aba45
Update models/langchain4j-community-zhipu-ai/src/main/java/dev/langch…
cuiwei4j Jan 10, 2025
101cb15
Update models/langchain4j-community-zhipu-ai/src/main/java/dev/langch…
cuiwei4j Jan 10, 2025
c911a63
Update models/langchain4j-community-zhipu-ai/src/main/java/dev/langch…
cuiwei4j Jan 10, 2025
e2cd224
Update models/langchain4j-community-zhipu-ai/src/main/java/dev/langch…
cuiwei4j Jan 10, 2025
a3e4f67
Update models/langchain4j-community-zhipu-ai/src/main/java/dev/langch…
cuiwei4j Jan 10, 2025
faefb01
Update models/langchain4j-community-zhipu-ai/src/main/java/dev/langch…
cuiwei4j Jan 10, 2025
541a396
Update models/langchain4j-community-zhipu-ai/src/main/java/dev/langch…
cuiwei4j Jan 10, 2025
e8181f3
Update: Standardize the code
cuiwei4j Jan 10, 2025
7c46d09
Modify the comments
cuiwei4j Jan 10, 2025
1d8cd96
Modify the test class name.
cuiwei4j Jan 10, 2025
73acfc8
Fix the JSON parsing exception returned by content security risk moni…
cuiwei4j Jan 10, 2025
b3fb9e4
Update: Open API method.
cuiwei4j Jan 11, 2025
2c0dc0d
Update: Change basic data types to wrapper types.
cuiwei4j Jan 15, 2025
00c1595
Update: When a recommended question fails, set the error status code …
cuiwei4j Jan 22, 2025
776a538
fix: Fix the issue where exceptions cannot be caught due to errors in…
cuiwei4j Feb 13, 2025
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package dev.langchain4j.community.model.zhipu;

import dev.langchain4j.community.model.zhipu.assistant.AssistantCompletion;
import dev.langchain4j.community.model.zhipu.assistant.AssistantSupportResponse;
import dev.langchain4j.community.model.zhipu.assistant.conversation.ConversationRequest;
import dev.langchain4j.community.model.zhipu.assistant.conversation.ConversationResponse;
import dev.langchain4j.community.model.zhipu.assistant.problem.ProblemsResponse;
import dev.langchain4j.community.model.zhipu.chat.ChatCompletionRequest;
import dev.langchain4j.community.model.zhipu.chat.ChatCompletionResponse;
import dev.langchain4j.community.model.zhipu.embedding.EmbeddingRequest;
Expand All @@ -9,8 +14,10 @@
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Streaming;

interface ZhipuAiApi {
Expand All @@ -31,4 +38,25 @@ interface ZhipuAiApi {
@POST("api/paas/v4/images/generations")
@Headers({"Content-Type: application/json"})
Call<ImageResponse> generations(@Body ImageRequest request);

@GET("api/llm-application/open/v2/application/{app_id}/variables")
@Headers({"Content-Type: application/json"})
Call<AssistantSupportResponse> variables(@Path("app_id") String appId);

@POST("api/llm-application/open/v2/application/{app_id}/conversation")
@Headers({"Content-Type: application/json"})
Call<ConversationResponse> conversation(@Path("app_id") String appId);

@POST("api/llm-application/open/v2/application/generate_request_id")
@Headers({"Content-Type: application/json"})
Call<ConversationResponse> generateRequestId(@Body ConversationRequest request);

@Streaming
@POST("api/llm-application/open/v2/model-api/{id}/sse-invoke")
@Headers({"Content-Type: application/json"})
Call<AssistantCompletion> sseInvoke(@Path("id") String id);

@GET("api/llm-application/open/history_session_record/{app_id}/{conversation_id}")
@Headers({"Content-Type: application/json"})
Call<ProblemsResponse> sessionRecord(@Path("app_id") String appId, @Path("conversation_id") String conversationId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
package dev.langchain4j.community.model.zhipu;

import static dev.langchain4j.internal.Utils.getOrDefault;
import static dev.langchain4j.spi.ServiceHelper.loadFactories;

import dev.langchain4j.community.model.zhipu.assistant.AssistantKeyValuePair;
import dev.langchain4j.community.model.zhipu.assistant.AssistantType;
import dev.langchain4j.community.model.zhipu.assistant.conversation.ConversationId;
import dev.langchain4j.community.model.zhipu.assistant.conversation.ConversationRequest;
import dev.langchain4j.community.model.zhipu.assistant.problem.Problems;
import dev.langchain4j.community.model.zhipu.spi.ZhipuAssistantChatModelBuilderFactory;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.model.StreamingResponseHandler;
import java.time.Duration;
import java.util.List;

public class ZhipuAssistantChatModel {

private final String appId;
private final ZhipuAssistantClient client;

public ZhipuAssistantChatModel(
String baseUrl,
String apiKey,
String appId,
Boolean logRequests,
Boolean logResponses,
Duration callTimeout,
Duration connectTimeout,
Duration readTimeout,
Duration writeTimeout) {
this.appId = appId;
this.client = ZhipuAssistantClient.builder()
.baseUrl(getOrDefault(baseUrl, "https://open.bigmodel.cn/"))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about settting the default value in ZhipuAiClient as currently all model set the default baseUrl in their own, and it is hard to maintain. WDYT?

.apiKey(apiKey)
.callTimeout(callTimeout)
.connectTimeout(connectTimeout)
.writeTimeout(writeTimeout)
.readTimeout(readTimeout)
.logRequests(getOrDefault(logRequests, false))
.logResponses(getOrDefault(logResponses, false))
.build();
}

public static ZhipuAssistantChatModelBuilder builder() {
for (ZhipuAssistantChatModelBuilderFactory factories :
loadFactories(ZhipuAssistantChatModelBuilderFactory.class)) {
return factories.get();
}
return new ZhipuAssistantChatModelBuilder();
}

public List<AssistantKeyValuePair> variables() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please adding some javadoc?

return client.variables(appId);
}

public ConversationId conversation() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please adding some javadoc?

return client.conversation(appId);
}

public void generate(
String conversationId,
List<AssistantKeyValuePair> keyValuePairs,
StreamingResponseHandler<AiMessage> handler) {
final ConversationRequest request = ConversationRequest.builder()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
final ConversationRequest request = ConversationRequest.builder()
ConversationRequest request = ConversationRequest.builder()

.appId(appId)
.conversationId(conversationId)
.keyValuePairs(keyValuePairs)
.build();
final ConversationId reqId = client.generate(request);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
final ConversationId reqId = client.generate(request);
ConversationId reqId = client.generate(request);

this.generate(reqId, handler);
}

public void generate(ConversationId request, StreamingResponseHandler<AiMessage> handler) {
client.sseInvoke(request, handler);
}

/**
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please translate the javadoc to English?

* 推荐问题
*
* @param conversationId 会话ID
* @return Problems
*/
public Problems sessionRecord(String conversationId) {
return client.sessionRecord(appId, conversationId);
}

public AssistantKeyValuePair initMessage(String content) {
AssistantKeyValuePair keyValuePair = new AssistantKeyValuePair();
keyValuePair.setId("user");
keyValuePair.setName("用户提问");
keyValuePair.setType(AssistantType.INPUT.serialize());
keyValuePair.setValue(content);
return keyValuePair;
}

public static class ZhipuAssistantChatModelBuilder {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public static class ZhipuAssistantChatModelBuilder {
public static class ZhipuAssistantBuilder {


private String baseUrl;
private String apiKey;
private String appId;
private Boolean logRequests;
private Boolean logResponses;
private Duration callTimeout;
private Duration connectTimeout;
private Duration readTimeout;
private Duration writeTimeout;

public ZhipuAssistantChatModelBuilder baseUrl(String baseUrl) {
this.baseUrl = baseUrl;
return this;
}

public ZhipuAssistantChatModelBuilder apiKey(String apiKey) {
this.apiKey = apiKey;
return this;
}

public ZhipuAssistantChatModelBuilder appId(String appId) {
this.appId = appId;
return this;
}

public ZhipuAssistantChatModelBuilder logRequests(Boolean logRequests) {
this.logRequests = logRequests;
return this;
}

public ZhipuAssistantChatModelBuilder logResponses(Boolean logResponses) {
this.logResponses = logResponses;
return this;
}

public ZhipuAssistantChatModelBuilder callTimeout(Duration callTimeout) {
this.callTimeout = callTimeout;
return this;
}

public ZhipuAssistantChatModelBuilder connectTimeout(Duration connectTimeout) {
this.connectTimeout = connectTimeout;
return this;
}

public ZhipuAssistantChatModelBuilder readTimeout(Duration readTimeout) {
this.readTimeout = readTimeout;
return this;
}

public ZhipuAssistantChatModelBuilder writeTimeout(Duration writeTimeout) {
this.writeTimeout = writeTimeout;
return this;
}

public ZhipuAssistantChatModel build() {
return new ZhipuAssistantChatModel(
this.baseUrl,
this.apiKey,
this.appId,
this.logRequests,
this.logResponses,
this.callTimeout,
this.connectTimeout,
this.readTimeout,
this.writeTimeout);
}
}
}
Loading
Loading