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

这篇文章主要为大家详细介绍了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接口内容请搜索骃骐网以前的文章或继续浏览下面的相关文章希望大家以后多多支持骃骐网!

您可能感兴趣的文章:

  • 一文教你如何本地部署DeepSeek
  • Node.js调用DeepSeek API的完整指南
  • PHP调用DeepSeek API的完整指南
  • Python调用DeepSeek API的完整操作指南
  • Go语言调用DeepSeek API实现流式输出和对话
  • C#使用DeepSeek API实现自然语言处理,文本分类和情感分析
  • 使用C# 调用deepseek api接口实现正常访问的过程

相关推荐:

怎样在Python Flask中集成Swagger接口文档_使用flasgger插件

用flasgger是Flask项目集成Swagger文档最轻量靠谱的选择;它通过装饰器和docstring生成可交互UI,需安装pyyaml并调用Swagger(app),注意YAML语法、definitions引用及类型书写规范。 Flask 项目里加 Swagger 文档,flasgger 是最轻量靠谱的选择 直接说结论:用 flasgger 比手写 OpenAPI YAML、或套 apisp...

如何在Python中对GraphQL接口进行自动化测试_结合pytest与sgqlc

sgqlc 与 pytest 结合测试的核心难点在于上下文缺失、类型校验绕过和响应误判;关键实践是用 sgqlc-codegen 同步最新 schema 并提交 Git,测试中通过 Operation 和生成类型类构造合法 query,用 op.variables 提取变量,function 级 fixture 管理 client,独立构造 Operation 避免污染。 直接用 sgqlc 写 ...

Python后端开发中如何保证API接口的防重操作幂等性_基于Redis防重Token或唯一联合索引

Redis+Token方案在分布式下易因网络超时、主从复制延迟、实例切换导致失效,仅适用于日志上报等弱一致性场景;强一致性操作如支付、订单必须用数据库唯一联合索引兜底;两者可组合使用,Redis前置拦截、DB最终校验,但需对齐生命周期与错误处理逻辑。 API 接口的防重操作(即幂等性)不能只靠前端拦截或按钮置灰,后端必须做校验;Redis 防重 Token 和数据库唯一联合索引是两种主流方案,但适...

Python爬虫怎么抓取动态更新的API数据_使用轮询机制请求接口

轮询前需先判断接口是否真需轮询:若API支持增量拉取(如含timestamp参数或last_updated字段)或缓存机制(ETag/If-Modified-Since),应优先采用;否则才考虑轮询,并需封装为可中断、带重试、超时控制与随机抖动的健壮循环。 轮询接口前先确认它是否真需要轮询 很多所谓“动态更新”的数据,其实只是前端用 fetch 或 axios 调了后端 API,而这个 API 本...

怎么在Python Django中实现API接口的版本控制_利用DRF的Versioning组件

绝大多数 Laravel 和 DRF 项目应将 API 版本号放在 URL 路径中(如 /api/v1/users),因其调试直观、缓存友好、日志可读、Nginx/CDN 路由可控;请求头方式虽更符合 REST 语义,但调试麻烦且代理可能丢弃自定义头。 API版本号该放在URL路径里还是请求头中 DRF默认支持多种版本控制方案,但URLPathVersioning和AcceptHeaderVers...

Python中如何处理异步ContextManager上下文管理_实现__aenter__接口

async with 不能直接用普通 enter__,因为其底层调用的是 __aenter 和 aexit 协程方法;二者必须用 async def 定义,且 aexit 需完整接收三个异常参数并支持 await 清理逻辑。 async with 为什么不能直接用普通 __enter__ 因为 async with 语句底层调用的是 __aenter__ 和 __aexit__,不是同步的 __e...

如何将调试日志写入文件并屏蔽控制台输出

本文详解如何将 Python 的 logging(包括第三方库如 requests/urllib3)的 DEBUG 级别日志完整写入文件,同时彻底禁用控制台(stdout/stderr)输出,避免日志污染终端。 本文详解如何将 python 的 `logging`(包括第三方库如 `requests`/`urllib3`)的 debug 级别日志完整写入文件,同时彻底禁用控制台(stdout/st...

Windows环境下Go语言UTF-8控制台显示问题的专业解决方案

本文旨在解决Go语言在Windows系统控制台下UTF-8字符显示异常的问题。Go语言默认支持UTF-8,但在Windows默认CMD或PowerShell中,由于编码不兼容,中文等UTF-8字符常显示乱码。教程将详细指导如何通过引入MSYS环境并配置Mintty终端模拟器,实现Go程序在Windows控制台的正确UTF-8输出,确保开发环境的一致性和可靠性。问题概述 go语言从设计之初就对utf...

深入理解Go语言结构体中的接口嵌入与方法提升

Go语言支持结构体嵌入(anonymous fields),允许将接口或其他结构体类型直接嵌入到另一个结构体中,无需显式指定字段名。此时,被嵌入的类型名将自动作为字段名。这种机制不仅简化了结构体定义,更重要的是实现了方法的自动提升,使得外部结构体可以直接调用嵌入类型的方法,极大地增强了代码的复用性和灵活性。本文将详细探讨Go结构体中接口嵌入的原理、访问方式及注意事项。Go语言结构体嵌入(匿名字段)...

C++工厂方法模式 对象创建接口封装

工厂方法模式通过虚函数将对象创建延迟到子类,实现解耦;C++中以抽象工厂定义接口,具体工厂创建具体产品,客户端仅依赖抽象,符合开闭原则,便于扩展与维护。 工厂方法模式是一种创建型设计模式,它把对象的创建过程封装到子类中,让父类不依赖具体对象的类型。在C++中,通过虚函数定义创建对象的接口,由派生类决定实例化哪个类,从而实现对象创建的解耦。 工厂方法模式的核心思想 定义一个用于创建对象的接口,但让子...