在C++中接入DeepSeek的API通常涉及HTTP请求和JSON数据处理。
1. 准备工作
获取API密钥:前往DeepSeek平台注册并创建应用,获取API Key。
查阅API文档:确认API端点、请求格式和参数要求(https://api.deepseek.com/v1/chat/completions)
2. 安装依赖库
libcurl:用于HTTP通信(Ubuntu安装:`udo apt-get install libcurl4-openssl-dev)
JSON库:推荐使用[nlohmann/json](https://github.com/nlohmann/json)(单头文件库)
3. 代码
#include <iostream>
#include <string>
#include <curl/curl.h>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
// 回调函数处理响应数据
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* s) {
size_t newLength = size * nmemb;
try {
s->append((char*)contents, newLength);
return newLength;
} catch(std::bad_alloc &e) {
return 0;
}
}
int main() {
CURL* curl;
CURLcode res;
std::string readBuffer;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
// 设置API端点
curl_easy_setopt(curl, CURLOPT_URL, "https://api.deepseek.com/v1/chat/completions");
// 设置请求头
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, ("Authorization: Bearer " + std::string("你的API_KEY")).c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 构建请求体
json requestBody = {
{"model", "deepseek-chat"},
{"messages", {
{{"role", "user"}, {"content", "你好,请自我介绍"}}
}},
{"temperature", 0.7}
};
std::string requestStr = requestBody.dump();
// 设置POST参数
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestStr.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestStr.length());
// 设置响应回调
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
// 执行请求
res = curl_easy_perform(curl);
// 处理响应
if(res == CURLE_OK) {
try {
json response = json::parse(readBuffer);
if(response.contains("choices") && !response["choices"].empty()) {
std::cout << "回复:" << response["choices"][0]["message"]["content"] << std::endl;
} else {
std::cerr << "错误响应:" << response.dump(2) << std::endl;
}
} catch(json::parse_error& e) {
std::cerr << "JSON解析失败: " << e.what() << std::endl;
}
} else {
std::cerr << "请求失败: " << curl_easy_strerror(res) << std::endl;
}
// 清理资源
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
4. 编译
g++ -o deepseek_demo deepseek_demo.cpp -lcurl
5. 注意事项
1. 安全存储API密钥:建议使用环境变量或配置文件,不要硬编码
2. 错误处理:
- 检查HTTP状态码(200表示成功)
- 处理网络异常和JSON解析错误
3. 性能优化:
- 复用CURL句柄(curl_easy_init)
- 启用连接池(CURLOPT_TCP_KEEPALIVE)
4. 异步处理:对于高并发需求,考虑使用libcurl的多线程接口或异步IO
高级功能实现
如需流式响应处理,可修改回调函数:
static size_t StreamCallback(char* ptr, size_t size, size_t nmemb, void* userdata) {
size_t dataSize = size * nmemb;
std::string chunk(ptr, dataSize);
try {
// 处理流式数据(示例:直接输出)
std::cout << chunk << std::flush;
} catch(...) {
return 0;
}
return dataSize;
}
// 设置流式回调
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, StreamCallback);
139

被折叠的 条评论
为什么被折叠?



