ellf-cli 4.0.96__tar.gz → 4.0.100__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. {ellf_cli-4.0.96/ellf_cli.egg-info → ellf_cli-4.0.100}/PKG-INFO +1 -1
  2. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/README.md +2 -2
  3. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/about.json +1 -1
  4. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/projects.py +3 -3
  5. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf.json +29 -29
  6. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/SKILL.md +13 -3
  7. {ellf_cli-4.0.96/ellf_cli/ellf_skills/skills/ellf-monitor.coding → ellf_cli-4.0.100/ellf_cli/ellf_skills/skills/ellf-monitor.assistant}/references/annotation_metrics.md +7 -4
  8. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/query.py +39 -14
  9. {ellf_cli-4.0.96 → ellf_cli-4.0.100/ellf_cli.egg-info}/PKG-INFO +1 -1
  10. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/LICENSE +0 -0
  11. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/MANIFEST.in +0 -0
  12. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/__init__.py +0 -0
  13. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/__main__.py +0 -0
  14. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/about.py +0 -0
  15. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/appdirs.py +0 -0
  16. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/auth.py +0 -0
  17. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/cli.py +0 -0
  18. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/cloud/__init__.py +0 -0
  19. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/cloud/gcp.py +0 -0
  20. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/cluster_config.py +0 -0
  21. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/__init__.py +0 -0
  22. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/_recipe_file.py +0 -0
  23. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  24. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/_state.py +0 -0
  25. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/actions.py +0 -0
  26. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/agents.py +0 -0
  27. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/assets.py +0 -0
  28. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/clusters.py +0 -0
  29. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/config.py +0 -0
  30. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/datasets.py +0 -0
  31. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/files/__init__.py +0 -0
  32. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/files/cp.py +0 -0
  33. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/files/ls.py +0 -0
  34. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/files/rm.py +0 -0
  35. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/files/rsync.py +0 -0
  36. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/files/stats.py +0 -0
  37. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/general.py +0 -0
  38. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/import_export.py +0 -0
  39. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/__init__.py +0 -0
  40. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/_helpers.py +0 -0
  41. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/deploy.py +0 -0
  42. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/init_values.py +0 -0
  43. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/provision.py +0 -0
  44. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/register.py +0 -0
  45. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/setup.py +0 -0
  46. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/start.py +0 -0
  47. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/terraform.py +0 -0
  48. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/infra/tls.py +0 -0
  49. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/jobs.py +0 -0
  50. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/packages.py +0 -0
  51. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/paths.py +0 -0
  52. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/plans.py +0 -0
  53. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/publish_code.py +0 -0
  54. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/publish_data.py +0 -0
  55. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/recipes.py +0 -0
  56. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/secrets.py +0 -0
  57. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/support.py +0 -0
  58. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/tasks.py +0 -0
  59. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/commands/todos.py +0 -0
  60. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/config.py +0 -0
  61. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/.claude-plugin/plugin.json +0 -0
  62. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/.gitignore +0 -0
  63. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/bin/write-current-session.py +0 -0
  64. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/hooks/hooks.json +0 -0
  65. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skill_variants.json +0 -0
  66. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md +0 -0
  67. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/annotation_audit.md +0 -0
  68. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/builtin_ellf_annotation_recipes.md +0 -0
  69. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/SKILL.md +0 -0
  70. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/annotation_audit.md +0 -0
  71. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_ellf_annotation_recipes.md +0 -0
  72. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_prodigy_recipes.md +0 -0
  73. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  74. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.md +0 -0
  75. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/training_monitoring.md +0 -0
  76. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/SKILL.md +0 -0
  77. {ellf_cli-4.0.96/ellf_cli/ellf_skills/skills/ellf-monitor.assistant → ellf_cli-4.0.100/ellf_cli/ellf_skills/skills/ellf-monitor.coding}/references/annotation_metrics.md +0 -0
  78. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/training_monitoring.md +0 -0
  79. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/scripts/check_training.py +0 -0
  80. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md +0 -0
  81. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-ops.coding/SKILL.md +0 -0
  82. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-ops.coding/references/data_infra_cli.md +0 -0
  83. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-ops.coding/scripts/run_job.py +0 -0
  84. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.md +0 -0
  85. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  86. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.md +0 -0
  87. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  88. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
  89. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  90. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  91. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  92. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  93. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  94. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  95. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  96. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  97. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  98. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  99. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  100. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  101. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  102. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.assistant/SKILL.md +0 -0
  103. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/consulting_patterns.md +0 -0
  104. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/explosion_strategy.md +0 -0
  105. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/prodigy_llm_bot.md +0 -0
  106. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.coding/SKILL.md +0 -0
  107. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/consulting_patterns.md +0 -0
  108. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/explosion_strategy.md +0 -0
  109. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/prodigy_llm_bot.md +0 -0
  110. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-support.assistant/SKILL.md +0 -0
  111. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-support.coding/SKILL.md +0 -0
  112. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.md +0 -0
  113. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.assistant/SKILL.md +0 -0
  114. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/diagnostics.md +0 -0
  115. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/evaluation_guide.md +0 -0
  116. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/model_selection.md +0 -0
  117. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/training_paradigms.md +0 -0
  118. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/workflow.md +0 -0
  119. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/SKILL.md +0 -0
  120. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_advanced.md +0 -0
  121. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_architectures.md +0 -0
  122. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_training.md +0 -0
  123. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/diagnostics.md +0 -0
  124. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/evaluation_guide.md +0 -0
  125. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/experiment_patterns.md +0 -0
  126. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/model_selection.md +0 -0
  127. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_paradigms.md +0 -0
  128. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_troubleshooting.md +0 -0
  129. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/workflow.md +0 -0
  130. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ellf_skills/skills/ellf-train.coding/scripts/ellf_logger.py +0 -0
  131. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/errors.py +0 -0
  132. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/helm.py +0 -0
  133. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/key_pair.py +0 -0
  134. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/main.py +0 -0
  135. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/messages.py +0 -0
  136. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  137. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  138. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  139. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  140. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  141. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  142. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  143. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  144. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  145. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
  146. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/testing/__init__.py +0 -0
  147. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ty.py +0 -0
  148. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/ui.py +0 -0
  149. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/url.py +0 -0
  150. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli/util.py +0 -0
  151. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli.egg-info/SOURCES.txt +0 -0
  152. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli.egg-info/dependency_links.txt +0 -0
  153. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli.egg-info/entry_points.txt +0 -0
  154. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli.egg-info/not-zip-safe +0 -0
  155. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli.egg-info/requires.txt +0 -0
  156. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/ellf_cli.egg-info/top_level.txt +0 -0
  157. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/pyproject.toml +0 -0
  158. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/setup.cfg +0 -0
  159. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/setup.py +0 -0
  160. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_appdirs.py +0 -0
  161. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_auth.py +0 -0
  162. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_config.py +0 -0
  163. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_errors.py +0 -0
  164. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_files_cp.py +0 -0
  165. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_files_cp_helpers.py +0 -0
  166. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_info.py +0 -0
  167. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_invalid_secrets.py +0 -0
  168. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_key_pair.py +0 -0
  169. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_login.py +0 -0
  170. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_main.py +0 -0
  171. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_plans.py +0 -0
  172. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_projects.py +0 -0
  173. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_query.py +0 -0
  174. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_recipe_file.py +0 -0
  175. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_recipes.py +0 -0
  176. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_state.py +0 -0
  177. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_support.py +0 -0
  178. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_ty.py +0 -0
  179. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_ui.py +0 -0
  180. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_ui_extras.py +0 -0
  181. {ellf_cli-4.0.96 → ellf_cli-4.0.100}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 4.0.96
3
+ Version: 4.0.100
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -795,7 +795,7 @@ List all projects
795
795
 
796
796
  | Argument | Type | Description | Default |
797
797
  | --- | --- | --- | --- |
798
- | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'description', 'default_job_name_template'] | `['id', 'name']` |
798
+ | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'slug', 'description', 'default_job_name_template'] | `['slug', 'name']` |
799
799
  | `--name` | `str` | Filter by name | `None` |
800
800
  | `--json` | `bool` | Output the result as JSON | `False` |
801
801
 
@@ -806,7 +806,7 @@ Get detailed info for a project
806
806
  | Argument | Type | Description | Default |
807
807
  | --- | --- | --- | --- |
808
808
  | `name_or_id` | `Union[str, UUID]` | Name or ID of the project | |
809
- | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'description', 'default_job_name_template'] | `None` |
809
+ | `--select` | `list[str]` | Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'slug', 'description', 'default_job_name_template'] | `None` |
810
810
  | `--json` | `bool` | Output the result as JSON | `False` |
811
811
 
812
812
  #### `ellf projects create`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "title": "Ellf CLI",
3
3
  "name": "ellf-cli",
4
- "version": "4.0.96",
4
+ "version": "4.0.100",
5
5
  "summary": "Ellf Command Line Interface",
6
6
  "uri": "https://prodi.gy",
7
7
  "prog": "ellf",
@@ -39,7 +39,7 @@ logger = logging.getLogger(__name__)
39
39
  # fmt: on
40
40
  )
41
41
  def list(
42
- select: builtins.list[str] = ["id", "name"],
42
+ select: builtins.list[str] = ["slug", "name"],
43
43
  name: Optional[str] = None,
44
44
  as_json: bool = False,
45
45
  ) -> Sequence[ProjectSummary]:
@@ -108,7 +108,7 @@ def create(
108
108
  except EllfErrors.ProjectInvalid:
109
109
  raise CLIError(Messages.E004.format(noun="project", name=name))
110
110
  print_mutation_result(
111
- {"id": str(res.id), "name": res.name},
111
+ {"slug": res.slug, "id": str(res.id), "name": res.name},
112
112
  Messages.T002.format(noun="project", name=res.name),
113
113
  as_json=as_json,
114
114
  )
@@ -147,7 +147,7 @@ def update(
147
147
  )
148
148
  res = auth.client.project.update(body)
149
149
  print_mutation_result(
150
- {"id": str(res.id), "name": res.name},
150
+ {"slug": res.slug, "id": str(res.id), "name": res.name},
151
151
  Messages.T051.format(noun="project", name=res.name),
152
152
  as_json=as_json,
153
153
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "4.0.95",
4
+ "version": "4.0.99",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -204,7 +204,7 @@
204
204
  "orig_type": "bool"
205
205
  }
206
206
  ],
207
- "description": "\n Log in to your Ellf account. You normally don't need to call this\n manually. It will automatically authenticate when needed.\n ",
207
+ "description": "\nLog in to your Ellf account. You normally don't need to call this\nmanually. It will automatically authenticate when needed.\n",
208
208
  "allow_extra": false,
209
209
  "parent": null,
210
210
  "is_placeholder": false
@@ -257,7 +257,7 @@
257
257
  "orig_type": "Literal[api, cluster, id, ci]"
258
258
  }
259
259
  ],
260
- "description": "\n Return an auth token for the current user\n ",
260
+ "description": "\nReturn an auth token for the current user\n",
261
261
  "allow_extra": false,
262
262
  "parent": null,
263
263
  "is_placeholder": false
@@ -333,7 +333,7 @@
333
333
  "orig_type": "list[Literal[tasks, actions, assets, datasets, paths]]"
334
334
  }
335
335
  ],
336
- "description": "\n Save the state of the current app JSON file. If an assets directory is\n provided, assets will be downloaded and referenced in the JSON accordingly.\n ",
336
+ "description": "\nSave the state of the current app JSON file. If an assets directory is\nprovided, assets will be downloaded and referenced in the JSON accordingly.\n",
337
337
  "allow_extra": false,
338
338
  "parent": null,
339
339
  "is_placeholder": false
@@ -368,7 +368,7 @@
368
368
  "orig_type": "bool"
369
369
  }
370
370
  ],
371
- "description": "\n Populate Ellf with data for projects, tasks, actions, assets and paths.\n ",
371
+ "description": "\nPopulate Ellf with data for projects, tasks, actions, assets and paths.\n",
372
372
  "allow_extra": false,
373
373
  "parent": null,
374
374
  "is_placeholder": false
@@ -445,7 +445,7 @@
445
445
  "orig_type": "List[str]"
446
446
  }
447
447
  ],
448
- "description": "\n Create a new action. The available action recipes are fetched from your\n cluster and are added as dynamic subcommands. You can see more details\n and available arguments by calling the subcommand with --help, e.g. create\n [name] --help\n ",
448
+ "description": "\nCreate a new action. The available action recipes are fetched from your\ncluster and are added as dynamic subcommands. You can see more details\nand available arguments by calling the subcommand with --help, e.g. create\n[name] --help\n",
449
449
  "allow_extra": true,
450
450
  "parent": "actions",
451
451
  "is_placeholder": false
@@ -480,7 +480,7 @@
480
480
  "orig_type": "bool"
481
481
  }
482
482
  ],
483
- "description": "\n List the actions on the cluster. By default, this includes their ID, name\n and current state, e.g. created or completed\n ",
483
+ "description": "\nList the actions on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
484
484
  "allow_extra": false,
485
485
  "parent": "actions",
486
486
  "is_placeholder": false
@@ -926,7 +926,7 @@
926
926
  "orig_type": "List[str]"
927
927
  }
928
928
  ],
929
- "description": "\n Create a new agent. The available agent recipes are fetched from your\n cluster and are added as dynamic subcommands. You can see more details\n and available arguments by calling the subcommand with --help, e.g. create\n [name] --help\n ",
929
+ "description": "\nCreate a new agent. The available agent recipes are fetched from your\ncluster and are added as dynamic subcommands. You can see more details\nand available arguments by calling the subcommand with --help, e.g. create\n[name] --help\n",
930
930
  "allow_extra": true,
931
931
  "parent": "agents",
932
932
  "is_placeholder": false
@@ -1035,7 +1035,7 @@
1035
1035
  "orig_type": "bool"
1036
1036
  }
1037
1037
  ],
1038
- "description": "\n List the agents on the cluster. By default, this includes their ID, name\n and current state, e.g. created or completed\n ",
1038
+ "description": "\nList the agents on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
1039
1039
  "allow_extra": false,
1040
1040
  "parent": "agents",
1041
1041
  "is_placeholder": false
@@ -1529,7 +1529,7 @@
1529
1529
  "orig_type": "bool"
1530
1530
  }
1531
1531
  ],
1532
- "description": "\n Get detailed info for an asset uploaded to the cluster and registered\n with Ellf\n ",
1532
+ "description": "\nGet detailed info for an asset uploaded to the cluster and registered\nwith Ellf\n",
1533
1533
  "allow_extra": false,
1534
1534
  "parent": "assets",
1535
1535
  "is_placeholder": false
@@ -1629,7 +1629,7 @@
1629
1629
  "orig_type": "bool"
1630
1630
  }
1631
1631
  ],
1632
- "description": "\n Create an asset on the cluster and register it with Ellf. Assets\n point to files or directories you control. The Ellf server only has\n a reference to them. This command doesn't transfer any data. See `ellf files`\n for utilities to transfer files to and from your cluster\n ",
1632
+ "description": "\nCreate an asset on the cluster and register it with Ellf. Assets\npoint to files or directories you control. The Ellf server only has\na reference to them. This command doesn't transfer any data. See `ellf files`\nfor utilities to transfer files to and from your cluster\n",
1633
1633
  "allow_extra": false,
1634
1634
  "parent": "assets",
1635
1635
  "is_placeholder": false
@@ -1858,7 +1858,7 @@
1858
1858
  "orig_type": "Union[str, UUID]"
1859
1859
  }
1860
1860
  ],
1861
- "description": "\n Delete a cluster from PAM. This only removes PAM's record\n of it. The cluster itself will continue to exist - you need\n to shut it down separately.\n ",
1861
+ "description": "\nDelete a cluster from PAM. This only removes PAM's record\nof it. The cluster itself will continue to exist - you need\nto shut it down separately.\n",
1862
1862
  "allow_extra": false,
1863
1863
  "parent": "clusters",
1864
1864
  "is_placeholder": false
@@ -1945,7 +1945,7 @@
1945
1945
  "orig_type": "bool"
1946
1946
  }
1947
1947
  ],
1948
- "description": "Check the health of a cluster deployment.\n\n Runs CLI-side connectivity checks against the cluster and PAM.\n Use --deep to also trigger cluster-side deployment checks (K8s API,\n NFS, database, etc.).\n ",
1948
+ "description": "Check the health of a cluster deployment.\n\nRuns CLI-side connectivity checks against the cluster and PAM.\nUse --deep to also trigger cluster-side deployment checks (K8s API,\nNFS, database, etc.).\n",
1949
1949
  "allow_extra": false,
1950
1950
  "parent": "clusters",
1951
1951
  "is_placeholder": false
@@ -2028,7 +2028,7 @@
2028
2028
  "orig_type": "str"
2029
2029
  }
2030
2030
  ],
2031
- "description": "Rotate the cluster RSA keypair.\n\n Generates a new keypair, updates the cluster record in PAM with the\n new public key, patches the K8s secret with the new private key,\n and restarts the cluster deployment.\n ",
2031
+ "description": "Rotate the cluster RSA keypair.\n\nGenerates a new keypair, updates the cluster record in PAM with the\nnew public key, patches the K8s secret with the new private key,\nand restarts the cluster deployment.\n",
2032
2032
  "allow_extra": false,
2033
2033
  "parent": "clusters",
2034
2034
  "is_placeholder": false
@@ -2813,7 +2813,7 @@
2813
2813
  "orig_type": "str"
2814
2814
  }
2815
2815
  ],
2816
- "description": "Export all the examples from a dataset and save it in the designated file as\n JSONL (newline-delimited JSON).\n ",
2816
+ "description": "Export all the examples from a dataset and save it in the designated file as\nJSONL (newline-delimited JSON).\n",
2817
2817
  "allow_extra": false,
2818
2818
  "parent": "datasets",
2819
2819
  "is_placeholder": false
@@ -3248,7 +3248,7 @@
3248
3248
  "orig_type": "bool"
3249
3249
  }
3250
3250
  ],
3251
- "description": "Deploy or upgrade the Ellf Helm chart.\n\n Creates the namespace, image pull secret, cluster keypair secret,\n then runs helm upgrade --install with the provided values.\n ",
3251
+ "description": "Deploy or upgrade the Ellf Helm chart.\n\nCreates the namespace, image pull secret, cluster keypair secret,\nthen runs helm upgrade --install with the provided values.\n",
3252
3252
  "allow_extra": false,
3253
3253
  "parent": "infra",
3254
3254
  "is_placeholder": false
@@ -3492,7 +3492,7 @@
3492
3492
  "orig_type": "str"
3493
3493
  }
3494
3494
  ],
3495
- "description": "Install cluster infrastructure prerequisites (Traefik, cert-manager).\n\n These operations are idempotent and safe to re-run.\n ",
3495
+ "description": "Install cluster infrastructure prerequisites (Traefik, cert-manager).\n\nThese operations are idempotent and safe to re-run.\n",
3496
3496
  "allow_extra": false,
3497
3497
  "parent": "infra",
3498
3498
  "is_placeholder": false
@@ -3775,7 +3775,7 @@
3775
3775
  "orig_type": "str"
3776
3776
  }
3777
3777
  ],
3778
- "description": "Manage TLS certificates for local cluster access.\n\n Use --self-signed when you have direct kubectl access to the cluster.\n Use --setup HOST to do everything from your laptop over SSH.\n Use --trust HOST to fetch and install an existing CA from a remote cluster.\n ",
3778
+ "description": "Manage TLS certificates for local cluster access.\n\nUse --self-signed when you have direct kubectl access to the cluster.\nUse --setup HOST to do everything from your laptop over SSH.\nUse --trust HOST to fetch and install an existing CA from a remote cluster.\n",
3779
3779
  "allow_extra": false,
3780
3780
  "parent": "infra",
3781
3781
  "is_placeholder": false
@@ -3799,7 +3799,7 @@
3799
3799
  "orig_type": "str"
3800
3800
  }
3801
3801
  ],
3802
- "description": "\n Run a job directly on the cluster from a YAML spec file, bypassing PAM.\n ",
3802
+ "description": "\nRun a job directly on the cluster from a YAML spec file, bypassing PAM.\n",
3803
3803
  "allow_extra": false,
3804
3804
  "parent": "jobs",
3805
3805
  "is_placeholder": false
@@ -4547,9 +4547,9 @@
4547
4547
  "id": "select",
4548
4548
  "option": "--select",
4549
4549
  "short": null,
4550
- "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'description', 'default_job_name_template']",
4551
- "default": "['id', 'name']",
4552
- "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'description', 'default_job_name_template'] (list[str])",
4550
+ "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'slug', 'description', 'default_job_name_template']",
4551
+ "default": "['slug', 'name']",
4552
+ "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'slug', 'description', 'default_job_name_template'] (list[str])",
4553
4553
  "action": null,
4554
4554
  "choices": null,
4555
4555
  "has_converter": true,
@@ -4608,9 +4608,9 @@
4608
4608
  "id": "select",
4609
4609
  "option": "--select",
4610
4610
  "short": null,
4611
- "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'description', 'default_job_name_template']",
4611
+ "orig_help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'slug', 'description', 'default_job_name_template']",
4612
4612
  "default": null,
4613
- "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'description', 'default_job_name_template'] (list[str])",
4613
+ "help": "Comma-separated fields to select and show in output. Available: ['id', 'created', 'updated', 'org_id', 'name', 'slug', 'description', 'default_job_name_template'] (list[str])",
4614
4614
  "action": null,
4615
4615
  "choices": null,
4616
4616
  "has_converter": true,
@@ -4877,7 +4877,7 @@
4877
4877
  "orig_type": "str"
4878
4878
  }
4879
4879
  ],
4880
- "description": "\n Upload and advertise a recipes package from your Python environment.\n ",
4880
+ "description": "\nUpload and advertise a recipes package from your Python environment.\n",
4881
4881
  "allow_extra": false,
4882
4882
  "parent": "publish",
4883
4883
  "is_placeholder": false
@@ -4990,7 +4990,7 @@
4990
4990
  "orig_type": "bool"
4991
4991
  }
4992
4992
  ],
4993
- "description": "\n Transfer data to the cluster, and advertise it to Ellf.\n\n These steps can also be done separately. See `ellf files` to transfer\n data to the cluster without creating an Asset record for it, and\n `ellf assets create` to create an Asset without transfer.\n ",
4993
+ "description": "\nTransfer data to the cluster, and advertise it to Ellf.\n\nThese steps can also be done separately. See `ellf files` to transfer\ndata to the cluster without creating an Asset record for it, and\n`ellf assets create` to create an Asset without transfer.\n",
4994
4994
  "allow_extra": false,
4995
4995
  "parent": "publish",
4996
4996
  "is_placeholder": false
@@ -5663,7 +5663,7 @@
5663
5663
  "orig_type": "List[str]"
5664
5664
  }
5665
5665
  ],
5666
- "description": "\n Create a new task. The available task recipes are fetched from your\n cluster and are added as dynamic subcommands. You can see more details\n and available arguments by calling the subcommand with --help, e.g. create\n [name] --help\n ",
5666
+ "description": "\nCreate a new task. The available task recipes are fetched from your\ncluster and are added as dynamic subcommands. You can see more details\nand available arguments by calling the subcommand with --help, e.g. create\n[name] --help\n",
5667
5667
  "allow_extra": true,
5668
5668
  "parent": "tasks",
5669
5669
  "is_placeholder": false
@@ -5698,7 +5698,7 @@
5698
5698
  "orig_type": "bool"
5699
5699
  }
5700
5700
  ],
5701
- "description": "\n List the tasks on the cluster. By default, this includes their ID, name\n and current state, e.g. created or completed\n ",
5701
+ "description": "\nList the tasks on the cluster. By default, this includes their ID, name\nand current state, e.g. created or completed\n",
5702
5702
  "allow_extra": false,
5703
5703
  "parent": "tasks",
5704
5704
  "is_placeholder": false
@@ -6129,7 +6129,7 @@
6129
6129
  "orig_type": "bool"
6130
6130
  }
6131
6131
  ],
6132
- "description": "Fetch a batch of questions from a running annotation task.\n\n Mirrors the web app: asks the broker for a Prodigy login token, then talks\n to the task pod directly via its public task_url. Note that requesting a\n batch reserves those questions for this CLI's session \u2014 they will not be\n handed to other annotators until they are answered or another session\n runs out of work and steals them.\n ",
6132
+ "description": "Fetch a batch of questions from a running annotation task.\n\nMirrors the web app: asks the broker for a Prodigy login token, then talks\nto the task pod directly via its public task_url. Note that requesting a\nbatch reserves those questions for this CLI's session \u2014 they will not be\nhanded to other annotators until they are answered or another session\nruns out of work and steals them.\n",
6133
6133
  "allow_extra": false,
6134
6134
  "parent": "tasks",
6135
6135
  "is_placeholder": false
@@ -75,19 +75,29 @@ If follow-up action is needed, route to `/ellf-ops` or `/ellf-handoff`.
75
75
 
76
76
  ### Annotation tasks
77
77
 
78
- Use cluster calls such as:
78
+ Use cluster calls for job status and per-dataset counts; use PAM for dataset
79
+ discovery:
79
80
  ```text
80
81
  mcp__cluster__cluster_request(method="GET", path="/api/v1/jobs/{id}/status")
81
- mcp__cluster__cluster_request(method="GET", path="/api/v1/datasets/example-count", query={"dataset": "<name>"})
82
+ mcp__pam__dataset_list(cluster_id="<id>") # discover datasets (org-wide, registered with PAM)
83
+ mcp__cluster__dataset_example_count(name="<name>") # total examples in the dataset (per-cluster, via broker)
84
+ mcp__cluster__dataset_session_counts(name="<name>") # per-annotator breakdown (keys are session_ids; null = bulk import)
82
85
  ```
83
86
 
87
+ `dataset_list` is a PAM read (org-wide registry), while the count tools talk to
88
+ the broker because example counts live in the per-cluster Prodigy database.
89
+ All three are read-only and do not require user confirmation. They do not
90
+ read annotation contents — only counts and metadata.
91
+
84
92
  Read when needed:
85
93
  - `${CLAUDE_SKILL_DIR}/references/annotation_metrics.md`
86
94
 
87
95
  Report:
88
96
  - task state
89
97
  - whether the task appears reachable and healthy
90
- - annotation count
98
+ - annotation count (from `dataset_example_count`)
99
+ - per-annotator activity (from `dataset_session_counts`) when the user asks
100
+ who annotated what or about active annotators
91
101
  - dataset growth
92
102
  - whether agent assignment appears to be producing data if applicable
93
103
 
@@ -4,10 +4,13 @@ Use this reference to interpret annotation activity and quality signals.
4
4
 
5
5
  ## What to watch
6
6
 
7
- - Total annotation count
8
- - Dataset growth over time
9
- - Number of active annotators or agents
10
- - Whether a running task is producing new examples
7
+ - Total annotation count — from `mcp__cluster__dataset_example_count`
8
+ - Dataset growth over time — compare counts across checks
9
+ - Number of active annotators or agents — from `mcp__cluster__dataset_session_counts`
10
+ (each non-null key is a session_id; `null` means examples written directly via
11
+ `db-in` rather than through an annotation session)
12
+ - Whether a running task is producing new examples — combine job status with
13
+ example count over time
11
14
 
12
15
  ## Warning signals
13
16
 
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import time
4
4
  from collections.abc import Callable, Iterable
5
- from typing import Literal, TypeVar, Union
5
+ from typing import Any, Literal, TypeVar, Union, cast
6
6
  from uuid import UUID
7
7
 
8
8
  import httpx
@@ -384,9 +384,8 @@ def _resolve_id(
384
384
  name_or_id: str | UUID,
385
385
  params: dict[str, str | UUID | None],
386
386
  ) -> UUID:
387
- """Resolve reference to a Ellf Entity by name or ID.
388
- If an ID is given, return it. If it's a name,
389
- look up the ID.
387
+ """Resolve reference to a Ellf Entity by UUID, slug, or name.
388
+ If an ID is given, return it. Otherwise try slug then name.
390
389
  """
391
390
  if isinstance(name_or_id, UUID):
392
391
  return name_or_id
@@ -397,12 +396,11 @@ def _resolve_id(
397
396
  auth = get_auth_state()
398
397
  model_client = getattr(auth.client, model_name)
399
398
  NotFound = get_not_found_error(model_name)
400
- try:
401
- res = model_client.read(name=name_or_id, **params)
402
- return res.id
403
- except NotFound:
399
+ res = _read_by_slug_or_name(model_client, str(name_or_id), params, NotFound)
400
+ if res is None:
404
401
  err = Messages.E038.format(noun=model_name, name_or_id=name_or_id)
405
402
  raise CLIError(err, params)
403
+ return cast(UUID, res.id) # type: ignore[attr-defined]
406
404
 
407
405
 
408
406
  def _resolve_object(
@@ -410,9 +408,13 @@ def _resolve_object(
410
408
  name_or_id: str | UUID,
411
409
  params: dict[str, str | UUID | None],
412
410
  ) -> BaseModel:
413
- """Resolve reference to a Ellf Entity by name or ID.
414
- If an ID is given, use it for an id query, otherwise, query by
415
- the entity name
411
+ """Resolve reference to a Ellf Entity by UUID, slug, or name.
412
+
413
+ UUIDs are detected by parsing. Otherwise we try the input as a slug
414
+ first (globally unique), then fall back to name (scoped). The slug
415
+ branch is silently skipped for SDK clients that don't yet expose
416
+ a slug field on their Reading model — older deployments stay
417
+ name-resolvable.
416
418
  """
417
419
  auth = get_auth_state()
418
420
  model_client = getattr(auth.client, model_name)
@@ -432,14 +434,37 @@ def _resolve_object(
432
434
  err = Messages.E038.format(noun=model_name, name_or_id=name_or_id)
433
435
  raise CLIError(err, params)
434
436
  else:
435
- try:
436
- res = model_client.read(name=name_or_id, **params)
437
- except NotFound:
437
+ res = _read_by_slug_or_name(model_client, str(name_or_id), params, NotFound)
438
+ if res is None:
438
439
  err = Messages.E038.format(noun=model_name, name_or_id=name_or_id)
439
440
  raise CLIError(err, params)
440
441
  return res
441
442
 
442
443
 
444
+ def _read_by_slug_or_name(
445
+ model_client: Any,
446
+ value: str,
447
+ params: dict[str, str | UUID | None],
448
+ not_found_exc: type[BaseException],
449
+ ) -> BaseModel | None:
450
+ """Try slug lookup first, then name. Return None if neither matches.
451
+
452
+ Slug lookup is only attempted when the SDK's Reading schema for this
453
+ resource declares a ``slug`` field; without it the request would fail
454
+ schema validation client-side before ever leaving the process.
455
+ """
456
+ reading_cls = getattr(model_client, "Reading", None)
457
+ if reading_cls is not None and "slug" in getattr(reading_cls, "model_fields", {}):
458
+ try:
459
+ return model_client.read(slug=value, **params)
460
+ except not_found_exc:
461
+ pass
462
+ try:
463
+ return model_client.read(name=value, **params)
464
+ except not_found_exc:
465
+ return None
466
+
467
+
443
468
  def _resolve_latest_object(
444
469
  model_name: str,
445
470
  name_or_id: str | UUID,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 4.0.96
3
+ Version: 4.0.100
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes