Spaces:
Sleeping
Sleeping
""" | |
OpenRouter Chatbot – elenco dinamico completo | |
Run: gradio app.py | |
""" | |
import os | |
import functools | |
import requests | |
import gradio as gr | |
# ------------------------------------------------------------------ | |
# Configurazione | |
# ------------------------------------------------------------------ | |
OPENROUTER_API_KEY = os.getenv( | |
"OPENROUTER_API_KEY", | |
"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" | |
) | |
# ------------------------------------------------------------------ | |
# Utility per ottenere l’elenco modelli | |
# ------------------------------------------------------------------ | |
def fetch_models() -> list[str]: | |
""" | |
Restituisce la lista completa di modelli offerti da OpenRouter. | |
Il decorator @lru_cache la memorizza in cache per tutta la durata | |
del processo (si aggiorna solo al riavvio del container). | |
""" | |
headers = {"Authorization": f"Bearer {OPENROUTER_API_KEY}"} | |
try: | |
resp = requests.get( | |
"https://openrouter.ai/api/v1/models", | |
headers=headers, | |
timeout=15 | |
) | |
resp.raise_for_status() | |
data = resp.json() | |
models = sorted(m["id"] for m in data["data"]) | |
return models | |
except Exception as e: | |
gr.Warning(f"Impossibile scaricare l’elenco modelli: {e}") | |
return ["openai/gpt-4-turbo"] # fallback statico | |
# ------------------------------------------------------------------ | |
# Funzione di chiamata al modello | |
# ------------------------------------------------------------------ | |
def chat_with_openrouter(prompt: str, model: str): | |
headers = { | |
"Authorization": f"Bearer {OPENROUTER_API_KEY}", | |
"Content-Type": "application/json" | |
} | |
payload = { | |
"model": model, | |
"messages": [{"role": "user", "content": prompt}], | |
"max_tokens": 4096, | |
"temperature": 0.7, | |
} | |
try: | |
resp = requests.post( | |
"https://openrouter.ai/api/v1/chat/completions", | |
headers=headers, | |
json=payload, | |
timeout=60 | |
) | |
resp.raise_for_status() | |
return resp.json()["choices"][0]["message"]["content"] | |
except Exception as e: | |
return f"❌ Errore: {e}" | |
# ------------------------------------------------------------------ | |
# Interfaccia Gradio | |
# ------------------------------------------------------------------ | |
def build_interface(): | |
models = fetch_models() | |
with gr.Blocks(title="NotExistChatter – Tutti i modelli") as demo: | |
gr.Markdown("🤖project Adam🤖") | |
gr.Markdown("Il menù mostra **tutti** i modelli disponibili.") | |
with gr.Row(): | |
model_dropdown = gr.Dropdown( | |
choices=models, | |
value=models[0] if models else None, | |
label="Modello", | |
allow_custom_value=False, | |
interactive=True | |
) | |
prompt_box = gr.Textbox( | |
label="Prompt", | |
placeholder="Scrivi qui il tuo messaggio...", | |
lines=4, | |
max_lines=10 | |
) | |
output_box = gr.Textbox( | |
label="Risposta", | |
interactive=False, | |
lines=15, | |
max_lines=20 | |
) | |
send_btn = gr.Button("Invia", variant="primary") | |
send_btn.click( | |
fn=chat_with_openrouter, | |
inputs=[prompt_box, model_dropdown], | |
outputs=output_box | |
) | |
prompt_box.submit( | |
fn=chat_with_openrouter, | |
inputs=[prompt_box, model_dropdown], | |
outputs=output_box | |
) | |
return demo | |
# Lancia l’interfaccia | |
if __name__ == "__main__": | |
build_interface().launch() |