hilmanhosting / main.py
HilmanBey's picture
Update main.py
95e544d verified
Raw
History Blame Contribute Delete
7.01 kB
import os
import requests
import sqlite3
from fastapi import FastAPI, Header, HTTPException, Request
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from duckduckgo_search import DDGS
app = FastAPI(title="HilmanAI Real Cloud Proxy Gateway")
# --- ÇEVRE DEĞİŞKENLERİ (Hugging Face Secrets'tan çekilir) ---
MY_SECRET_KEY = os.getenv("MY_SECRET_KEY", "sk-hilman-proxy-2026")
OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY")
ANTIGRAVITY_API_KEY = os.getenv("ANTIGRAVITY_API_KEY")
# --- VERİTABANI (İstek Logları ve Hafıza) ---
DB_PATH = "hilman_space_memory.db"
def init_db():
try:
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
role TEXT,
content TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()
except Exception as e:
print(f"DB Başlatma Hatası: {e}")
init_db()
def save_message(role, content):
try:
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("INSERT INTO messages (role, content) VALUES (?, ?)", (role, content))
conn.commit()
conn.close()
except Exception as e:
print(f"DB Kayıt Hatası: {e}")
# --- İNTERNET ARAMA MOTORU ---
def web_search(query: str) -> str:
try:
print(f"[İNTERNET ARAMASI]: '{query}' aranıyor...")
results_text = ""
with DDGS() as ddgs:
results = list(ddgs.text(query, max_results=5))
for r in results:
title = r.get("title", "Başlık Yok")
body = r.get("body", "Açıklama Yok")
href = r.get("href", "#")
results_text += f"- Ürün/Kaynak: {title}\n Özet/Detay: {body}\n Link: {href}\n\n"
return results_text if results_text else "Web aramasında sonuç bulunamadı."
except Exception as e:
print(f"[ARAMA HATASI]: {e}")
return f"Arama sırasında hata oluştu: {e}"
class ChatRequest(BaseModel):
model: str = "google/gemini-2.0-flash-lite-001"
messages: list
temperature: float = 0.2
# --- SUNUCU SAĞLIK VE DURUM KONTROLÜ ---
@app.get("/")
def root():
return {
"status": "online",
"message": "HilmanAI Cloud Proxy is active and running 24/7, Halil.",
"endpoints": {
"chat_completions": "/v1/chat/completions",
"status": "/server-status"
}
}
@app.get("/server-status")
def server_status():
return {
"service": "Running",
"port": 7860,
"auth_enabled": True,
"providers_loaded": {
"openrouter": bool(OPENROUTER_API_KEY),
"antigravity": bool(ANTIGRAVITY_API_KEY)
}
}
# --- GERÇEK PROXY İSTEK YÖNLENDİRİCİSİ ---
@app.post("/v1/chat/completions")
def proxy_chat_completions(req: ChatRequest, authorization: str = Header(None)):
# 1. Güvenlik ve Yetkilendirme Kontrolü
if not authorization or authorization != f"Bearer {MY_SECRET_KEY}":
raise HTTPException(status_code=401, detail="Yetkisiz erişim! Geçersiz Secret Key.")
# 2. Gelen Mesajları Veritabanına Kaydet
last_user_msg = ""
for m in req.messages:
if isinstance(m, dict):
role = m.get("role", "user")
content = m.get("content", "")
if role == "user":
last_user_msg = content
save_message(role, content)
# 3. Canlı İnternet Arama Tetikleyicisi
search_keywords = ["bul", "ara", "fiyat", "en ucuz", "nerede", "satın al", "karşılaştır", "incele"]
search_context = ""
if any(kw in last_user_msg.lower() for kw in search_keywords):
search_results = web_search(last_user_msg)
search_context = f"\n\n[CANLI İNTERNET ARAMA SONUÇLARI]:\n{search_results}\nYukarıdaki güncel internet verilerini kullanarak Halil'e net, fiyatlı ve detaylı bilgi sun."
# Sistem Talimatı Ekleme
system_instruction = {
"role": "system",
"content": (
"Sen HilmanAI'sın. Kullanıcıya her zaman 'Halil' diye hitap edeceksin. "
"İşletim sistemi WINDOWS'tur. "
"Halil internetten ürün, fiyat veya araştırma istediğinde sana sağlanan [CANLI İNTERNET ARAMA SONUÇLARI]'nı kullan."
)
}
full_messages = [system_instruction] + req.messages
if search_context and len(full_messages) > 1:
if isinstance(full_messages[-1], dict):
full_messages[-1]["content"] += search_context
ai_response_text = "Tüm yapay zeka servisleri şu an yanıt vermiyor."
# 4. Antigravity API Üzerinden Proxy İsteği
if ANTIGRAVITY_API_KEY:
try:
headers = {
"Authorization": f"Bearer {ANTIGRAVITY_API_KEY.strip()}",
"Content-Type": "application/json"
}
payload = {
"model": "gemini-2.0-flash",
"messages": full_messages,
"temperature": req.temperature
}
res = requests.post("https://api.antigravity.dev/v1/chat/completions", json=payload, headers=headers, timeout=15)
if res.status_code == 200:
data = res.json()
ai_response_text = data["choices"][0]["message"]["content"]
save_message("assistant", ai_response_text)
return res.json()
except Exception as e:
print(f"Antigravity Proxy Hatası: {e}")
# 5. OpenRouter API Üzerinden Proxy İsteği (Yedek)
if OPENROUTER_API_KEY:
try:
headers = {
"Authorization": f"Bearer {OPENROUTER_API_KEY.strip()}",
"Content-Type": "application/json",
"HTTP-Referer": "https://huggingface.co",
"X-Title": "HilmanAI"
}
fallback_models = [
req.model,
"google/gemini-2.0-flash-lite-001",
"meta-llama/llama-3.3-70b-instruct"
]
for model_name in fallback_models:
payload = {
"model": model_name,
"messages": full_messages,
"temperature": req.temperature
}
res = requests.post("https://openrouter.ai/api/v1/chat/completions", json=payload, headers=headers, timeout=15)
if res.status_code == 200:
data = res.json()
ai_response_text = data["choices"][0]["message"]["content"]
save_message("assistant", ai_response_text)
return res.json()
except Exception as e:
print(f"OpenRouter Proxy Hatası: {e}")
raise HTTPException(status_code=500, detail="Hiçbir AI Sağlayıcısından yanıt alınamadı.")