flux2api / app.py
smgc's picture
Update app.py
a78ea5d verified
raw
history blame
4 kB
from flask import Flask, request, jsonify, Response
import requests
import json
import time
import random
import logging
app = Flask(__name__)
# 配置日志格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
logger = logging.getLogger(__name__)
@app.route('/')
def index():
return "text-to-image with siliconflow", 200
@app.route('/ai/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
authorization_header = request.headers.get('Authorization')
if not authorization_header:
return jsonify({"error": "Unauthorized: Missing Authorization header"}), 401
# Extract tokens from Authorization header
tokens = authorization_header.split(' ')[1].split(',')
if len(tokens) == 1:
selected_token = tokens[0]
else:
selected_token = random.choice(tokens)
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
}
headers = {
'accept': 'application/json',
'content-type': 'application/json',
'Authorization': f'Bearer {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 = str(int(time.time() * 1000)) # Convert id to string
current_timestamp = int(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
finally:
# 记录请求的 model 和 被命中的 token
logger.info(f'"POST /ai/v1/chat/completions HTTP/1.1" "model: {model}" "token: {selected_token}" "status: {response.status_code}" -')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)