C++通過控制臺訪問deepseek接口并進行對話
如題,其實對于調試一個接口來說并不復雜,關鍵在于會遇到json輸入和解析的字符處理問題,比如中文的輸入和解析,動不動就會遇到亂碼,經(jīng)過與deepseek的深度碰撞(發(fā)給deepseek),同比通義千問給的方案,更加的準確和高效
開發(fā)環(huán)境:win11,visual stutio 2022
注意事項:在創(chuàng)建控制臺項目后,對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; // 回調函數(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() { // 設置控制臺為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); // 執(zhí)行請求 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服務目前不穩(wěn)定,經(jīng)常會出現(xiàn)空響應,多試幾次即可。
后續(xù):目前代碼未支持流式輸出,另外實際上對于有需要的朋友,可以設計幾個輔助功能
1、創(chuàng)建新話題,和保存舊話題內容
2、對于想要留存到本地的價值內容,可以設計個事件,將對話內容以word或者txt的方式存放到一個專門的文件夾中
到此這篇關于C++通過控制臺訪問deepseek接口并進行對話的文章就介紹到這了,更多相關C++控制臺訪問deepseek接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++?opencv利用grabCut算法實現(xiàn)摳圖示例
這篇文章主要為大家介紹了C++?opencv利用grabCut算法實現(xiàn)摳圖的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05