Spaces:
Paused
Paused
| import os | |
| import json | |
| import gradio as gr | |
| from openai import OpenAI | |
| from datetime import datetime | |
| ENV_API_KEY = os.getenv("LLMAPI_KEY") # backup if user doesn't provide | |
| DEFAULT_ENDPOINT = "https://api.llmapi.ai/v1" | |
| DEFAULT_MODEL = "deepseek-v4-flash-0731" | |
| def run_llm(endpoint: str, api_key: str, model: str, prompt: str): | |
| endpoint = (endpoint or "").strip().rstrip("/") | |
| api_key = (api_key or "").strip() | |
| model = (model or "").strip() | |
| prompt = (prompt or "").strip() | |
| if not endpoint: | |
| return ("Missing endpoint (e.g. https://api.llmapi.ai/v1).", None) | |
| key = api_key or (ENV_API_KEY or "").strip() | |
| if not key: | |
| return ("Missing API key. Provide one in the form or set Spaces secret env LLMAPI_KEY.", None) | |
| if not model: | |
| return ("Missing model (e.g. deepseek-v4-flash-0731).", None) | |
| if not prompt: | |
| return ("Missing prompt.", None) | |
| client = OpenAI(base_url=endpoint, api_key=key) | |
| try: | |
| resp = client.chat.completions.create( | |
| model=model, | |
| messages=[{"role": "user", "content": prompt}], | |
| ) | |
| content = resp.choices[0].message.content | |
| # Build a JSON download payload (complete-ish) | |
| payload = { | |
| "created_at_utc": datetime.utcnow().isoformat() + "Z", | |
| "request": { | |
| "base_url": endpoint, | |
| "model": model, | |
| "messages": [{"role": "user", "content": prompt}], | |
| }, | |
| "response": resp.model_dump() if hasattr(resp, "model_dump") else str(resp), | |
| } | |
| # Write to a file for Gradio download | |
| filename = "result.json" | |
| with open(filename, "w", encoding="utf-8") as f: | |
| json.dump(payload, f, ensure_ascii=False, indent=2) | |
| return (content, filename) | |
| except Exception as e: | |
| return (f"Error: {e}", None) | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Custom LLM Endpoint (user-provided)") | |
| with gr.Row(): | |
| endpoint = gr.Textbox(label="Endpoint (base_url)", value=DEFAULT_ENDPOINT) | |
| api_key = gr.Textbox( | |
| label="API Key (optional - uses env LLMAPI_KEY as backup)", | |
| type="password", | |
| placeholder="Leave blank to use env LLMAPI_KEY", | |
| ) | |
| model = gr.Textbox(label="Model", value=DEFAULT_MODEL) | |
| prompt = gr.Textbox(label="Prompt", lines=6, placeholder="Type your prompt here...") | |
| run_btn = gr.Button("Send") | |
| out_text = gr.Textbox(label="Response", lines=10) | |
| out_file = gr.File(label="Download results as JSON") | |
| run_btn.click( | |
| fn=run_llm, | |
| inputs=[endpoint, api_key, model, prompt], | |
| outputs=[out_text, out_file], | |
| ) | |
| demo.launch() | |