"""default the embedder to SigLIP 2 — for FRESH installs only (#1203) Make SigLIP 2 (so400m, 512px; a 1152-d drop-in) the default embedder. New installs start on it. An EXISTING library is NOT touched: flipping its stored embedder version would mark every embedding stale (the scorer is version-gated) and kill suggestions until a full re-embed+retrain — so an existing instance switches deliberately via Settings → GPU agent → Embedding model → Re-embed → Retrain. We detect "fresh" by the absence of any embedded image. Revision ID: 0069 Revises: 0068 Create Date: 2026-06-30 """ from typing import Sequence, Union from alembic import op revision: str = "0069" down_revision: Union[str, None] = "0068" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None _NEW_NAME = "google/siglip2-so400m-patch16-512" _NEW_VERSION = "siglip2-so400m-patch16-512" _OLD_NAME = "google/siglip-so400m-patch14-384" _OLD_VERSION = "siglip-so400m-patch14-384" def upgrade() -> None: # Fresh install (nothing embedded yet) → adopt SigLIP 2. op.execute( f""" UPDATE ml_settings SET embedder_model_name = '{_NEW_NAME}', embedder_model_version = '{_NEW_VERSION}' WHERE NOT EXISTS ( SELECT 1 FROM image_record WHERE siglip_embedding IS NOT NULL ) """ ) op.alter_column("ml_settings", "embedder_model_name", server_default=_NEW_NAME) op.alter_column( "ml_settings", "embedder_model_version", server_default=_NEW_VERSION ) def downgrade() -> None: op.alter_column("ml_settings", "embedder_model_name", server_default=_OLD_NAME) op.alter_column( "ml_settings", "embedder_model_version", server_default=_OLD_VERSION )