深入理解Java对接DeepSeek

其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。

1.获取 KEY

https://platform.deepseek.com/transactions
直接付款就是了(现在官网暂停充值2025年2月7日),不比以前gpt,花钱都不知道怎么充值。
在这里插入图片描述
输入任意key名称,即可创建key。
在这里插入图片描述

2.对接文档

在当前页面下面,即可看到接口文档。访问就是了。https://api-docs.deepseek.com/zh-cn/
在这里插入图片描述

3.接口测试

注意:不要段时间内多次重复发送同一个问题,容易奔溃,然后就没办法调试了,目前DeepSeek还是很脆弱,不注意就奔溃了

3.1curl测试

这是接口文档里面的第一个示例。虽然只提供了curl、python、nodejs,对于我们对接来说,完全够了。
在这里插入图片描述
这里为了比较符合我们开发规范。如果你现在有个可以访问互联网的linux那就很简单了,把你的KEY复制出来,把下面的sk-5bf10*******************0eab换成你的实际key,然后在linux上面输入下面这个命令即可。

curl https://api.deepseek.com/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer sk-5bf10***********************0eab" \-d '{"model": "deepseek-chat","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello!"}],"stream": false}'

3.2.PostMan

如果你没有一个联网的linux,那就简单,下载一个接口测试工具,例如postman
将curl中的对应信息填入到post中即可。
在这里插入图片描述

如下所示即可掉通。
在这里插入图片描述
例如,我用post提问:给一个SpringBoot入门案例
在这里插入图片描述

3.3.浏览器F12

如果你的电脑只有浏览一个,并且你实在不想安装类似postman这样的接口测试工具,那就用浏览器F12自带的开发者模式来调试吧。
随便打开一个页面,例如这里我打开的是百度,在console输入下面的代码。
在这里插入图片描述
注意如果出现这个提示信息。
Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself. This could allow attackers to steal your identity or take control of your computer. Please type ‘allow pasting’ below and hit Enter to allow pasting.表示此时禁用了粘贴,这时候让你输入:allow pasting然后回车,就可以粘贴了。
在这里插入图片描述
有些网页会禁用鼠标右键粘贴(这种情况用ctrl + v就行了)

注意替换你的key

fetch('https://api.deepseek.com/chat/completions', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': 'Bearer sk-5bf10***********************0eab'},body: JSON.stringify({model: "deepseek-chat",messages: [{ role: "system", content: "SpringBoot和Spring框架的最大区别是什么?" },],stream: false})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

在这里插入图片描述

4.代码对接

4.1传统API对接

这里,我以大家最为熟练的RestTemplate来调用,代码如下

	@Autowiredprivate RestTemplate restTemplate;@GetMapping("/api/traditional/restTemplate")public String traditional() {String url = "https://api.deepseek.com/chat/completions";HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);//换成你自己的Keyheaders.set("Authorization", "Bearer sk-5bf1074b825a4xxxxxxxx50eab");//构建请求参数ChatReqMessage message = new Message("system", "SpringBoot和Spring框架的最大区别是什么?");ChatReq requestBody = new ChatReq("deepseek-chat", Collections.singletonList(message), false);HttpEntity<ChatReq> entity = new HttpEntity<>(requestBody, headers);ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);if (response.getStatusCode().is2xxSuccessful()) {System.out.println("Response: " + response.getBody());} else {System.out.println("Error: " + response.getStatusCode());}return response.getBody();}

效果展示
在这里插入图片描述

4.2.流式API对接

如果有兴趣,建议你先阅读这篇文章,方便你理解。具体相关概念,我就不在介绍了,基本上百分之99吧,我们的各类GPT,AI助手,都是用流式API对接的。
传统API和流式响应API
现在有个问题,那就是传统API,他是一次性接收所有数据,如下所示,我们问的这个问题,deepseek是将整个问题回答完毕以后,然后一次性打包发送给我们,但是和我们平时使用的AI助手明显不是这样的,平常我们使用的AI助手,他的回答是一点点出来的。
在这里插入图片描述
根据官方API说明,只需要我们将stream 设置为true,即可实现流式响应。
在这里插入图片描述
当然问题不是仅仅改这个这么简单,这里改为true,表示的含义是,对方将会按照流式响应返回数据,同时,你也得用流式响应调用。具体相关细节见我另外的博客:传统API和流式响应API,这里我不在重复。

@GetMapping("/api/stream/restTemplate")public String stream() {WebClient webClient = WebClient.builder().baseUrl("https://api.deepseek.com").defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader("Authorization", "Bearer sk-5bf1074b825a43dxxxxxxxxxxxx0e50eab").build();// 构建请求参数 ChatReqMessage message = new Message("system", "SpringBoot和Spring框架的最大区别是什么?");ChatReq requestBody = new ChatReq("deepseek-chat", Collections.singletonList(message), true); // 设置 stream 为 true// 发送 POST 请求并处理流式响应Flux<String> responseFlux = webClient.post().uri("/chat/completions").bodyValue(requestBody).retrieve().bodyToFlux(String.class);// 逐步打印响应数据responseFlux.subscribe(data -> System.out.println("Received: " + data),error -> System.err.println("Error: " + error),() -> System.out.println("Stream completed"));return null;}

通过日志,我们发现是一点点打印的,每次几个字,而不是一开始的那样,等待一段时间以后,然后一次性返回。
在这里插入图片描述
我们可以稍微处理下返回值。进行解析一下。例如我们只需要里面的content内容,当然你也可以一开始就定义好返回数据类型,而不是我示例中的String

{"id": "d3380a6c-965d-4649-9fe4-78d2a397202a", "object": "chat.completion.chunk", "created": 1739338918, "model": "deepseek-chat", "system_fingerprint": "fp_3a5770e1b4", "choices": [{"index": 0, "delta": {"content": "管理"}, "logprobs": null, "finish_reason": null}]
}

下面是我们稍微处理了一下返回值,效果可能就更明确了

	@GetMapping("/api/stream/webClient ")public String stream() {WebClient webClient = WebClient.builder().baseUrl("https://api.deepseek.com").defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader("Authorization", "Bearer sk-5bf1074b825a43da935920a9b0e50eab").build();// 构建请求参数 ChatReqMessage message = new Message("system", "SpringBoot和Spring框架的最大区别是什么?");ChatReq requestBody = new ChatReq("deepseek-chat", Collections.singletonList(message), true); // 设置 stream 为 true// 发送 POST 请求并处理流式响应Flux<String> responseFlux = webClient.post().uri("/chat/completions").bodyValue(requestBody).retrieve().bodyToFlux(String.class);// 逐步打印响应数据ObjectMapper objectMapper = new ObjectMapper();responseFlux.subscribe(data -> {JsonNode jsonNode;try {jsonNode = objectMapper.readTree(data);String content = jsonNode.get("choices").get(0).get("delta").get("content").asText();System.out.print(content);} catch (Exception e) {e.printStackTrace();}},error -> System.err.println("Error: " + error),() -> System.out.println("Stream completed"));return null;}

此时我们打印的就是挨个返回的信息。而不是等到所有数据准备完毕以后,一次性返回。
在这里插入图片描述

但是现在也还是有个问题,那就是,我们在控制台打印,相当于我们在一个传统阻塞的API接口中打印流式API接口返回的数据,我们是否有办法实现,我们将流式API接口的数据返回去,也就是在流式API接口里面调用流式API接口。

@GetMapping(value ="/api/stream/webClient/flux", produces = "text/event-stream;charset=UTF-8")public Flux<String> streamFlux(@RequestParam String ask) {WebClient webClient = WebClient.builder().baseUrl("https://api.deepseek.com").defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader("Authorization", "Bearer sk-5bf1074b825a43da935920a9b0e50eab").build();// 构建请求参数 ChatReqMessage message = new Message("system", ask);ChatReq requestBody = new ChatReq("deepseek-chat", Collections.singletonList(message), true); // 设置 stream 为 true// 发送 POST 请求并处理流式响应Flux<String> responseFlux = webClient.post().uri("/chat/completions").bodyValue(requestBody).retrieve().bodyToFlux(String.class);// 创建一个 Sinks 用于将数据推送到响应流Sinks.Many<String> sink = Sinks.many().multicast().onBackpressureBuffer();// 逐步处理响应数据并推送到 sinkresponseFlux.subscribe(data -> {try {ObjectMapper objectMapper = new ObjectMapper();JsonNode jsonNode = objectMapper.readTree(data);String content = jsonNode.get("choices").get(0).get("delta").get("content").asText();System.out.print(content);// 将提取的内容推送到响应流sink.tryEmitNext(content); } catch (Exception e) {sink.tryEmitError(e); // 处理错误}},error -> sink.tryEmitError(error), // 处理错误() -> sink.tryEmitComplete() // 完成信号);return sink.asFlux(); // 返回响应流}

此时我们通过浏览器访问:

http://127.0.0.1:8081/api/stream/webClient/flux?ask=介绍一下华为北向网管接口

控制台打印是这样的。

浏览器页面看到是这样的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调用DeepSeek官方的API接口

效果 前端样式体验链接&#xff1a;https://livequeen.top/deepseekshow 准备工作 1、注册deepseek官网账号 地址&#xff1a;DeepSeek 点击进入右上角【API开放平台】&#xff0c;并进行账号注册。 2、注册完成后&#xff0c;依次点击【API keys】-【生成API key】&#x…

【SpringBoot实现全局API限频】 最佳实践

在 Spring Boot 中实现全局 API 限频&#xff08;Rate Limiting&#xff09;可以通过多种方式实现&#xff0c;这里推荐一个结合 拦截器 Redis 的分布式解决方案&#xff0c;适用于生产环境且具备良好的扩展性。 方案设计思路 核心目标&#xff1a;基于客户端标识&#xff08…

香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。

简介&#xff1a; 亮点直击 将电影镜头设计引入图像到视频的合成过程中。 推出了MotionCanvas&#xff0c;这是一种简化的视频合成系统&#xff0c;用于电影镜头设计&#xff0c;提供整体运动控制&#xff0c;以场景感知的方式联合操控相机和对象的运动。 设计了专门的运动条…

01.Docker 概述

Docker 概述 1. Docker 的主要目标2. 使用Docker 容器化封装应用程序的意义3. 容器和虚拟机技术比较4. 容器和虚拟机表现比较5. Docker 的组成6. Namespace7. Control groups8. 容器管理工具9. docker 的优缺点10. 容器的相关技术 docker 官网: http://www.docker.com 帮助文档…

【DeepSeek】deepseek可视化部署

目录 1 -> 前文 2 -> 部署可视化界面 1 -> 前文 【DeepSeek】DeepSeek概述 | 本地部署deepseek 通过前文可以将deepseek部署到本地使用&#xff0c;可是每次都需要winR输入cmd调出命令行进入到命令模式&#xff0c;输入命令ollama run deepseek-r1:latest。体验很…

开启对话式智能分析新纪元——Wyn商业智能 BI 携手Deepseek 驱动数据分析变革

2月18号&#xff0c;Wyn 商业智能 V8.0Update1 版本将重磅推出对话式智能分析&#xff0c;集成Deepseek R1大模型&#xff0c;通过AI技术的深度融合&#xff0c;致力于打造"会思考的BI系统"&#xff0c;让数据价值触手可及&#xff0c;助力企业实现从数据洞察到决策执…

Response 和 Request 介绍

怀旧网个人博客网站地址&#xff1a;怀旧网&#xff0c;博客详情&#xff1a;Response 和 Request 介绍 1、HttpServletResponse 1、简单分类 2、文件下载 通过Response下载文件数据 放一个文件到resources目录 编写下载文件Servlet文件 public class FileDownServlet exten…

分层耦合 - IOC详解

推荐使用下面三种, 第一种多用于其他类 声明bean的时候&#xff0c;可以通过value属性指定bean的名字&#xff0c;如果没有指定&#xff0c;默认为类名首字母小写。 使用以上四个注解都可以声明bean&#xff0c;但是在springboot集成web开发中&#xff0c;声明控制器bean只能用…

STM32 Flash详解教程文章

目录 Flash基本概念理解 Flash编程接口FPEC Flash擦除/写入流程图 Flash选项字节基本概念理解 Flash电子签名 函数读取地址下存放的数据 Flash的数据处理限制部分 编写不易&#xff0c;请勿搬运&#xff0c;感谢理解&#xff01;&#xff01;&#xff01; Flash基本概念…

WPF 设置宽度为 父容器 宽度的一半

方法1&#xff1a;使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…

【Ubuntu VScode Remote SSH 问题解决】Resolver error: Error: XHR failed

1. 问题描述 VScode使用remote ssh 远程服务器&#xff0c;报错类似&#xff1a; [12:06:01.219] Downloading VS Code server locally... [12:06:01.310] Resolver error: Error: XHR failedat k.onerror (vscode-file://vscode-app/private/var/folders/g1/cvs2rnpx60qc3b4…

32单片机学习记录1之GPIO

32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色&#xff1f; 在单片机中&#xff0c;GPIO口&#xff08;General Purpose Input/Output&#xff09; 是一种通用输入/输出接口&#xff0c;扮演着连接单片机与外部设备的桥梁角色。具体来说&#xff0c;它在单片…

第三十二周:Informer学习笔记

目录 摘要Abstract1 Informer1.1 预备知识1.2 模型框架1.3 实验分析 总结 摘要 本周学习的主要内容是Informer模型&#xff0c;Informer是一种专为长序列时间序列预测&#xff08;LSTF&#xff09; 设计的Transformer模型。相较于传统的Transformer&#xff0c;Informer采用Pr…

React 生命周期函数详解

React 组件在其生命周期中有多个阶段&#xff0c;每个阶段都有特定的生命周期函数&#xff08;Lifecycle Methods&#xff09;。这些函数允许你在组件的不同阶段执行特定的操作。以下是 React 组件生命周期的主要阶段及其对应的生命周期函数&#xff0c;并结合了 React 16.3 的…

【计算机毕业设计】Spring Boot教师人事档案管理系统功能说明

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

绩效归因概述

绩效归因概述 1. 分类2. 基于净值的归因方法2.1 发展背景2.2 择时选股模型 T-M模型2.3 择时选股模型 H-M模型2.4 择时选股模型 C-L模型2.5 风格配置模型-Sharpe2.6 多因子模型 Fama-French32.7 多因子模型 Carhart42.8 多因子模型 Fama-French5 3. 基于持仓的归因方法3.1 发展背…

MambaMorph brain MR-CT

loss代码实现了几种用于医学图像配准(Registration)和分割(Segmentation)任务的损失函数,主要包括以下几种: NCC (Normalized Cross-Correlation): 功能: 计算局部归一化互相关损失,用于衡量两个图像之间的相似性。 应用场景: 通常用于图像配准任务,通过最大化图像之间…

大模型chagpt原理(持续更新)

20250210更新&#xff1a; 根据李宏毅课程可知&#xff0c;大模型chatgpt基本原理分为三步&#xff08;每一步都是在做文字接龙&#xff0c;但训练资料不同&#xff09; 一、依赖大量网上文章、维基百科等资料训练 对资料进行去重&#xff0c;劣质优质划分&#xff0c;过滤等…

DeepAR:一种用于时间序列预测的深度学习模型

介绍 DeepAR是一种基于递归神经网络&#xff08;RNN&#xff09;的时间序列预测模型&#xff0c;由亚马逊在2017年提出。它特别适用于处理多变量时间序列数据&#xff0c;并能够生成概率预测。DeepAR通过联合训练多个相关时间序列来提高预测性能&#xff0c;从而在实际应用中表…

C++ ——从C到C++

1、C的学习方法 &#xff08;1&#xff09;C知识点概念内容比较多&#xff0c;需要反复复习 &#xff08;2&#xff09;偏理论&#xff0c;有的内容不理解&#xff0c;可以先背下来&#xff0c;后续可能会理解更深 &#xff08;3&#xff09;学好编程要多练习&#xff0c;简…