Add POST /skincare/analyze-photos endpoint that accepts 1–3 skin photos, sends them to Gemini vision, and returns a structured SkinPhotoAnalysisResponse for pre-filling the snapshot form. Extract shared Gemini client setup into innercontext/llm.py (get_gemini_client) so both products and skincare use a single default model (gemini-flash-latest) and API key check. Frontend: AI photo card on /skin page with file picker, previews, and auto-fill of all form fields from the analysis result. New fields (skin_type, sebum_tzone, sebum_cheeks) added to form and server action. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
21 lines
605 B
Python
21 lines
605 B
Python
"""Shared helpers for Gemini API access."""
|
|
|
|
import os
|
|
|
|
from fastapi import HTTPException
|
|
from google import genai
|
|
|
|
|
|
_DEFAULT_MODEL = "gemini-flash-latest"
|
|
|
|
|
|
def get_gemini_client() -> tuple[genai.Client, str]:
|
|
"""Return an authenticated Gemini client and the configured model name.
|
|
|
|
Raises HTTP 503 if GEMINI_API_KEY is not set.
|
|
"""
|
|
api_key = os.environ.get("GEMINI_API_KEY")
|
|
if not api_key:
|
|
raise HTTPException(status_code=503, detail="GEMINI_API_KEY not configured")
|
|
model = os.environ.get("GEMINI_MODEL", _DEFAULT_MODEL)
|
|
return genai.Client(api_key=api_key), model
|