Dify chat模型streaming转为文字解决方案

问题

我们搭建了一个Agent的知识库问题,希望调用接口进行返回,但是Agent模型只支持streaming格式,不支持blocking模式。

而流式输出是字节码,我们是不能直接看懂它的意思,因此需要通过下面代码去实现转换。

python 复制代码
import requests
import json


def stream_to_text(url, headers, data):
    """
    将流式API响应转换为完整的文字输出

    参数:
        url: API端点URL
        headers: 请求头
        data: 请求数据(字典格式)

    返回:
        完整的响应文本
    """
    full_response = ""

    try:
        # 发送POST请求,设置stream=True来接收流式响应
        response = requests.post(url, headers=headers, json=data, stream=True)
        response.raise_for_status()

        # 逐行读取流式响应
        for line in response.iter_lines():
            if line:
                # 解码字节为字符串
                line_str = line.decode('utf-8')

                # 流式响应通常以"data: "开头
                if line_str.startswith('data: '):
                    json_str = line_str[6:]  # 移除"data: "前缀

                    try:
                        # 解析JSON数据
                        data_obj = json.loads(json_str)

                        # 根据实际API响应结构提取文本
                        # 这里可能需要根据你的API实际返回格式调整
                        if 'answer' in data_obj:
                            full_response += data_obj['answer']
                        elif 'message' in data_obj:
                            full_response += data_obj['message']
                        elif 'text' in data_obj:
                            full_response += data_obj['text']

                    except json.JSONDecodeError:
                        # 如果不是JSON格式,直接添加文本
                        if json_str != '[DONE]':  # 忽略结束标记
                            full_response += json_str

        return full_response

    except requests.exceptions.RequestException as e:
        return f"请求错误: {str(e)}"


# 使用示例
if __name__ == "__main__":
    url = "http://xxx/v1/chat-messages"

    headers = {
        "Authorization": "Bearer your-api-key",
        "Content-Type": "application/json"
    }

    data = {
        "inputs": {},
        "query": "卷纸属于哪一类的费用报销",
        "response_mode": "streaming",
        "conversation_id": "",
        "user": "abc-123"
    }

    print("正在请求API...")
    result = stream_to_text(url, headers, data)
    print("\n完整响应:")
    print(result)

运行后会得到以下结果:

相关推荐
鱼日先生35 分钟前
Dify 中级实验(14):对话变量与状态管理——如何让工作流记住多轮对话的状态?
工作流·dify·ai agent·大模型应用·ai 训练
zzz_236840 分钟前
TencentDB-Agent-Memory 深度解析:让多个 Agent 共享项目经验的记忆中枢
java·开发语言·jvm·人工智能·agent·memory·tencent db
武子康1 小时前
WebRTC 已经双向,语音 Agent 为什么还会抢话?
人工智能·llm·agent
用户469368483202 小时前
kimi-code 深度掌握系列文章-Plan Mode 与 Goal Mode:结构化的自主执行(九)
agent
leeyi2 小时前
Memory 三层设计:为什么 [“session“,id] 最后写成了四元组(第78篇-E64)
aigc·agent·ai编程
为你学会写情书2 小时前
Agent Skills 完全指南:从目录规范到渐进式加载的工程实践
agent
Ai拆代码的曹操2 小时前
Agent 做错了怎么办?Self-Critique 机制拆解
后端·agent·ai编程
ckjoker2 小时前
我把Java多模态链路从0跑通了,结果先被4个坑狠狠干了一顿
后端·agent
小当家.1052 小时前
Agent 如何触发 Skill?Skill 和 Tool 的区别详解
agent·skill·tool
提笔了无痕3 小时前
Agent 上下文管理详解、Context设计与构建
数据库·oracle·agent·context