Add comprehensive debug logging for rotation model selection

- Add detailed logging for provider scanning process
- Show which providers are skipped and why (rate limited/deactivated)
- Display model details including weight, rate limit, and provider
- Add priority-based selection visualization
- Show sorted models by weight in descending order
- Indicate whether selection was random or deterministic
- Add clear section headers for different stages of selection
- Provide final selection summary with all relevant details
parent 963f3fc3
...@@ -164,57 +164,103 @@ class RotationHandler: ...@@ -164,57 +164,103 @@ class RotationHandler:
logger.error(f"Rotation {rotation_id} not found") logger.error(f"Rotation {rotation_id} not found")
raise HTTPException(status_code=400, detail=f"Rotation {rotation_id} not found") raise HTTPException(status_code=400, detail=f"Rotation {rotation_id} not found")
logger.info(f"Rotation config: {rotation_config}") logger.info(f"Rotation config loaded successfully")
providers = rotation_config.providers providers = rotation_config.providers
logger.info(f"Number of providers in rotation: {len(providers)}") logger.info(f"Number of providers in rotation: {len(providers)}")
# Collect all available models with their weights # Collect all available models with their weights
available_models = [] available_models = []
skipped_providers = []
total_models_considered = 0
logger.info(f"=== MODEL SELECTION PROCESS START ===")
logger.info(f"Scanning providers for available models...")
for provider in providers: for provider in providers:
logger.info(f"Processing provider: {provider['provider_id']}")
provider_id = provider['provider_id'] provider_id = provider['provider_id']
logger.info(f"")
logger.info(f"--- Processing provider: {provider_id} ---")
# Check if provider is rate limited/deactivated # Check if provider is rate limited/deactivated
provider_handler = get_provider_handler(provider_id, provider.get('api_key')) provider_handler = get_provider_handler(provider_id, provider.get('api_key'))
if provider_handler.is_rate_limited(): if provider_handler.is_rate_limited():
logger.info(f" Provider {provider_id} is rate limited/deactivated, skipping") logger.warning(f" [SKIPPED] Provider {provider_id} is rate limited/deactivated")
logger.warning(f" Reason: Provider has exceeded failure threshold or is in cooldown period")
skipped_providers.append(provider_id)
continue continue
logger.info(f" [AVAILABLE] Provider {provider_id} is active and ready")
models_in_provider = len(provider['models'])
total_models_considered += models_in_provider
logger.info(f" Found {models_in_provider} model(s) in this provider")
for model in provider['models']: for model in provider['models']:
logger.info(f" Model: {model['name']}, weight: {model['weight']}") model_name = model['name']
model_weight = model['weight']
model_rate_limit = model.get('rate_limit', 'N/A')
logger.info(f" - Model: {model_name}")
logger.info(f" Weight (Priority): {model_weight}")
logger.info(f" Rate Limit: {model_rate_limit}")
# Add provider_id and api_key to model for later use # Add provider_id and api_key to model for later use
model_with_provider = model.copy() model_with_provider = model.copy()
model_with_provider['provider_id'] = provider_id model_with_provider['provider_id'] = provider_id
model_with_provider['api_key'] = provider.get('api_key') model_with_provider['api_key'] = provider.get('api_key')
available_models.append(model_with_provider) available_models.append(model_with_provider)
logger.info(f"Total available models: {len(available_models)}") logger.info(f"")
logger.info(f"=== MODEL SELECTION SUMMARY ===")
logger.info(f"Total providers scanned: {len(providers)}")
logger.info(f"Providers skipped (rate limited): {len(skipped_providers)}")
if skipped_providers:
logger.info(f"Skipped providers: {', '.join(skipped_providers)}")
logger.info(f"Total models considered: {total_models_considered}")
logger.info(f"Total models available: {len(available_models)}")
if not available_models: if not available_models:
logger.error("No models available in rotation (all providers may be rate limited)") logger.error("No models available in rotation (all providers may be rate limited)")
logger.error("All providers in this rotation are currently deactivated")
raise HTTPException(status_code=503, detail="No models available in rotation (all providers may be rate limited)") raise HTTPException(status_code=503, detail="No models available in rotation (all providers may be rate limited)")
# Sort models by weight in descending order (higher weight = higher priority) # Sort models by weight in descending order (higher weight = higher priority)
available_models.sort(key=lambda m: m['weight'], reverse=True) available_models.sort(key=lambda m: m['weight'], reverse=True)
logger.info(f"Models sorted by weight (descending): {[m['name'] + ':' + str(m['weight']) for m in available_models]}")
logger.info(f"")
logger.info(f"=== PRIORITY-BASED SELECTION ===")
logger.info(f"Models sorted by weight (descending priority):")
for idx, model in enumerate(available_models, 1):
logger.info(f" {idx}. {model['name']} (provider: {model['provider_id']}, weight: {model['weight']})")
# Find the highest weight # Find the highest weight
highest_weight = available_models[0]['weight'] highest_weight = available_models[0]['weight']
logger.info(f"Highest weight: {highest_weight}") logger.info(f"")
logger.info(f"Highest priority weight: {highest_weight}")
# Filter models with the highest weight # Filter models with the highest weight
highest_weight_models = [m for m in available_models if m['weight'] == highest_weight] highest_weight_models = [m for m in available_models if m['weight'] == highest_weight]
logger.info(f"Models with highest weight: {[m['name'] for m in highest_weight_models]}") logger.info(f"Models with highest priority ({highest_weight}): {len(highest_weight_models)}")
for model in highest_weight_models:
logger.info(f" - {model['name']} (provider: {model['provider_id']})")
# If multiple models have the same highest weight, randomly select among them # If multiple models have the same highest weight, randomly select among them
import random import random
if len(highest_weight_models) > 1: if len(highest_weight_models) > 1:
logger.info(f"Multiple models with highest weight, selecting randomly") logger.info(f"Multiple models with same highest priority - performing random selection")
selected_model = random.choice(highest_weight_models) selected_model = random.choice(highest_weight_models)
logger.info(f"Randomly selected from {len(highest_weight_models)} candidates")
else: else:
selected_model = highest_weight_models[0] selected_model = highest_weight_models[0]
logger.info(f"Single model with highest priority - deterministic selection")
logger.info(f"Selected model: {selected_model}") logger.info(f"")
logger.info(f"=== FINAL SELECTION ===")
logger.info(f"Selected model: {selected_model['name']}")
logger.info(f"Selected provider: {selected_model['provider_id']}")
logger.info(f"Model weight (priority): {selected_model['weight']}")
logger.info(f"Model rate limit: {selected_model.get('rate_limit', 'N/A')}")
logger.info(f"=== MODEL SELECTION PROCESS END ===")
provider_id = selected_model['provider_id'] provider_id = selected_model['provider_id']
api_key = selected_model.get('api_key') api_key = selected_model.get('api_key')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment