背景
如果有这样的需求,java微服务访问aget的api做一些数据操作,具体应该怎么做呢?考虑以下问题:
- 使用什么工具?
- 参数如何封装?
- agent只接收流式模式,就是那种一个字一个字往外面蹦,那java又应该使用什么样的代码来接收呢?
第一个思路
假设你不知道,那就先啥也别想了,整理好自己的问题,然后直接询问deepseek,指不定就有现成的代码直接能用,我使用问小白试了试,给的示例操作步骤还是很清晰的
思路二:直接使用下面的代码
从ai拿过来的代码还是需要自己本地测试验证的,我自己做了测试通过了,在这里直接给大家分享
指定的agent返回json数据
{
"items": "x",
"log": "x",
"explanation": "x"
}
导入pom
我是用的springboot,所以没加版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
通过接口触发调用agent的api
@PostMapping("getInformation")
public R getInformation(@RequestBody Map<String, Object> inputBean) {
new Thread(() -> {
try {
DifyService.callDifyStreaming("你好,你是谁?);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
return R.data();
}
DifyService访问
注意修改自己的地址和apikey
public class DifyService {
private static final String DIFY_URL = "http://localhost/v1/chat-messages";
private static final String API_KEY = "Bearer agent密钥";
public static void callDifyStreaming(String query) throws InterruptedException {
// 构建请求体
DifyRequestBean requestBody = new DifyRequestBean();
requestBody.setQuery(query);
requestBody.setInputs(Collections.emptyMap());
requestBody.setResponse_mode("streaming");
requestBody.setUser("abc-123");
requestBody.setFiles(Collections.emptyList());
// 创建WebClient
WebClient client = WebClient.builder()
.baseUrl(DIFY_URL)
.defaultHeader("Authorization", API_KEY)
.defaultHeader("Content-Type", "application/json")
.build();
// 发送流式请求
Flux<String> responseStream = client.post()
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(requestBody)
.retrieve()
.bodyToFlux(String.class);
// 处理流式响应
CountDownLatch latch = new CountDownLatch(1);
StringBuffer responseBuilder = new StringBuffer();
responseStream.subscribe(
data -> {
StreamResponse streamResponse = JSONObject.parseObject(data, StreamResponse.class);
String answer = streamResponse.getAnswer();
if (ObjectUtils.isNotEmpty(answer)) {
responseBuilder.append(answer);
}
},
error -> {
System.err.println("发生错误: " + error.getMessage());
latch.countDown();
},
() -> {
System.out.println("最终回答:" + responseBuilder);
FinalResponseData streamResponse = JSONObject.parseObject(decode, FinalResponseData.class);
streamResponse.setQuery(query);
System.out.println(streamResponse.getLog());
ListToExcel.generateExcel(Collections.singletonList(streamResponse), "D:\\" + DateUtil.now().getTime() + ".xlsx");
latch.countDown();
}
);
latch.await();
}
}
使用以上代码能够直接访问agent获取json数据,然后处理结果。
但是这里有个问题,就是这个Java代码一次只能处理一个query,如果我有业务需要,一次有几十个query需要处理,即使我用for遍历循环,处理速度也是很慢的。有没有办法能够同时处理几十个请求,提高效率呢?
后面有机会给大家分享!