env('RECOMMENDATIONS_QUEUE', env('VISION_QUEUE', 'default')), 'embedding' => [ 'enabled' => env('RECOMMENDATIONS_EMBEDDING_ENABLED', true), 'model' => env('RECOMMENDATIONS_EMBEDDING_MODEL', 'clip'), 'model_version' => env('RECOMMENDATIONS_EMBEDDING_MODEL_VERSION', 'v1'), 'algo_version' => env('RECOMMENDATIONS_ALGO_VERSION', 'clip-cosine-v1'), // Preferred CLIP endpoint for embeddings. The service also accepts an embedding payload from the analyze endpoint response. 'endpoint' => env('CLIP_EMBED_ENDPOINT', '/embed'), 'timeout_seconds' => (int) env('CLIP_EMBED_TIMEOUT_SECONDS', 8), 'connect_timeout_seconds' => (int) env('CLIP_EMBED_CONNECT_TIMEOUT_SECONDS', 2), 'retries' => (int) env('CLIP_EMBED_HTTP_RETRIES', 1), 'retry_delay_ms' => (int) env('CLIP_EMBED_HTTP_RETRY_DELAY_MS', 200), // Guardrails for malformed service responses. 'min_dim' => (int) env('RECOMMENDATIONS_MIN_DIM', 64), 'max_dim' => (int) env('RECOMMENDATIONS_MAX_DIM', 4096), ], // Backfill chunk size for resumable queue fan-out. 'backfill_batch_size' => (int) env('RECOMMENDATIONS_BACKFILL_BATCH', 200), // A/B support for recommendation ranking variants. 'ab' => [ 'algo_versions' => array_values(array_filter(array_map( static fn (string $value): string => trim($value), explode(',', (string) env('RECOMMENDATIONS_AB_ALGO_VERSIONS', env('RECOMMENDATIONS_ALGO_VERSION', 'clip-cosine-v1'))) ))), ], ];