uni-api / test /xue /test_form_uni_api.py
yym68686's picture
✨ Feature: 1. Add support for experimental frontend.
923b378
raw
history blame
4.63 kB
from fastapi import FastAPI, Form as FastAPIForm
from fastapi.responses import HTMLResponse
from xue import HTML, Head, Body, Div, xue_initialize, Strong, Span, Ul, Li
from xue.components import form, button, checkbox, input
from xue.components.model_config_row import model_config_row
from typing import List, Optional
import time
xue_initialize(tailwind=True)
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
async def root():
result = HTML(
Head(
title="Provider Configuration Form"
),
Body(
Div(
form.Form(
form.FormField("Provider", "provider", placeholder="Enter provider name", required=True),
form.FormField("Base URL", "base_url", placeholder="Enter base URL", required=True),
form.FormField("API Key", "api_key", type="password", placeholder="Enter API key"),
Div(
Div("Models", class_="text-lg font-semibold mb-2"),
Div(
model_config_row("model1", "gpt-4o: deepbricks-gpt-4o-mini", True),
model_config_row("model2", "gpt-4o"),
model_config_row("model3", "gpt-3.5-turbo"),
model_config_row("model4", "claude-3-5-sonnet-20240620: claude-3-5-sonnet"),
model_config_row("model5", "o1-mini-all"),
model_config_row("model6", "o1-preview-all"),
model_config_row("model7", "whisper-1"),
id="models-container"
),
button.button(
"Add Model",
class_="mt-2",
hx_post="/add-model",
hx_target="#models-container",
hx_swap="beforeend"
),
class_="mb-4"
),
Div(
checkbox.checkbox("tools", "Enable Tools", checked=True),
class_="mb-4"
),
form.FormField("Notes", "notes", placeholder="Enter any additional notes"),
Div(
button.button("Submit", class_="bg-blue-500 text-white"),
button.button("Cancel", class_="bg-gray-300 text-gray-700 ml-2"),
class_="flex justify-end mt-4"
),
hx_post="/submit",
hx_swap="outerHTML",
class_="space-y-4"
),
class_="container mx-auto p-4 max-w-2xl"
)
)
).render()
print(result)
return result
@app.post("/add-model", response_class=HTMLResponse)
async def add_model():
new_model_id = f"model{hash(str(time.time()))}" # 生成一个唯一的ID
new_model = model_config_row(new_model_id).render()
return new_model
def form_success_message(provider, base_url, api_key, models, tools_enabled, notes):
return Div(
Strong("Success!", class_="font-bold"),
Span("Form submitted successfully.", class_="block sm:inline"),
Ul(
Li(f"Provider: {provider}"),
Li(f"Base URL: {base_url}"),
Li(f"API Key: {'*' * len(api_key)}"),
Li(f"Models: {', '.join(models)}"),
Li(f"Tools Enabled: {'Yes' if tools_enabled else 'No'}"),
Li(f"Notes: {notes}"),
class_="mt-3"
),
class_="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded relative",
role="alert"
)
@app.post("/submit", response_class=HTMLResponse)
async def submit_form(
provider: str = FastAPIForm(...),
base_url: str = FastAPIForm(...),
api_key: str = FastAPIForm(...),
models: List[str] = FastAPIForm([]),
tools: Optional[str] = FastAPIForm(None),
notes: Optional[str] = FastAPIForm(None)
):
# 处理提交的数据
print(f"Received: provider={provider}, base_url={base_url}, api_key={api_key}")
print(f"Models: {models}")
print(f"Tools Enabled: {tools is not None}")
print(f"Notes: {notes}")
# 返回处理结果
return form_success_message(
provider,
base_url,
api_key,
models,
tools is not None,
notes or "No notes provided"
).render()
if __name__ == "__main__":
import uvicorn
uvicorn.run("__main__:app", host="0.0.0.0", port=8000, reload=True)