|
5 | 5 | import traceback |
6 | 6 |
|
7 | 7 | # Import all necessary configuration variables |
8 | | -from config import MAX_SONGS_PER_CLUSTER, SCORE_WEIGHT_DIVERSITY, SCORE_WEIGHT_SILHOUETTE, SCORE_WEIGHT_DAVIES_BOULDIN, SCORE_WEIGHT_CALINSKI_HARABASZ, SCORE_WEIGHT_PURITY, SCORE_WEIGHT_OTHER_FEATURE_DIVERSITY, SCORE_WEIGHT_OTHER_FEATURE_PURITY, MIN_SONGS_PER_GENRE_FOR_STRATIFICATION, STRATIFIED_SAMPLING_TARGET_PERCENTILE, CLUSTER_ALGORITHM, NUM_CLUSTERS_MIN, NUM_CLUSTERS_MAX, DBSCAN_EPS_MIN, DBSCAN_EPS_MAX, DBSCAN_MIN_SAMPLES_MIN, DBSCAN_MIN_SAMPLES_MAX, GMM_N_COMPONENTS_MIN, GMM_N_COMPONENTS_MAX, SPECTRAL_N_CLUSTERS_MIN, SPECTRAL_N_CLUSTERS_MAX, ENABLE_CLUSTERING_EMBEDDINGS, PCA_COMPONENTS_MIN, PCA_COMPONENTS_MAX, CLUSTERING_RUNS, TOP_N_MOODS, AI_MODEL_PROVIDER, OLLAMA_SERVER_URL, OLLAMA_MODEL_NAME, OPENAI_SERVER_URL, OPENAI_MODEL_NAME, OPENAI_API_KEY, GEMINI_API_KEY, GEMINI_MODEL_NAME, TOP_N_PLAYLISTS, MISTRAL_API_KEY, MISTRAL_MODEL_NAME |
| 8 | +from config import ( |
| 9 | + MAX_SONGS_PER_CLUSTER, SCORE_WEIGHT_DIVERSITY, SCORE_WEIGHT_SILHOUETTE, |
| 10 | + SCORE_WEIGHT_DAVIES_BOULDIN, SCORE_WEIGHT_CALINSKI_HARABASZ, |
| 11 | + SCORE_WEIGHT_PURITY, SCORE_WEIGHT_OTHER_FEATURE_DIVERSITY, |
| 12 | + SCORE_WEIGHT_OTHER_FEATURE_PURITY, MIN_SONGS_PER_GENRE_FOR_STRATIFICATION, |
| 13 | + STRATIFIED_SAMPLING_TARGET_PERCENTILE, CLUSTER_ALGORITHM, NUM_CLUSTERS_MIN, |
| 14 | + NUM_CLUSTERS_MAX, DBSCAN_EPS_MIN, DBSCAN_EPS_MAX, DBSCAN_MIN_SAMPLES_MIN, |
| 15 | + DBSCAN_MIN_SAMPLES_MAX, GMM_N_COMPONENTS_MIN, GMM_N_COMPONENTS_MAX, |
| 16 | + SPECTRAL_N_CLUSTERS_MIN, SPECTRAL_N_CLUSTERS_MAX, ENABLE_CLUSTERING_EMBEDDINGS, |
| 17 | + PCA_COMPONENTS_MIN, PCA_COMPONENTS_MAX, CLUSTERING_RUNS, TOP_N_MOODS, |
| 18 | + AI_MODEL_PROVIDER, OLLAMA_SERVER_URL, OLLAMA_MODEL_NAME, OPENAI_SERVER_URL, |
| 19 | + OPENAI_MODEL_NAME, OPENAI_API_KEY, GEMINI_API_KEY, GEMINI_MODEL_NAME, |
| 20 | + TOP_N_PLAYLISTS, MISTRAL_API_KEY, MISTRAL_MODEL_NAME, |
| 21 | + TASK_STATUS_PENDING, TASK_STATUS_FAILURE, TASK_STATUS_SUCCESS, |
| 22 | + TASK_STATUS_STARTED, TASK_STATUS_PROGRESS, TASK_STATUS_REVOKED, |
| 23 | +) |
9 | 24 |
|
10 | 25 | # RQ import |
11 | 26 | from rq import Retry |
12 | 27 |
|
13 | 28 | from error import error_manager |
14 | 29 | from error.error_dictionary import ERR_CLUSTERING_FAILED |
15 | 30 |
|
| 31 | +# App helper functions |
| 32 | +from app_helper import rq_queue_high, save_task_status |
| 33 | +from database import clean_up_previous_main_tasks, get_active_main_task |
| 34 | + |
16 | 35 |
|
17 | 36 | logger = logging.getLogger(__name__) |
18 | 37 |
|
|
22 | 41 | def clustering_task_failure_handler(job, connection, type, value, tb): |
23 | 42 | """A failure handler for the main clustering task, executed by the worker.""" |
24 | 43 | from flask_app import app |
25 | | - from app_helper import save_task_status, TASK_STATUS_FAILURE |
26 | 44 | with app.app_context(): |
27 | 45 | task_id = getattr(job, 'id', None) or getattr(job, 'get_id', lambda: None)() |
28 | 46 |
|
@@ -245,10 +263,6 @@ def start_clustering_endpoint(): |
245 | 263 | status: |
246 | 264 | type: string |
247 | 265 | """ |
248 | | - # Local imports to prevent circular dependency at startup |
249 | | - from app_helper import rq_queue_high, get_active_main_task |
250 | | - from app_helper import clean_up_previous_main_tasks, save_task_status, TASK_STATUS_PENDING |
251 | | - |
252 | 266 | # Check for any existing active main task to prevent parallel batch runs |
253 | 267 | active_task = get_active_main_task() |
254 | 268 | if active_task: |
|
0 commit comments