烤翅 发表于 2025-1-3 04:14:38

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:25:20

本帖最后由 创世魂 于 2025-1-3 15:26 编辑

官方库没有封你说的这个。
但是有一个置写入数据回调函数方法。
这个是下载文件用的,可以实时获取数据。

你可以用这个方法试试。

RMJ 发表于 2025-1-3 20:54:55

<火山程序 类型 = "通常" 版本 = 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.加入文本 (当前内容)
            处理事件 ()// 让界面即时刷新
      }
    }

    返回 (数据尺寸 * 数据数量)
}

RMJ 发表于 2025-1-3 20:55:50

还是ai厉害,我喂了火山代码,他给我整出来了

RMJ 发表于 2025-1-3 20:58:22


RMJ 发表于 2025-1-3 21:23:06

DeepSeek对接API2.zip

caomin 发表于 2025-1-3 22:11:25

RMJ 发表于 2025-1-3 20:55
还是ai厉害,我喂了火山代码,他给我整出来了

哥能不能搞个视频教程 看下 你怎么投喂的然后训练出来的吗

RMJ 发表于 2025-1-3 23:39:27

caomin 发表于 2025-1-3 22:11
哥能不能搞个视频教程 看下 你怎么投喂的然后训练出来的吗

cursor,搜索一下,很聪明,能记住投喂,其他AI的记不住,我并没有投什么,估计还有人投,因为有很多方法我没给他都给我整出来了,咸鱼花点小钱搞个账号,这AI对火山最友好的,其他的AI用火山代码像训练傻子

RMJ 发表于 2025-1-3 23:42:23

caomin 发表于 2025-1-3 22:11
哥能不能搞个视频教程 看下 你怎么投喂的然后训练出来的吗

网络传输类我没给他,只给了网络访问类代码,很差异他能把他用出来

烤翅 发表于 2025-1-4 18:32:16

RMJ 发表于 2025-1-3 23:42
网络传输类我没给他,只给了网络访问类代码,很差异他能把他用出来

https://bbs.voldp.com/thread-24670-1-1.html

X大直接封了个类! 牛逼
页: [1]
查看完整版本: libcurl库如何实现异步回调响应 流式输出