dial-docker-compose/ci/model/azure_deployment_mock/app.py (51 lines of code) (raw):
import json
import os
import uuid
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse, StreamingResponse
import time
app = FastAPI()
API_KEY = os.environ.get("API_KEY")
if API_KEY is None:
raise ValueError("API_KEY environment variable not set")
@app.post("/openai/deployments/{model}/chat/completions")
async def process_completion(model: str, request: Request):
api_key = request.headers.get("api-key")
if api_key is None:
raise HTTPException(status_code=401, detail="API key not provided")
if api_key != API_KEY:
raise HTTPException(status_code=403, detail="Invalid API key")
if model not in ["gpt-35-turbo", "gpt-4"]:
raise HTTPException(status_code=404, detail="Model not found")
body = await request.json()
stream = body.get("stream", False)
content = body["messages"][-1]["content"]
message_key = "message" if not stream else "delta"
response_payload = {
"id": str(uuid.uuid4()),
"object": "chat.completion" if not stream else "chat.completion.chunk",
"created": int(time.time()),
"model": model,
"choices": [
{
"index": 0,
message_key: {
"role": "assistant",
"content": content,
},
"finish_reason": "stop",
}
],
"usage": {
"prompt_tokens": 1,
"completion_tokens": 1,
"total_tokens": 2,
},
}
if stream:
def generate_stream():
yield f"data: {json.dumps(response_payload)}\n\n"
yield "data: [DONE]\n\n"
return StreamingResponse(generate_stream(), media_type="text/event-stream")
else:
return JSONResponse(content=response_payload)