调用DeepSeek官方的API接口

news2025/2/12 17:10:47

效果

前端样式体验链接: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
      // 判断用户是否手动向上滚动超过底部位置30px
      if (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 = false
            if (res.data.code === 200) {
              this.chatAI(res.data.data)
            } else {
              this.chatAI('服务器繁忙,请稍后重试!')
            }
          })
          .catch(err => {
            // 关闭加载
            this.isloading = false
            this.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 - 1
      if (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.coloradmin.cn/o/2296941.html

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

相关文章

MFC线程安全案例

作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目解析 二…

Win11下搭建Kafka环境

目录 一、环境准备 二、安装JDK 1、下载JDK 2、配置环境变量 3、验证 三、安装zookeeper 1、下载Zookeeper安装包 2、配置环境变量 3、修改配置文件zoo.cfg 4、启动Zookeeper服务 4.1 启动Zookeeper客户端验证 4.2 启动客户端 四、安装Kafka 1、下载Kafka安装包…

51c自动驾驶~合集49

我自己的原文哦~ https://blog.51cto.com/whaosoft/13164876 #Ultra-AV 轨迹预测新基准&#xff01;清华开源&#xff1a;统一自动驾驶纵向轨迹数据集 自动驾驶车辆在交通运输领域展现出巨大潜力&#xff0c;而理解其纵向驾驶行为是实现安全高效自动驾驶的关键。现有的开…

Python——批量图片转PDF(GUI版本)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

LabVIEW无人机飞行状态监测系统

近年来&#xff0c;无人机在农业植保、电力巡检、应急救灾等多个领域得到了广泛应用。然而&#xff0c;传统的目视操控方式仍然存在以下三大问题&#xff1a; 飞行姿态的感知主要依赖操作者的经验&#xff1b; 飞行中突发的姿态异常难以及时发现&#xff1b; 飞行数据缺乏系统…

算法16(力扣451)——根据字符出现频率排序

1、问题 给定一个字符串 s &#xff0c;根据字符出现的 频率 对其进行 降序排序 。一个字符出现的频率 是它出现在字符串中的次数&#xff0c; 返回 已排序的字符串。如果有多个答案&#xff0c;返回其中任何一个。 2、示例 &#xff08;1&#xff09; 输入: s "tree&q…

Response 和 Request 介绍

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

ADB详细教程

目录 一、ADB简介 二、配置 配置环境变量 验证是否安装成功 三、简单使用 基本命令 设备连接管理 USB连接 WIFI连接&#xff08;需要USB线&#xff09; 开启手机USB调试模式 开启USB调试 四、其他 更换ADB默认启动端口 一、ADB简介 ADB&#xff08;Android Debug…

Jenkins+gitee 搭建自动化部署

Jenkinsgitee 搭建自动化部署 环境说明&#xff1a; 软件版本备注CentOS8.5.2111JDK1.8.0_211Maven3.8.8git2.27.0Jenkins2.319最好选稳定版本&#xff0c;不然安装插件有点麻烦 一、安装Jenkins程序 1、到官网下载相应的版本war或者直接使用yum安装 Jenkins官网下载 直接…

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡 背景 前端开发接口请求&#xff0c;调试&#xff0c;联调&#xff0c;接入数据&#xff0c;前端必不可少工具&#xff0c;postman是一个非常好…

AI大语言模型

一、AIGC和生成式AI的概念 1-1、AIGC Al Generated Content&#xff1a;AI生成内容 1-2、生成式AI&#xff1a;generative ai AIGC是生成式 AI 技术在内容创作领域的具体应用成果。 目前有许多知名的生成式 AI&#xff1a; 文本生成领域 OpenAI GPT 系列百度文心一言阿里通…

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名&#xff0c; 不仅仅是公私钥签名&#xff0c;还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式&#xff0c;可以基于字节范围进行计算&#xff0c;也可以基于Pdf 对象&#xff08;pdf object&#xff09;进行计算。 PDF文件可能包…

Python 识别图片和扫描PDF中的文字

目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时&#xff0c;文字信息往往无法直接编辑、搜索或复制&#xff0c;这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…

C++引用深度详解

C引用深度详解 前言1. 引用的本质与核心特性1.1 引用概念1.2 核心特性 2. 常引用与权限控制2.1 权限传递规则2.2 常量引用2.3 临时变量保护1. 样例2. 样例3. 测试 三、引用使用场景分析3.1 函数参数传递输出型参数避免多级指针高效传参 3.2 做函数返回值正确使用危险案例 4. 性…

SpringCloud - Gateway 网关

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://spring.io/projects/spring-clou…

【JVM详解五】JVM性能调优

示例&#xff1a; 配置JVM参数运行 #前台运行 java -XX:MetaspaceSize-128m -XX:MaxMetaspaceSize-128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio8 - XX:UseConcMarkSweepGC -jar /jar包路径 #后台运行 nohup java -XX:MetaspaceSize-128m -XX:MaxMetaspaceS…

DeepSeek:搅动人工智能产业风云的鲶鱼效应深度解读

我的个人主页 我的专栏&#xff1a;人工智能领域&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 引言 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最为耀眼的领域之一。众多技术与平台如繁星般涌现&a…

bingAI生成的易语言编程基础

易语言编程基础 易语言&#xff08;EPL&#xff09;是一种基于中文的编程语言&#xff0c;旨在简化编程学习过程&#xff0c;特别适合初学者和有一定编程基础的开发者。它通过中文关键词和语法&#xff0c;降低了编程的门槛&#xff0c;使得代码更加直观易懂。 示例&#xff…

DeepSeek AI R1推理大模型API集成文档

DeepSeek AI R1推理大模型API集成文档 引言 随着自然语言处理技术的飞速发展&#xff0c;大语言模型在各行各业的应用日益广泛。DeepSeek R1作为一款高性能、开源的大语言模型&#xff0c;凭借其强大的文本生成能力、高效的推理性能和灵活的接口设计&#xff0c;吸引了大量开发…

【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和

【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和 文章目录 一、dp1.1 题意理解1.2 整体思路1.3 具体思路1.4 代码 二、多语言解法 一、dp 1.1 题意理解 nums 数组, 有正负0, 使用最多两次魔法卷轴, 希望使数组整体的累加和尽可能大. 求尽可能大的累加和 其实就…