chore: add agent sample and fix agent (#16)

This commit is contained in:
tomsun28 2025-07-23 16:44:00 +08:00 committed by GitHub
parent b22470dd77
commit 363843cf3a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 703 additions and 16 deletions

View file

@ -0,0 +1,51 @@
package ai.z.openapi.service.agents;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@Builder
public class AgentContent {
/** 消息类型 text image_url video_url */
private String type;
/** 消息内容 when type is text */
private String text;
/** 消息图片URL when type is image_url */
@JsonProperty("image_url")
private String imageUrl;
/** 消息视频URL when type is video_url */
@JsonProperty("video_url")
private String videoUrl;
/** 消息对象 when type is object */
@JsonProperty("object")
private Object object;
public static AgentContent ofText(String text) {
return AgentContent.builder().type("text").text(text).build();
}
public static AgentContent ofImageUrl(String imageUrl) {
return AgentContent.builder().type("image_url").imageUrl(imageUrl).build();
}
public static AgentContent ofVideoUrl(String videoUrl) {
return AgentContent.builder().type("video_url").videoUrl(videoUrl).build();
}
public static AgentContent ofObject(Object object) {
return AgentContent.builder().type("object").object(object).build();
}
}

View file

@ -0,0 +1,21 @@
package ai.z.openapi.service.agents;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AgentMessage {
private String role;
/**
* list AgentContent or One AgentContent
*/
private Object content;
}

View file

@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.node.ObjectNode;
import ai.z.openapi.core.model.ClientRequest;
import ai.z.openapi.service.CommonRequest;
import ai.z.openapi.service.model.ChatMessage;
import ai.z.openapi.service.model.SensitiveWordCheckRequest;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -35,7 +34,7 @@ public class AgentsCompletionRequest extends CommonRequest implements ClientRequ
/**
* Message body
*/
private List<ChatMessage> messages;
private List<AgentMessage> messages;
/**
* Synchronous call: false, SSE call: true

View file

@ -1,11 +1,14 @@
package ai.z.openapi.service.model;
import ai.z.openapi.service.agents.AgentMessage;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ -21,6 +24,12 @@ public class Choice {
@JsonProperty("message")
private ChatMessage message;
/**
* for agent message
*/
@JsonProperty("messages")
private List<AgentMessage> messages;
@JsonProperty("delta")
private Delta delta;

View file

@ -68,9 +68,9 @@ public class AgentServiceTest {
@EnabledIfEnvironmentVariable(named = "ZAI_API_KEY", matches = "^[^.]+\\.[^.]+$")
void testSyncAgentCompletion() throws JsonProcessingException {
// Prepare test data
List<ChatMessage> messages = new ArrayList<>();
ChatMessage userMessage = new ChatMessage(ChatMessageRole.USER.value(),
"Hello, please translate this to Chinese: How are you?");
List<AgentMessage> messages = new ArrayList<>();
AgentMessage userMessage = new AgentMessage(ChatMessageRole.USER.value(),
AgentContent.ofText("Hello, please translate this to Chinese: How are you?"));
messages.add(userMessage);
String requestId = String.format(REQUEST_ID_TEMPLATE, System.currentTimeMillis());
@ -101,9 +101,9 @@ public class AgentServiceTest {
@EnabledIfEnvironmentVariable(named = "ZAI_API_KEY", matches = "^[^.]+\\.[^.]+$")
void testStreamAgentCompletion() throws JsonProcessingException {
// Prepare test data
List<ChatMessage> messages = new ArrayList<>();
ChatMessage userMessage = new ChatMessage(ChatMessageRole.USER.value(),
"Please translate this to Chinese: The weather is beautiful today");
List<AgentMessage> messages = new ArrayList<>();
AgentMessage userMessage = new AgentMessage(ChatMessageRole.USER.value(),
AgentContent.ofText("Please translate this to Chinese: The weather is beautiful today"));
messages.add(userMessage);
String requestId = String.format(REQUEST_ID_TEMPLATE, System.currentTimeMillis());
@ -207,8 +207,8 @@ public class AgentServiceTest {
@Test
@DisplayName("Test Parameter Validation - Null Agent ID")
void testValidation_NullAgentId() {
List<ChatMessage> messages = new ArrayList<>();
messages.add(new ChatMessage(ChatMessageRole.USER.value(), "Test message"));
List<AgentMessage> messages = new ArrayList<>();
messages.add(new AgentMessage(ChatMessageRole.USER.value(), "Test message"));
AgentsCompletionRequest request = AgentsCompletionRequest.builder().messages(messages).build();
@ -231,14 +231,16 @@ public class AgentServiceTest {
@DisplayName("Test Multi-turn Conversation with Agent")
@EnabledIfEnvironmentVariable(named = "ZAI_API_KEY", matches = "^[^.]+\\.[^.]+$")
void testMultiTurnConversationWithAgent() throws JsonProcessingException {
List<ChatMessage> messages = new ArrayList<>();
List<AgentMessage> messages = new ArrayList<>();
// First round of conversation
messages.add(new ChatMessage(ChatMessageRole.USER.value(), "Please translate 'Hello' to Chinese"));
messages.add(new ChatMessage(ChatMessageRole.ASSISTANT.value(), "你好"));
messages.add(new AgentMessage(ChatMessageRole.USER.value(),
AgentContent.ofText("Please translate 'Hello' to Chinese")));
messages.add(new AgentMessage(ChatMessageRole.ASSISTANT.value(), AgentContent.ofText("你好")));
// Second round of conversation
messages.add(new ChatMessage(ChatMessageRole.USER.value(), "Now translate 'Thank you' to Chinese"));
messages.add(new AgentMessage(ChatMessageRole.USER.value(),
AgentContent.ofText("Now translate 'Thank you' to Chinese")));
String requestId = String.format(REQUEST_ID_TEMPLATE, System.currentTimeMillis());
@ -264,8 +266,9 @@ public class AgentServiceTest {
@DisplayName("Test Agent Completion with Custom Variables")
@EnabledIfEnvironmentVariable(named = "ZAI_API_KEY", matches = "^[^.]+\\.[^.]+$")
void testAgentCompletionWithCustomVariables() throws JsonProcessingException {
List<ChatMessage> messages = new ArrayList<>();
ChatMessage userMessage = new ChatMessage(ChatMessageRole.USER.value(), "Translate this text");
List<AgentMessage> messages = new ArrayList<>();
AgentMessage userMessage = new AgentMessage(ChatMessageRole.USER.value(),
AgentContent.ofText("Translate this text"));
messages.add(userMessage);
String requestId = String.format(REQUEST_ID_TEMPLATE, System.currentTimeMillis());

View file

@ -0,0 +1,82 @@
package ai.z.openapi.samples;
import ai.z.openapi.ZaiClient;
import ai.z.openapi.service.agents.AgentContent;
import ai.z.openapi.service.agents.AgentMessage;
import ai.z.openapi.service.agents.AgentsCompletionRequest;
import ai.z.openapi.service.agents.AgentAsyncResultRetrieveParams;
import ai.z.openapi.service.model.ChatCompletionResponse;
import ai.z.openapi.service.model.ChatMessage;
import ai.z.openapi.service.model.ChatMessageRole;
import ai.z.openapi.service.model.Choice;
import ai.z.openapi.service.model.ModelData;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Agent Example
* Demonstrates how to use ZaiClient for agent-based completions
*/
public class AgentExample {
public static void main(String[] args) {
// Create client, recommended to set API Key via environment variable
// export ZAI_API_KEY=your.api.key
ZaiClient client = ZaiClient.builder().ofZHIPU().build();
// Or set API Key via code
// ZaiClient client = ZaiClient.builder()
// .apiKey("your.api.key.your.api.secret")
// .build();
syncAgentCompletion(client);
}
/**
* Example of synchronous agent completion
*/
private static void syncAgentCompletion(ZaiClient client) {
System.out.println("\n=== Synchronous Agent Completion Example ===");
// Create messages for the agent
List<AgentMessage> messages = new ArrayList<>();
AgentMessage userMessage = new AgentMessage(
ChatMessageRole.USER.value(),
Arrays.asList(AgentContent.ofText("Hello, please translate this to French: How are you today?"))
);
messages.add(userMessage);
// Create agent completion request
AgentsCompletionRequest request = AgentsCompletionRequest.builder()
.agentId("general_translation") // Using translation agent
.stream(false) // Non-streaming mode
.messages(messages)
.customVariables(JsonNodeFactory.instance.objectNode().put("source_lang", "en").put("target_lang", "cn"))
.requestId("agent-example-" + System.currentTimeMillis())
.build();
try {
// Execute request
ChatCompletionResponse response = client.agents().createAgentCompletion(request);
if (response.isSuccess()) {
System.out.println("Agent completion successful!");
// Display agent response
Object content = response.getData().getChoices().get(0).getMessages();
System.out.println("\nResponse: " + new ObjectMapper().writeValueAsString(content));
} else {
System.err.println("Error: " + response.getMsg());
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,89 @@
package ai.z.openapi.samples;
import ai.z.openapi.ZaiClient;
import ai.z.openapi.core.Constants;
import ai.z.openapi.service.videos.VideoCreateParams;
import ai.z.openapi.service.videos.VideosResponse;
/**
* CogVideoX Example
* Demonstrates how to use ZaiClient to generate videos using CogVideoX models
*/
public class CogVideoXExample {
public static void main(String[] args) {
// Create client, recommended to set API Key via environment variable
// export ZAI_API_KEY=your.api.key
ZaiClient client = ZaiClient.builder().build();
// Or set API Key via code
// ZaiClient client = ZaiClient.builder()
// .apiKey("your.api.key.your.api.secret")
// .build();
// Basic Video Generation
generateBasicVideo(client);
}
/**
* Example of basic video generation using CogVideoX
*/
private static void generateBasicVideo(ZaiClient client) {
System.out.println("\n=== Basic CogVideoX Generation Example ===");
// Create video generation request
VideoCreateParams request = VideoCreateParams.builder()
.model(Constants.ModelCogVideoX) // Using CogVideoX model
.prompt("A beautiful sunset over the ocean with waves gently crashing on the shore")
.requestId("cogvideox-example-" + System.currentTimeMillis())
.build();
try {
// Execute request
VideosResponse response = client.videos().videoGenerations(request);
if (response.isSuccess()) {
System.out.println("Video generation request successful!");
System.out.println("Task ID: " + response.getData().getId());
System.out.println("\nNote: Video generation is an asynchronous process.");
System.out.println("Use the Task ID to check the status and retrieve the result later.");
} else {
System.err.println("Error: " + response.getMsg());
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Example of checking video generation result
* Note: You need to replace the taskId with a real task ID from a previous generation request
*/
private static void checkVideoResult(ZaiClient client) {
System.out.println("\n=== Check Video Generation Result Example ===");
// Replace with a real task ID from a previous generation request
String taskId = "your-task-id-here";
System.out.println("Checking result for task ID: " + taskId);
System.out.println("Note: In a real application, replace 'your-task-id-here' with an actual task ID.");
try {
// Skip the actual API call in this example to avoid errors with a fake task ID
if (!taskId.equals("your-task-id-here")) {
// Execute request to check result
VideosResponse response = client.videos().videoGenerationsResult(taskId);
if (response.isSuccess()) {
System.out.println("Video generation: " + response.getData());
} else {
System.err.println("Error: " + response.getMsg());
}
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,129 @@
package ai.z.openapi.samples;
import ai.z.openapi.ZaiClient;
import ai.z.openapi.core.Constants;
import ai.z.openapi.service.videos.VideoCreateParams;
import ai.z.openapi.service.videos.VideosResponse;
import java.io.File;
import java.io.IOException;
import java.util.Base64;
import org.apache.commons.io.FileUtils;
/**
* Vidu Image-to-Video Example
* Demonstrates how to use ZaiClient to generate videos from images using Vidu models
*/
public class ViduImageToVideoExample {
public static void main(String[] args) {
// Create client, recommended to set API Key via environment variable
// export ZAI_API_KEY=your.api.key
ZaiClient client = ZaiClient.builder().build();
// Or set API Key via code
// ZaiClient client = ZaiClient.builder()
// .apiKey("your.api.key.your.api.secret")
// .build();
// Generate video from image using Vidu
generateVideoFromImage(client);
}
/**
* Example of generating video from an image using Vidu
* Note: You need to provide a valid image file path
*/
private static void generateVideoFromImage(ZaiClient client) {
System.out.println("\n=== Vidu Image-to-Video Generation Example ===");
// Path to your image file
// In a real application, replace with an actual image path
String imagePath = "path/to/your/image.jpg";
try {
// For demonstration purposes, we'll skip the actual file reading
// In a real application, you would read and encode the image file
String imageBase64 = "sample_base64_string";
// Uncomment the following code to read and encode a real image file
/*
File imageFile = new File(imagePath);
if (imageFile.exists()) {
byte[] fileContent = FileUtils.readFileToByteArray(imageFile);
imageBase64 = Base64.getEncoder().encodeToString(fileContent);
} else {
System.err.println("Image file not found: " + imagePath);
return;
}
*/
// Create video generation request
VideoCreateParams request = VideoCreateParams.builder()
.model(Constants.ModelVidu2Image) // Using Vidu 2 Image model
.prompt("Transform this image into a dynamic scene with gentle movement")
.imageUrl(imageBase64) // Base64 encoded image
.requestId("vidu-image-example-" + System.currentTimeMillis())
.duration(5) // 5 seconds duration
.build();
// Skip the actual API call in this example to avoid errors with a fake image
System.out.println("In a real application, the following code would be executed:");
System.out.println("VideosResponse response = client.videos().videoGenerations(request);");
System.out.println("\nNote: This example is skipping the actual API call since we're using a placeholder image.");
System.out.println("To run this example with a real image, uncomment the image reading code and provide a valid image path.");
// Uncomment the following code to make the actual API call with a real image
/*
// Execute request
VideosResponse response = client.videos().videoGenerations(request);
if (response.isSuccess()) {
System.out.println("Video generation request successful!");
System.out.println("Task ID: " + response.getData().getId());
System.out.println("Status: " + response.getData().getStatus());
System.out.println("\nNote: Video generation is an asynchronous process.");
System.out.println("Use the Task ID to check the status and retrieve the result later.");
} else {
System.err.println("Error: " + response.getMsg());
}
*/
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Example of checking video generation result
* Note: You need to replace the taskId with a real task ID from a previous generation request
*/
private static void checkVideoResult(ZaiClient client) {
System.out.println("\n=== Check Video Generation Result Example ===");
// Replace with a real task ID from a previous generation request
String taskId = "your-task-id-here";
System.out.println("Checking result for task ID: " + taskId);
System.out.println("Note: In a real application, replace 'your-task-id-here' with an actual task ID.");
try {
// Skip the actual API call in this example to avoid errors with a fake task ID
if (!taskId.equals("your-task-id-here")) {
// Execute request to check result
VideosResponse response = client.videos().videoGenerationsResult(taskId);
if (response.isSuccess()) {
System.out.println("Video generation: " + response.getData());
} else {
System.err.println("Error: " + response.getMsg());
}
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,127 @@
package ai.z.openapi.samples;
import ai.z.openapi.ZaiClient;
import ai.z.openapi.core.Constants;
import ai.z.openapi.service.videos.VideoCreateParams;
import ai.z.openapi.service.videos.VideosResponse;
/**
* Vidu Text-to-Video Example
* Demonstrates how to use ZaiClient to generate videos from text using Vidu models
*/
public class ViduTextToVideoExample {
public static void main(String[] args) {
// Create client, recommended to set API Key via environment variable
// export ZAI_API_KEY=your.api.key
ZaiClient client = ZaiClient.builder().build();
// Or set API Key via code
// ZaiClient client = ZaiClient.builder()
// .apiKey("your.api.key.your.api.secret")
// .build();
// Example: Generate video from text using Vidu
generateVideoFromText(client);
}
/**
* Example of generating video from text using Vidu
*/
private static void generateVideoFromText(ZaiClient client) {
System.out.println("\n=== Vidu Text-to-Video Generation Example ===");
// Create video generation request
VideoCreateParams request = VideoCreateParams.builder()
.model(Constants.ModelViduQ1Text) // Using Vidu Q1 Text model
.prompt("A person walking through a beautiful forest with sunlight filtering through the trees")
.requestId("vidu-text-example-" + System.currentTimeMillis())
.build();
try {
// Execute request
VideosResponse response = client.videos().videoGenerations(request);
if (response.isSuccess()) {
System.out.println("Video generation request successful!");
System.out.println("Task ID: " + response.getData().getId());
System.out.println("Data: " + response.getData());
System.out.println("\nNote: Video generation is an asynchronous process.");
System.out.println("Use the Task ID to check the status and retrieve the result later.");
} else {
System.err.println("Error: " + response.getMsg());
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Example of generating video from text with custom settings
*/
private static void generateVideoFromTextWithCustomSettings(ZaiClient client) {
System.out.println("\n=== Vidu Text-to-Video with Custom Settings Example ===");
// Create video generation request with custom settings
VideoCreateParams request = VideoCreateParams.builder()
.model(Constants.ModelViduQ1Text) // Using Vidu Q1 Text model
.prompt("An astronaut floating in space with Earth visible in the background, anime style")
.requestId("vidu-text-custom-example-" + System.currentTimeMillis())
.quality("high") // High quality setting
.withAudio(true) // Generate with audio
.size("1280x720") // Custom resolution
.duration(8) // 8 seconds duration
.fps(30) // 30 frames per second
.build();
try {
// Execute request
VideosResponse response = client.videos().videoGenerations(request);
if (response.isSuccess()) {
System.out.println("Custom video generation request successful!");
System.out.println("Task ID: " + response.getData().getId());
System.out.println("Data: " + response.getData());
System.out.println("\nNote: Video generation is an asynchronous process.");
System.out.println("Use the Task ID to check the status and retrieve the result later.");
} else {
System.err.println("Error: " + response.getMsg());
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Example of checking video generation result
* Note: You need to replace the taskId with a real task ID from a previous generation request
*/
private static void checkVideoResult(ZaiClient client) {
System.out.println("\n=== Check Video Generation Result Example ===");
// Replace with a real task ID from a previous generation request
String taskId = "your-task-id-here";
System.out.println("Checking result for task ID: " + taskId);
System.out.println("Note: In a real application, replace 'your-task-id-here' with an actual task ID.");
try {
// Skip the actual API call in this example to avoid errors with a fake task ID
if (!taskId.equals("your-task-id-here")) {
// Execute request to check result
VideosResponse response = client.videos().videoGenerationsResult(taskId);
if (response.isSuccess()) {
System.out.println("Video generation: " + response.getData());
} else {
System.err.println("Error: " + response.getMsg());
}
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,177 @@
package ai.z.openapi.samples;
import ai.z.openapi.ZaiClient;
import ai.z.openapi.service.model.ChatMessageRole;
import ai.z.openapi.service.tools.ChoiceDelta;
import ai.z.openapi.service.tools.SearchChatMessage;
import ai.z.openapi.service.tools.WebSearchApiResponse;
import ai.z.openapi.service.tools.WebSearchMessage;
import ai.z.openapi.service.tools.WebSearchParamsRequest;
import ai.z.openapi.service.web_search.WebSearchRequest;
import ai.z.openapi.service.web_search.WebSearchResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Web Search Example
* Demonstrates how to use ZaiClient for web search capabilities
*/
public class WebSearchExample {
public static void main(String[] args) {
// Create client, recommended to set API Key via environment variable
// export ZAI_API_KEY=your.api.key
ZaiClient client = ZaiClient.builder().build();
// Or set API Key via code
// ZaiClient client = ZaiClient.builder()
// .apiKey("your.api.key.your.api.secret")
// .build();
// Example 1: Basic Web Search
basicWebSearch(client);
}
/**
* Example of basic web search functionality
*/
private static void basicWebSearch(ZaiClient client) {
System.out.println("\n=== Basic Web Search Example ===");
// Create web search request
WebSearchRequest request = WebSearchRequest.builder()
.searchEngine("search_std")
.searchQuery("latest AI technology trends")
.count(3) // Number of results to return
.searchRecencyFilter("oneYear") // Filter for results within the last year
.contentSize("high") // Request detailed content
.requestId("web-search-example-" + System.currentTimeMillis())
.build();
try {
// Execute request
WebSearchResponse response = client.webSearch().createWebSearch(request);
if (response.isSuccess()) {
System.out.println("Search successful!");
System.out.println("Number of results: " + response.getData().getWebSearchResp().size());
// Display search results
response.getData().getWebSearchResp().forEach(result -> {
System.out.println("\nTitle: " + result.getTitle());
System.out.println("Result: " + result);
});
} else {
System.err.println("Error: " + response.getMsg());
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Example of web search pro functionality (non-streaming)
*/
private static void webSearchPro(ZaiClient client) {
System.out.println("\n=== Web Search Pro Example ===");
// Create messages for the search
List<SearchChatMessage> messages = new ArrayList<>();
SearchChatMessage userMessage = new SearchChatMessage(
ChatMessageRole.USER.value(),
"What are the latest developments in quantum computing?"
);
messages.add(userMessage);
// Create web search pro request
WebSearchParamsRequest request = WebSearchParamsRequest.builder()
.model("web-search-pro")
.stream(false) // Non-streaming mode
.messages(messages)
.requestId("web-search-pro-example-" + System.currentTimeMillis())
.build();
try {
// Execute request
WebSearchApiResponse response = client.webSearch().createWebSearchPro(request);
if (response.isSuccess()) {
System.out.println("Search successful!");
// Display search result
WebSearchMessage content = response.getData().getChoices().get(0).getMessage();
System.out.println("\nResponse: " + content);
} else {
System.err.println("Error: " + response.getMsg());
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Example of web search pro with streaming functionality
*/
private static void webSearchProStream(ZaiClient client) {
System.out.println("\n=== Web Search Pro Streaming Example ===");
// Create messages for the search
List<SearchChatMessage> messages = new ArrayList<>();
SearchChatMessage userMessage = new SearchChatMessage(
ChatMessageRole.USER.value(),
"What are the recent advancements in renewable energy?"
);
messages.add(userMessage);
// Create web search pro streaming request
WebSearchParamsRequest request = WebSearchParamsRequest.builder()
.model("web-search-pro")
.stream(true) // Enable streaming
.messages(messages)
.requestId("web-search-pro-stream-example-" + System.currentTimeMillis())
.build();
try {
// Execute streaming request
WebSearchApiResponse response = client.webSearch().createWebSearchProStream(request);
if (response.isSuccess() && response.getFlowable() != null) {
System.out.println("Streaming search started...");
// Track streaming progress
AtomicInteger messageCount = new AtomicInteger(0);
AtomicBoolean isFirst = new AtomicBoolean(true);
StringBuilder fullContent = new StringBuilder();
// Subscribe to the stream
response.getFlowable().doOnNext(webSearchPro -> {
if (isFirst.getAndSet(false)) {
System.out.println("Receiving stream response:");
}
if (webSearchPro.getChoices() != null && !webSearchPro.getChoices().isEmpty()) {
ChoiceDelta content = webSearchPro.getChoices().get(0).getDelta();
System.out.print(content);
fullContent.append(content);
messageCount.incrementAndGet();
}
})
.doOnComplete(() -> {
System.out.println("\n\nStream completed. Received " + messageCount.get() + " chunks.");
System.out.println("Full response length: " + fullContent.length() + " characters");
})
.blockingSubscribe();
} else {
System.err.println("Error: " + response.getMsg());
}
} catch (Exception e) {
System.err.println("Exception occurred: " + e.getMessage());
e.printStackTrace();
}
}
}