import gradio as gr from typing import List, Dict from sqlmodel import Session, select from db import get_engine from schema import APIProvider import os # 获取数据库引擎 engine = get_engine(os.path.join(os.path.dirname(__file__), "..", "workdir")) def setting_page(): def get_providers() -> List[List[str]]: with Session(engine) as session: providers = session.exec(select(APIProvider)).all() return [ [p.id, p.model_id, p.base_url, p.api_key or ""] for p in providers ] def add_provider(model_id, base_url, api_key): try: with Session(engine) as session: new_provider = APIProvider( model_id=model_id if model_id else None, base_url=base_url if base_url else None, api_key=api_key if api_key else None ) session.add(new_provider) session.commit() session.refresh(new_provider) return get_providers() except Exception as e: # 抛出错误提示 raise gr.Error(f"添加失败: {str(e)}") with gr.Blocks() as demo: gr.Markdown("## API Provider 管理") with gr.Row(): with gr.Column(scale=1): model_id_input = gr.Textbox(label="Model ID") base_url_input = gr.Textbox(label="Base URL") api_key_input = gr.Textbox(label="API Key") add_button = gr.Button("添加新API") # API Provider列表 with gr.Column(scale=3): provider_table = gr.DataFrame( headers=["id" , "model id", "base URL", "API Key"], datatype=["number","str", "str", "str"], interactive=True, value=get_providers(), wrap=True, col_count=(4, "auto") ) with gr.Row(): edit_button = gr.Button("编辑选中行") delete_button = gr.Button("删除选中行") add_button.click( fn=add_provider, inputs=[model_id_input, base_url_input, api_key_input], outputs=[provider_table] ) return demo