Spaces:
Sleeping
Sleeping
| from __future__ import annotations | |
| from typing import cast | |
| import gradio as gr | |
| from core.app_logging import configure_app_logging | |
| from core.deployment import current_policy | |
| from models.model_catalog import load_model_catalog | |
| from ui.agent_tab import build_agent_tab | |
| from ui.chat_tab import build_chat_tab | |
| from ui.dataset_tab import build_dataset_tab | |
| from ui.export_tab import build_export_tab | |
| from ui.notes_tab import build_notes_tab | |
| from ui.status_tab import build_status_tab | |
| from ui.traces_tab import build_traces_tab | |
| from ui.train_tab import build_train_tab | |
| from ui.vision_tab import build_vision_tab | |
| from ui.vllm_tab import build_vllm_tab | |
| APP_THEME = gr.themes.Soft(primary_hue="teal", neutral_hue="slate") | |
| APP_CSS = """ | |
| .app-title { | |
| margin-bottom: 0.25rem; | |
| } | |
| .gradio-container { | |
| max-width: 1180px !important; | |
| } | |
| .tabs { | |
| overflow-x: auto; | |
| } | |
| button { | |
| min-height: 2.5rem; | |
| } | |
| textarea, | |
| input, | |
| .wrap { | |
| max-width: 100%; | |
| } | |
| @media (max-width: 720px) { | |
| .gradio-container { | |
| padding-left: 0.75rem !important; | |
| padding-right: 0.75rem !important; | |
| } | |
| .app-title h1 { | |
| font-size: 1.55rem; | |
| line-height: 1.2; | |
| } | |
| } | |
| """ | |
| def build_app() -> gr.Blocks: | |
| configure_app_logging() | |
| policy = current_policy() | |
| catalog = load_model_catalog("config/models.yaml") | |
| with gr.Blocks(title="OpenBMB Local AI Workbench", analytics_enabled=False) as demo: | |
| gr.Markdown( | |
| """ | |
| # OpenBMB Local AI Workbench | |
| Real small-model experimentation for Gradio + Hugging Face Spaces. | |
| """, | |
| elem_classes=["app-title"], | |
| ) | |
| if policy.is_space: | |
| gr.Markdown( | |
| "Deployment mode: Space. Placeholder and demo inference are disabled; " | |
| "select a configured real backend before running model calls." | |
| ) | |
| with gr.Tabs(): | |
| with gr.Tab("Chat"): | |
| build_chat_tab(catalog, policy) | |
| with gr.Tab("Vision"): | |
| build_vision_tab(catalog, policy) | |
| with gr.Tab("Dataset"): | |
| build_dataset_tab() | |
| with gr.Tab("Train"): | |
| build_train_tab() | |
| with gr.Tab("vLLM"): | |
| build_vllm_tab(catalog) | |
| with gr.Tab("Export"): | |
| build_export_tab(catalog) | |
| with gr.Tab("Field Notes"): | |
| build_notes_tab(catalog) | |
| with gr.Tab("Traces"): | |
| build_traces_tab() | |
| with gr.Tab("Agent"): | |
| build_agent_tab() | |
| with gr.Tab("Status"): | |
| build_status_tab(catalog, policy) | |
| return cast(gr.Blocks, demo) | |
| if __name__ == "__main__": | |
| build_app().launch( | |
| server_port=7860, | |
| share=False, | |
| theme=APP_THEME, | |
| css=APP_CSS, | |
| mcp_server=True, | |
| ) | |