libcurl库如何实现异步回调响应 流式输出
https://api-docs.deepseek.com/zh-cn/现在的对话大模型访问请求基本都是流式输出内容的 这样效率更高,用户体验更好,请问火山中如何实现呢
#include <curl/curl.h>
#include <iostream>
#include <string>
// 回调函数,用于处理每一块流式数据
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
std::string* response = static_cast<std::string*>(userp);
size_t totalSize = size * nmemb;
response->append(static_cast<char*>(contents), totalSize);
std::cout << "Received chunk: " << response->substr(response->length() - totalSize) << std::endl;
return totalSize;
}
int main() {
CURL* curl;
CURLcode res;
std::string response;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://api.example.com/stream"); // 替换为实际的API地址
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); // 设置回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); // 设置用户数据
// 启动请求
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
}
curl_easy_cleanup(curl);
}
return 0;
}
按道理curl库是可以实现的 但是本人不懂c++,不知道如何实现此功能. 特来论坛求助
本帖最后由 创世魂 于 2025-1-3 15:26 编辑
官方库没有封你说的这个。
但是有一个置写入数据回调函数方法。
这个是下载文件用的,可以实时获取数据。
你可以用这个方法试试。
<火山程序 类型 = "通常" 版本 = 1 />
方法 获取问答 <公开 静态>
{
变量 FW <类型 = 网络访问类>
变量 cs1 <类型 = 文本型
值 = "{\r\n \"model\": \"deepseek-chat\",\r\n \"messages\": [\r\n {\"role\": \"system\", \"content\": \"">
变量 cs2 <类型 = 文本型 值 = "\"}\r\n ],\r\n \"stream\": true\r\n }">
变量 协议 <类型 = 文本数组类>
变量 KEY <类型 = 文本型>
变量 传输对象 <类型 = 网络传输类>
协议.加入成员 ("Content-Type: application/json")
KEY = "sk-82a1564834be4b09b991b6ed29acb390"// 填写自己的KEY
协议.加入成员 ("Authorization:Bearer " + KEY)
变量 cs <类型 = 文本型>
cs = cs1 + FW.URL编码 (取程序 ().主窗口对象.编辑框1.内容) + cs2
// 先输出问题
取程序 ().主窗口对象.编辑框2.加入文本行 ("问:" + 取程序 ().主窗口对象.编辑框1.内容)
取程序 ().主窗口对象.编辑框2.加入文本行 ("答:")
// 设置传输对象参数
传输对象.地址 = "https://api.deepseek.com/chat/completions"
传输对象.置请求方式 ("POST")
传输对象.置请求头 (协议)
传输对象.置提交数据 (文本到多字节 (cs, 假))
// 设置回调函数处理流式数据
传输对象.置写入数据回调函数 (处理流式数据)
// 发送请求
传输对象.发送请求 ()
}
方法 处理流式数据 <静态 类型 = 变整数>
参数 数据 <类型 = 变整数>
参数 数据尺寸 <类型 = 变整数>
参数 数据数量 <类型 = 变整数>
参数 用户数据 <类型 = 变整数>
{
变量 缓冲区 <类型 = 文本型>
缓冲区 = UTF8到文本 (指针到字节集 (数据, (整数)数据尺寸 * (整数)数据数量))
如果 (寻找文本 (缓冲区, "content\":\"", , ) != -1)
{
变量 A1 <类型 = 整数>
变量 A2 <类型 = 整数>
A1 = 寻找文本 (缓冲区, "content\":\"", , )
A2 = 寻找文本 (缓冲区, "\"},\"", , )
如果 (A2 > A1 && A1 != 0 && A2 != 0)
{
变量 当前内容 <类型 = 文本型>
当前内容 = 取文本中间 (缓冲区, A1 + 10, A2 - A1 - 10)
子文本替换 (当前内容, "\\n", "\r\n", , , )
取程序 ().主窗口对象.编辑框2.加入文本 (当前内容)
处理事件 ()// 让界面即时刷新
}
}
返回 (数据尺寸 * 数据数量)
}
还是ai厉害,我喂了火山代码,他给我整出来了
DeepSeek对接API2.zip
RMJ 发表于 2025-1-3 20:55
还是ai厉害,我喂了火山代码,他给我整出来了
哥能不能搞个视频教程 看下 你怎么投喂的然后训练出来的吗 caomin 发表于 2025-1-3 22:11
哥能不能搞个视频教程 看下 你怎么投喂的然后训练出来的吗
cursor,搜索一下,很聪明,能记住投喂,其他AI的记不住,我并没有投什么,估计还有人投,因为有很多方法我没给他都给我整出来了,咸鱼花点小钱搞个账号,这AI对火山最友好的,其他的AI用火山代码像训练傻子 caomin 发表于 2025-1-3 22:11
哥能不能搞个视频教程 看下 你怎么投喂的然后训练出来的吗
网络传输类我没给他,只给了网络访问类代码,很差异他能把他用出来 RMJ 发表于 2025-1-3 23:42
网络传输类我没给他,只给了网络访问类代码,很差异他能把他用出来
https://bbs.voldp.com/thread-24670-1-1.html
X大直接封了个类! 牛逼
页:
[1]