C++通過控制臺(tái)訪問deepseek接口并進(jìn)行對(duì)話
如題,其實(shí)對(duì)于調(diào)試一個(gè)接口來說并不復(fù)雜,關(guān)鍵在于會(huì)遇到j(luò)son輸入和解析的字符處理問題,比如中文的輸入和解析,動(dòng)不動(dòng)就會(huì)遇到亂碼,經(jīng)過與deepseek的深度碰撞(發(fā)給deepseek),同比通義千問給的方案,更加的準(zhǔn)確和高效
開發(fā)環(huán)境:win11,visual stutio 2022
注意事項(xiàng):在創(chuàng)建控制臺(tái)項(xiàng)目后,對(duì)main.cpp(或者你自定義的cpp文件)點(diǎn)擊頂部“文件”-xxxx.cpp另存為,選擇”保存“按鈕右側(cè)的更多按鈕下的“編碼保存”

以下是代碼方案
#include <iostream>
#include <json/json.h>
#include <curl/curl.h>
#include <vector>
#include <Windows.h>
#include <sstream>
using namespace std;
// 回調(diào)函數(shù)
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() {
// 設(shè)置控制臺(tái)為UTF-8模式
system("chcp 65001 > nul");
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
std::string apiKey = "這里放你自己申請(qǐng)的APIkey(注意不要尖括號(hào))";
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);
// 構(gòu)建JSON請(qǐng)求
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);
// 設(shè)置CURL選項(xiàng)
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);
// 執(zhí)行請(qǐng)求
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "Request failed: " << curl_easy_strerror(res) << std::endl;
}
// 處理響應(yīng)
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服務(wù)目前不穩(wěn)定,經(jīng)常會(huì)出現(xiàn)空響應(yīng),多試幾次即可。
后續(xù):目前代碼未支持流式輸出,另外實(shí)際上對(duì)于有需要的朋友,可以設(shè)計(jì)幾個(gè)輔助功能
1、創(chuàng)建新話題,和保存舊話題內(nèi)容
2、對(duì)于想要留存到本地的價(jià)值內(nèi)容,可以設(shè)計(jì)個(gè)事件,將對(duì)話內(nèi)容以word或者txt的方式存放到一個(gè)專門的文件夾中
到此這篇關(guān)于C++通過控制臺(tái)訪問deepseek接口并進(jìn)行對(duì)話的文章就介紹到這了,更多相關(guān)C++控制臺(tái)訪問deepseek接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual C++ 常用數(shù)據(jù)類型轉(zhuǎn)換方法詳解
本文純粹是總結(jié)一下有關(guān)類型轉(zhuǎn)換的貼子,需要的朋友可以參考下2017-06-06
Linux vmstat命令實(shí)戰(zhàn)詳細(xì)解析
這個(gè)命令是我查看Linux/Unix最喜愛的命令,一個(gè)是Linux/Unix都支持,二是相比top,我可以看到整個(gè)機(jī)器的CPU,內(nèi)存,IO的使用情況,而不是單單看到各個(gè)進(jìn)程的CPU使用率和內(nèi)存使用率(使用場(chǎng)景不一樣)2013-09-09
C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問題
這篇文章主要給大家介紹了關(guān)于如何利用C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問題,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-12-12
C++基于Boost庫(kù)實(shí)現(xiàn)命令行解析
Boost庫(kù)中默認(rèn)自帶了一個(gè)功能強(qiáng)大的命令行參數(shù)解析器,以往我都是自己實(shí)現(xiàn)參數(shù)解析的,今天偶爾發(fā)現(xiàn)這個(gè)好東西,就來總結(jié)一下參數(shù)解析的基本用法,該庫(kù)需要引入program_options.hpp頭文件,即可使用了2021-06-06
使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)的方法
本篇文章是對(duì)使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別
拷貝構(gòu)造函數(shù)和賦值函數(shù)非常容易混淆,本文主要介紹了C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C++實(shí)現(xiàn)LeetCode(237.刪除鏈表的節(jié)點(diǎn))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(237.刪除鏈表的節(jié)點(diǎn)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

