Update app.py
Browse files
app.py
CHANGED
|
@@ -164,21 +164,16 @@ SHOWCASE = [
|
|
| 164 |
]
|
| 165 |
|
| 166 |
MODELS = {
|
| 167 |
-
"
|
| 168 |
-
"list":["
|
| 169 |
-
"deepseek-r1-distill-llama-70b","llama-3.3-70b-versatile","qwen-qwq-32b"]},
|
| 170 |
-
"OpenAI": {"env":"OPENAI_API_KEY","default":"gpt-5.2",
|
| 171 |
-
"list":["gpt-5.2","gpt-5.2-chat-latest","gpt-5.4","gpt-5.4-pro","gpt-5.2-pro",
|
| 172 |
-
"gpt-5.2-codex","gpt-5","gpt-5-mini","gpt-4o","gpt-4o-mini","gpt-oss-120b"]},
|
| 173 |
"Anthropic": {"env":"ANTHROPIC_API_KEY","default":"claude-sonnet-4-6",
|
| 174 |
"list":["claude-opus-4-6","claude-sonnet-4-6","claude-haiku-4-5-20251001"]},
|
| 175 |
-
"Google Gemini": {"env":"GOOGLE_API_KEY","default":"gemini-
|
| 176 |
-
"list":["gemini-
|
| 177 |
"DeepSeek": {"env":"DEEPSEEK_API_KEY","default":"deepseek-chat",
|
| 178 |
"list":["deepseek-chat","deepseek-reasoner"]},
|
| 179 |
-
"xAI (Grok)": {"env":"XAI_API_KEY","default":"grok-
|
| 180 |
-
"list":["grok-
|
| 181 |
-
"Friendli": {"env":"FRIENDLI_TOKEN","default":"deppfs281rgffnk","list":["deppfs281rgffnk"]},
|
| 182 |
"Ollama (Local)": {"env":"","default":"llama3.1",
|
| 183 |
"list":["llama3.1","llama3.1:70b","qwen3.5:32b","deepseek-r1:8b","phi4:14b"]},
|
| 184 |
"Custom (OpenAI-compatible)": {"env":"","default":"custom","list":["custom"]},
|
|
@@ -493,10 +488,7 @@ def _build(backend, api_key, model, base_url):
|
|
| 493 |
k = api_key or (os.getenv(ek,"") if ek else "")
|
| 494 |
|
| 495 |
try:
|
| 496 |
-
if backend == "
|
| 497 |
-
if not k: return None, "❌ GROQ_API_KEY required"
|
| 498 |
-
return Marl.from_openai_compatible("https://api.groq.com/openai/v1", k, model, cfg), "✅"
|
| 499 |
-
elif backend == "OpenAI":
|
| 500 |
if not k: return None, "❌ OPENAI_API_KEY required"
|
| 501 |
return Marl.from_openai(k, model, cfg), "✅"
|
| 502 |
elif backend == "Anthropic":
|
|
@@ -512,9 +504,6 @@ def _build(backend, api_key, model, base_url):
|
|
| 512 |
elif backend == "xAI (Grok)":
|
| 513 |
if not k: return None, "❌ XAI_API_KEY required"
|
| 514 |
return Marl.from_openai_compatible("https://api.x.ai/v1", k, model, cfg), "✅"
|
| 515 |
-
elif backend == "Friendli":
|
| 516 |
-
if not k: return None, "❌ FRIENDLI_TOKEN required"
|
| 517 |
-
return Marl.from_friendli(k, model, cfg), "✅"
|
| 518 |
elif backend == "Ollama (Local)":
|
| 519 |
return Marl.from_ollama(model, base_url or "http://localhost:11434", cfg), "✅"
|
| 520 |
elif backend == "Custom (OpenAI-compatible)":
|
|
@@ -588,7 +577,7 @@ def run_marl_only(prompt, backend, api_key, model, base_url, budget, mode_sel, e
|
|
| 588 |
# ════════════════════════════════════════════════════════════════
|
| 589 |
|
| 590 |
def create_app():
|
| 591 |
-
init_m = MODELS["
|
| 592 |
|
| 593 |
with gr.Blocks(title="MARL — Model-Agnostic Runtime Middleware") as app:
|
| 594 |
gr.HTML(INDEX_HTML)
|
|
@@ -596,11 +585,11 @@ def create_app():
|
|
| 596 |
with gr.Tabs():
|
| 597 |
with gr.Tab("⚡ Playground"):
|
| 598 |
with gr.Row():
|
| 599 |
-
backend = gr.Dropdown(label="Backend", choices=BACKEND_LIST, value="
|
| 600 |
-
api_key = gr.Textbox(label="API Key", type="password", placeholder="
|
| 601 |
-
value=os.getenv("
|
| 602 |
with gr.Row():
|
| 603 |
-
model = gr.Dropdown(label="Model", choices=init_m, value="
|
| 604 |
allow_custom_value=True, scale=3)
|
| 605 |
base_url = gr.Textbox(label="Base URL (Custom/Ollama)",
|
| 606 |
placeholder="http://localhost:11434", scale=2)
|
|
@@ -770,7 +759,7 @@ ml = Marl.from_anthropic(<span style="color:#d97706">"sk-ant-..."</span>)
|
|
| 770 |
ml = Marl.from_ollama(<span style="color:#d97706">"llama3.1"</span>)
|
| 771 |
|
| 772 |
<span style="color:#94a3b8"># Any OpenAI-compatible</span>
|
| 773 |
-
ml = Marl.
|
| 774 |
</div>
|
| 775 |
|
| 776 |
<div style="background:var(--surface,#fff);border:1px solid #e2e5f0;border-radius:16px;padding:20px;margin-bottom:16px;box-shadow:0 1px 3px rgba(15,23,42,.04)">
|
|
@@ -811,12 +800,11 @@ ml = Marl.from_openai_compatible(<span style="color:#d97706">"https://api.groq.c
|
|
| 811 |
<div style="overflow-x:auto">
|
| 812 |
<table style="width:100%;border-collapse:separate;border-spacing:0;font-size:11px;border-radius:10px;overflow:hidden;border:1px solid #e2e5f0">
|
| 813 |
<tr style="background:#f5f6fa"><th style="text-align:left;padding:8px 10px;font-family:JetBrains Mono,monospace;font-size:8px;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Backend</th><th style="text-align:left;padding:8px 10px;font-family:JetBrains Mono,monospace;font-size:8px;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Models</th></tr>
|
| 814 |
-
<tr style="background:rgba(99,102,241,.06)"><td style="padding:8px 10px;border-top:1px solid #e2e5f0;font-weight:700;color:#6366f1">⭐
|
| 815 |
-
<tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">
|
| 816 |
-
<tr style="background:#fafbfe"><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Anthropic</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Claude Opus 4, Sonnet 4</td></tr>
|
| 817 |
<tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Google Gemini</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Gemini 2.5 Pro / Flash</td></tr>
|
| 818 |
<tr style="background:#fafbfe"><td style="padding:8px 10px;border-top:1px solid #e2e5f0">DeepSeek</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">V3 / R1</td></tr>
|
| 819 |
-
<tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">xAI</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Grok-3
|
| 820 |
<tr style="background:#fafbfe"><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Ollama</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Llama, Mistral, Phi, Qwen</td></tr>
|
| 821 |
<tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Custom</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Any OpenAI-compatible endpoint</td></tr>
|
| 822 |
</table>
|
|
|
|
| 164 |
]
|
| 165 |
|
| 166 |
MODELS = {
|
| 167 |
+
"OpenAI": {"env":"OPENAI_API_KEY","default":"gpt-5.4",
|
| 168 |
+
"list":["gpt-5.4","gpt-5.4-pro","gpt-5.2","gpt-4o","gpt-4o-mini"]},
|
|
|
|
|
|
|
|
|
|
|
|
|
| 169 |
"Anthropic": {"env":"ANTHROPIC_API_KEY","default":"claude-sonnet-4-6",
|
| 170 |
"list":["claude-opus-4-6","claude-sonnet-4-6","claude-haiku-4-5-20251001"]},
|
| 171 |
+
"Google Gemini": {"env":"GOOGLE_API_KEY","default":"gemini-2.5-pro",
|
| 172 |
+
"list":["gemini-2.5-pro","gemini-2.5-flash"]},
|
| 173 |
"DeepSeek": {"env":"DEEPSEEK_API_KEY","default":"deepseek-chat",
|
| 174 |
"list":["deepseek-chat","deepseek-reasoner"]},
|
| 175 |
+
"xAI (Grok)": {"env":"XAI_API_KEY","default":"grok-3-beta",
|
| 176 |
+
"list":["grok-3-beta"]},
|
|
|
|
| 177 |
"Ollama (Local)": {"env":"","default":"llama3.1",
|
| 178 |
"list":["llama3.1","llama3.1:70b","qwen3.5:32b","deepseek-r1:8b","phi4:14b"]},
|
| 179 |
"Custom (OpenAI-compatible)": {"env":"","default":"custom","list":["custom"]},
|
|
|
|
| 488 |
k = api_key or (os.getenv(ek,"") if ek else "")
|
| 489 |
|
| 490 |
try:
|
| 491 |
+
if backend == "OpenAI":
|
|
|
|
|
|
|
|
|
|
| 492 |
if not k: return None, "❌ OPENAI_API_KEY required"
|
| 493 |
return Marl.from_openai(k, model, cfg), "✅"
|
| 494 |
elif backend == "Anthropic":
|
|
|
|
| 504 |
elif backend == "xAI (Grok)":
|
| 505 |
if not k: return None, "❌ XAI_API_KEY required"
|
| 506 |
return Marl.from_openai_compatible("https://api.x.ai/v1", k, model, cfg), "✅"
|
|
|
|
|
|
|
|
|
|
| 507 |
elif backend == "Ollama (Local)":
|
| 508 |
return Marl.from_ollama(model, base_url or "http://localhost:11434", cfg), "✅"
|
| 509 |
elif backend == "Custom (OpenAI-compatible)":
|
|
|
|
| 577 |
# ════════════════════════════════════════════════════════════════
|
| 578 |
|
| 579 |
def create_app():
|
| 580 |
+
init_m = MODELS["OpenAI"]["list"]
|
| 581 |
|
| 582 |
with gr.Blocks(title="MARL — Model-Agnostic Runtime Middleware") as app:
|
| 583 |
gr.HTML(INDEX_HTML)
|
|
|
|
| 585 |
with gr.Tabs():
|
| 586 |
with gr.Tab("⚡ Playground"):
|
| 587 |
with gr.Row():
|
| 588 |
+
backend = gr.Dropdown(label="Backend", choices=BACKEND_LIST, value="OpenAI", scale=2)
|
| 589 |
+
api_key = gr.Textbox(label="API Key", type="password", placeholder="Enter your API key (required)",
|
| 590 |
+
value=os.getenv("OPENAI_API_KEY",""), scale=3)
|
| 591 |
with gr.Row():
|
| 592 |
+
model = gr.Dropdown(label="Model", choices=init_m, value="gpt-5.4",
|
| 593 |
allow_custom_value=True, scale=3)
|
| 594 |
base_url = gr.Textbox(label="Base URL (Custom/Ollama)",
|
| 595 |
placeholder="http://localhost:11434", scale=2)
|
|
|
|
| 759 |
ml = Marl.from_ollama(<span style="color:#d97706">"llama3.1"</span>)
|
| 760 |
|
| 761 |
<span style="color:#94a3b8"># Any OpenAI-compatible</span>
|
| 762 |
+
ml = Marl.from_openai(<span style="color:#d97706">"sk-..."</span>, <span style="color:#d97706">"gpt-5.4"</span>)</code></pre>
|
| 763 |
</div>
|
| 764 |
|
| 765 |
<div style="background:var(--surface,#fff);border:1px solid #e2e5f0;border-radius:16px;padding:20px;margin-bottom:16px;box-shadow:0 1px 3px rgba(15,23,42,.04)">
|
|
|
|
| 800 |
<div style="overflow-x:auto">
|
| 801 |
<table style="width:100%;border-collapse:separate;border-spacing:0;font-size:11px;border-radius:10px;overflow:hidden;border:1px solid #e2e5f0">
|
| 802 |
<tr style="background:#f5f6fa"><th style="text-align:left;padding:8px 10px;font-family:JetBrains Mono,monospace;font-size:8px;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Backend</th><th style="text-align:left;padding:8px 10px;font-family:JetBrains Mono,monospace;font-size:8px;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Models</th></tr>
|
| 803 |
+
<tr style="background:rgba(99,102,241,.06)"><td style="padding:8px 10px;border-top:1px solid #e2e5f0;font-weight:700;color:#6366f1">⭐ OpenAI (Default)</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0;font-weight:600">GPT-5.4, GPT-5.4-pro, GPT-5.2, GPT-4o</td></tr>
|
| 804 |
+
<tr style="background:#fafbfe"><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Anthropic</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Claude Opus 4.6, Sonnet 4.6, Haiku 4.5</td></tr>
|
|
|
|
| 805 |
<tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Google Gemini</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Gemini 2.5 Pro / Flash</td></tr>
|
| 806 |
<tr style="background:#fafbfe"><td style="padding:8px 10px;border-top:1px solid #e2e5f0">DeepSeek</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">V3 / R1</td></tr>
|
| 807 |
+
<tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">xAI</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Grok-3</td></tr>
|
| 808 |
<tr style="background:#fafbfe"><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Ollama</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Llama, Mistral, Phi, Qwen</td></tr>
|
| 809 |
<tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Custom</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">Any OpenAI-compatible endpoint</td></tr>
|
| 810 |
</table>
|