开发者社区 问答 正文

AgentScope Java 中ToolResultBlock 事件获取不到

protected void processStream(Flux<Event> generator, Sinks.Many<ServerSentEvent<String>> sink) {
        generator
                .doOnNext(output -> logger().info("output = {}", output))
                .filter(event -> !event.isLast())
                .map(event -> event.getMessage())
                .flatMap(msg -> Flux.fromIterable(msg.getContent()))
                .flatMap(block -> {
                    if (block instanceof TextBlock) {
                        String content = ((TextBlock) block).getText();
                        ServerSentEvent<String> sse = ServerSentEvent.builder(content)
                                .event("text")  // 文本回答事件
                                .build();
                        return Flux.just(sse);

                    } else if (block instanceof ThinkingBlock) {
                        String thinking = ((ThinkingBlock) block).getThinking();
                        ServerSentEvent<String> sse = ServerSentEvent.builder(thinking)
                                .event("thinking")  // 思考过程事件
                                .build();
                        return Flux.just(sse);

                    } else if (block instanceof ToolUseBlock) {
                        ToolUseBlock toolBlock = (ToolUseBlock) block;
                        ServerSentEvent<String> sse = ServerSentEvent.builder(
                                        JSON.toJSONString(toolBlock))
                                .event("tool_call")  // 工具调用事件
                                .build();
                        return Flux.just(sse);

                    } else if (block instanceof ToolResultBlock) {
                        ToolResultBlock toolBlock = (ToolResultBlock) block;
                        ServerSentEvent<String> sse = ServerSentEvent.builder(
                                        JSON.toJSONString(toolBlock))
                                .event("tool_result")  // 工具响应事件
                                .build();
                        // TODO在这里返回工具调用结果,供前端展示 如搜索了xxx个网页
                        return Flux.just(sse);
                    } else {
                        return Flux.empty();
                    }
                })
                .doOnNext(sink::tryEmitNext)
                .doOnError(e -> {
                    logger().error("Unexpected error in stream processing: {}", e.getMessage(), e);
                    ServerSentEvent<String> errorSse = ServerSentEvent.builder(
                                    "System processing error, please try again later.")
                            .event("error")  // 错误事件
                            .build();
                    sink.tryEmitNext(errorSse);
                })
                .doOnComplete(() -> {
                    logger().info("Stream processing completed successfully");
                    // 发送完成事件
                    ServerSentEvent<String> endSse = ServerSentEvent.builder("")
                            .event("end")  // 结束事件
                            .build();
                    sink.tryEmitNext(endSse);
                    sink.tryEmitComplete();
                })
                .subscribe(
                        null,
                        e -> {
                            logger().error("Stream processing failed: {}", e.getMessage(), e);
                            sink.tryEmitError(e);
                        }
                );
    }

在调用时可以获取到ToolUseBlock事件,但是无法获取到结果事件
image.png

展开
收起
oxeokb5oiheds 2026-02-05 10:36:50 26 分享 版权
0 条回答
写回答
取消 提交回答