C++通过控制台访问deepseek接口并进行对话

 更新时间:2025年02月09日 10:31:16   作者:manelry  
这篇文章主要为大家详细介绍了C++如何通过控制台访问deepseek接口并进行对话,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

如题,其实对于调试一个接口来说并不复杂,关键在于会遇到json输入和解析的字符处理问题,比如中文的输入和解析,动不动就会遇到乱码,经过与deepseek的深度碰撞(发给deepseek),同比通义千问给的方案,更加的准确和高效

开发环境:win11,visual stutio 2022

注意事项:在创建控制台项目后,对main.cpp(或者你自定义的cpp文件)点击顶部“文件”-xxxx.cpp另存为,选择”保存“按钮右侧的更多按钮下的“编码保存”

以下是代码方案

#include <iostream>
#include <json/json.h>
#include <curl/curl.h>
#include <vector>
#include <Windows.h>
#include <sstream>
using namespace std;

// 回调函数
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

void addMessage(std::vector<Json::Value>& messages, const std::string& role, const std::string& content) {
    Json::Value message;
    message["role"] = role;
    message["content"] = content;
    messages.push_back(message);
}

int main() {
    // 设置控制台为UTF-8模式
    system("chcp 65001 > nul");
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);

    std::string apiKey = "这里放你自己申请的APIkey(注意不要尖括号)";
    std::vector<Json::Value> messages;
    addMessage(messages, "system", "You are a helpful assistant.");

    CURL* curl = curl_easy_init();
    if (curl) {
        std::string readBuffer;
        std::string userInput;

        while (true) {
            std::cout << "User: ";
            std::getline(std::cin, userInput);
            if (userInput == "exit") break;

            addMessage(messages, "user", userInput);

            // 构建JSON请求
            Json::Value jsonData;
            jsonData["model"] = "deepseek-chat";
            jsonData["stream"] = false;
            for (const auto& msg : messages) {
                jsonData["messages"].append(msg);
            }

            // 生成JSON字符串
            Json::StreamWriterBuilder writerBuilder;
            writerBuilder.settings_["emitUTF8"] = true;
            std::string jsonString = Json::writeString(writerBuilder, jsonData);

            // 设置CURL选项
            curl_easy_setopt(curl, CURLOPT_URL, "https://api.deepseek.com/chat/completions");
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonString.c_str());
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

            struct curl_slist* headers = NULL;
            headers = curl_slist_append(headers, "Content-Type: application/json");
            headers = curl_slist_append(headers, ("Authorization: Bearer " + apiKey).c_str());
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

            // 执行请求
            CURLcode res = curl_easy_perform(curl);
            if (res != CURLE_OK) {
                std::cerr << "Request failed: " << curl_easy_strerror(res) << std::endl;
            }

            // 处理响应
            Json::CharReaderBuilder readerBuilder;
            std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
            Json::Value root;
            std::string errs;

            if (reader->parse(readBuffer.c_str(), readBuffer.c_str() + readBuffer.size(), &root, &errs)) {
                if (root.isMember("choices") && root["choices"].size() > 0) {
                    std::string response = root["choices"][0]["message"]["content"].asString();
                    std::cout << "Assistant: " << response << std::endl;
                    addMessage(messages, "assistant", response);
                }
                else {
                    std::cerr << "API Error: " << root.toStyledString() << std::endl;
                }
            }
            else {
                std::cerr << "JSON Parse Error: " << errs << std::endl;
            }

            readBuffer.clear();
            curl_slist_free_all(headers);
            curl_easy_reset(curl);
        }
        curl_easy_cleanup(curl);
    }
    return 0;
}

ps:由于deepseek官方API服务目前不稳定,经常会出现空响应,多试几次即可。

后续:目前代码未支持流式输出,另外实际上对于有需要的朋友,可以设计几个辅助功能

1、创建新话题,和保存旧话题内容

2、对于想要留存到本地的价值内容,可以设计个事件,将对话内容以word或者txt的方式存放到一个专门的文件夹中

到此这篇关于C++通过控制台访问deepseek接口并进行对话的文章就介绍到这了,更多相关C++控制台访问deepseek接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Visual C++ 常用数据类型转换方法详解

    Visual C++ 常用数据类型转换方法详解

    本文纯粹是总结一下有关类型转换的贴子,需要的朋友可以参考下
    2017-06-06
  • Linux vmstat命令实战详细解析

    Linux vmstat命令实战详细解析

    这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)
    2013-09-09
  • C++解决输出链表中倒数k个结点的问题

    C++解决输出链表中倒数k个结点的问题

    这篇文章主要给大家介绍了关于如何利用C++解决输出链表中倒数k个结点的问题,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • C++基于Boost库实现命令行解析

    C++基于Boost库实现命令行解析

    Boost库中默认自带了一个功能强大的命令行参数解析器,以往我都是自己实现参数解析的,今天偶尔发现这个好东西,就来总结一下参数解析的基本用法,该库需要引入program_options.hpp头文件,即可使用了
    2021-06-06
  • 使用C语言递归与非递归实现字符串反转函数char *reverse(char *str)的方法

    使用C语言递归与非递归实现字符串反转函数char *reverse(char *str)的方法

    本篇文章是对使用C语言递归与非递归实现字符串反转函数char *reverse(char *str)进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ 拷贝构造函数与赋值的区别

    C++ 拷贝构造函数与赋值的区别

    拷贝构造函数和赋值函数非常容易混淆,本文主要介绍了C++ 拷贝构造函数与赋值的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • C语言中#pragma once的作用

    C语言中#pragma once的作用

    这篇文章主要介绍了C语言中#pragma once的作用,pragma once 一般由编译器提供保证,更多相关内容在下面文章详细展开需要的小伙伴可以参考一下
    2022-05-05
  • C++实现LeetCode(208.实现字典树(前缀树))

    C++实现LeetCode(208.实现字典树(前缀树))

    这篇文章主要介绍了C++实现LeetCode(208.实现字典树(前缀树)),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 一波C语言二元查找树算法题目解答实例汇总

    一波C语言二元查找树算法题目解答实例汇总

    这篇文章主要介绍了一波C语言二元查找树算法题目解答实例汇总,包括按层次遍历和转换为镜像等基本算法题目,需要的朋友可以参考下
    2016-03-03
  • C++实现LeetCode(237.删除链表的节点)

    C++实现LeetCode(237.删除链表的节点)

    这篇文章主要介绍了C++实现LeetCode(237.删除链表的节点),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论