From 2e0a94e88c847a5ed8dc6ad5fa49715cd631bdfe Mon Sep 17 00:00:00 2001 From: Tyler Hoang Date: Fri, 8 May 2026 01:58:48 -0700 Subject: Initial commit — Commis personal chef app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI-powered local chef tool: pantry tracking, meal logging, rotating weekly menu generation, and grocery list optimization via Ollama (llama3). FastAPI backend, SQLite, vanilla JS frontend. Co-Authored-By: Claude Sonnet 4.6 --- main.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 main.py (limited to 'main.py') diff --git a/main.py b/main.py new file mode 100644 index 0000000..fdbdea9 --- /dev/null +++ b/main.py @@ -0,0 +1,51 @@ +from contextlib import asynccontextmanager +import asyncio +from fastapi import FastAPI +from fastapi.staticfiles import StaticFiles +from database import engine, Base +from config import settings +from routers import pantry, meals, recipes, menus, grocery + + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup + Base.metadata.create_all(bind=engine) + yield + # Shutdown + pass + + +app = FastAPI(title="Commis", lifespan=lifespan) + +# Include routers first so API routes take priority over the static catch-all +app.include_router(pantry.router) +app.include_router(meals.router) +app.include_router(recipes.router) +app.include_router(menus.router) +app.include_router(grocery.router) +app.include_router(grocery.ai_router) + + +@app.get("/api/health") +async def health(): + try: + import ollama + client = ollama.Client(host=settings.ollama_host) + loop = asyncio.get_event_loop() + models_resp = await loop.run_in_executor(None, client.list) + model_names = [m["name"] for m in models_resp.get("models", [])] + ollama_status = "connected" + except Exception: + model_names = [] + ollama_status = "disconnected" + return { + "status": "ok", + "ollama": ollama_status, + "model": settings.model_name, + "available_models": model_names, + } + + +# Static files mount last — acts as a catch-all, must come after all API routes +app.mount("/", StaticFiles(directory="static", html=True), name="static") -- cgit v1.3-2-g0d8e