ellf-cli 21.0.5__tar.gz → 21.0.7__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.
- {ellf_cli-21.0.5/ellf_cli.egg-info → ellf_cli-21.0.7}/PKG-INFO +2 -2
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/auth.py +14 -8
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf.json +1 -1
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md +22 -3
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.coding.md +60 -12
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.coding.md +24 -2
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.coding.md +2 -1
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.coding.md +1 -1
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/references.coding/data_infra_cli.md +7 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md +27 -1
- ellf_cli-21.0.7/ellf_cli/ellf_skills/skills/ellf-project/references/jev.coding.md +66 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md +2 -1
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/pypi_auth.py +10 -10
- ellf_cli-21.0.7/ellf_cli/version/21.0.5_2026-10-21-09-28-47_patch_fabd5cfe-2d04-4215-abf1-58fba226acb7 +3 -0
- ellf_cli-21.0.7/ellf_cli/version/21.0.6_2026-10-22-16-07-37_patch_d2bb27d7-6304-4c99-abbc-46d3dd7e363b +3 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7/ellf_cli.egg-info}/PKG-INFO +2 -2
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/SOURCES.txt +3 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/requires.txt +1 -1
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_auth.py +19 -2
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/LICENSE +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/MANIFEST.in +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/README.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/__main__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/about.json +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/about.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/agents.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/appdirs.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cli.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cloud/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cloud/gcp.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cluster_config.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_cluster_select.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_org_select.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_project_scope.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_recipe_file.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_recipe_subcommand.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_state.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_usage.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/actions.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/agents.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/assets.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/auth.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/clusters.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/config.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/datasets.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/cp.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/ls.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/rm.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/rsync.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/stats.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/general.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/import_export.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/_config_io.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/_helpers.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/configure.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/deploy.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/hibernate.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/init.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/init_values.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/pause.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/provision.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/register.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/setup.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/start.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/terraform.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/tls.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/jobs.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/mcp.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/packages.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/paths.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/plans.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/projects.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/publish_code.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/publish_data.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/recipes.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/secrets.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/services.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/sessions.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/support.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/tasks.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/todos.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/users.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/config.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/.gitignore +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/render.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_prodigy_recipes.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/scripts.coding/check_training.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_service_recipe.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/config_advanced.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/config_architectures.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/config_training.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/diagnostics.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/evaluation_guide.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/experiment_patterns.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/model_selection.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/training_paradigms.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/training_troubleshooting.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.assistant.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.coding.md +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/scripts.coding/ellf_logger.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/errors.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/helm.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/interactivity.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/key_pair.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/main.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/mcp_proxy.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/messages.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/query.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/testing/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ty.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ui.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/url.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/util.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.114_2026-08-19-08-36-57__1a4e37c1-471e-4a81-b4d5-1ffe7dec3a61 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.114_2026-08-19-09-25-21_patch_33ff1e26-0e5e-46d8-8052-ab1d032e8b6c +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.115_2026-08-19-09-27-13_patch_4ac728c3-0342-4a36-adbc-e28d2d99b1ba +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.116_2026-08-19-09-30-47_patch_c706fef6-6813-4183-b268-12e7b00d7d0b +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.117_2026-08-19-09-39-14_patch_c6b0495f-2f88-4aa8-9ebf-0a235b4c407e +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.118_2026-08-19-09-52-00_patch_b395655a-8d78-4344-9266-6901c20f6517 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.119_2026-08-19-10-22-38_patch_8f95c49d-aedc-41b8-816d-ccb95f048831 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.120_2026-08-19-10-26-58_patch_7fbf35e6-cc01-4b75-8c9a-f5d054bcaf93 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.121_2026-08-19-10-42-02_patch_31a81b02-a886-4dea-84e0-67cc6ca412d5 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.122_2026-08-19-11-16-49_patch_1c4d7307-48d4-493e-936d-80af799d644b +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.123_2026-08-19-11-47-32_patch_d3d78d04-9989-45b1-91b1-93b571d8814a +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.124_2026-08-20-08-03-17_patch_57f4c389-2d19-41ce-aca4-13b61c62f387 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.125_2026-08-20-08-25-05_patch_7f368148-0d1c-4525-bbdf-c6d257ad861a +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.126_2026-08-20-14-51-36_patch_a99abcc8-3371-4c63-a759-bb7ea5b32432 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.127_2026-08-21-05-48-58_patch_34b4ccee-7596-4f57-93e9-774973cca58e +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.128_2026-08-21-10-47-20_patch_693112b9-927c-4a8f-8553-b06eef86079d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.129_2026-08-21-11-16-54_patch_7a981666-01d9-4d1b-9ba3-2129744e3bd5 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.130_2026-08-21-13-09-36_patch_b7ad1a76-ce70-4d70-9d1a-7c414eba5bb4 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.131_2026-08-21-14-31-10_patch_9128ef66-193e-4caf-8710-afd86128e638 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.132_2026-08-24-08-59-34_patch_c600fc14-86a5-460f-9c4e-f0177056f756 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.133_2026-08-24-10-28-29_patch_b6ce3e32-9d7b-48ac-981a-270c22c180dd +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.134_2026-08-24-11-00-51_patch_a4fc0484-4a64-46a2-94f8-aa805254c7b0 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.135_2026-08-24-12-12-41_patch_a870a56f-9a65-49eb-92da-f572b26667d8 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.136_2026-08-24-12-42-46_patch_9b399356-6482-4291-8da7-e748a99c4b53 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.137_2026-08-24-12-53-57_patch_f7979348-1910-40cd-a535-90299eca84ee +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.138_2026-08-24-14-36-30_patch_ed0f8750-f663-498b-85e7-0d3f2213fcfe +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.139_2026-08-25-08-37-26_patch_3ba87e19-902b-4f76-b64c-90e5c0ca1fc6 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.140_2026-08-25-09-52-45_patch_abc830f2-df15-4385-b797-cdaf72c10752 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.141_2026-08-25-11-37-20_patch_1d9ec01e-06f6-4c8e-b095-af17d5b62b00 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.142_2026-08-26-07-38-49_patch_3dd23e36-e7df-494c-986f-a412861a8d40 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.143_2026-08-26-09-32-32_patch_7b7ebd34-de27-4b73-98a7-3e1501e16cd5 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.144_2026-08-26-10-56-43_patch_166064f2-2208-4c9b-9e25-25dc4cd32084 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.145_2026-08-26-11-37-29_patch_b997f3ee-d7d3-4408-9f2f-c8b6d08bdb3b +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.146_2026-08-26-12-15-20_patch_afbbb893-25db-468c-81db-2663ca373068 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.147_2026-08-26-14-10-50_patch_fd753b1f-2fa1-4ddb-a9e7-de690da85254 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.148_2026-08-27-09-08-35_patch_23814c0b-7f77-489c-b4a8-ceadd18146e3 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.149_2026-08-27-09-40-17_patch_8879d72e-a3d8-4abc-a16a-d9dcf75f0fa1 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.150_2026-08-27-10-57-25_patch_afbe60ed-3e23-4d88-be3c-f800d7002a7d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.151_2026-08-28-09-02-46_patch_1d4ca23b-aeae-4ea8-96b1-8cf57371f29d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.152_2026-08-28-15-37-24_patch_c9d0bdc1-a7e1-432b-92b9-92dc76fe0c78 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.153_2026-08-29-09-03-27_patch_7531573a-1b33-4092-aa9c-0e65f47b201f +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.154_2026-08-29-11-56-35_patch_919f5787-39c8-4dc1-ae6a-f27c28380f21 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.155_2026-08-29-15-15-59_patch_822f9ed8-c366-4e5f-9791-dee8467cf3ce +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.156_2026-08-29-16-19-01_patch_3ac2bf36-20f7-4c9f-9fdb-295d4466d59e +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.157_2026-08-30-17-32-17_patch_4302354c-c9c5-4be7-acd3-542872a748d8 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.158_2026-08-31-09-28-33_patch_3523774f-c25d-4102-8c1a-92fff046a48d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.159_2026-08-31-10-31-01_patch_fe3e6290-2553-4154-a0a0-8b8a418280ed +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.160_2026-08-31-11-23-39_patch_e701a085-3d23-4212-b0af-73b1d419a4c1 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.161_2026-08-31-12-41-01_patch_074d7bde-c493-44db-bc15-e81fd91e2921 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.162_2026-08-31-13-58-06_patch_84db1d60-4280-433b-bd3a-22e5611cd315 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.163_2026-08-31-15-25-54_patch_1931c5ba-73df-48cb-8dcb-555ace0af267 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.163_2026-08-31-15-44-37_patch_3962e805-2a92-494a-a87b-b6e6d66c40a0 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.165_2026-08-31-19-48-59_patch_86e5b923-2b99-4b86-b542-469b197614be +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.166_2026-09-01-07-39-57_patch_c344892f-d542-4e7b-8f27-02365a411e15 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.167_2026-09-01-08-21-53_patch_e199d419-282a-4dbb-8756-cf98b7037e2b +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.168_2026-09-01-09-12-31_patch_235c9fe0-da15-431d-bb56-01e2b9b15f4b +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.169_2026-09-01-11-54-19_patch_98b617ab-d130-42b5-93f2-19cae56d4c4c +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.170_2026-09-02-09-27-28_patch_e448d2e6-b7ec-4235-96bf-0173b3623c87 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.171_2026-09-02-12-52-44_patch_e6a241c2-1d62-482c-a9eb-9e3373395c50 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.172_2026-09-04-08-47-04_patch_daae079f-c104-4fcd-bb57-7bff68e80ad9 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.173_2026-09-04-12-34-42_patch_399c4cbd-0c28-4dfd-a4ec-e569420a36e4 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.174_2026-09-04-13-08-48_patch_f5cfe3d5-808e-45e4-bafc-00d0554838ee +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.175_2026-09-04-17-20-46_patch_1ef542fa-5d8e-4d90-aa15-9fc4cea3dfec +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.176_2026-09-05-08-25-05_patch_ced5521f-f9da-4640-a921-95fcb5cd2e6d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.177_2026-09-05-09-00-16_patch_803c1ad4-a9af-4953-92c5-d882dec03ea2 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.178_2026-09-05-09-30-34_patch_012f6259-2e3f-4591-9806-1920fd06cb1f +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.179_2026-09-05-09-33-43_patch_f4bdf28c-d584-47a5-b699-8c883330162c +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.180_2026-09-05-12-02-21_patch_34a14b01-d22d-44a8-ac63-be0370a61422 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.181_2026-09-05-12-47-46_patch_56b18867-99f6-4d5c-8215-7b9d60d34010 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.182_2026-09-05-13-35-18_patch_61b7d4d1-73c8-4603-9b0c-593e7405587f +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.183_2026-09-06-07-27-09_patch_d76331b2-e3a3-4c0b-8412-ecd131b6ac02 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.184_2026-09-06-10-21-47_patch_7680b7a1-49f0-4eef-b12e-4c854407448c +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.185_2026-09-06-10-30-40_patch_e56c2183-77f8-44ef-a92e-7377ea6ce8c1 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.186_2026-09-07-10-00-51_patch_67de5683-d208-4bc0-8fb6-7677377908e7 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.187_2026-09-07-10-18-13_patch_2086cee2-276b-48f7-80ce-6a17397b9541 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.188_2026-09-07-12-51-28_patch_d6590822-068f-4a19-814d-34bbf204ba6e +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.189_2026-09-07-12-55-23_patch_7e0fb04b-4d40-4490-974f-c74ba2ae55a1 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.190_2026-09-08-08-58-03_patch_15e3ac1e-4475-4272-bdd8-d00bb0db8f17 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.191_2026-09-08-09-55-58_patch_3d350e50-ee53-4282-bc75-d2251142c46e +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.192_2026-09-08-11-12-21_patch_0733223b-1ae2-4b5b-897f-dfc57574ff83 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.193_2026-09-08-21-48-17_patch_8d07d4e6-3555-4720-85c9-9452570fae2d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.194_2026-09-09-07-53-43_patch_69559429-aa42-4b62-9bd7-cdfded1c00d0 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.195_2026-09-09-09-55-40_patch_bbf67f1d-3b9a-43a2-b1bc-22df3fed8a34 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.196_2026-09-09-09-59-47_patch_70d76812-7b3c-4192-ad49-fcaccc29b0da +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.197_2026-09-09-13-06-06_patch_d455be0b-5421-492a-b952-fab0fd8110f8 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.198_2026-09-09-13-14-34_patch_267f54e5-311e-435e-882f-8e19191325ea +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.199_2026-09-09-22-24-18_patch_81e3e453-ca0e-42fa-9c21-8f94d43c05f2 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.200_2026-09-10-07-19-50_patch_911714fa-1fa3-4165-bfe6-d10c650bf5bf +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.201_2026-09-10-10-14-19_patch_864015f2-b0b0-4563-a1c8-155629cb9126 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.202_2026-09-10-11-00-05_patch_18270ecf-e770-4e69-8bcf-e5143c39929b +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.203_2026-09-10-11-10-41_patch_ff273ab1-44f3-4bc0-b184-3396e943df04 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.204_2026-09-10-13-02-02_patch_d4ee41e2-d13c-4941-8605-3f1a42b56b22 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.205_2026-09-10-13-57-50_patch_284df67e-5957-4b0c-bc64-5581db6ddecc +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf93c9d0869 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.10_2026-09-14-16-09-38_patch_9403d562-eed0-4125-a8b3-09cd92a13298 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.11_2026-09-15-09-05-57_patch_8b22dba2-d931-4c4d-ae60-db3238d5e73d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.12_2026-09-15-11-18-52_patch_81314afa-e70d-4ad8-b45b-3f8d62b983e7 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.13_2026-09-16-08-00-55_patch_bfa30fc0-3281-4de6-bb56-d7290c98d1c3 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.14_2026-09-16-14-38-26_patch_aae6e9b0-88f4-4bcf-b611-3308c7fcd6eb +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.15_2026-09-17-07-58-54_patch_43d40582-effd-4925-a8bd-e70fecf1faab +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.16_2026-09-17-08-12-37_patch_b4db2d23-88f1-45c1-82d9-78d38014fcb6 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.17_2026-09-18-09-38-19_patch_25697fc3-e9a8-4980-962b-e6cb0a4760c5 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.18_2026-09-18-09-54-33_patch_d37d9c71-c469-4d94-90d7-4898915ee991 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.19_2026-09-18-10-47-33_patch_47607b3c-d1b6-4864-b9b0-00a2a8d2ac32 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.20_2026-09-18-11-07-21_patch_5a336f91-63a6-4877-97ed-da89395cc8f5 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.21_2026-09-18-13-34-52_patch_c56462e1-63d9-498f-a912-c80c5f0171d1 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.22_2026-09-20-08-10-45_patch_6afa2c20-bcef-4b7d-8685-2c9815d8683f +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.23_2026-09-20-08-38-35_patch_a7f169e5-37ab-4ec0-bf89-d14770181303 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.24_2026-09-20-15-49-27_patch_c1222081-ff44-4f20-aea2-5840b6d76efd +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.25_2026-09-21-06-11-40_patch_6df46dd9-e7d3-4e71-bec4-e5c93b4ac863 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.26_2026-09-21-07-54-11_patch_cc52dd36-5eba-4094-a1b0-d6f79f103441 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.27_2026-09-21-08-36-49_patch_a25fa125-9bcd-4317-8da5-851c1c329631 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.28_2026-09-21-09-44-01_patch_4430a721-0b3c-4f6a-b9bc-a53e667161bb +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.29_2026-09-21-10-58-07_patch_83b2b942-60a4-4bef-afd1-99690ba52b69 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.30_2026-09-21-12-51-16_patch_519b9a65-d400-4234-b113-36b46e315507 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.31_2026-09-22-06-53-35_patch_5c45a235-81b6-4d05-801a-07dc7db61400 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.32_2026-09-22-07-42-04_patch_f12c6415-8166-4063-9e5d-26601b929d63 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.33_2026-09-22-08-12-32_patch_cec31bb0-a6cb-43e6-8407-25aba322b54c +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.34_2026-09-23-07-09-16_patch_659fccbb-c0a0-4f6f-bc87-e6abaa8815a7 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.35_2026-09-23-09-38-52_patch_023f904d-807a-4833-8a40-570365e8ec06 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.36_2026-09-23-10-05-33_patch_846fb491-2b1b-47ed-ac1f-ba40e744e199 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.37_2026-09-23-13-08-30_patch_8e4b1d24-156e-4ffe-8e4a-b8740ec18588 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.38_2026-09-24-06-41-37_patch_67adb1d6-3f49-4357-a67f-b1d48f23a972 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.39_2026-09-24-15-24-32_patch_e5dd375d-5643-4514-9b65-8d877c4a2bb2 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.40_2026-09-24-19-58-14_patch_ff18824b-be51-4a3d-a621-e96279e53c3e +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.41_2026-09-26-09-24-52_patch_b9979267-30f9-440a-a4ce-c611991d4886 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.42_2026-09-28-12-39-34_patch_dda535d9-8922-4eb9-ab51-6ecff0650c10 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.43_2026-09-28-13-35-27_minor_aca1168a-1286-4326-9d0c-2f2587c9fe92 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.5_2026-09-13-14-11-18_patch_9b111116-5e62-472a-b72c-d1bbafa22c97 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.5_2026-09-13-17-01-11_patch_d4bf61c0-83ac-4dd3-b512-a65805d298c8 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.6_2026-09-14-11-31-04_patch_fd2ebda6-22cb-4e7d-9452-2f6f2640e828 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.7_2026-09-13-17-06-08_patch_428af161-0b27-43c2-8751-e5f7874df120 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.9_2026-09-14-12-37-42_patch_b2ca0529-4b67-4fa4-8fdc-5f5e9f5d5166 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.1.0_2026-09-28-14-27-54_patch_324444f7-d24e-4189-b21f-1188894a3109 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.1.1_2026-09-28-21-03-07_major_e266a14a-7d96-4ece-92a3-8f34e64438a5 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.0_2026-09-29-11-05-31_patch_77d6f9f8-ead3-4d79-a4b2-b084b2dffc98 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.10_2026-10-02-12-56-52_patch_14e97576-73ca-44b8-82c9-7dad6f1789ab +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.11_2026-10-04-10-31-19_patch_088eb371-1799-4949-a119-286cf1cd55d1 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.12_2026-10-06-18-00-25_patch_36554bed-49c5-41cb-9fd4-48cc6af74c09 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.13_2026-10-07-12-24-08_patch_a540a364-3a0d-4960-b278-06ba2c7cc258 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.14_2026-10-07-12-52-39_patch_e3a6fc5c-2ee4-414c-a2dd-4910a655a7dd +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.15_2026-10-09-04-15-56_patch_bd7a9b06-867b-4fea-9678-973a05e3022d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.16_2026-10-09-16-11-56_patch_a1135435-7dea-4f00-8c98-203ba3974382 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.17_2026-10-09-17-44-55_patch_faeacad8-541a-40f2-ab9c-abcd66fcd00e +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.18_2026-10-10-07-29-38_major_02601a1e-9bdb-45bf-ad67-a07b7dcd0002 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.1_2026-09-29-11-59-38_patch_bbf4753c-d641-4c2f-ac7c-02be6bd8e7c2 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.2_2026-09-29-12-44-07_patch_19fdaa94-60dc-464b-93b8-c17607ebc7b6 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.3_2026-09-29-14-16-00_patch_3cb60272-95cf-4311-8897-721e1b5c2c88 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.4_2026-09-29-16-24-53_patch_9fe8ad2b-e3ec-4558-a5fc-9c44c5c266dc +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.5_2026-09-29-17-13-16_patch_e48d2dd2-f41a-402e-a441-756b23c01dcb +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.6_2026-09-29-17-22-11_patch_3b1c79e9-9002-4e96-ba78-10668c33be6a +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.7_2026-09-30-07-50-58_patch_e8b1f046-d819-499c-9cd5-3e1a20fc9acf +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.8_2026-10-01-13-41-44_patch_7d63af18-e0af-4127-ab58-aede2407490f +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.9_2026-10-01-15-57-35_patch_143863cb-8f63-4ef7-bd78-c1114fc93a2d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.0_2026-10-10-09-36-17_patch_d2618f39-cdc9-4d3a-ba40-1a0ad6265f3b +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.1_2026-10-11-10-24-33_patch_e29a8713-eecb-4eb1-9641-789d3cfab21a +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.2_2026-10-12-07-22-24_patch_f4053ad1-8fcd-4591-a68d-bf1e23485ba7 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de90d3ea8 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.4_2026-10-14-16-20-24_patch_c6672844-8227-4e0a-9fb5-36af7e7141dc +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.5_2026-10-15-08-53-28_patch_10154146-8afd-4632-b250-9b4b9f5bf67c +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.6_2026-10-15-14-17-40_patch_df3a5d3c-f0e0-46cb-aeaf-15b51c8a0f13 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.7_2026-10-16-07-09-40_major_3e5dfba3-2810-47b4-85a9-938bfff72a04 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.0_2026-10-16-10-44-29_patch_1058e453-613f-492b-a3c7-f3ca2abe8c2d +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.1_2026-10-16-16-06-10_patch_e20b4ad2-b87f-478e-b4f4-323c8bcc5ea9 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.2_2026-10-19-13-54-31_patch_bf091df4-00bb-43c8-9117-51047944e305 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.3_2026-10-19-14-58-29_patch_9b985381-1b1d-4531-b242-b02cea2484c5 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.4_2026-10-20-17-08-51_patch_38d02583-cb5c-4adc-b5d7-614b483acf19 +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/__init__.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/read_version.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/dependency_links.txt +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/entry_points.txt +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/not-zip-safe +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/top_level.txt +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/pyproject.toml +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/setup.cfg +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/setup.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_agents.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_agents_info_stats.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_appdirs.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_clusters_info_stats.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_config.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_datasets_export.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_errors.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_files_cp.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_files_cp_helpers.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_helm.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_import_export.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_info.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_config_io.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_configure.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_deploy_node_labels.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_deploy_preflight.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_destroy.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_get_terraform.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_hibernate.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_init.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_pause.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_provision.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_start_fixes.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_start_validation.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_state_bucket.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_terraform_init.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_invalid_secrets.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_job_list_project_filter.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_jobs_info_hides_creator.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_jobs_list_unmatched.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_key_pair.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_login.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_logout.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_main.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_mcp_proxy.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_org_select.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_plans.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_projects.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_projects_delete_confirm.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_build_poll.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_data.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_import_root.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_requirements.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_versions.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_pypi_auth.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_query.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_recipe_file.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_recipe_required_args.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_recipes.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_sessions.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_state.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_support.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_todos.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_ty.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_ui.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_ui_extras.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_usage_counts.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_users_assign.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_users_info_stats.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_users_list.py +0 -0
- {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_util.py +0 -0
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ellf-cli
|
|
3
|
-
Version: 21.0.
|
|
3
|
+
Version: 21.0.7
|
|
4
4
|
Summary: Ellf Command Line Interface
|
|
5
5
|
Home-page: https://prodi.gy
|
|
6
6
|
Author: ExplosionAI GmbH
|
|
7
7
|
Author-email: contact@explosion.ai
|
|
8
8
|
License: All rights reserved
|
|
9
9
|
License-File: LICENSE
|
|
10
|
+
Requires-Dist: certifi>=2026.10.19
|
|
10
11
|
Requires-Dist: cryptography>=35.0.0
|
|
11
12
|
Requires-Dist: ellf-broker-sdk
|
|
12
13
|
Requires-Dist: ellf-pam-sdk
|
|
13
14
|
Requires-Dist: email-validator
|
|
14
15
|
Requires-Dist: httpx
|
|
15
|
-
Requires-Dist: httpx
|
|
16
16
|
Requires-Dist: keyring>=24.0.0
|
|
17
17
|
Requires-Dist: packaging
|
|
18
18
|
Requires-Dist: pkginfo>=1.7
|
|
@@ -673,14 +673,20 @@ class AuthStateImpl:
|
|
|
673
673
|
last_check = 0.0
|
|
674
674
|
while time.monotonic() < deadline:
|
|
675
675
|
if time.monotonic() > (last_check + int(interval)):
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
676
|
+
try:
|
|
677
|
+
token_response = httpx.post(
|
|
678
|
+
token_url,
|
|
679
|
+
json={
|
|
680
|
+
"grant_type": OIDC_DEVICE_GRANT_TYPE,
|
|
681
|
+
"device_code": device_code,
|
|
682
|
+
},
|
|
683
|
+
timeout=AUTH_REQUEST_TIMEOUT_SECONDS,
|
|
684
|
+
)
|
|
685
|
+
except httpx.TransportError:
|
|
686
|
+
logger.debug("Device token poll failed; retrying", exc_info=True)
|
|
687
|
+
last_check = time.monotonic()
|
|
688
|
+
time.sleep(1)
|
|
689
|
+
continue
|
|
684
690
|
last_check = time.monotonic()
|
|
685
691
|
token_data = self._safe_json(token_response, token_url)
|
|
686
692
|
if token_response.status_code == 200:
|
{ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ellf-annotate
|
|
3
|
-
description: "Set up and launch annotation from the coding environment once the methodology, schema, and data are ready. Use when the user wants to start annotation on the Ellf cluster, run a local Prodigy annotation server, choose between built-in Ellf and built-in Prodigy recipes, verify that annotation is ready to launch, preview the annotation setup, or determine whether a new custom recipe is needed. Also trigger on \"I want to annotate\", \"start a local Prodigy server\", \"launch annotation on the cluster\", \"which recipe should I use\", \"can I run this locally\", \"set up review\", or \"help me run annotation\". This skill is the annotation readiness gatekeeper: it applies the audit checklist before launch, prefers built-in workflows when possible, and delegates to `/ellf-prodigy` when a new custom recipe must be implemented."
|
|
3
|
+
description: "Set up and launch annotation from the coding environment once the methodology, schema, and data are ready. Use when the user wants to start annotation on the Ellf cluster, run a local Prodigy annotation server, choose between built-in Ellf and built-in Prodigy recipes, verify that annotation is ready to launch, preview the annotation setup, or determine whether a new custom recipe is needed. Also trigger on \"I want to annotate\", \"start a local Prodigy server\", \"launch annotation on the cluster\", \"which recipe should I use\", \"can I run this locally\", \"set up review\", \"settle disagreements\", \"make the annotation UI easier to use\", or \"help me run annotation\". This skill is the annotation readiness gatekeeper: it applies the audit checklist before launch, prefers built-in workflows when possible, and delegates to `/ellf-prodigy` when a new custom recipe must be implemented."
|
|
4
4
|
argument-hint: "[describe what you want to annotate]"
|
|
5
5
|
allowed-tools: Bash(ellf info defaults:*), Bash(echo:*)
|
|
6
6
|
---
|
|
@@ -24,6 +24,7 @@ You are responsible for:
|
|
|
24
24
|
- deciding whether an existing custom recipe is sufficient
|
|
25
25
|
- deciding when a new custom recipe is required
|
|
26
26
|
- determining where the user wants annotation to run
|
|
27
|
+
- making the interface work for annotators: checking it with the real data and suggesting layout fixes before anyone labels
|
|
27
28
|
- launching the annotation process
|
|
28
29
|
- verifying that it actually starts and is reachable
|
|
29
30
|
|
|
@@ -43,6 +44,7 @@ Do not launch until you have confirmed:
|
|
|
43
44
|
- the recipe choice actually matches the task
|
|
44
45
|
- the input data is ready
|
|
45
46
|
- the output dataset or storage target is clear
|
|
47
|
+
- annotators can read the longest examples and reach every option (see "Annotator experience" below)
|
|
46
48
|
|
|
47
49
|
If the audit fails:
|
|
48
50
|
- route methodological problems to `/ellf-project`
|
|
@@ -64,7 +66,13 @@ Use the bundled references as the default selection catalog:
|
|
|
64
66
|
Key selection rules:
|
|
65
67
|
- prefer `.correct` when the user has existing model or LLM predictions to correct; prefer `.manual` when starting from scratch
|
|
66
68
|
- prefer `.teach` for active learning when labels are a good fit for binary annotation
|
|
67
|
-
-
|
|
69
|
+
- use `review` to settle disagreements between annotators or datasets (see "Settling disagreements" below), not as a substitute for `.correct`
|
|
70
|
+
|
|
71
|
+
### Settling disagreements
|
|
72
|
+
|
|
73
|
+
When two annotators, or two passes, labelled the same examples and the user needs one answer per example, that is what `review` is for. Give it the datasets to compare: it groups each example's answers, shows each annotator's answer, and saves the settled one to its own dataset. With auto-accept on, the examples everyone agreed on are saved without being shown, so the reviewer only sees the conflicts. Check `ellf tasks create review --help` for the exact args. It only reads structured datasets and takes no annotation instructions, so write the settling rule in the plan and tell the reviewer.
|
|
74
|
+
|
|
75
|
+
A plain labelling task over the disputed examples, with no earlier answers shown, is something else: a third blind answer, not a settlement. It avoids anchoring on the earlier answers, but the reviewer can't see what the disagreement was. If the user wants that, say what it costs and let them choose; default to `review`.
|
|
68
76
|
|
|
69
77
|
### Existing custom recipe
|
|
70
78
|
|
|
@@ -119,6 +127,15 @@ ellf-dev run <recipe> [args]
|
|
|
119
127
|
|
|
120
128
|
For trusted built-in recipes, skip local validation. For custom recipes or anything recently changed, run at least the form preview before cluster launch.
|
|
121
129
|
|
|
130
|
+
## Annotator experience
|
|
131
|
+
|
|
132
|
+
People label faster and more consistently when the interface fits the data. Don't wait for the user to say the layout is awkward: check it yourself before launch and suggest fixes.
|
|
133
|
+
|
|
134
|
+
- Look at it with real data, the longest examples included. For a built-in recipe on the cluster, create the first task, open its annotation URL and look (take a screenshot if you can), or ask the user to open it and say what's awkward. For a custom recipe, use `ellf-dev run`.
|
|
135
|
+
- Go through "Annotator experience" in `${SKILL_DIR}/references/annotation_audit.md` and propose concrete changes: CSS through the task's Prodigy config (`global_css`), flagging (`show_flag`), keyboard shortcuts, a different interface, or splitting the question.
|
|
136
|
+
- A task's settings can't be changed after it's created, so agree the layout on the first task before creating the rest. Keep the agreed Prodigy config in one file in the project and pass it to every task over the same kind of data, rather than retyping it.
|
|
137
|
+
- When a task restates rules that already exist (guidelines, a label scheme), copy the wording or link to it. Shortened or paraphrased rules change the answers people give.
|
|
138
|
+
|
|
122
139
|
## Launch
|
|
123
140
|
|
|
124
141
|
### 1. Confirm unresolved values
|
|
@@ -153,6 +170,8 @@ or `prodigy <recipe> ...` if that is the working command in the environment.
|
|
|
153
170
|
|
|
154
171
|
**Other environment:** clarify the execution model before proceeding.
|
|
155
172
|
|
|
173
|
+
If this kind of task will be created again (each round, batch or week), put the steps in a script in the project: building the input, publishing it, creating the task with the shared config, assigning annotators. Run it from there and name it in the plan, so the next round doesn't depend on commands someone has to rewrite.
|
|
174
|
+
|
|
156
175
|
## Verification after launch
|
|
157
176
|
|
|
158
177
|
A launch is not complete until you verify that the annotation process is usable.
|
|
@@ -196,7 +215,7 @@ When you finish:
|
|
|
196
215
|
|
|
197
216
|
| File | What it covers | When to read |
|
|
198
217
|
|------|---------------|--------------|
|
|
199
|
-
| `${SKILL_DIR}/references/annotation_audit.md` | Readiness checklist: objective, schema, recipe fit, data, dataset | Before every launch |
|
|
218
|
+
| `${SKILL_DIR}/references/annotation_audit.md` | Readiness checklist: objective, schema, recipe fit, settling disagreements, annotator experience, data, dataset | Before every launch |
|
|
200
219
|
| `${SKILL_DIR}/references/builtin_ellf_annotation_recipes.md` | Built-in Ellf task and agent recipes with supported workflows | Recipe selection for cluster |
|
|
201
220
|
| `${SKILL_DIR}/references/builtin_prodigy_recipes.md` | Built-in standalone Prodigy recipes | Recipe selection for local |
|
|
202
221
|
| `${SKILL_DIR}/references/label_schemes.md` | Label scheme (`labels` asset) format, design and use by tasks and agents. Built-in `ner`, `spans` and `textcat` only | Labels need definitions, building them from annotated data, or writing guidelines |
|
|
@@ -29,12 +29,17 @@ over time, it's business logic — factor it out.
|
|
|
29
29
|
|
|
30
30
|
### Label set size
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
drops, inter-annotator agreement falls, and the
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
For spans and entities, more than 6-8 labels per pass creates cognitive
|
|
33
|
+
overload. Annotator consistency drops, inter-annotator agreement falls, and the
|
|
34
|
+
model receives noisier signal. Recommend multi-pass (labels-first iteration):
|
|
35
|
+
each pass focuses on 1-3 related labels, and model predictions pre-annotate
|
|
36
|
+
the later passes.
|
|
37
|
+
|
|
38
|
+
Picking one category per text is easier: annotators compare whole options
|
|
39
|
+
rather than scanning the text for spans. A longer list can work in one pass if
|
|
40
|
+
every label has a description and all the options fit on screen. Watch the
|
|
41
|
+
pilot's flags and agreement: if they show confusion between labels, group them
|
|
42
|
+
or split the question.
|
|
38
43
|
|
|
39
44
|
### Label definitions
|
|
40
45
|
|
|
@@ -61,11 +66,14 @@ rules, it should be.
|
|
|
61
66
|
| Red flag | What to do |
|
|
62
67
|
|---|---|
|
|
63
68
|
| Labels encode business logic | Escalate to ellf-project |
|
|
64
|
-
| > 8 labels in one pass | Recommend multi-pass, or escalate if labels need redesign |
|
|
69
|
+
| > 8 span or entity labels in one pass | Recommend multi-pass, or escalate if labels need redesign |
|
|
65
70
|
| Composite labels (COMPENSATED_EXECUTIVE) | Factor into components (PERSON + COMPENSATION + rules) |
|
|
66
71
|
| Labels require external knowledge | Factor out — model learns language patterns only |
|
|
67
72
|
| Annotation mirrors output schema | Redesign — annotation schema ≠ output schema |
|
|
68
73
|
| Labels without definitions, or definitions only in someone's head | Write a label scheme before launch |
|
|
74
|
+
| Task instructions paraphrase existing guidelines | Copy the wording or link to it |
|
|
75
|
+
| Disagreements settled in a new blind labelling task | Use `review`, or tell the user it's a third blind answer |
|
|
76
|
+
| Long texts or many options left in the default layout | Check the interface with real data and fix it before launch |
|
|
69
77
|
|
|
70
78
|
---
|
|
71
79
|
|
|
@@ -95,14 +103,20 @@ the situation is non-standard or the user needs deeper discussion.
|
|
|
95
103
|
### Single vs multi-pass
|
|
96
104
|
|
|
97
105
|
- **≤ 5 labels**: single pass is fine
|
|
98
|
-
- **6-8 labels**: consider multi-pass, recommend if annotators report difficulty
|
|
99
|
-
- **> 8 labels**: multi-pass required (labels-first iteration)
|
|
106
|
+
- **6-8 span or entity labels**: consider multi-pass, recommend if annotators report difficulty
|
|
107
|
+
- **> 8 span or entity labels**: multi-pass required (labels-first iteration)
|
|
108
|
+
- **One category per text**: see "Label set size" above
|
|
100
109
|
|
|
101
110
|
### Quality control
|
|
102
111
|
|
|
103
|
-
- **Always**:
|
|
112
|
+
- **Always**: let the interface enforce schema constraints (e.g. exclusive
|
|
113
|
+
choice for one label per text); a custom recipe can add a `validate_answer`
|
|
114
|
+
callback for the rest
|
|
115
|
+
- **Pilots and reference sets**: flagging on, so annotators can mark the
|
|
116
|
+
examples they hesitated on
|
|
104
117
|
- **Recommended**: gold-standard examples for onboarding new annotators
|
|
105
|
-
- **For teams**: review
|
|
118
|
+
- **For teams**: settle disagreements with `review` (see "Settling
|
|
119
|
+
disagreements" in the skill)
|
|
106
120
|
|
|
107
121
|
---
|
|
108
122
|
|
|
@@ -118,12 +132,46 @@ These catch cases where a different recipe would be significantly more efficient
|
|
|
118
132
|
| User picks `spans.manual` but has a trained spans model | Suggest `spans.correct` |
|
|
119
133
|
| Large dataset, no model assistance | Suggest active learning recipe (`.teach` variants) |
|
|
120
134
|
| Complex UI needs (custom blocks, multiple views) | Delegate to ellf-prodigy for custom recipe |
|
|
135
|
+
| Two annotators' datasets need one answer per example | `review` over both datasets, with auto-accept so only conflicts are shown |
|
|
136
|
+
| Disputed examples put in a new `textcat` or `ner` task to settle | `review`, unless the user wants a blind third answer |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Annotator experience
|
|
141
|
+
|
|
142
|
+
Check the interface with real data before launch, the longest examples
|
|
143
|
+
included, and propose a fix for anything that fails:
|
|
144
|
+
|
|
145
|
+
- **Text is readable.** Long texts are left-aligned at a normal reading size
|
|
146
|
+
and scroll inside the card if needed, rather than pushing the options or
|
|
147
|
+
buttons off screen. Prose shouldn't be centred, the default for short texts.
|
|
148
|
+
- **Every option is visible without scrolling.** Many options can go in a
|
|
149
|
+
grid. Keyboard shortcuts work.
|
|
150
|
+
- **Labels explain themselves.** With a label scheme, annotators see each
|
|
151
|
+
label's description when they hover it (built-in `ner`, `spans`, `textcat`).
|
|
152
|
+
- **Annotators can say they're unsure.** Flagging is on for pilots and
|
|
153
|
+
reference sets. When one click submits, the flag has to come first: say so
|
|
154
|
+
in the instructions.
|
|
155
|
+
- **Submitting is deliberate.** Submitting on a single click saves time per
|
|
156
|
+
example, but there's no second look; make sure annotators know.
|
|
157
|
+
- **An example can be discussed.** An ID or source shows in the meta, so
|
|
158
|
+
annotators and the user can point to one.
|
|
159
|
+
- **Instructions are short and on the task** (H key), and repeat existing
|
|
160
|
+
rules word for word.
|
|
161
|
+
- **Nothing shown that shouldn't be.** Hide model suggestions and other
|
|
162
|
+
annotators' answers when the labels are a reference or a blind check; show
|
|
163
|
+
them when correcting is the point.
|
|
164
|
+
|
|
165
|
+
Most fixes go in the task's Prodigy config: CSS in `global_css`, `show_flag`,
|
|
166
|
+
keyboard settings. Agree the layout with the user on the first task, keep the
|
|
167
|
+
config in one file in the project, and reuse it for every task over the same
|
|
168
|
+
kind of data.
|
|
121
169
|
|
|
122
170
|
---
|
|
123
171
|
|
|
124
172
|
## Escalation Triggers
|
|
125
173
|
|
|
126
|
-
Escalate to **ellf-project** (
|
|
174
|
+
Escalate to **ellf-project** (`/ellf-project`) when:
|
|
127
175
|
|
|
128
176
|
- Labels encode business logic and need redesign
|
|
129
177
|
- Task decomposition is needed (complex task → simpler sub-tasks)
|
|
@@ -159,11 +159,33 @@ that fit the task type. Their label settings add:
|
|
|
159
159
|
`hf_model_agent` runs a fine-tuned model and uses neither instructions nor label
|
|
160
160
|
definitions.
|
|
161
161
|
|
|
162
|
+
## Jev: confident answers by machine, the rest by people
|
|
163
|
+
|
|
164
|
+
If the cluster lists the `textcat_jev` action, it labels an input asset for text
|
|
165
|
+
classification with TypeSafe's Jev and saves only the answers at or above
|
|
166
|
+
`--min-confidence` (default 0.9). It's an action, not an agent: it runs once over the
|
|
167
|
+
input rather than taking tasks from a queue. Pair it with a `textcat` task over the same
|
|
168
|
+
input and labels that has the Jev dataset in `--settings.exclude`: annotators then only
|
|
169
|
+
see the texts Jev was unsure about.
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
ellf actions create textcat_jev --input <asset> --label-scheme <labels_asset> \
|
|
173
|
+
--labels-exclusive --instructions "<what the labels are for>" \
|
|
174
|
+
--output <jev_dataset> --api-key <secret>
|
|
175
|
+
ellf tasks create textcat --input <asset> --label-scheme <labels_asset> \
|
|
176
|
+
--labels-exclusive --settings.exclude <jev_dataset> ...
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
It needs a TypeSafe API key as an Ellf secret, and sends the texts to TypeSafe. Before
|
|
180
|
+
trusting its threshold, evaluate it on a human-labelled set with `--min-confidence 0`:
|
|
181
|
+
`${SKILL_DIR}/../ellf-project/references/jev.md`.
|
|
182
|
+
|
|
162
183
|
## Selection rules
|
|
163
184
|
|
|
164
185
|
- Prefer a built-in task recipe whenever it fits without bending the schema.
|
|
165
|
-
- Use `review`
|
|
166
|
-
|
|
186
|
+
- Use `review` to settle disagreements or review existing annotations across
|
|
187
|
+
annotators or datasets, rather than to create annotations from scratch or to
|
|
188
|
+
correct a model's suggestions.
|
|
167
189
|
- If the user needs a custom interface, multi-view workflow, unusual routing,
|
|
168
190
|
or annotation logic the built-ins cannot express cleanly, delegate to
|
|
169
191
|
`ellf-prodigy`.
|
|
@@ -117,7 +117,8 @@ The export is structured JSONL, one row per answer: the text is in `input.text`,
|
|
|
117
117
|
the annotation in `user_anns` (`user_anns.spans` for spans, `user_anns.label` for
|
|
118
118
|
text classification, `user_anns.accept` for choice; a key missing there comes from
|
|
119
119
|
`server_anns`, the suggestion as served), the answer in `answer`, and the flag in
|
|
120
|
-
`extras.flagged
|
|
120
|
+
`extras.flagged`, a key that is only present on flagged rows. Who answered and when is in
|
|
121
|
+
`extras._annotator_id`, `extras._session_id` and `extras._timestamp`.
|
|
121
122
|
|
|
122
123
|
Derive the scheme from the exported JSONL:
|
|
123
124
|
- **Labels and order:** the labels used in the data, most frequent first.
|
|
@@ -25,7 +25,7 @@ You execute ready operations. You do not:
|
|
|
25
25
|
- implement new recipe code
|
|
26
26
|
|
|
27
27
|
If the request is not operationally ready:
|
|
28
|
-
- use `/ellf-annotate` for annotation readiness and recipe choice
|
|
28
|
+
- use `/ellf-annotate` for annotation readiness and recipe choice, and before creating a labelling task people will work in (recipe, settling disagreements, interface), unless it repeats one that already passed
|
|
29
29
|
- use `/ellf-train` for training strategy
|
|
30
30
|
- use `/ellf-project` for planning
|
|
31
31
|
- use `/ellf-prodigy` for custom recipe implementation
|
|
@@ -28,6 +28,13 @@ ellf datasets delete "<name>"
|
|
|
28
28
|
ellf datasets export "<name>" --output <path> # exports as JSONL
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
An exported row is structured, not flat Prodigy JSON: the text is in `input.text`, the
|
|
32
|
+
annotation in `user_anns` (`spans`, `label` or `accept`; a missing key falls back to
|
|
33
|
+
`server_anns`), the answer (`accept`, `reject`, `ignore`) in `answer`, and the
|
|
34
|
+
annotator, session and time in `extras._annotator_id`, `extras._session_id` and
|
|
35
|
+
`extras._timestamp`. Flags are in `extras.flagged`, present only when set, so look
|
|
36
|
+
there before reporting that nothing was flagged.
|
|
37
|
+
|
|
31
38
|
## Files
|
|
32
39
|
|
|
33
40
|
Manage files on the cluster's storage bucket directly.
|
{ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md
RENAMED
|
@@ -65,6 +65,8 @@ For long-lived sub-topics, prefer creating a separate named plan over appending
|
|
|
65
65
|
|
|
66
66
|
If no plan exists yet, create one as soon as the problem statement is clear.
|
|
67
67
|
|
|
68
|
+
**Script what will run again.** When a step will be repeated (every round, batch or week), write it as a script in the project's `scripts/`, run it from there, and name it in the plan. One-off lookups can stay inline. A routine in the plan should point to scripts, not to commands someone has to rewrite.
|
|
69
|
+
|
|
68
70
|
### Linking to Ellf concepts
|
|
69
71
|
|
|
70
72
|
Project plans are rendered as Markdown, and references to real Ellf concepts — tasks, actions, agents, assets, datasets, recipes, packages, and other plans — display as **inline concept links**: chips with the concept's icon (and a live status indicator for jobs) that link straight to the concept's page in the app. Use them wherever the plan names a concept that already exists, so the plan stays a navigable map of the project rather than a flat document.
|
|
@@ -179,7 +181,9 @@ Read this additional reference when relevant:
|
|
|
179
181
|
- `${SKILL_DIR}/references/annotation_agents.md`
|
|
180
182
|
Use when the user has limited annotation capacity, wants LLM-assisted annotation, or is considering agent-heavy data development.
|
|
181
183
|
- `${SKILL_DIR}/references/label_schemes.md`
|
|
182
|
-
Use when designing labels, turning an agreed label set into a `labels` asset, building a scheme from annotated data or a pilot, or planning guidelines for labels that already exist.
|
|
184
|
+
Use when designing labels, turning an agreed label set into a `labels` asset, building a scheme from annotated data or a pilot, reviewing what a pilot's labels and flags say about the scheme, or planning guidelines for labels that already exist. It also describes what an exported dataset row looks like.
|
|
185
|
+
- `${SKILL_DIR}/references/jev.md`
|
|
186
|
+
Use when the user mentions Jev or TypeSafe, or the cluster lists `textcat_jev` and the job is text classification: what the action does, when it fits, and what's specific to evaluating it.
|
|
183
187
|
|
|
184
188
|
These references are your strategic foundation. Apply them naturally. Do not cite them as documents unless the user explicitly asks.
|
|
185
189
|
|
|
@@ -214,6 +218,8 @@ Use Explosion knowledge base (KB) via the `query_knowledge_base` tool when you n
|
|
|
214
218
|
Use KB results to ground your advice. When you find a relevant case study or best practice, weave it naturally into your recommendation.
|
|
215
219
|
Never dump raw KB output.
|
|
216
220
|
|
|
221
|
+
When the user names a model, vendor or tool you don't recognise, check `ellf recipes list` before saying you don't know it: Ellf may integrate it as a built-in recipe. Read the recipe's description and arguments (`ellf actions create <recipe> --help`, or `tasks` / `agents` for those kinds) and advise from that.
|
|
222
|
+
|
|
217
223
|
## Plan lifecycle
|
|
218
224
|
|
|
219
225
|
### Starting a plan
|
|
@@ -330,6 +336,13 @@ If something relevant surfaces, mention it briefly — it builds credibility and
|
|
|
330
336
|
calibrates the conversation: "This is similar to a skills extraction project
|
|
331
337
|
where the key was to separate entity recognition from taxonomy mapping."
|
|
332
338
|
|
|
339
|
+
**Weigh other framings before recommending one.** The way the user phrased the
|
|
340
|
+
problem is one framing among several. Lay out two or three, and for each say
|
|
341
|
+
which business outcome it would move and what it would need (labels, data,
|
|
342
|
+
people). If the data argues for a different framing, say so. Then pick one, say
|
|
343
|
+
why, and record the rejected ones
|
|
344
|
+
in the decision log. Keep this short; it's a paragraph, not a survey.
|
|
345
|
+
|
|
333
346
|
**Form a rough pipeline shape early.** Sketch which parts are rule-based, which
|
|
334
347
|
need ML, which might use an LLM. Share this sketch — even if it's wrong, it
|
|
335
348
|
gives the user something concrete to react to. This is more valuable than
|
|
@@ -431,10 +444,23 @@ evaluation. Apply all of it. Don't let a project plan leave this section empty.
|
|
|
431
444
|
**How to run this part of the conversation:**
|
|
432
445
|
|
|
433
446
|
- Make sure every component in the pipeline sketch has an evaluation plan.
|
|
447
|
+
- Name the business outcome the system should move (time saved, cost, errors
|
|
448
|
+
that reach customers) and how it will be measured once it runs. Accuracy on
|
|
449
|
+
the test set is how you choose a system, not how you know it helped.
|
|
434
450
|
- Push for a held-out test set to be set aside before training starts.
|
|
435
451
|
- Insist on a rule-based baseline before evaluating any model.
|
|
436
452
|
- For LLM/generative components: recommend A/B evaluation. Consult the KB for
|
|
437
453
|
Prodigy-specific workflows.
|
|
454
|
+
- For a classifier that answers with a confidence and leaves the texts it's
|
|
455
|
+
unsure about to people (a spaCy `textcat` model's scores, an LLM's
|
|
456
|
+
probabilities, Jev), the threshold is part of the system:
|
|
457
|
+
- run it on the evaluation set with no threshold, so every answer and its
|
|
458
|
+
confidence is kept;
|
|
459
|
+
- choose the threshold from how accuracy and the share of texts it answers
|
|
460
|
+
change across thresholds, against a bar agreed beforehand, not from one
|
|
461
|
+
accuracy number;
|
|
462
|
+
- record the model version, the threshold and the curve it was chosen from
|
|
463
|
+
in the plan, and pin the version if results have to be reproducible.
|
|
438
464
|
|
|
439
465
|
### 7. Plan Deployment
|
|
440
466
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Jev — Validating It on the User's Data
|
|
2
|
+
|
|
3
|
+
## What It Is
|
|
4
|
+
|
|
5
|
+
Jev is TypeSafe's "System One" model. It doesn't generate text: it answers typed
|
|
6
|
+
questions about a text with calibrated probabilities. On Ellf it runs as the built-in
|
|
7
|
+
`textcat_jev` action ("Classify text with Jev"), which labels an input asset for text
|
|
8
|
+
classification and keeps only the answers Jev is confident about. Check that the
|
|
9
|
+
cluster lists it (`ellf recipes list`) before planning around it.
|
|
10
|
+
|
|
11
|
+
What the action does:
|
|
12
|
+
- **Modes** follow the labels: one label is a yes/no question; several exclusive labels
|
|
13
|
+
(`--labels-exclusive`) are one choice question with at most 255 options; several
|
|
14
|
+
non-exclusive labels are one yes/no question per label, asked in the same request.
|
|
15
|
+
- **Label definitions** are sent as the questions' criteria. Pass the labels as a
|
|
16
|
+
`labels` asset (`--label-scheme`) so Jev gets each label's description, look-alikes
|
|
17
|
+
and examples, not just the names. `--instructions` adds context about what the
|
|
18
|
+
labels are for ("Decide whether the review reports a product defect").
|
|
19
|
+
- **Confidence**: each answer comes with a confidence. For non-exclusive labels it's
|
|
20
|
+
the confidence of the label Jev is least sure about. The answer, the confidence and
|
|
21
|
+
every label's probability are saved in the example's `meta.jev`, along with the
|
|
22
|
+
model that answered.
|
|
23
|
+
- **Routing to people**: answers below `--min-confidence` (default 0.9) aren't saved.
|
|
24
|
+
A `textcat` task over the same input and labels with the Jev dataset in
|
|
25
|
+
`--settings.exclude` then shows annotators only the texts Jev was unsure about.
|
|
26
|
+
The action builds its examples like that task does, so the hashes match.
|
|
27
|
+
- **Reruns** skip texts already in the output dataset, so a rerun after a failure
|
|
28
|
+
only asks about the rest.
|
|
29
|
+
- **Privacy**: the texts are sent to TypeSafe's API. Raise this before the user sends
|
|
30
|
+
anything sensitive.
|
|
31
|
+
- **Setup**: a TypeSafe API key stored as an Ellf secret (`--api-key`). A bad key, no
|
|
32
|
+
credits or an unknown model stop the action with the reason.
|
|
33
|
+
|
|
34
|
+
Don't add claims about Jev beyond this — pricing, benchmark numbers, company news.
|
|
35
|
+
If the user asks, say so, and make the case that their own evaluation set answers
|
|
36
|
+
the question that matters.
|
|
37
|
+
|
|
38
|
+
## When It Fits
|
|
39
|
+
|
|
40
|
+
- The job is text classification: routing, triage, tagging, filtering.
|
|
41
|
+
- The user wants a share of texts handled automatically and the rest left to people,
|
|
42
|
+
rather than one model that has to be right about everything.
|
|
43
|
+
- The labels can be defined in words. Jev reads the definitions; it can't learn a
|
|
44
|
+
distinction nobody can write down.
|
|
45
|
+
|
|
46
|
+
It doesn't do span extraction (NER, spans) or generation.
|
|
47
|
+
|
|
48
|
+
## Evaluating It
|
|
49
|
+
|
|
50
|
+
Evaluate it like any classifier that answers with a confidence (see the
|
|
51
|
+
evaluation strategy): a human-labelled set Jev never touches, no threshold on the
|
|
52
|
+
evaluation run, and the threshold chosen from the curve. What's specific to the
|
|
53
|
+
action:
|
|
54
|
+
|
|
55
|
+
- "No threshold" means `--min-confidence 0`, into its own dataset. With the
|
|
56
|
+
default 0.9, the answers Jev was unsure about are never saved. Each answer's
|
|
57
|
+
confidence is in `meta.jev`.
|
|
58
|
+
- Pin `--model` to the name Jev reports in `meta.jev` rather than `jev-latest`.
|
|
59
|
+
- Reruns skip texts already in the output dataset, so a run with different labels,
|
|
60
|
+
definitions or instructions needs a new output dataset.
|
|
61
|
+
|
|
62
|
+
## In the Plan
|
|
63
|
+
|
|
64
|
+
Besides what the evaluation strategy records, note the label scheme and
|
|
65
|
+
instructions Jev was given, and keep Jev's answers in their own dataset, separate
|
|
66
|
+
from the human answers.
|
|
@@ -117,7 +117,8 @@ The export is structured JSONL, one row per answer: the text is in `input.text`,
|
|
|
117
117
|
the annotation in `user_anns` (`user_anns.spans` for spans, `user_anns.label` for
|
|
118
118
|
text classification, `user_anns.accept` for choice; a key missing there comes from
|
|
119
119
|
`server_anns`, the suggestion as served), the answer in `answer`, and the flag in
|
|
120
|
-
`extras.flagged
|
|
120
|
+
`extras.flagged`, a key that is only present on flagged rows. Who answered and when is in
|
|
121
|
+
`extras._annotator_id`, `extras._session_id` and `extras._timestamp`.
|
|
121
122
|
|
|
122
123
|
Derive the scheme from the exported JSONL:
|
|
123
124
|
- **Labels and order:** the labels used in the data, most frequent first.
|
|
@@ -36,6 +36,7 @@ import httpx
|
|
|
36
36
|
import keyring.backend
|
|
37
37
|
import keyring.credentials
|
|
38
38
|
import keyring.errors
|
|
39
|
+
from packaging.version import InvalidVersion, Version
|
|
39
40
|
|
|
40
41
|
from .url import URL
|
|
41
42
|
|
|
@@ -52,9 +53,10 @@ REQUEST_TIMEOUT_SECONDS = 15.0
|
|
|
52
53
|
# so a token that is valid when pip asks doesn't expire mid-download.
|
|
53
54
|
TOKEN_EXPIRY_MARGIN_SECONDS = 60.0
|
|
54
55
|
|
|
55
|
-
# pip only understands `keyring-provider` in pip.conf from 23.1 on
|
|
56
|
-
#
|
|
57
|
-
|
|
56
|
+
# pip only understands `keyring-provider` in pip.conf from 23.1 on, and
|
|
57
|
+
# pips before 26.2.2 vendor a certifi that trusts the compromised eMudhra
|
|
58
|
+
# intermediates, so the index token they send could be intercepted.
|
|
59
|
+
MIN_PIP_VERSION = Version("26.2.2")
|
|
58
60
|
|
|
59
61
|
|
|
60
62
|
def _request_credentials(pam_url: URL, api_token: str) -> httpx.Response:
|
|
@@ -271,15 +273,13 @@ def check_venv_supports_keyring(venv_dir: Path) -> Optional[str]:
|
|
|
271
273
|
"load the ellf keyring backend — install ellf-cli into it and "
|
|
272
274
|
"re-run 'ellf login'"
|
|
273
275
|
)
|
|
274
|
-
pip_version = res.stdout.strip().split(".")
|
|
275
276
|
try:
|
|
276
|
-
|
|
277
|
-
except
|
|
277
|
+
pip_version = Version(res.stdout.strip())
|
|
278
|
+
except InvalidVersion:
|
|
278
279
|
return f"could not parse pip version {res.stdout.strip()!r}"
|
|
279
|
-
if
|
|
280
|
-
needed = ".".join(str(p) for p in MIN_PIP_VERSION)
|
|
280
|
+
if pip_version < MIN_PIP_VERSION:
|
|
281
281
|
return (
|
|
282
|
-
f"pip {
|
|
283
|
-
f"upgrade to pip>={
|
|
282
|
+
f"pip {pip_version} is too old for keyring auth; "
|
|
283
|
+
f"upgrade to pip>={MIN_PIP_VERSION} in the virtualenv"
|
|
284
284
|
)
|
|
285
285
|
return None
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ellf-cli
|
|
3
|
-
Version: 21.0.
|
|
3
|
+
Version: 21.0.7
|
|
4
4
|
Summary: Ellf Command Line Interface
|
|
5
5
|
Home-page: https://prodi.gy
|
|
6
6
|
Author: ExplosionAI GmbH
|
|
7
7
|
Author-email: contact@explosion.ai
|
|
8
8
|
License: All rights reserved
|
|
9
9
|
License-File: LICENSE
|
|
10
|
+
Requires-Dist: certifi>=2026.10.19
|
|
10
11
|
Requires-Dist: cryptography>=35.0.0
|
|
11
12
|
Requires-Dist: ellf-broker-sdk
|
|
12
13
|
Requires-Dist: ellf-pam-sdk
|
|
13
14
|
Requires-Dist: email-validator
|
|
14
15
|
Requires-Dist: httpx
|
|
15
|
-
Requires-Dist: httpx
|
|
16
16
|
Requires-Dist: keyring>=24.0.0
|
|
17
17
|
Requires-Dist: packaging
|
|
18
18
|
Requires-Dist: pkginfo>=1.7
|
|
@@ -139,6 +139,7 @@ ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md
|
|
|
139
139
|
ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md
|
|
140
140
|
ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md
|
|
141
141
|
ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md
|
|
142
|
+
ellf_cli/ellf_skills/skills/ellf-project/references/jev.coding.md
|
|
142
143
|
ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md
|
|
143
144
|
ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md
|
|
144
145
|
ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md
|
|
@@ -342,6 +343,8 @@ ellf_cli/version/21.0.1_2026-10-16-16-06-10_patch_e20b4ad2-b87f-478e-b4f4-323c8b
|
|
|
342
343
|
ellf_cli/version/21.0.2_2026-10-19-13-54-31_patch_bf091df4-00bb-43c8-9117-51047944e305
|
|
343
344
|
ellf_cli/version/21.0.3_2026-10-19-14-58-29_patch_9b985381-1b1d-4531-b242-b02cea2484c5
|
|
344
345
|
ellf_cli/version/21.0.4_2026-10-20-17-08-51_patch_38d02583-cb5c-4adc-b5d7-614b483acf19
|
|
346
|
+
ellf_cli/version/21.0.5_2026-10-21-09-28-47_patch_fabd5cfe-2d04-4215-abf1-58fba226acb7
|
|
347
|
+
ellf_cli/version/21.0.6_2026-10-22-16-07-37_patch_d2bb27d7-6304-4c99-abbc-46d3dd7e363b
|
|
345
348
|
ellf_cli/version/__init__.py
|
|
346
349
|
ellf_cli/version/read_version.py
|
|
347
350
|
tests/test_agents.py
|
|
@@ -134,7 +134,13 @@ class TestPamHostResolution:
|
|
|
134
134
|
class TestDeviceLogin:
|
|
135
135
|
"""Polling for the browser's approval in ``ellf login``."""
|
|
136
136
|
|
|
137
|
-
def _run(
|
|
137
|
+
def _run(
|
|
138
|
+
self,
|
|
139
|
+
monkeypatch,
|
|
140
|
+
polls: Sequence[tuple[int, dict] | Exception],
|
|
141
|
+
*,
|
|
142
|
+
expires_in=600,
|
|
143
|
+
):
|
|
138
144
|
import httpx
|
|
139
145
|
|
|
140
146
|
from ellf_cli import auth as auth_module
|
|
@@ -156,7 +162,10 @@ class TestDeviceLogin:
|
|
|
156
162
|
"expires_in": expires_in,
|
|
157
163
|
}
|
|
158
164
|
return httpx.Response(200, json=body)
|
|
159
|
-
|
|
165
|
+
poll = next(responses)
|
|
166
|
+
if isinstance(poll, Exception):
|
|
167
|
+
raise poll
|
|
168
|
+
status, body = poll
|
|
160
169
|
return httpx.Response(status, json=body)
|
|
161
170
|
|
|
162
171
|
def fake_sleep(seconds):
|
|
@@ -205,3 +214,11 @@ class TestDeviceLogin:
|
|
|
205
214
|
approved = (200, {"id_token": "id"})
|
|
206
215
|
tokens, _, _ = self._run(monkeypatch, [flaky, approved])
|
|
207
216
|
assert tokens == ("id", None)
|
|
217
|
+
|
|
218
|
+
def test_keeps_polling_through_network_errors(self, monkeypatch):
|
|
219
|
+
import httpx
|
|
220
|
+
|
|
221
|
+
dropped = httpx.ReadTimeout("The read operation timed out")
|
|
222
|
+
approved = (200, {"id_token": "id"})
|
|
223
|
+
tokens, _, _ = self._run(monkeypatch, [dropped, approved])
|
|
224
|
+
assert tokens == ("id", None)
|
|
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
|