使用场景,移动端集成AnythingLLM chat,使用python作为转发,此处可以有自己的业务去访问AnythingLLM,避免前端输入一堆东西,直接返回结果。
以下是如何实现流式输出的详细步骤和代码示例:
from flask import Flask, Response, request
import requests
from flask_cors import CORSapp = 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或POSTtarget_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)}", 500if __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
注意配置这些的地方,不能少