Wire the full embedding flow: - Rewrite Embedding model to use pgvector Vector(512) with HNSW index - Add embed_photo, vision_fanout, backfill_vision Celery tasks on dedicated `vision` queue - Hook vision_fanout into generate_thumbnails completion - Add POST /api/v1/photos/search with hybrid RRF ranking (semantic-only for now; FTS leg added in PR5) - Stub ocr_photo, detect_objects, extract_faces tasks for later PRs Migration 0003 drops/recreates the embeddings table (was never populated). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
"""
|
|
Celery configuration and app initialization
|
|
"""
|
|
from celery import Celery
|
|
from app.config import settings
|
|
|
|
# Create Celery app
|
|
celery_app = Celery(
|
|
'mulita',
|
|
broker=settings.celery_broker_url,
|
|
backend=settings.celery_result_backend,
|
|
include=['app.tasks.scan', 'app.tasks.thumbs', 'app.tasks.vision']
|
|
)
|
|
|
|
# Configure Celery
|
|
celery_app.conf.update(
|
|
task_serializer='json',
|
|
accept_content=['json'],
|
|
result_serializer='json',
|
|
timezone='UTC',
|
|
enable_utc=True,
|
|
task_routes={
|
|
'app.tasks.thumbs.*': {'queue': 'high'},
|
|
'app.tasks.scan.*': {'queue': 'low'},
|
|
'app.tasks.vision.*': {'queue': 'vision'},
|
|
'embed_photo': {'queue': 'vision'},
|
|
'ocr_photo': {'queue': 'vision'},
|
|
'detect_objects': {'queue': 'vision'},
|
|
'extract_faces': {'queue': 'vision'},
|
|
'vision_fanout': {'queue': 'vision'},
|
|
},
|
|
task_default_queue='default',
|
|
task_default_exchange='default',
|
|
task_default_exchange_type='direct',
|
|
task_default_routing_key='default',
|
|
broker_connection_retry_on_startup=True,
|
|
) |