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
注意配置这些的地方,不能少