| from __future__ import annotations |
|
|
| import gradio as gr |
|
|
| from core.app_state import APP_STATE, emit_inference_response |
| from core.deployment import ( |
| DeploymentPolicy, |
| current_policy, |
| default_backend_for_policy, |
| filter_backends_for_policy, |
| ) |
| from core.events import Event, EventType |
| from core.spaces_runtime import spaces |
| from core.tab_feedback import emit_tab_error, status_ok |
| from models.model_catalog import ModelInfo, model_choices, model_summary |
| from models.service_factory import BACKENDS, create_text_service |
| from ui.progress import CLICK_PROGRESS |
|
|
|
|
| def build_chat_tab( |
| catalog: dict[str, ModelInfo], |
| policy: DeploymentPolicy | None = None, |
| ) -> None: |
| active_policy = policy or current_policy() |
| text_models = model_choices(catalog, "text") or list(catalog) |
| default_model = text_models[0] |
| backend_choices = filter_backends_for_policy(BACKENDS, active_policy) |
| default_backend = default_backend_for_policy( |
| BACKENDS, |
| "transformers" if active_policy.is_space else "placeholder", |
| active_policy, |
| ) |
|
|
| with gr.Row(): |
| model_id = gr.Dropdown(text_models, value=default_model, label="Model") |
| backend = gr.Dropdown(backend_choices, value=default_backend, label="Backend") |
| model_meta = gr.JSON(model_summary(catalog[default_model]), label="Model card") |
|
|
| system_prompt = gr.Textbox(label="System prompt", lines=2) |
| user_prompt = gr.Textbox( |
| label="Prompt", |
| lines=6, |
| placeholder="Ask the local workbench something...", |
| ) |
| run = gr.Button("Run", variant="primary") |
| output = gr.Textbox(label="Response", lines=12) |
| status = gr.Markdown(status_ok("Ready.")) |
|
|
| def select_model(selected: str) -> dict: |
| return model_summary(catalog[selected]) |
|
|
| @spaces.GPU(duration=120) |
| def respond( |
| selected: str, |
| selected_backend: str, |
| system: str, |
| prompt: str, |
| ) -> tuple[str, str]: |
| if not prompt.strip(): |
| return ( |
| "", |
| emit_tab_error( |
| "Chat", |
| "Enter a prompt before running chat.", |
| {"model_id": selected, "backend": selected_backend}, |
| ), |
| ) |
| APP_STATE.emit( |
| Event( |
| EventType.INFERENCE_REQUEST, |
| { |
| "mode": "text", |
| "model_id": selected, |
| "backend": selected_backend, |
| "prompt_chars": len(prompt), |
| }, |
| ) |
| ) |
| try: |
| response = create_text_service( |
| catalog[selected], |
| selected_backend, |
| active_policy, |
| ).chat(system, prompt) |
| except (RuntimeError, ValueError, OSError) as exc: |
| return ( |
| "", |
| emit_tab_error( |
| "Chat", |
| str(exc), |
| {"model_id": selected, "backend": selected_backend}, |
| ), |
| ) |
| emit_inference_response("text", selected, selected_backend, response) |
| return response, status_ok("Chat response generated.") |
|
|
| model_id.change(select_model, model_id, model_meta) |
| run.click( |
| respond, |
| [model_id, backend, system_prompt, user_prompt], |
| [output, status], |
| show_progress=CLICK_PROGRESS, |
| ) |
|
|