调用DeepSeek官方的API接口

效果

前端样式体验链接:https://livequeen.top/deepseekshow

准备工作

1、注册deepseek官网账号

地址:DeepSeek

点击进入右上角【API开放平台】,并进行账号注册。

 

2、注册完成后,依次点击【API keys】-【生成API key】,记住自己保存好API keys,他只会显示一次,如果忘了,就要重新生成了!

然后点击【接口文档】,就可以看到官方API文档了!

3、在接口文档中,点击【首次调用API】,然后选择对应的语言,就可以看到示例代码了

代码示例

这里用vue+node.js做一个上面效果动态图简单示例

一、后端

1、 引入依赖,在终端中输入如下指令

npm install openai

2、新建一个工具类【deepseek.js】,用于执行deepseek的API并返回结果,如下(可直接复制):

// Please install OpenAI SDK first: `npm install openai`
const OpenAI = require('openai')// api参数配置
const openai = new OpenAI({baseURL: 'https://api.deepseek.com',apiKey: 'sk-c63c***********************e1e0b70'
})/*** message 消息列表*    role 角色*    content 对话内容*    name 某个角色的参与者,用于区分相同角色(选填)* model   模型 [deepseek-chat, deepseek-reasoner] deepseek-chat 模型已全面升级为 DeepSeek-V3。*/
async function deepSeekChat (contents) {// 执行获取结果const completion = await openai.chat.completions.create({messages: [{role: 'system',content: contents}],model: 'deepseek-chat'})// 返回结果return completion.choices[0].message.content
}module.exports = {deepSeekChat
}

3、在你自己的后端接口中通过异步调用的方式,来传参调用上面工具类里面的deepSeekChat()方法 ,如下:

// 引用前面deepseek工具类的方法
const {deepSeekChat} = require('../utils/deepseek')// 后端接口(异步)
router.post('/deepseek', async (req, res) => {// 调用前面deepseek工具类的方法let data = await deepSeekChat(req.body.contents)// 返回结果res.end(JSON.stringify({traceId: req.traceId,code: 200,data: data}))
})

 二、前端

1、h5布局

<template><div class="mess_dialog" v-loading="isloading"><!-- 对话框头部 --><div class="dlog_header"><h1>DeepSeek对话</h1></div><!-- 对话框内容 --><div id="content_overflow" class="dlog_content" ref="scrollContainer" @scroll="handleScroll"><div v-for="(item, index) in messnowList" :key="index" class="dlog_content_item" style="margin-left: 5px;"><!-- AI消息展示 --><div v-if="item.role === 'system'" class="content_other"><!-- 头像 --><div><el-avatar :size="35" :src="require('../../../assets/image/ai.png')" style="margin-top: 5px;"></el-avatar></div><div class="mess_other"><!-- 发送时间 --><div><span style="font-size: 8px;">{{item.date}}</span></div><!-- 发送内容 --><div class="content_other_bgd"><span class="mess_content_msg">{{item.content}}</span></div><!-- 复制按钮 --><div class="iconCopy" @click="onCopy(item.content)"><i class="el-icon-copy-document"></i></div></div></div><!--本用户的消息展示--><div v-else-if="item.role === 'user'" class="content_me"><div class="mess_me"><!-- 发送时间 --><div><span style="font-size: 8px;">{{item.date}}</span></div><!-- 发送内容 --><div class="content_me_bgd"><span class="mess_content_msg">{{item.content}}</span></div></div><!-- 头像 --><div><el-avatar :size="35" :src="userAvatar" style="margin-top: 5px;"></el-avatar></div></div></div></div><!--对话框底部--><div class="dlog_footer"><div class="footer_content"><el-input type="textarea" :rows="4" v-model="mess" maxlength="500" show-word-limit @keydown.enter.native="keyDown"></el-input><el-button type="primary" @click="Wssendmess()" style="float: right;margin-top: 5px;">发送</el-button></div></div></div>
</template>

2、css样式

<style scoped>
.mess_dialog {height: 100%;width: 100%;max-width: 800px;position: relative;margin: 0 auto;display: flex;flex-direction: column; /* 垂直排列 */
}
.dlog_header {display: flex;justify-content: center;flex: 1;
}
.dlog_content {flex: 7;overflow-y: auto;overflow-x: hidden;
}
.content_other{width: 80%;display: flex;justify-content: flex-start;margin: 11px 18px;
}
.mess_other{text-align: left;margin-left: 10px;
}
.content_me{width: 80%;display: flex;justify-content: flex-end;float: right;margin: 11px 18px;
}
.mess_me{text-align: right;margin-right: 10px;
}
.mess_content_msg{font-size: 16px;font-weight: 300;margin: 2px;
}
/*其他用户的气泡*/
.content_other_bgd {border-radius: 6px;position: relative;display: inline-block;padding: 0px 6px;width: auto;height: auto;line-height: 34px;background: #e3e1e1;z-index: 0;
}
/*气泡前的小三角指向*/
.content_other_bgd::before {border-style: solid;border-width: 0 11px 11px 0;border-color: transparent #e3e1e1 transparent transparent;content: "";position: absolute;top: 10px; left: -8px;margin-top: -9px;display: block;width: 0px;height: 0px;z-index: 0;
}
/*我方的气泡*/
.content_me_bgd {border-radius: 6px;position: relative;display: inline-block;padding: 0px 6px;width: auto;height: auto;line-height: 34px;background: #95ec69;z-index: 0;text-align: left;
}
.content_me_bgd::after {border-style: solid;border-width: 0 0 11px 11px;border-color: transparent transparent transparent #95ec69;content: "";position: absolute;top: 10px; right: -8px;margin-top: -10px;display: block;width: 0px;height: 0px;z-index: -1;
}
.iconCopy{padding: 7px;margin-top: 3px;width: 20px;border-radius: 5px;display: flex;justify-content: center;
}
.el-icon-copy-document{color: #a2a2a2;
}
.iconCopy:hover {background-color: #ecebeb;
}
.iconCopy:hover  .el-icon-copy-document{color: #3d9aff;
}
.iconCopy:active {background-color: #dedede;
}
.iconCopy:active  .el-icon-copy-document{color: #0b7bf5;
}
.dlog_footer{width: 100%;flex: 2;padding: 10px 0;
}
</style>

3、js函数

<script>
import userAvatar from '@/assets/image/userAvatar.png'
import moment from 'moment/moment'
import cookie from '../../../utils/cookie'
import base from '../../../api/base'export default {name: 'Index',data () {return {mess: '', // 输入的信息userAvatar: userAvatar, // 默认用户头像autoScroll: true, // 是否需要自动滚动到底部messnowList: [], // 当前对话用户的-聊天内容列表isloading: false // 加载中,默认关闭}},watch: {// 监听当前消息列表,更新时,保持滚动条位于底部messnowList: {handler (newValue, oldValue) {this.scrollToBottom()},deep: true}},methods: {// 监听用户滑动情况,判断是否需要自动定位底部handleScroll () {// 绑定组件const container = this.$refs.scrollContainer// 判断用户是否手动向上滚动超过底部位置30pxif (container.scrollHeight - container.scrollTop - container.clientHeight > 50) {this.autoScroll = false // 用户手动滚动,停止自动滚动} else {this.autoScroll = true // 用户滚动到底部,恢复自动滚动}},// 定位到底部scrollToBottom () {this.$nextTick(() => {var message = document.getElementById('content_overflow')if (this.autoScroll) {// 滚动滑钮到滚动条顶部的距离=滚动条的高度message.scrollTop = message.scrollHeight}})},// enter发送消息,ctrl+enter换行keyDown (e) {if (e.ctrlKey && e.keyCode === 13) { // 用户点击了ctrl+enter触发this.mess += '\n'} else { // 用户点击了enter触发this.Wssendmess()e.preventDefault() // 阻止浏览器默认换行操作return false}},// 发送按钮Wssendmess () {var message = this.mess.trim()this.mess = ''// 开启加载this.isloading = true// 判断是否有字符输入if (message === null | message === '') {this.$notify({title: '提示',message: '发送内容不能为空!',type: 'warning'})// 关闭加载this.isloading = false} else {// 用户发言,恢复自动滚动this.autoScroll = true// 保存到数据集合中let date = moment().format('YYYY-MM-DD HH:mm:ss')let item = this.data_rule('user', message, date)this.messnowList.push(item)// 执行接口this.$api.deepseek(message).then(res => {// 关闭加载this.isloading = falseif (res.data.code === 200) {this.chatAI(res.data.data)} else {this.chatAI('服务器繁忙,请稍后重试!')}}).catch(err => {// 关闭加载this.isloading = falsethis.chatAI('服务器繁忙,请稍后重试!')console.log(err)})}},// 规范数据格式data_rule (role, content, date) {return {role: role,content: content,date: date}},/*** 模拟AI机器人打字效果* @param content 返回的全部文本*/chatAI (content) {// 获取返回结果let data = content// 临时储存结果(一个个字符)let dataTemp = data[0]let date = moment().format('YYYY-MM-DD HH:mm:ss')// 循环一个个字符赋予,模拟机器人打字效果let item2 = this.data_rule('system', dataTemp + '_', date)this.messnowList.push(item2)let nowSize = this.messnowList.length - 1if (data.length > 1) {for (let i = 1; i < data.length; i++) {setTimeout(() => {if (i === data.length - 1) {dataTemp = dataTemp + data[i]item2 = this.data_rule('system', dataTemp, date)} else {dataTemp = dataTemp + data[i]item2 = this.data_rule('system', dataTemp + '_', date)}this.messnowList[nowSize] = item2// 更新组件监听this.$forceUpdate()// 更新滚动条定位this.scrollToBottom()}, 100 * i)}}},// 复制按钮onCopy (content) {// 复制到粘贴板navigator.clipboard.writeText(content).then(() => {this.$message.success('复制成功')}).catch(err => {this.$message.error('复制失败,原因:' + err)})}}
}
</script>

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

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

相关文章

香港中文大学 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…

绩效归因概述

绩效归因概述 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): 功能: 计算局部归一化互相关损失,用于衡量两个图像之间的相似性。 应用场景: 通常用于图像配准任务,通过最大化图像之间…

C++ ——从C到C++

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

<tauri><rust><GUI>基于rust和tauri的图片显示程序(本地图片的加载、显示、保存)

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 环境配置 系统:windows 10 平台:visual studio code 语言:rust、javascript 库:tauri2.0 概述 …

Arrays工具类详解

目录 1. Arrays.toString() 方法 2. Arrays.deepToString() 方法 3. Arrays.equals(int[ ] arr1, int[ ] arr2) 方法 4. Arrays.equals(Object[] arr1, Object[] arr2) 方法 5. Arrays.deepEquals(Object[] arr1, Object[] arr2) 方法 6. Arrays.sort(int[] arr) 方法 7…

设计高效的测试用例:从需求到验证

在现代软件开发过程中&#xff0c;测试用例的设计一直是质量保证&#xff08;QA&#xff09;环节的核心。有效的测试用例不仅能够帮助发现潜在缺陷&#xff0c;提升软件质量&#xff0c;还能降低后期修复成本&#xff0c;提高开发效率。尽管如此&#xff0c;如何从需求出发&…

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…

三角测量——用相机运动估计特征点的空间位置

引入 使用对极约束估计了相机运动后&#xff0c;接下来利用相机运动估计特征点的空间位置&#xff0c;使用的方法就是三角测量。 三角测量 和对极几何中的对极几何约束描述类似&#xff1a; z 2 x 2 R ( z 1 x 1 ) t z_2x_2R(z_1x_1)t z2​x2​R(z1​x1​)t 经过对极约束…

如何本地部署DeepSeek

第一步&#xff1a;安装ollama https://ollama.com/download 打开官网&#xff0c;选择对应版本 第二步&#xff1a;选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量&#xff08;Parameters&#xff09;&#xff0c;其中 B 是英文 B…