Why do advisors only return information about calling AI for the second time, and cannot obtain information about calling Tools for the first time, which makes my observabAfter method unable to obtain the name and parameters of the calling tool. My example:
public class CustomizeLoggerAdvisor implements CallAdvisor, StreamAdvisor {
private Integer order;
@NotNull
@Override
public String getName() {
return this.getClass().getSimpleName();
}
@Override
public int getOrder() {
return null != order ? order : 1;
}
private ChatClientRequest before(ChatClientRequest request) {
log.info("AI Request: {}", request.prompt().getContents());
log.info("AI Request Message: {}", request.context());
return request;
}
private void observeAfter(ChatClientResponse advisedResponse) {
ChatResponse response = advisedResponse.chatResponse();
if (null == response) {
log.info("AI Response is null");
return;
}
ChatResponseMetadata responseMetadata = response.getMetadata();
// 输出使用的tokens数
Usage usage = responseMetadata.getUsage();
log.info("已使用的总tokens数:{}", usage.getTotalTokens());
log.info("输入的tokens数:{}", usage.getPromptTokens());
log.info("输出的tokens数:{}", usage.getCompletionTokens());
AssistantMessage assistantMessage = response.getResult().getOutput();
List<AssistantMessage.ToolCall> toolCallList = assistantMessage.getToolCalls();
// 输出提示信息
// 抓取不到第一次调用AI所用的工具?
log.info("选择了 [{}] 个工具来使用", toolCallList.size());
String toolCallInfo = toolCallList.stream()
.map(toolCall -> String.format("工具名称:%s,参数:%s", toolCall.name(), toolCall.arguments()))
.collect(Collectors.joining("\n"));
log.info(toolCallInfo);
log.info("AI Response: {}", assistantMessage.getText());
}
@NotNull
@Override
public ChatClientResponse adviseCall(ChatClientRequest advisedRequest, CallAdvisorChain chain) {
advisedRequest = this.before(advisedRequest);
ChatClientResponse advisedResponse = chain.nextCall(advisedRequest);
this.observeAfter(advisedResponse);
return advisedResponse;
}
@NotNull
@Override
public Flux<ChatClientResponse> adviseStream(ChatClientRequest advisedRequest, StreamAdvisorChain chain) {
advisedRequest = this.before(advisedRequest);
Flux<ChatClientResponse> advisedResponses = chain.nextStream(advisedRequest);
return (new ChatClientMessageAggregator()).aggregateChatClientResponse(advisedResponses, this::observeAfter);
}
}
Comment From: checkHup
I am similar to your example, but I cannot obtain token consumption or call tool names every time