Spaces:
Running
Running
import os | |
from flask import Flask, request, jsonify, Response, stream_with_context | |
from functools import wraps | |
import requests | |
import json | |
app = Flask(__name__) | |
AZURE_API_KEY = os.environ.get("AZURE_API_KEY") | |
AZURE_API_BASE = "https://openai-skyline-jp.openai.azure.com" | |
AZURE_API_VERSION = "2023-05-15" | |
AZURE_DEPLOYMENT_NAME = "GPT-4" | |
API_TOKEN = os.environ.get("API_TOKEN") | |
def token_required(f): | |
def decorated(*args, **kwargs): | |
token = None | |
if 'Authorization' in request.headers: | |
auth_header = request.headers['Authorization'] | |
try: | |
token = auth_header.split(" ")[1] | |
except IndexError: | |
return jsonify({"error": "Invalid token format"}), 401 | |
if not token: | |
return jsonify({"error": "Token is missing"}), 401 | |
if token != API_TOKEN: | |
return jsonify({"error": "Invalid token"}), 401 | |
return f(*args, **kwargs) | |
return decorated | |
def convert_to_openai_format(azure_response): | |
openai_response = { | |
"id": azure_response.get("id", ""), | |
"object": "chat.completion", | |
"created": azure_response.get("created", 0), | |
"model": azure_response.get("model", "gpt-4"), | |
"choices": [], | |
"usage": azure_response.get("usage", {}) | |
} | |
for choice in azure_response.get("choices", []): | |
openai_choice = { | |
"index": choice.get("index", 0), | |
"message": choice.get("message", {}), | |
"finish_reason": choice.get("finish_reason") | |
} | |
openai_response["choices"].append(openai_choice) | |
return {k: v for k, v in openai_response.items() if v is not None} | |
def chat_completions(): | |
request_data = request.json | |
stream = request_data.get('stream', False) | |
azure_url = f"{AZURE_API_BASE}/openai/deployments/{AZURE_DEPLOYMENT_NAME}/chat/completions?api-version={AZURE_API_VERSION}" | |
headers = { | |
"Content-Type": "application/json", | |
"api-key": AZURE_API_KEY | |
} | |
if not stream: | |
response = requests.post(azure_url, json=request_data, headers=headers) | |
if response.status_code == 200: | |
azure_response = response.json() | |
openai_response = convert_to_openai_format(azure_response) | |
return jsonify(openai_response), 200 | |
else: | |
return jsonify({"error": "Azure OpenAI API request failed", "details": response.text}), response.status_code | |
else: | |
def generate(): | |
with requests.post(azure_url, json=request_data, headers=headers, stream=True) as response: | |
if response.status_code != 200: | |
yield f"data: {json.dumps({'error': 'Azure OpenAI API request failed', 'details': response.text})}\n\n" | |
return | |
for line in response.iter_lines(): | |
if line: | |
azure_data = json.loads(line.decode('utf-8').replace('data: ', '')) | |
openai_data = { | |
"id": azure_data.get("id", ""), | |
"object": azure_data.get("object", ""), | |
"created": azure_data.get("created", 0), | |
"model": azure_data.get("model", "gpt-4"), | |
"choices": [ | |
{ | |
"index": choice.get("index", 0), | |
"delta": choice.get("delta", {}), | |
"finish_reason": choice.get("finish_reason") | |
} for choice in azure_data.get("choices", []) | |
] | |
} | |
openai_data = {k: v for k, v in openai_data.items() if v is not None} | |
yield f"data: {json.dumps(openai_data)}\n\n" | |
yield "data: [DONE]\n\n" | |
return Response(stream_with_context(generate()), content_type='text/event-stream') | |
if __name__ == "__main__": | |
app.run(host="0.0.0.0", port=7860) |