Files
Timmy-time-dashboard/src/dashboard/routes/mobile.py
2026-03-05 19:45:38 -05:00

79 lines
2.6 KiB
Python

"""Mobile-optimized dashboard route — /mobile endpoint.
Provides a simplified, mobile-first view of the dashboard that
prioritizes the chat interface and essential status information.
Designed for quick access from a phone's home screen.
The /mobile/local endpoint loads a small LLM directly into the
browser via WebLLM so Timmy can run on an iPhone with no server.
"""
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse
from config import settings
from dashboard.templating import templates
router = APIRouter(tags=["mobile"])
@router.get("/mobile", response_class=HTMLResponse)
async def mobile_dashboard(request: Request):
"""Render the mobile-optimized dashboard.
Falls back to the main index template which is already responsive.
A dedicated mobile template can be added later for a more
streamlined experience.
"""
return templates.TemplateResponse(request, "index.html")
@router.get("/mobile/local", response_class=HTMLResponse)
async def mobile_local_dashboard(request: Request):
"""Mobile dashboard with in-browser local model inference.
Loads a small LLM (via WebLLM / WebGPU) directly into Safari
so Timmy works on an iPhone without any server connection.
Falls back to server-side Ollama when the local model is
unavailable or the user prefers it.
"""
return templates.TemplateResponse(
request,
"mobile_local.html",
{
"browser_model_enabled": settings.browser_model_enabled,
"browser_model_id": settings.browser_model_id,
"browser_model_fallback": settings.browser_model_fallback,
"server_model": settings.ollama_model,
"page_title": "Local AI",
},
)
@router.get("/mobile/local-models")
async def local_models_config():
"""Return browser model configuration for the JS client."""
return {
"enabled": settings.browser_model_enabled,
"default_model": settings.browser_model_id,
"fallback_to_server": settings.browser_model_fallback,
"server_model": settings.ollama_model,
"server_url": settings.ollama_url,
}
@router.get("/mobile/status")
async def mobile_status():
"""Lightweight status endpoint optimized for mobile polling."""
from dashboard.routes.health import check_ollama
ollama_ok = await check_ollama()
return {
"ollama": "up" if ollama_ok else "down",
"model": settings.ollama_model,
"agent": "default",
"ready": True,
"browser_model_enabled": settings.browser_model_enabled,
"browser_model_id": settings.browser_model_id,
}