diff --git a/deploy-crons.py b/deploy-crons.py index e0d29930f..ed0f6b396 100644 --- a/deploy-crons.py +++ b/deploy-crons.py @@ -18,9 +18,9 @@ from typing import Any, Dict, Optional def normalize_job(job: Dict[str, Any]) -> Dict[str, Any]: """ - Normalize a job dict to ensure consistent model field types. + Normalize a job dict to ensure consistent model field types and aligned skill fields. - Before normalization: + Model normalization: - If model AND provider: model = raw string, provider = raw string (inconsistent) - If only model: model = raw string - If only provider: provider = raw string at top level @@ -30,37 +30,61 @@ def normalize_job(job: Dict[str, Any]) -> Dict[str, Any]: - If provider exists: model = {"provider": "yyy"} - If both exist: model = {"model": "xxx", "provider": "yyy"} - If neither: model = None + + Skill normalization: + - Aligns legacy `skill` (single string) with `skills` (list), setting skill = skills[0] """ job = dict(job) # Create a copy to avoid modifying the original - + + # --- skill / skills normalization --- + raw_skill = job.get("skill") + raw_skills = job.get("skills") + + if raw_skills is None: + skill_items = [raw_skill] if raw_skill else [] + elif isinstance(raw_skills, str): + skill_items = [raw_skills] + else: + skill_items = list(raw_skills) + + normalized_skills: list = [] + for item in skill_items: + text = str(item or "").strip() + if text and text not in normalized_skills: + normalized_skills.append(text) + + job["skills"] = normalized_skills + job["skill"] = normalized_skills[0] if normalized_skills else None + + # --- model / provider normalization --- model = job.get("model") provider = job.get("provider") - + # Skip if already normalized (model is a dict) if isinstance(model, dict): return job - + # Build normalized model dict model_dict = {} - + if model is not None and isinstance(model, str): model_dict["model"] = model.strip() - + if provider is not None and isinstance(provider, str): model_dict["provider"] = provider.strip() - + # Set model field if model_dict: job["model"] = model_dict else: job["model"] = None - + # Remove top-level provider field if it was moved into model dict if provider is not None and "provider" in model_dict: # Keep provider field for backward compatibility but mark it as deprecated # This allows existing code that reads job["provider"] to continue working pass - + return job @@ -90,20 +114,26 @@ def normalize_jobs_file(jobs_file: Path, dry_run: bool = False) -> int: for i, job in enumerate(jobs): original_model = job.get("model") original_provider = job.get("provider") - + original_skill = job.get("skill") + original_skills = job.get("skills") + normalized_job = normalize_job(job) - + # Check if anything changed if (normalized_job.get("model") != original_model or - normalized_job.get("provider") != original_provider): + normalized_job.get("provider") != original_provider or + normalized_job.get("skill") != original_skill or + normalized_job.get("skills") != original_skills): jobs[i] = normalized_job modified_count += 1 - + job_id = job.get("id", "?") job_name = job.get("name", "(unnamed)") print(f"Normalized job {job_id} ({job_name}):") print(f" model: {original_model!r} -> {normalized_job.get('model')!r}") print(f" provider: {original_provider!r} -> {normalized_job.get('provider')!r}") + print(f" skill: {original_skill!r} -> {normalized_job.get('skill')!r}") + print(f" skills: {original_skills!r} -> {normalized_job.get('skills')!r}") if modified_count == 0: print("All jobs already have consistent model field types.")