递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 1957|回复: 9
打印 上一主题 下一主题

[视窗] libcurl库如何实现异步回调响应 流式输出

[复制链接]

32

主题

126

帖子

561

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
561
跳转到指定楼层
楼主
发表于 2025-1-3 04:14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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++,不知道如何实现此功能. 特来论坛求助

67761dee4c465.png (13.36 KB, 下载次数: 127)

67761dee4c465.png
回复

使用道具 举报

453

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
43107
沙发
发表于 2025-1-3 15:25:20 | 只看该作者
本帖最后由 创世魂 于 2025-1-3 15:26 编辑

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

你可以用这个方法试试。
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

3

主题

91

帖子

976

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
976
板凳
发表于 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.加入文本 (当前内容)
            处理事件 ()  // 让界面即时刷新
        }
    }

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

使用道具 举报

3

主题

91

帖子

976

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
976
地板
发表于 2025-1-3 20:55:50 | 只看该作者
还是ai厉害,我喂了火山代码,他给我整出来了
回复

使用道具 举报

3

主题

91

帖子

976

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
976
5#
发表于 2025-1-3 20:58:22 | 只看该作者

回复

使用道具 举报

3

主题

91

帖子

976

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
976
6#
发表于 2025-1-3 21:23:06 | 只看该作者
[url=]DeepSeek对接API2.zip[/url]

DeepSeek对接API2.zip

132.97 KB, 下载次数: 10

回复

使用道具 举报

11

主题

50

帖子

831

积分

高级会员

Rank: 4

积分
831
7#
发表于 2025-1-3 22:11:25 | 只看该作者
RMJ 发表于 2025-1-3 20:55
还是ai厉害,我喂了火山代码,他给我整出来了

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

使用道具 举报

3

主题

91

帖子

976

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
976
8#
发表于 2025-1-3 23:39:27 | 只看该作者
caomin 发表于 2025-1-3 22:11
哥能不能搞个视频教程 看下 你怎么投喂的  然后训练出来的吗

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

使用道具 举报

3

主题

91

帖子

976

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
976
9#
发表于 2025-1-3 23:42:23 | 只看该作者
caomin 发表于 2025-1-3 22:11
哥能不能搞个视频教程 看下 你怎么投喂的  然后训练出来的吗

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

使用道具 举报

32

主题

126

帖子

561

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
561
10#
 楼主| 发表于 2025-1-4 18:32:16 | 只看该作者
RMJ 发表于 2025-1-3 23:42
网络传输类我没给他,只给了网络访问类代码,很差异他能把他用出来

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

X大直接封了个类! 牛逼
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-4-27 17:16 , Processed in 0.106601 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表