import os
import json
import re
from pathlib import Path
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
import gradio as gr
from openai import OpenAI
# Default system prompt for DeepSeek V4 Flash
DEFAULT_SYSTEM_PROMPT = "You are DeepSeek, a helpful AI assistant powered by DeepSeek V4 Flash. You provide accurate, detailed, and thoughtful responses."
# ── Initialize Gradio Server (FastAPI subclass) ─────────────────────────
app = gr.Server()
# Create static directory if it doesn't exist
STATIC_DIR = Path(__file__).parent / "static"
os.makedirs(STATIC_DIR, exist_ok=True)
# ── API Endpoint: Chat ──────────────────────────────────────────────────
@app.api(name="chat_with_deepseek")
def chat_with_deepseek(
messages_json: str,
reasoning_effort: str = "medium",
max_tokens: str = "2048",
temperature: str = "0.7",
system_prompt: str = "",
) -> str:
try:
messages = json.loads(messages_json)
max_tokens = int(max_tokens)
temperature = float(temperature)
key = os.environ.get("SILICONFLOW_API_KEY", "").strip()
if not key:
return json.dumps({
"status": "error",
"message": "SILICONFLOW_API_KEY environment variable is not configured on the server."
})
client = OpenAI(
api_key=key,
base_url="https://api.siliconflow.com/v1",
)
sys_prompt = system_prompt.strip() if system_prompt and system_prompt.strip() else DEFAULT_SYSTEM_PROMPT
messages_no_system = [m for m in messages if m.get("role") != "system"]
final_messages = [{"role": "system", "content": sys_prompt}] + messages_no_system
params = {
"model": "deepseek-ai/DeepSeek-V4-Flash",
"messages": final_messages,
"max_tokens": max_tokens,
"temperature": temperature
}
if reasoning_effort in ["low", "medium", "high"]:
params["reasoning_effort"] = reasoning_effort
response = client.chat.completions.create(**params)
content = response.choices[0].message.content
reasoning_content = getattr(response.choices[0].message, "reasoning_content", "")
if not reasoning_content and content and "