“深入浅出”系列之C++:(23)C++接入Deepseek

在C++中接入DeepSeek的API通常涉及HTTP请求和JSON数据处理。以下是分步指南及示例代码:

### 1. 准备工作

- **获取API密钥**:前往DeepSeek平台注册并创建应用,获取API Key。

- **查阅API文档**:确认API端点、请求格式和参数要求(如`https://api.deepseek.com/v1/chat/completions`)。

### 2. 安装依赖库

- **libcurl**:用于HTTP通信(Ubuntu安装:`sudo apt-get install libcurl4-openssl-dev`)

- **JSON库**:推荐使用[nlohmann/json](https://github.com/nlohmann/json)(单头文件库)

### 3. 示例代码实现

```cpp

#include <iostream>

#include <string>

#include <curl/curl.h>

#include <nlohmann/json.hpp>

using json = nlohmann::json;

// 回调函数处理响应数据

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* s) {

    size_t newLength = size * nmemb;

    try {

        s->append((char*)contents, newLength);

        return newLength;

    } catch(std::bad_alloc &e) {

        return 0;

    }

}

int main() {

    CURL* curl;

    CURLcode res;

    std::string readBuffer;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();

    if(curl) {

        // 设置API端点

        curl_easy_setopt(curl, CURLOPT_URL, "https://api.deepseek.com/v1/chat/completions");

        

        // 设置请求头

        struct curl_slist* headers = NULL;

        headers = curl_slist_append(headers, "Content-Type: application/json");

        headers = curl_slist_append(headers, ("Authorization: Bearer " + std::string("你的API_KEY")).c_str());

        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // 构建请求体

        json requestBody = {

            {"model", "deepseek-chat"},

            {"messages", {

                {{"role", "user"}, {"content", "你好,请自我介绍"}}

            }},

            {"temperature", 0.7}

        };

        std::string requestStr = requestBody.dump();

        // 设置POST参数

        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestStr.c_str());

        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestStr.length());

        // 设置响应回调

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);

        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        // 执行请求

        res = curl_easy_perform(curl);

        // 处理响应

        if(res == CURLE_OK) {

            try {

                json response = json::parse(readBuffer);

                if(response.contains("choices") && !response["choices"].empty()) {

                    std::cout << "回复:" << response["choices"][0]["message"]["content"] << std::endl;

                } else {

                    std::cerr << "错误响应:" << response.dump(2) << std::endl;

                }

            } catch(json::parse_error& e) {

                std::cerr << "JSON解析失败: " << e.what() << std::endl;

            }

        } else {

            std::cerr << "请求失败: " << curl_easy_strerror(res) << std::endl;

        }

        // 清理资源

        curl_slist_free_all(headers);

        curl_easy_cleanup(curl);

    }

    curl_global_cleanup();

    return 0;

}

```

### 4. 编译命令

```bash

g++ -o deepseek_demo deepseek_demo.cpp -lcurl

```

### 5. 关键注意事项

1. **安全存储API密钥**:建议使用环境变量或配置文件,不要硬编码

2. **错误处理**:

   - 检查HTTP状态码(200表示成功)

   - 处理网络异常和JSON解析错误

3. **性能优化**:

   - 复用CURL句柄(curl_easy_init)

   - 启用连接池(CURLOPT_TCP_KEEPALIVE)

4. **异步处理**:对于高并发需求,考虑使用libcurl的多线程接口或异步IO

### 6. 高级功能实现

如需流式响应处理,可修改回调函数:

```cpp

static size_t StreamCallback(char* ptr, size_t size, size_t nmemb, void* userdata) {

    size_t dataSize = size * nmemb;

    std::string chunk(ptr, dataSize);

    

    try {

        // 处理流式数据(示例:直接输出)

        std::cout << chunk << std::flush;

    } catch(...) {

        return 0;

    }

    return dataSize;

}

// 设置流式回调

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, StreamCallback);

```

建议参考官方文档获取最新API规范,并根据实际需求调整参数和处理逻辑。

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

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

相关文章

利用亚马逊AI代码助手生成、构建和编译一个游戏应用(下)

在上篇文章中中&#xff0c;我们介绍了如何通过亚马逊AI代码生成助手 - Amazon Q Developer代理的代码生成、构建和测试功能&#xff0c;让开发者可以更高效地交付高质量代码项目&#xff0c;同时减少代码中bug错误&#xff0c;提升整体开发体验。在本篇中&#xff0c;我们将通…

网络安全技术pat实验 网络安全 实验

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网络安全实验3 前言Kali 常用指令工具教程 ettercap 基本使用 一、口令破解 John the ripper 破解 linux 密码l0phtcrack7 破解 windows 密码John 破解 zip 压…

网络行为管理系统是什么?有什么功能?

​简单来说&#xff0c;网络行为管理系统就是对网络进行有效的规范约束和调整&#xff0c;关于网络行为管理系统的相关问题整理了一些详细介绍供大家参考。 一、什么是网络行为管理系统&#xff1f; 在数据网络和数据通信业务发展非常迅速&#xff0c;在数据网络和通信业务迅…

毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现

&#x1f393; 毕业设计大揭秘&#xff01;想要源码和文章&#xff1f;快来私信我吧&#xff01; Hey小伙伴们~ &#x1f44b; 毕业季又来啦&#xff01;是不是都在为毕业设计忙得团团转呢&#xff1f;&#x1f914; 别担心&#xff0c;我这里有个小小的福利要分享给你们哦&…

垃圾回收器

一、GC分类与性能指标 1.垃圾回收器概述: 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中&#xff0c;因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器&#xff0c;可以将…

Java基础——代理模式

代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 一、代理模式的主要作用 控制访问&#xff1a;通…

微软宣布 Windows 11 将不再免费升级:升级需趁早

大家都知道如果你现在是Windows 10 系统&#xff0c;其实可以免费升级到正版 Windows 11&#xff0c;只要你的电脑配置满足 TPM2.0要求。 而最近微软已经公布了 Windows 10 的最后支持时间&#xff0c;也就是今年10月14日&#xff0c;在这之后微软将不再对Windows 10负责&#…

django连接mysql数据库

1.下载mysqlclient第三方库 2.在settings.py里连接数据库&#xff08;提前建好&#xff09; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: 学生信息,USER: root,PASSWORD: 999123457,HOST: localhost,POST: 3306,} } 3.在models.py里创建一个类&#xff0…

滤波器 | 原理 / 分类 / 特征指标 / 设计

注&#xff1a;本文为 “滤波器” 相关文章合辑。 未整理去重。 浅谈滤波器之 —— 啥是滤波器 原创 RF 小木匠 射频学堂 2020 年 03 月 25 日 07:46 滤波器&#xff0c;顾名思义&#xff0c;就是对信号进行选择性过滤&#xff0c;对不需要的信号进行有效滤除。按照其传输信…

v4l2子系统学习(一)V4L2应用程序编程

文章目录 1、声明2、前言3、数据采集流程3.1、buffer的管理3.2、完整的使用流程 4、应用程序编写5、测试 1、声明 本文是在学习韦东山《驱动大全》V4L2子系统时&#xff0c;为梳理知识点和自己回看而记录&#xff0c;全部内容高度复制粘贴。 韦老师的《驱动大全》&#xff1a…

NAC网络接入控制三种认证方式802.1X认证、MAC认证和Portal认证

NAC网络接入控制三种认证方式802.1X认证、MAC认证和Portal认证 1.NAC简介2.802.1X认证3. MAC认证4. Portal认证 1.NAC简介 NAC&#xff08;Network Access Control&#xff09;称为网络接入控制&#xff0c;通过对接入网络的客户端和用户的认证保证网络的安全&#xff0c;是一…

vscode远程报错:Remote host key has changed,...

重装了Ubuntu系统之后&#xff0c;由20.04改为22.04&#xff0c;再用vscode远程&#xff0c;就出现了以上报错。 亲测有效的办法 gedit ~/.ssh/known_hosts 打开这个配置文件 删掉与之匹配的那一行&#xff0c;不知道删哪一行的话&#xff0c;就打开第一行这个 /.ssh/confi…

多个 JDK 版本(Java 8、Java 17、Java 21)下载和切换

文章目录 多个 JDK 版本&#xff08;Java 8、Java 17、Java 21&#xff09;下载和切换1. 下载 JDK2. 配置环境变量3. JDK 版本切换4. 测试5. 在 IDEA 中切换 JDK注意&#xff1a; 多个 JDK 版本&#xff08;Java 8、Java 17、Java 21&#xff09;下载和切换 随着 Spring Boot …

深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作

一、问题背景&#xff08;传统爬虫的痛点&#xff09; 数据采集是现代网络爬虫技术的核心任务之一。然而&#xff0c;传统爬虫面临多重挑战&#xff0c;主要包括&#xff1a; 反爬机制&#xff1a;许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫&#xff0c;进而限制…

【Vue+python】Vue调用python-fastApi接口实现数据(数值、列表类型数据)渲染

前言&#xff1a;之前做的一直都是SpringBootVue的应用&#xff0c;但现在需要实现一个能将python实现的算法应用展示在前端的界面。想法是直接Vue调用python-fastApi接口实现数据渲染~ 文章目录 1. 变量定义2. axios调用python3. 跨域问题解决4. 数据渲染4.1 数值数据渲染4.2 …

SOME/IP--协议英文原文讲解8

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2 Speci…

禁止WPS强制打开PDF文件

原文网址&#xff1a;禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR&#xff0c;输入&#xff1a;regedit&#xff0c;回车。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

Pytorch深度学习教程_3_初识pytorch

欢迎来到《PyTorch深度学习教程》系列的第三篇&#xff01;在前面的两篇中&#xff0c;我们已经介绍了Python及numpy的基本使用。今天&#xff0c;我们将深入探索PyTorch的核心功能&#xff0c;帮助你更好地理解和使用这个强大的深度学习框架。 欢迎订阅专栏&#xff1a; 深度…

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0&#xff1a;总目录-CSDN博客 Windows桌面系统管理1&#xff1a;计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2&#xff1a;VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3&#xff1a;Windows 10操作系统部署与使用-CSDN博客 Wi…

web入侵实战分析-常见web攻击类应急处置实验1

场景说明&#xff1a; 某天运维人员发现在/opt/tomcat8/webapps/test/目录下&#xff0c;多出了一个index_bak.jsp这个文件&#xff0c; 并告诉你如下信息 操作系统&#xff1a;ubuntu-16.04业务&#xff1a;测试站点中间件&#xff1a;tomcat开放端口&#xff1a;22&#x…