您现在的位置是:首页 >技术教程 >使用C++控制台访问deepseek接口并进行对话网站首页技术教程
使用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的方式存放到一个专门的文件夹中
欢迎大佬进行交流学习,感谢观看~
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。