free-tier / app.py
Hiren122's picture
Create app.py
b33bd58 verified
from flask import Flask, request, Response, jsonify
import requests
import json
import uuid
import time
import os
import re
import base64
import mimetypes
import random
from datetime import datetime
app = Flask(__name__)
# ================= CONFIGURATION =================
COGNIX_BASE_URL = "https://www.cognixai.co"
DEFAULT_SESSION_ID = "f351d7e7-a0ba-4888-86a4-76aab9a7a661"
KEYS_FILE = os.path.join(os.getcwd(), "keys.json")
MASTER_KEY = "sk-master-onyx-2026" # The Master Key to create other keys
# Tier Limits
RPM_LIMIT = 10
# Models NOT supported in this tier
RESTRICTED_MODELS = ["claude opus-4.6", "3-pro", "gpt-5.3 codex"]
# In-memory database
if not os.path.exists(KEYS_FILE):
with open(KEYS_FILE, 'w') as f:
json.dump({"api_keys": {}}, f)
def load_keys():
try:
with open(KEYS_FILE, 'r') as f:
return json.load(f)
except:
return {"api_keys": {}}
def save_keys(keys_data):
with open(KEYS_FILE, 'w') as f:
json.dump(keys_data, f, indent=4)
# Tracking Data
rpm_tracking = {}
COGNIX_COOKIES = [
"ext_name=ojplmecpdpgccookcobabopnaifgidhf; cf_clearance=j_nYaeNI0RwDRG1Qyd.bRf0R5YCGgIgAEzEgaQEjCCU-1770908625-1.2.1.1-RMchxpAE5hSG0Xl4XY3BShfT4aXGHCqNiBxN6iyTGkrv8azqzeTMuCOKZZ1lHjBZ5kdtj4.F_hmpP2legrsaaSe16gMqtqa5.FrM7yNuGQczvf1ep45loNu5MhI151HAk0k9T5UKDHdHXHcidlUt_ajlE64FUTSj26Rf6WwTg55n.xeliVOzxYygojzifx7hywAXmXMAqCpKADeDnSuEWqahc2_zDnpJxwy4444gh_o; __Secure-better-auth.state=FOj7ymeub1GeD3s4fiEbm9Hrd-hE0slR.oM0kHle4Je9FhUDPisXmPSHQvH4nkqldTe3kRBrTHJk%3D; __Secure-better-auth.session_token=5npdnyCa90buJBq2qW2wopL6nC3HjO4R.5v3gNhODuU7F0hbVXAJ%2BPFgMPsCPM0j8J%2BHk%2FrqsNdc%3D; __Secure-better-auth.session_data=eyJzZXNzaW9uIjp7InNlc3Npb24iOnsiZXhwaXJlc0F0IjoiMjAyNi0wMi0xOVQxNTowMzo0OC44MjNaIiwidG9rZW4iOiI1bnBkbnlDYTkwYnVKQnEycVcyd29wTDZuQzNIak80UiIsImNyZWF0ZWRBdCI6IjIwMjYtMDItMTJUMTU6MDM6NDguODIzWiIsInVwZGF0ZWRBdCI6IjIwMjYtMDItMTJUMTU6MDM6NDguODIzWiIsImlwQWRkcmVzcyI6IjE2Mi4xNTguNjMuMjQwIiwidXNlckFnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzE0NC4wLjAuMCBTYWZhcmkvNTM3LjM2IiwidXNlcklkIjoiODM0YWZkYWEtOWFiYy00OGNkLTkwMzQtNzU4YTMzY2M3NTUxIiwiaW1wZXJzb25hdGVkQnkiOm51bGwsImlkIjoiNzk5ODJjMWMtZjQwOC00ODYyLWI0ZGEtMzI2ZTZkZmQ1NWU0In0sInVzZXIiOnsibmFtZSI6IkhpcmVuIEFoYWxhd2F0IiwiZW1haWwiOiJnaGc2NDI3MkBnbWFpbC5jb20iLCJlbWFpbFZlcmlmaWVkIjp0cnVlLCJpbWFnZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0ozTVo3MjdKYzlJU244bERCcUplS2MyU0MxYXV5djFlbkV1bWxuTDhmR01CaEp0OGNUPXM5Ni1jIiwiY3JlYXRlZEF0IjoiMjAyNi0wMS0yNlQwNTo0NzoyNC43NzNaIiwidXBkYXRlZEF0IjoiMjAyNi0wMS0yNlQwNTo0NzoyNC43NzNaIiwicm9sZSI6ImVkaXRvciIsImJhbm5lZCI6ZmFsc2UsImJhblJlYXNvbiI6bnVsbCwiYmFuRXhwaXJlcyI6bnVsbCwiaWQiOiI4MzRhZmRhYS05YWJjLTQ4Y2QtOTAzNC03NThhMzNjYzc1NTEifX0sImV4cGlyZXNBdCI6MTc3MDkxMjIyODgzNCwic2lnbmF0dXJlIjoidXpNQWloYU9Sbk1QSnZ1V2VCMDdtOGcxSHliYVVrT2hLU05PS3JKSE96byJ9"
]
def get_headers():
return {
"accept": "*/*",
"accept-language": "en-IN,en;q=0.9",
"cookie": random.choice(COGNIX_COOKIES),
"origin": "https://www.cognixai.co",
"referer": f"https://www.cognixai.co/chat/{DEFAULT_SESSION_ID}",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36"
}
# ================= AUTH & LIMITS =================
@app.before_request
def validate_access():
if request.path == "/" or request.path == "/v1/models" or not request.path.startswith("/v1/"):
return
# Master Key exclusion for its own route
if request.path == "/v1/admin/create-key":
auth_header = request.headers.get("Authorization", "")
if auth_header != f"Bearer {MASTER_KEY}":
return jsonify({"error": "Admin Access Denied"}), 403
return
# Standard Key Validation
auth_header = request.headers.get("Authorization", "")
if not auth_header.startswith("Bearer "):
return jsonify({"error": "Unauthorized", "message": "Missing Bearer token"}), 401
api_key = auth_header.replace("Bearer ", "").strip()
data = load_keys()
if api_key not in data["api_keys"]:
return jsonify({"error": "Unauthorized", "message": "Invalid API Key"}), 401
# RPM Enforcement (10 RPM)
now = time.time()
if api_key not in rpm_tracking:
rpm_tracking[api_key] = []
rpm_tracking[api_key] = [t for t in rpm_tracking[api_key] if now - t < 60]
if len(rpm_tracking[api_key]) >= RPM_LIMIT:
return jsonify({"error": "Rate limit exceeded", "message": f"Free Tier: {RPM_LIMIT} RPM"}), 429
rpm_tracking[api_key].append(now)
# Model Exclusion Check
if request.method == "POST" and request.path.endswith("/chat/completions"):
body = request.get_json(silent=True) or {}
model = body.get("model", "").lower()
if any(rm in model for rm in RESTRICTED_MODELS):
return jsonify({
"error": "Access Forbidden",
"message": f"Model '{model}' is not supported in the Free Tier. Upgrade to Development Plan."
}), 403
# ================= ADMIN ROUTES =================
@app.route('/v1/admin/create-key', methods=['POST'])
def create_key():
d = request.json
name = d.get('name')
if not name:
return jsonify({"error": "Name is required"}), 400
new_key = f"sk-free-{name.lower().replace(' ', '-')}-{uuid.uuid4().hex[:6]}"
data = load_keys()
data["api_keys"][new_key] = {
"name": name,
"created_at": datetime.now().isoformat()
}
save_keys(data)
return jsonify({
"status": "success",
"key": new_key,
"name": name,
"details": "This key is limited to 10 RPM and basic models only."
})
# ================= CORE PROXY LOGIC =================
def parse_cognix_stream_chunk(line):
if not line.strip(): return None, "content"
if line.startswith("data: "): line = line[6:]
if line.strip() == "[DONE]": return None, "stop"
try:
data = json.loads(line)
content = data.get('text') or data.get('content')
if not content:
delta = data.get('delta')
if isinstance(delta, str): content = delta
elif isinstance(delta, dict): content = delta.get('text') or delta.get('content', '')
return content or "", "content"
except:
return line, "content"
@app.route('/v1/chat/completions', methods=['POST'])
def chat_completions():
d = request.json
model = d.get('model', 'openai/gpt-4o')
messages = d.get('messages', [])
system = next((m.get('content', '') for m in messages if m.get('role') == 'system'), "")
filtered = [m for m in messages if m.get('role') != 'system']
prov, ver = model.split('/', 1) if '/' in model else ("openai", model)
payload = {
"id": str(uuid.uuid4()),
"chatModel": {"provider": prov, "model": ver},
"message": {"role": "user", "parts": [{"type": "text", "text": f"{system}\n\n{filtered[-1].get('content', '') if filtered else ''}"}], "id": str(uuid.uuid4())},
"allowedAppDefaultToolkit": ["webSearch"],
"attachments": []
}
if d.get('stream'):
def gen():
cid = f"chatcmpl-{uuid.uuid4().hex[:24]}"
yield f"data: {json.dumps({'id': cid, 'object': 'chat.completion.chunk', 'choices': [{'delta': {'role': 'assistant'}}]})}\n\n"
with requests.post(f"{COGNIX_BASE_URL}/api/chat", json=payload, headers=get_headers(), stream=True) as r:
for line in r.iter_lines(decode_unicode=True):
if not line: continue
cont, pty = parse_cognix_stream_chunk(line)
if pty == "stop": break
if cont:
yield f"data: {json.dumps({'id': cid, 'object': 'chat.completion.chunk', 'choices': [{'delta': {'content': cont}}]})}\n\n"
yield "data: [DONE]\n\n"
return Response(gen(), content_type='text/event-stream')
r = requests.post(f"{COGNIX_BASE_URL}/api/chat", json=payload, headers=get_headers())
full_text = "".join([parse_cognix_stream_chunk(l)[0] or "" for l in r.text.strip().split('\n')])
return jsonify({"id": str(uuid.uuid4()), "object": "chat.completion", "choices": [{"message": {"role": "assistant", "content": full_text}, "finish_reason": "stop"}]})
@app.route('/v1/models', methods=['GET'])
def list_models():
return jsonify({
"object": "list",
"data": [
{"id": "openai/gpt-4o", "object": "model"},
{"id": "anthropic/claude-3-5-sonnet", "object": "model"}
]
})
@app.route('/')
def index():
return jsonify({
"tier": "Public Free Tier",
"rpm_limit": RPM_LIMIT,
"restricted_models": RESTRICTED_MODELS,
"status": "online"
})
if __name__ == '__main__':
print("🚀 Public Free Tier Proxy (Port 7866) Started...")
app.run(host='0.0.0.0', port=7860, debug=True)