当前位置: 首页 > article >正文

python实现自己的业务集成AnythingLLM并使用eventStream方式返回前端数据

使用场景,移动端集成AnythingLLM chat,使用python作为转发,此处可以有自己的业务去访问AnythingLLM,避免前端输入一堆东西,直接返回结果。

以下是如何实现流式输出的详细步骤和代码示例:


from flask import Flask, Response, request
import requests
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
api_key = "WQ59GRH-1JC4M3R-MS2NN3X-VBQCY7H"  # 替换成你自己的apikey
# workspace = "8ceb3fb1-4e75-40fe-87db-570d5a689113"
workspace_name = "8ceb3fb1-4e75-40fe-87db-570d5a689113"
@app.route('/api/embed/<workspace_name>/stream-chat', methods=['GET', 'POST'])
def proxy(workspace_name):
    try:
        target_url = f"http://ip:port/api/v1/workspace/{workspace_name}/stream-chat"
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json",
            "accept": "text/event-stream"  # 确保服务器支持流式响应
        }
        data = {
            "message": "道德经讲的是什么,用50个字概括", #此处需要拼接自己的问题或本地业务
            "mode": "query",  # 可选chat/query模式
            'max_tokens': 1024,  # 控制生成文本的长度
            "stream": True
        }
        print("1")
        # 根据请求方法选择GET或POST
        target_response = requests.post(target_url,
                                        json=data,  # 将客户端的流式数据转发
                                        headers=headers,  # 使用自定义请求头
                                        stream=True)  # 启用流式请求
        # 检查目标服务器的响应状态
        if target_response.status_code != 200:
            return f"Error: Target server returned status code {target_response.status_code}", target_response.status_code

        # 按流接收并返回数据块
        def generate():
            try:
                print("start")
                for chunk in target_response.iter_lines():
                    if chunk:  # 确保数据块不为空
                        print(chunk.decode("utf-8"))
                        yield chunk.decode("utf-8")+"\n\n"  # 立即将数据块返回给客户端
            finally:
                print("close")
                target_response.close()  # 确保关闭目标响应

        # 创建流式响应
        return Response(generate(), mimetype='text/event-stream')

    except requests.RequestException as e:
        return f"Error: {str(e)}", 500

if __name__ == '__main__':
    app.run(host="0.0.0.0",debug=True)


关键点说明

1、host=“0.0.0.0”

不配置,不能被其他地址访问

2、 yield chunk.decode(“utf-8”)+“\n\n”

解码之后必须给后面的\n\n,这个是格式要求,不能去掉

3、 “stream”: True

注意配置这些的地方,不能少


http://www.kler.cn/a/565644.html

相关文章:

  • 依赖注入
  • Qt 上下键切换焦点及显示自定义ToolTip
  • 【MySQL】 表的约束(上)
  • R语言+AI提示词:贝叶斯广义线性混合效应模型GLMM生物学Meta分析
  • T23N 君正(Ingenic)T系列芯片是专为智能视频和物联网应用设计的高性能、低功耗处理器 提供软硬件资料及样品测试
  • 网络安全技术概述
  • 周鸿祎新能源汽车抽奖活动,抽奖券:7UTVCA
  • 辛格迪客户案例 | 甫康(上海)健康科技有限责任公司药物警戒管理系统(PVS)项目
  • 用DeepSeek生成批量删除处理 PDF第一页工具
  • 【计算机视觉】条形码与二维码识别
  • 边缘计算+多模态感知:户外监控核心技术解析与工程部署实践!户外摄像头监控哪种好?户外摄像头监控十大品牌!格行视精灵VS海康威视VS大华横评!
  • JavaEE [特殊字符] TCP协议:三次握手四次挥手全图解
  • python-leetcode-下一个排列
  • 基于定制开发开源AI大模型S2B2C商城小程序的商品选品策略研究
  • 单例模式---是 Spring 容器的核心特性之一
  • Oracle 导出所有表索引的创建语句
  • macos下myslq图形化工具之Sequel Ace
  • 面试基础---Spring 生态---深度剖析Spring AOP动态代理机制
  • leetcode53—最大子数组和(kadane算法)
  • 覆盖数学/代码/科学/谜题,高质量推理数据集汇总,助力复现DeepSeek超强推理能力