Lei075fr commited on
Commit
348cf47
·
verified ·
1 Parent(s): 5271ae4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -65
app.py CHANGED
@@ -1,90 +1,71 @@
1
- import os, random, httpx, uvicorn, asyncio
2
  from fastapi import FastAPI, Request, Response
3
  from fastapi.responses import HTMLResponse
4
 
5
  app = FastAPI()
6
 
7
- # --- ARSENAL DE CHAVES (Pool de 15 chaves - Operação Beira, MZ) ---
8
- # Carrega as chaves do OpenRouter configuradas nos Secrets do Hugging Face
9
  KEYS = [os.getenv(f"OR_KEY_{i}") for i in range(1, 16)]
10
  KEYS = [k for k in KEYS if k and k.strip()]
11
 
12
- # --- MAPEAMENTO UNIFICADO ARIA (Atualização Estratégica Qwen3) ---
13
- # Tradução dos comandos do CEO para os IDs técnicos reais
14
  MODEL_MAP = {
15
- "aria_coder": "qwen/qwen3-coder:free", # O novo motor de elite para programação
16
- "aria_brain": "nvidia/nemotron-3-super:free", # Raciocínio clínico massivo para a Vitalis
17
- "aria_med": "google/gemini-2.5-pro:free",
18
- "aria_vision": "nvidia/nemotron-nano-12b-2-vl:free",
19
- "aria_office": "minimax/minimax-m2.5:free", # Gestão de documentos para a Nexos
20
- "aria_default": "qwen/qwen3-coder:free" # Qwen3 Coder definido como padrão
21
  }
22
 
23
  @app.get("/", response_class=HTMLResponse)
24
  async def root():
25
- # Painel de Status Visual para monitorização em Beira
26
- status_color = "#00ff88" if KEYS else "#ff4444"
27
- status_text = "🟢 SISTEMA OPERACIONAL" if KEYS else "🔴 FALHA NAS CHAVES"
28
-
29
- return f"""
30
- <html>
31
- <head>
32
- <title>Aria Shield V2.6.1</title>
33
- <meta charset="utf-8">
34
- </head>
35
- <body style='background:#0a0a0a; color:#e0e0e0; font-family:monospace; text-align:center; padding-top:80px;'>
36
- <div style='border: 1px solid {status_color}; display:inline-block; padding:40px; border-radius:10px; background:#0f0f0f; box-shadow: 0 0 15px {status_color}22;'>
37
- <h1 style='color:{status_color}; letter-spacing:4px;'>ARIA SOVEREIGN SHIELD V2.6.1</h1>
38
- <p style='font-size:1.3em;'>Arsenal: <strong>{len(KEYS)} Chaves Ativas</strong></p>
39
- <p style='color:#666;'>Localização: Beira, Sofala, Moçambique</p>
40
- <hr style='border:0; border-top:1px solid #333; margin:25px 0;'>
41
- <p style='font-weight:bold; font-size:1.4em;'>Status: {status_text}</p>
42
- <p style='color:#0088ff; font-size:0.9em;'>Motor Ativo: Qwen3 Coder (Software Architecture Mode)</p>
43
- </div>
44
- </body>
45
- </html>
46
- """
47
 
48
  @app.post("/v1/chat/completions")
49
  async def proxy(request: Request):
50
  if not KEYS:
51
- return Response(content='{{"error": "CEO, o arsenal de 15 chaves não foi detetado!"}}', status_code=500)
 
 
 
52
 
53
- try:
54
- body = await request.json()
55
- model_requested = body.get("model", "")
56
-
57
- # 1. LIMPEZA DE PREFIXO: Remove "fortune/" para garantir que a ponte não falha
58
- clean_model = model_requested.replace("fortune/", "")
59
-
60
- # 2. TRADUÇÃO: Converte o apelido (ex: aria_coder) no ID oficial do OpenRouter
61
- target_model = MODEL_MAP.get(clean_model, clean_model)
62
- body["model"] = target_model
63
-
64
- # 3. ROTAÇÃO DE CHAVES: Escolha aleatória para distribuir o tráfego e evitar limites
65
- selected_key = random.choice(KEYS)
66
-
67
- headers = {
68
- "Authorization": f"Bearer {selected_key}",
69
- "HTTP-Referer": "https://github.com/Fortnee/Ariaaa",
70
- "X-Title": "Aria Sovereign System",
71
- "Content-Type": "application/json"
72
- }
73
 
74
- # 4. EXECUÇÃO: Encaminhamento para o OpenRouter com timeout para operações longas
75
- async with httpx.AsyncClient() as client:
76
- response = await client.post(
77
  "https://openrouter.ai/api/v1/chat/completions",
78
- json=body,
79
- headers=headers,
80
- timeout=120.0
81
  )
82
- return Response(content=response.content, status_code=response.status_code)
83
 
84
- except Exception as e:
85
- return Response(content=f'{{"error": "Falha na Ponte Shield: {str(e)}"}}', status_code=500)
 
 
 
 
 
 
 
 
 
 
 
 
86
 
87
- # --- IGNIÇÃO DO SERVIDOR (Prevenção de Exit Code 0 no Hugging Face) ---
88
  if __name__ == "__main__":
89
- print("🛰️ Aria Shield V2.6.1: Operação Beira Iniciada...")
90
  uvicorn.run(app, host="0.0.0.0", port=7860)
 
1
+ import os, random, httpx, uvicorn
2
  from fastapi import FastAPI, Request, Response
3
  from fastapi.responses import HTMLResponse
4
 
5
  app = FastAPI()
6
 
7
+ # Pool de 15 Chaves
 
8
  KEYS = [os.getenv(f"OR_KEY_{i}") for i in range(1, 16)]
9
  KEYS = [k for k in KEYS if k and k.strip()]
10
 
11
+ # MAPEAMENTO DE ELITE (Cérebros Pesados - Atualizado para Qwen3)
 
12
  MODEL_MAP = {
13
+ "gpt-4o": "qwen/qwen3-coder:free",
14
+ "vitalis": "google/gemini-2.0-pro-exp-02-05:free",
15
+ "nexos": "qwen/qwen3-coder:free",
16
+ "nutrilens": "google/gemini-2.0-flash-lite-preview-02-05:free",
17
+ "default": "qwen/qwen3-coder:free"
 
18
  }
19
 
20
  @app.get("/", response_class=HTMLResponse)
21
  async def root():
22
+ return f"<h1>🛡️ Escudo Fortune Ativo: {len(KEYS)} Chaves Operacionais</h1>"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  @app.post("/v1/chat/completions")
25
  async def proxy(request: Request):
26
  if not KEYS:
27
+ return Response(content='{"error": "Adiciona as chaves nos Secrets!"}', status_code=500)
28
+
29
+ body = await request.json()
30
+ msg_content = str(body.get("messages", "")).lower()
31
 
32
+ # Roteador Inteligente de Projectos
33
+ target = MODEL_MAP["gpt-4o"]
34
+ if "vitalis" in msg_content: target = MODEL_MAP["vitalis"]
35
+ elif "nexos" in msg_content: target = MODEL_MAP["nexos"]
36
+ elif "nutrilens" in msg_content: target = MODEL_MAP["nutrilens"]
37
+
38
+ body["model"] = target
39
+ selected_key = random.choice(KEYS)
40
+
41
+ headers = {
42
+ "Authorization": f"Bearer {selected_key}",
43
+ "X-Title": "Aria_Sovereign_System",
44
+ "HTTP-Referer": "https://fortune-dev-moz.io",
45
+ "Content-Type": "application/json"
46
+ }
 
 
 
 
 
47
 
48
+ async with httpx.AsyncClient() as client:
49
+ try:
50
+ resp = await client.post(
51
  "https://openrouter.ai/api/v1/chat/completions",
52
+ json=body, headers=headers, timeout=60.0
 
 
53
  )
 
54
 
55
+ # Modo de Emergência Absoluta:
56
+ # Se a chave ou modelo falhar, ele usa o roteador livre do OpenRouter e troca de chave
57
+ if resp.status_code != 200:
58
+ print(f"⚠️ Erro {resp.status_code}, a ativar emergência...")
59
+ body["model"] = "openrouter/free"
60
+ headers["Authorization"] = f"Bearer {random.choice(KEYS)}"
61
+ resp = await client.post(
62
+ "https://openrouter.ai/api/v1/chat/completions",
63
+ json=body, headers=headers, timeout=60.0
64
+ )
65
+
66
+ return Response(content=resp.content, status_code=resp.status_code)
67
+ except Exception as e:
68
+ return Response(content=f'{{"error": "{str(e)}"}}', status_code=500)
69
 
 
70
  if __name__ == "__main__":
 
71
  uvicorn.run(app, host="0.0.0.0", port=7860)