|
from flask import Flask, request, jsonify, Response |
|
import requests |
|
import json |
|
import time |
|
import random |
|
|
|
app = Flask(__name__) |
|
|
|
@app.route('/v1/chat/completions', methods=['POST']) |
|
def handle_request(): |
|
try: |
|
body = request.json |
|
model = body.get('model') |
|
messages = body.get('messages') |
|
stream = body.get('stream', False) |
|
|
|
if not model or not messages or len(messages) == 0: |
|
return jsonify({"error": "Bad Request: Missing required fields"}), 400 |
|
|
|
prompt = messages[-1]['content'] |
|
new_url = f'https://api.siliconflow.cn/v1/{model}/text-to-image' |
|
|
|
new_request_body = { |
|
"prompt": prompt, |
|
"image_size": "1024x1024", |
|
"batch_size": 1, |
|
"num_inference_steps": 4, |
|
"guidance_scale": 1 |
|
} |
|
|
|
|
|
authorization_header = request.headers.get('Authorization') |
|
if authorization_header: |
|
|
|
tokens = authorization_header.replace("Bearer ", "").split(',') |
|
if len(tokens) > 1: |
|
selected_token = random.choice(tokens).strip() |
|
else: |
|
selected_token = tokens[0].strip() |
|
|
|
selected_token = f"Bearer {selected_token}" |
|
else: |
|
return jsonify({"error": "Unauthorized: Missing Authorization header"}), 401 |
|
|
|
headers = { |
|
'accept': 'application/json', |
|
'content-type': 'application/json', |
|
'Authorization': selected_token |
|
} |
|
|
|
response = requests.post(new_url, headers=headers, json=new_request_body) |
|
response_body = response.json() |
|
|
|
image_url = response_body['images'][0]['url'] |
|
unique_id = int(time.time() * 1000) |
|
current_timestamp = unique_id // 1000 |
|
|
|
if stream: |
|
response_payload = { |
|
"id": unique_id, |
|
"object": "chat.completion.chunk", |
|
"created": current_timestamp, |
|
"model": model, |
|
"choices": [ |
|
{ |
|
"index": 0, |
|
"delta": { |
|
"content": f"![]({image_url})" |
|
}, |
|
"finish_reason": "stop" |
|
} |
|
] |
|
} |
|
data_string = json.dumps(response_payload) |
|
return Response(f"data: {data_string}\n\n", content_type='text/event-stream') |
|
else: |
|
response_payload = { |
|
"id": unique_id, |
|
"object": "chat.completion", |
|
"created": current_timestamp, |
|
"model": model, |
|
"choices": [ |
|
{ |
|
"index": 0, |
|
"message": { |
|
"role": "assistant", |
|
"content": f"![]({image_url})" |
|
}, |
|
"logprobs": None, |
|
"finish_reason": "length" |
|
} |
|
], |
|
"usage": { |
|
"prompt_tokens": len(prompt), |
|
"completion_tokens": len(image_url), |
|
"total_tokens": len(prompt) + len(image_url) |
|
} |
|
} |
|
data_string = json.dumps(response_payload) |
|
return Response(f"{data_string}\n\n", content_type='text/event-stream') |
|
|
|
except Exception as e: |
|
return jsonify({"error": f"Internal Server Error: {str(e)}"}), 500 |
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=8000) |