Java对接Deepseek api - 流式响应

首先需要登录Deepseek开放平台,申请 appkey。

Deepseek api文档

java 版 demo代码如下所示:

@Slf4j
public class DeepSeekApiDemo {
    private static final MediaType MEDIA_APPLICATION_JSON = MediaType.parse("application/json; charset=utf-8");
    private static final String URL = "https://api.deepseek.com/chat/completions";
    private static final String APP_kEY = "你的appkey";
    private static final String MODEL = "deepseek-chat";
    private static final String DONE = "[DONE]";

    public static void main(String[] args) {
        String query = "你是谁";

        long start = System.currentTimeMillis();

        DeepSeekRequest request = DeepSeekRequest.make(query);
        StringBuilder allContent = new StringBuilder();

        OkHttpClient client = initOkHttpClient();
        EventSource.Factory factory = EventSources.createFactory(client);
        Request httpRequest = new Request.Builder()
                .url(URL)
                .addHeader("Authorization", "Bearer " + APP_kEY)
                .post(RequestBody.create(JSON.toJSONString(request), MEDIA_APPLICATION_JSON))
                .build();

        factory.newEventSource(httpRequest, new EventSourceListener() {
            private boolean receiveResponse = false;
            @Override
            public void onClosed(@NotNull EventSource eventSource) {
                super.onClosed(eventSource);
                log.info("sse onClosed.");
                eventSource.cancel();
            }

            @Override
            public void onEvent(@NotNull EventSource eventSource, @Nullable String id, @Nullable String type, @NotNull String data) {
                super.onEvent(eventSource, id, type, data);
                if (! receiveResponse) {
                    receiveResponse = true;
                    log.info("receive first frame, rt: {}ms", System.currentTimeMillis() - start);
                }

                if (DONE.equals(data)) {
                    log.info("sse event response finish, rt: {}ms, allResponse: {}", System.currentTimeMillis() - start, allContent);
                    // 结束流式响应
                    return;
                }
                try {
                    DeepSeekResponse response = JSON.parseObject(data, DeepSeekResponse.class);
                    if (CollectionUtils.isEmpty(response.getChoices())) {
                        return;
                    }
                    DeepSeekChoice choice = response.getChoices().get(0);
                    if (choice.getDelta() == null) {
                        return;
                    }
                    String content = choice.getDelta().getContent();
                    if (StringUtils.isNotEmpty(content)) {
                        log.info("sse event response content: {}", content);
                        allContent.append(content);
                    }
                } catch (Exception e) {
                    log.error("parse response fail. ", e);
                }
            }

            @Override
            public void onFailure(@NotNull EventSource eventSource, @Nullable Throwable t, @Nullable Response response) {
                super.onFailure(eventSource, t, response);
                int code = response != null ? response.code() : 400;
                String msg = response != null ? response.message() : "";
                String body = "";
                if (response != null)  {
                    body = Optional.of(response).map(Response::body).map(responseBody -> {
                        try {
                            return responseBody.string();
                        } catch (IOException e) {
                            log.error("parse response.body error. ", e);
                            return "";
                        }
                    }).orElse("");
                }

                log.info("sse onFailure code:{} msg:{} body:{}. ", code, msg, body, t);
                eventSource.cancel();
            }

            @Override
            public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
                super.onOpen(eventSource, response);
                log.info("sse onOpen.");
            }
        });

        log.info("request ok");
    }

    private static OkHttpClient initOkHttpClient() {
        Dispatcher dispatcher = new Dispatcher();
        dispatcher.setMaxRequests(12);
        return new OkHttpClient.Builder()
                .connectTimeout(1000, TimeUnit.MILLISECONDS)
                .writeTimeout(16000, TimeUnit.MILLISECONDS)
                .readTimeout(5000, TimeUnit.MILLISECONDS)
                .dispatcher(dispatcher)
                .build();
    }

    @Setter
    @Getter
    private static class DeepSeekRequest {
        private String model = MODEL;
        /**
         * 历史对话和当前对话都放在message中,最后一条为当前轮对话。由客户端发送的query,role为user、系统回复为 assistant
         */
        private List<DeepSeekContext> messages;
        private boolean stream = true;

        private DeepSeekRequest() {
        }

        /**
         * 构建请求
         * @param query 请求
         * @return DeepSeekRequest
         */
        public static DeepSeekRequest make(String query) {
            DeepSeekRequest request = new DeepSeekRequest();
            DeepSeekContext message = new DeepSeekContext();
            message.setRole("user");
            message.setContent(query);
            request.setMessages(Lists.newArrayList(message));
            return request;
        }
    }

    @Setter
    @Getter
    private static class DeepSeekContext {
        private String role;
        private String content;
    }

    @Setter
    @Getter
    private static class DeepSeekResponse {
        private String id;
        private String object;
        private long created;
        private String model;
        @JSONField(name = "system_fingerprint")
        private String systemFingerprint;
        private List<DeepSeekChoice> choices;
    }

    @Setter
    @Getter
    private static class DeepSeekChoice {
        private int index;
        private String logprobs;
        @JSONField(name = "finish_reason")
        private String finishReason;
        private DeepSeekContext delta;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值