-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathmain.py
More file actions
50 lines (37 loc) · 1.33 KB
/
main.py
File metadata and controls
50 lines (37 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import asyncio
import os
from fastapi import FastAPI,Request
from fastapi.middleware.cors import CORSMiddleware
from langchain.callbacks import AsyncIteratorCallbackHandler
from langchain.schema import HumanMessage, BaseMessage
from langchain.chat_models import ChatOpenAI
from starlette.responses import StreamingResponse
import request_model
# fastapi
app = FastAPI()
# openai
os.environ["OPENAI_API_KEY"] = 'your api key'
@app.post("/chat")
async def chat(req_model: request_model.Chat):
callback = AsyncIteratorCallbackHandler()
llm = ChatOpenAI(streaming=True, callbacks=[callback], temperature=0)
messages = [HumanMessage(content=req_model.content)]
return StreamingResponse(generate_stream_response(callback, llm, messages), media_type="text/event-stream")
async def generate_stream_response(_callback, llm: ChatOpenAI, messages: list[BaseMessage]):
"""流式响应"""
task = asyncio.create_task(llm.apredict_messages(messages))
async for token in _callback.aiter():
yield token
await task
# 跨域处理
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
expose_headers=["Content-Disposition"]
)
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host='0.0.0.0', port=8008, reload=True)