Spaces:
Runtime error
Runtime error
| import os | |
| from flask import Flask, request, jsonify | |
| from dotenv import load_dotenv | |
| from pymongo import MongoClient | |
| import openai | |
| from datetime import datetime | |
| load_dotenv() | |
| app = Flask(__name__) | |
| # MongoDB bağlantısı | |
| client = MongoClient(os.getenv("MONGODB_URI")) | |
| db = client[os.getenv("MONGODB_DB_NAME")] | |
| # OpenAI API anahtarı | |
| openai.api_key = os.getenv("OPENAI_API_KEY") | |
| # Model grupları ve modeller | |
| MODEL_GROUPS = { | |
| "GPT4_GROUP": ["gpt-4", "gpt-4-0125-preview", "gpt-4-0613", "gpt-4-1106-preview"], | |
| "GPT4_TURBO_GROUP": ["gpt-4-turbo", "gpt-4-turbo-preview"], | |
| "GPT35_GROUP": ["gpt-3.5-turbo", "gpt-3.5-turbo-0125", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-1106"], | |
| } | |
| MODELS = { | |
| "GPT4": MODEL_GROUPS["GPT4_GROUP"] + MODEL_GROUPS["GPT4_TURBO_GROUP"], | |
| "GPT35": MODEL_GROUPS["GPT35_GROUP"], | |
| "IMAGE": ["dall-e-2", "dall-e-3"], | |
| } | |
| # Kullanıcı seviyeleri | |
| TIERS = { | |
| 1: { | |
| "models": MODELS["GPT35"], | |
| "limits": {"daily": 100, "GPT35_GROUP": 100} | |
| }, | |
| 2: { | |
| "models": MODELS["GPT35"] + MODELS["GPT4"], | |
| "limits": {"daily": 500, "GPT35_GROUP": 300, "GPT4_GROUP": 150, "GPT4_TURBO_GROUP": 50} | |
| }, | |
| 3: { | |
| "models": MODELS["GPT35"] + MODELS["GPT4"] + MODELS["IMAGE"], | |
| "limits": {"daily": 1000, "GPT35_GROUP": 500, "GPT4_GROUP": 300, "GPT4_TURBO_GROUP": 100, "dall-e-2": 50, "dall-e-3": 25} | |
| } | |
| } | |
| def get_user_tier(api_key): | |
| user = db.users.find_one({"api_key": api_key}) | |
| if user: | |
| return user["tier"] | |
| for i in range(1, 4): | |
| if os.getenv(f"USER_{i}_API_KEY") == api_key: | |
| return int(os.getenv(f"USER_{i}_TIER")) | |
| return None | |
| def get_model_group(model): | |
| for group, models in MODEL_GROUPS.items(): | |
| if model in models: | |
| return group | |
| return model | |
| def check_rate_limit(api_key, tier, model): | |
| now = datetime.now() | |
| today = now.date().isoformat() | |
| model_group = get_model_group(model) | |
| usage = db.usage.find_one_and_update( | |
| {"api_key": api_key, "date": today}, | |
| {"$inc": {"daily": 1, model_group: 1}}, | |
| upsert=True, | |
| return_document=True | |
| ) | |
| tier_limits = TIERS[tier]["limits"] | |
| if usage["daily"] > tier_limits["daily"]: | |
| raise Exception("Daily rate limit exceeded") | |
| if usage.get(model_group, 0) > tier_limits.get(model_group, float("inf")): | |
| raise Exception(f"Rate limit for {model_group} exceeded") | |
| def chat_completions(): | |
| data = request.json | |
| api_key = request.headers.get('Authorization', '').replace('Bearer ', '') | |
| user_tier = get_user_tier(api_key) | |
| if not user_tier: | |
| return jsonify({"error": "Invalid API key"}), 401 | |
| model = data.get('model') | |
| if model not in TIERS[user_tier]["models"]: | |
| return jsonify({"error": "Model not available for your tier"}), 403 | |
| try: | |
| check_rate_limit(api_key, user_tier, model) | |
| response = openai.ChatCompletion.create(**data) | |
| return jsonify(response) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 429 | |
| def image_generations(): | |
| data = request.json | |
| api_key = request.headers.get('Authorization', '').replace('Bearer ', '') | |
| user_tier = get_user_tier(api_key) | |
| if not user_tier: | |
| return jsonify({"error": "Invalid API key"}), 401 | |
| model = data.get('model', 'dall-e-2') | |
| if model not in TIERS[user_tier]["models"]: | |
| return jsonify({"error": "Model not available for your tier"}), 403 | |
| try: | |
| check_rate_limit(api_key, user_tier, model) | |
| response = openai.Image.create(**data) | |
| return jsonify(response) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 429 | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860) |