HTTP Stream Response
http 1.1 的 streaming response
http 2.0 的 streaming response
一个stream response的fastAPI示例
from fastapi import FastAPI, Request
from fastapi.responses import StreamingResponse
from fastapi.middleware.cors import CORSMiddleware
from openai import AzureOpenAI
import os
import asyncio
from dotenv import load_dotenv
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
load_dotenv()
app = FastAPI(debug=True)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
azure_endpoint=os.getenv("AZURE_OPENAI_API_BASE")
)
async def sse_chat_generator(prompt):
try:
logger.info(f"Sending prompt to API: {prompt}")
response = client.chat.completions.create(
model=os.getenv("AZURE_OPENAI_MODEL", "gpt-4o-mini"),
messages=[{"role": "user", "content": prompt}],
stream=True,
)
yield "data: " # 加 data: 主要是为了 vue 里的过滤处理。需要看下vue
for chunk in response:
if chunk.choices and len(chunk.choices) > 0:
delta = chunk.choices[0].delta
if delta and delta.content:
yield delta.content
await asyncio.sleep(0.01)
except Exception as e:
logger.error(f"Error in sse_chat_generator: {e}", exc_info=True)
yield f"Error: {str(e)}"
@app.post("/chat")
async def chat(request: Request):
try:
data = await request.json()
prompt = data.get("message", "")
logger.info(f"Received chat request with prompt: {prompt}")
return StreamingResponse(sse_chat_generator(prompt), media_type="text/event-stream")
except Exception as e:
logger.error(f"Error in chat endpoint: {e}", exc_info=True)
return {"error": str(e)}
if __name__ == "__main__":
import uvicorn
logger.info("Starting the server...")
uvicorn.run(app, host="0.0.0.0", port=8080)
Last updated