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)