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 all 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,185 @@
package dev.langchain4j.community.model.zhipu;

import static dev.langchain4j.internal.Utils.getOrDefault;
import static dev.langchain4j.spi.ServiceHelper.loadFactories;
import static java.time.Duration.ofSeconds;

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.ZhipuAssistantBuilderFactory;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.model.StreamingResponseHandler;
import java.time.Duration;
import java.util.List;

/**
* <a href="https://open.bigmodel.cn/dev/api/Agent_Platform/agent">QingLiu Agent</a>
*/
public class ZhipuAiAssistant {

private final String appId;
private final ZhipuAssistantClient client;

public ZhipuAiAssistant(
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/"))
.apiKey(apiKey)
.callTimeout(getOrDefault(callTimeout, ofSeconds(60)))
.connectTimeout(connectTimeout)
.writeTimeout(writeTimeout)
.readTimeout(readTimeout)
.logRequests(getOrDefault(logRequests, false))
.logResponses(getOrDefault(logResponses, false))
.build();
}

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

/**
* Obtain the input parameters of the intelligent agent (application).
*/
public List<AssistantKeyValuePair> variables() {
return client.variables(appId);
}

/**
* Create a new session
*/
public String getConversationId() {
ConversationId conversation = client.conversation(appId);
return conversation.getConversationId();
}

/**
* Create session request.
* @param conversationId Conversation ID
* @param keyValuePairs input parameters
*/
public String getRequestId(String conversationId, List<AssistantKeyValuePair> keyValuePairs) {
ConversationRequest request = ConversationRequest.builder()
.appId(appId)
.conversationId(conversationId)
.keyValuePairs(keyValuePairs)
.build();
return client.generate(request).getId();
}

public void generate(
String conversationId,
List<AssistantKeyValuePair> keyValuePairs,
StreamingResponseHandler<AiMessage> handler) {
String requestId = getRequestId(conversationId, keyValuePairs);
this.generate(requestId, handler);
}

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

/**
* Recommended questions
*
* @param conversationId Conversation ID
*/
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 ZhipuAiAssistantBuilder {

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 ZhipuAiAssistantBuilder baseUrl(String baseUrl) {
this.baseUrl = baseUrl;
return this;
}

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

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

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

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

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

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

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

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

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