79 lines
2.6 KiB
Python
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,
|
|
}
|