Skip to content

Problems with Advisors #3867

@shuaidaia

Description

@shuaidaia

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);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions