langchain4j笔记-04

流式调用

模型创建
java 复制代码
public static StreamingChatModel STREAMING_BASE_MODEL = OpenAiStreamingChatModel.builder()
            .baseUrl("https://api.deepseek.com")
            .apiKey(System.getenv("DS_API_KEY"))
            .modelName("deepseek-v4-flash")
            .logRequests(true)
            .logResponses(true)
            .build();
对话
java 复制代码
    /**
     * Response Streaming
     */
    @Test
    void test01() throws InterruptedException {
        String userMessage = "给我讲一个笑话";

        STREAMING_BASE_MODEL.chat(userMessage, new StreamingChatResponseHandler() {

            // 部分响应
            @Override
            public void onPartialResponse(String partialResponse) {
                System.out.println("onPartialResponse: " + partialResponse);
            }

            // 部分思考
            @Override
            public void onPartialThinking(PartialThinking partialThinking) {
                System.out.println("onPartialThinking: " + partialThinking);
            }

            // 部分工具调用
            @Override
            public void onPartialToolCall(PartialToolCall partialToolCall) {
                System.out.println("onPartialToolCall: " + partialToolCall);
            }

            // 工具调用完成
            @Override
            public void onCompleteToolCall(CompleteToolCall completeToolCall) {
                System.out.println("onCompleteToolCall: " + completeToolCall);
            }

            // 完成调用
            @Override
            public void onCompleteResponse(ChatResponse completeResponse) {
                System.out.println("onCompleteResponse: " + completeResponse);
            }

            // 异常
            @Override
            public void onError(Throwable error) {
                error.printStackTrace();
            }
        });

        Thread.sleep(1000000000000000L);
    }
输出结果如下:
json 复制代码
{
  "aiMessage": {
    "text": "当然!这是一个经典的笑话:有一天,一只海鸥飞到一家咖啡馆,点了一杯咖啡和一块蛋糕。服务员惊讶地说:"您居然会说话?"海鸥淡定地回答:"这里的蛋糕,难道不会说话吗?"",
    "thinking": null,
    "toolExecutionRequests": [],
    "attributes": {}
  },
  "metadata": {
    "id": "8cf726c0-6b4e-4d56-8d78-9bd78228cdea",
    "modelName": "deepseek-v4-flash",
    "tokenUsage": {
      "inputTokenCount": 8,
      "inputTokensDetails": {
        "cachedTokens": 0
      },
      "outputTokenCount": 90,
      "outputTokensDetails": {
        "reasoningTokens": 44
      },
      "totalTokenCount": 98
    },
    "finishReason": "STOP",
    "created": 1778565664,
    "serviceTier": "null",
    "systemFingerprint": "fp_8b330d02d0_prod0820_fp8_kvcache_20260402",
    "rawHttpResponse": "dev.langchain4j.http.client.SuccessfulHttpResponse@662e8336",
    "rawServerSentEvents": [{
      "event": null,
      "data": "{\"id\":\"8cf726c0-6b4e-4d56-8d78-9bd78228cdea\",\"object\":\"chat.completion.chunk\",\"created\":1778565664,\"model\":\"deepseek-v4-flash\",\"system_fingerprint\":\"fp_8b330d02d0_prod0820_fp8_kvcache_20260402\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":null,\"reasoning_content\":\"\"},\"logprobs\":null,\"finish_reason\":null}],\"usage\":null}"
    }],
    "logProbs": null
  }
}
简化如下:
java 复制代码
@Test
void test01() throws InterruptedException {
    String userMessage = "给我讲一个笑话";
    //StreamingChatResponseHandler handler = LambdaStreamingResponseHandler.onPartialResponse(System.out::println);
    STREAMING_BASE_MODEL.chat(userMessage, LambdaStreamingResponseHandler.onPartialResponse(System.out::println));
    STREAMING_BASE_MODEL.chat("Tell me a joke", LambdaStreamingResponseHandler.onPartialResponseAndError(System.out::print, Throwable::printStackTrace));
    Thread.sleep(1000000000000000L);
}
流的取消
java 复制代码
@Test
void test02() throws InterruptedException {
    String userMessage = "给我讲一个笑话";
    boolean shouldCancel = true;
    STREAMING_BASE_MODEL.chat(userMessage, new StreamingChatResponseHandler() {

        @Override
        public void onPartialResponse(PartialResponse partialResponse, PartialResponseContext context) {
            System.out.println("onPartialResponse: " + partialResponse);
            if (shouldCancel) {
                // 取消
                context.streamingHandle().cancel();
            }
        }

        @Override
        public void onCompleteResponse(ChatResponse completeResponse) {
            System.out.println("onCompleteResponse: " + completeResponse);
        }

        @Override
        public void onError(Throwable error) {
            error.printStackTrace();
        }
    });
}
相关推荐
Wang's Blog2 分钟前
PostgreSQL笔记64:分区插件生态与扩展查询协议深度解析
数据库·笔记·postgresql
影寂ldy17 分钟前
Modbus-ASCII 协议 + LRC校验
笔记·网络协议·c#
金立基包装胶水31 分钟前
纸袋封口热封胶不粘是什么原因?
大数据·笔记·其他
chnyi6_ya41 分钟前
论文阅读笔记 | From Priors to Perception: Grounding Video-LLMs in Physical Reality
论文阅读·笔记
M78佐菲2 小时前
Linux学习笔记:目录IO与帧缓冲
linux·笔记·学习·算法
hongmai6668882 小时前
把玩ESP8684-WROOM-04C-H4X:一颗耐高温的RISC-V小钢炮
笔记·单片机·嵌入式硬件·物联网·risc-v
天天爱吃肉82182 小时前
XCP协议 Part 1 概述 — 完整学习笔记(商用车主机厂工程师版)
大数据·笔记·python·学习·汽车
蒲锘2 小时前
DevOps 项目阶段笔记二:Docker Engine + cri-dockerd
笔记·docker·devops
优化Henry3 小时前
关于“星链”互联网系统的几点认识
运维·服务器·网络·笔记·学习·信息与通信
九硕智慧建筑一体化厂家5 小时前
智慧建筑高效管控!楼宇自控系统赋能新能源园区智能运维
运维·人工智能·笔记·智慧城市