openfree commited on
Commit
fbd5b4c
·
verified ·
1 Parent(s): 36f1cc6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +16 -28
app.py CHANGED
@@ -164,21 +164,16 @@ SHOWCASE = [
164
  ]
165
 
166
  MODELS = {
167
- "Groq": {"env":"GROQ_API_KEY","default":"openai/gpt-oss-120b",
168
- "list":["openai/gpt-oss-120b","meta-llama/llama-4-scout-17b-16e-instruct",
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-3.1-pro-preview",
176
- "list":["gemini-3.1-pro-preview","gemini-3-flash","gemini-2.5-flash","gemini-2.5-pro"]},
177
  "DeepSeek": {"env":"DEEPSEEK_API_KEY","default":"deepseek-chat",
178
  "list":["deepseek-chat","deepseek-reasoner"]},
179
- "xAI (Grok)": {"env":"XAI_API_KEY","default":"grok-4",
180
- "list":["grok-4","grok-4-fast-reasoning","grok-4-1-fast-reasoning","grok-3-beta"]},
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 == "Groq":
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["Groq"]["list"]
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="Groq", scale=2)
600
- api_key = gr.Textbox(label="API Key", type="password", placeholder="ENV: GROQ_API_KEY",
601
- value=os.getenv("GROQ_API_KEY",""), scale=3)
602
  with gr.Row():
603
- model = gr.Dropdown(label="Model", choices=init_m, value="openai/gpt-oss-120b",
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.from_openai_compatible(<span style="color:#d97706">"https://api.groq.com/openai/v1"</span>, <span style="color:#d97706">"key"</span>, <span style="color:#d97706">"gpt-oss-120b"</span>)</code></pre>
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">⭐ Groq (Default)</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0;font-weight:600">gpt-oss-120b, Llama 4, DeepSeek-R1, QwQ-32b</td></tr>
815
- <tr><td style="padding:8px 10px;border-top:1px solid #e2e5f0">OpenAI</td><td style="padding:8px 10px;border-top:1px solid #e2e5f0">GPT-5.2, GPT-4.1, o4-mini</td></tr>
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 / 4</td></tr>
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>