data-designer-engine 0.8.0__tar.gz → 0.9.0__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.
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/PKG-INFO +3 -3
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/pyproject.toml +1 -1
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/async_scheduler.py +161 -19
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/dataset_builder.py +23 -9
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/completion.py +23 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/queue.py +8 -20
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/task_policies.py +5 -5
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/anthropic_translation.py +11 -1
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/errors.py +10 -1
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/facade.py +33 -2
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/telemetry.py +15 -8
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/utils.py +54 -1
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/readiness.py +6 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_completion.py +17 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_queue.py +16 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_task_admission.py +17 -10
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_task_policies.py +1 -1
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_async_scheduler.py +319 -3
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_dataset_builder.py +40 -4
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_anthropic_translation.py +16 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_facade.py +241 -2
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_model_errors.py +52 -0
- data_designer_engine-0.9.0/tests/engine/models/test_model_utils.py +142 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_telemetry.py +9 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_readiness.py +18 -0
- data_designer_engine-0.8.0/tests/engine/models/test_model_utils.py +0 -51
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/.gitignore +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/README.md +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/column_profilers/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/column_profilers/judge_score_profiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/column_profilers/registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/column_statistics.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/dataset_profiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/utils/column_statistics_calculations.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/utils/judge_score_processing.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/capacity.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/custom.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/embedding.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/expression.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/image.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/llm_completion.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/samplers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/seed_dataset.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/validation.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/utils/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/utils/generator_classification.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/utils/judge_score_factory.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/utils/prompt_renderer.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/compiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/configurable_task.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/context.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/multi_column_configs.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/row_group_plan.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/resolver.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/resources.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/task_admission.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/task_model.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/async_concurrency.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/concurrency.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/config_compiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/execution_graph.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/processor_runner.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/row_group_buffer.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/skip_evaluator.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/skip_tracker.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/facade.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/factory.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/io.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/model_provider.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/anthropic.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/http_helpers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/http_model_client.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/openai_compatible.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/factory.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/model_request_executor.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/parsing.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/retry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/types.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/factory.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/parser.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/postprocessors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/tag_parsers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/types.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/recipes/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/recipes/response_recipes.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/config.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/controller.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/limits.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/outcomes.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/pressure.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/queue.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/resolver.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/resources.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/resources.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/usage.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/usage_events.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/observability.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/ast.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/environment.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/exceptions.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/record.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/exceptions.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/schema_transformers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/types.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/validators.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/drop_columns.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/schema_transform.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/reporter.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/terminal/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/terminal/throughput_panel.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/tracker.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/registry/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/registry/data_designer_registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/registry/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/atif.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/claude_code.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/codex.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/hermes_agent.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/pi_coding_agent.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/types.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/managed_dataset_generator.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/person_reader.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/resource_provider.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/seed_reader.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/column.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/constraints.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/data_sources/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/data_sources/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/data_sources/sources.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.parquet +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/dataset_based_person_fields.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/email_address_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/national_id_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/person.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/phone_number.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/generator.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/jinja_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/people_gen.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/person_constants.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/schema.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/schema_builder.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/secret_resolver.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/storage/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/storage/artifact_storage.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/storage/media_storage.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/fixtures.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/observability.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/seed_readers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/stubs.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/utils/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/utils/token_counting.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validation.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/local_callable.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/python.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/remote.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/sql.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/column_profilers/test_base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/column_profilers/test_judge_score_profiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_column_statistics_calculator.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_data/artifacts/dataset/column_configs.json +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_data/artifacts/dataset/dataset.json +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_data/artifacts/dataset/metadata.json +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_dataset_profiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/utils/test_column_statistics_calculations.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/utils/test_judge_score_processing.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_async_generators.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_column_generator_base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_custom.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_embedding.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_expression.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_image.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_llm_completion_generators.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_samplers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_seed_dataset.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_validation.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/test_registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_column_generator_errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_generator_classification.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_judge_score_factory.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_prompt_renderer.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_resolver.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_resources.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_task_model.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_async_builder_integration.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_multi_column_configs.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_concurrency.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_config_compiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_execution_graph.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_row_group_buffer.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_skip_evaluator.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_skip_tracker.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_topological_sort.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_facade.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_factory.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_io.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_anthropic.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_client_errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_factory.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_model_request_executor.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_native_http_clients.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_openai_compatible.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_parsing.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_retry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_types.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_parser.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_parsers_types.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_postprocessors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_tag_parsers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/recipes/test_recipe_base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/recipes/test_response_recipes.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/request_admission/test_controller.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/stub_secrets.json +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_model_registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_usage.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_ast.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_environment.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_exceptions.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_record.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_exceptions.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_schema_transformers.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_types.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_validators.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/test_drop_columns.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/test_registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/test_schema_transform.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/test_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/progress/terminal/test_throughput_panel.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/progress/test_tracker.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/test_base.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/test_data_designer_registry.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/test_errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_atif.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_claude_code.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_codex.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_hermes_agent.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_pi_coding_agent.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_managed_dataset_generator.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_person_reader.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_resource_provider.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_seed_reader.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/conftest.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/data_sources/test_sampler_errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/data_sources/test_sources.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_email_address_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_national_id_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_person.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_phone_number.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_column.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_constraints.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_generator.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_jinja_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_people_gen.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_schema.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/storage/__init__.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/storage/test_artifact_storage.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/storage/test_media_storage.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_capacity.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_compiler.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_configurable_task.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_dataset_metadata.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_engine_errors.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_model_provider.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_observability.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_secret_resolver.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_validation.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/testing/test_plugin_testing_utils.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/utils/test_token_counting.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_local_callable.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_python.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_remote.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_sql.py +0 -0
- {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/test_plugin_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: data-designer-engine
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: Generation engine for DataDesigner synthetic data generation
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -18,7 +18,7 @@ Requires-Dist: anyascii<1,>=0.3.3
|
|
|
18
18
|
Requires-Dist: asciichartpy<2,>=1.5.25
|
|
19
19
|
Requires-Dist: chardet<6,>=3.0.2
|
|
20
20
|
Requires-Dist: cryptography<=49,>=48.0.1
|
|
21
|
-
Requires-Dist: data-designer-config==0.
|
|
21
|
+
Requires-Dist: data-designer-config==0.9.0
|
|
22
22
|
Requires-Dist: duckdb<2,>=1.5.0
|
|
23
23
|
Requires-Dist: faker<21,>=20.1.0
|
|
24
24
|
Requires-Dist: fsspec<2026,>=2025.3.0
|
|
@@ -31,7 +31,7 @@ Requires-Dist: jsonpath-rust-bindings<2,>=1.0
|
|
|
31
31
|
Requires-Dist: jsonschema<5,>=4.0.0
|
|
32
32
|
Requires-Dist: lxml<7,>=6.1.0
|
|
33
33
|
Requires-Dist: marko<3,>=2.1.2
|
|
34
|
-
Requires-Dist: mcp<2,>=1.
|
|
34
|
+
Requires-Dist: mcp<2,>=1.29.0
|
|
35
35
|
Requires-Dist: networkx<4,>=3.0
|
|
36
36
|
Requires-Dist: numpy<3,>=1.23.5
|
|
37
37
|
Requires-Dist: pandas<3,>=2.3.3
|
|
@@ -68,8 +68,11 @@ from data_designer.engine.models.clients.errors import ProviderError
|
|
|
68
68
|
from data_designer.engine.models.errors import (
|
|
69
69
|
RETRYABLE_MODEL_ERRORS,
|
|
70
70
|
GenerationValidationFailureError,
|
|
71
|
+
ModelAPIConnectionError,
|
|
72
|
+
ModelInternalServerError,
|
|
71
73
|
ModelRateLimitError,
|
|
72
74
|
ModelRequestAdmissionTimeoutError,
|
|
75
|
+
ModelTimeoutError,
|
|
73
76
|
)
|
|
74
77
|
from data_designer.engine.models.request_admission.config import RequestAdmissionConfig
|
|
75
78
|
from data_designer.engine.models.request_admission.resources import RequestResourceKey
|
|
@@ -163,6 +166,13 @@ class _DeferredAdmissionAnalysis:
|
|
|
163
166
|
independent_candidate_columns: tuple[str, ...]
|
|
164
167
|
|
|
165
168
|
|
|
169
|
+
@dataclass
|
|
170
|
+
class _GeneratorCallState:
|
|
171
|
+
"""Whether task execution reached user or provider generation code."""
|
|
172
|
+
|
|
173
|
+
invoked: bool = False
|
|
174
|
+
|
|
175
|
+
|
|
166
176
|
class AsyncTaskScheduler:
|
|
167
177
|
"""Dependency-aware async task scheduler for the dataset builder.
|
|
168
178
|
|
|
@@ -308,6 +318,10 @@ class AsyncTaskScheduler:
|
|
|
308
318
|
self._degraded_warn_window = degraded_warn_window
|
|
309
319
|
self._degraded_warn_interval_s = degraded_warn_interval_s
|
|
310
320
|
self._recent_retryable: deque[bool] = deque(maxlen=degraded_warn_window)
|
|
321
|
+
self._recent_retryable_kinds: deque[str] = deque(maxlen=degraded_warn_window)
|
|
322
|
+
self._retryable_outcome_counts: Counter[str] = Counter()
|
|
323
|
+
self._retryable_detail_counts: Counter[str] = Counter()
|
|
324
|
+
self._logged_retryable_kinds: set[str] = set()
|
|
311
325
|
# Initialize to -inf so the first WARN is always emitted regardless of
|
|
312
326
|
# the monotonic clock's absolute value (which can be near-zero on freshly
|
|
313
327
|
# booted CI runners).
|
|
@@ -432,6 +446,18 @@ class AsyncTaskScheduler:
|
|
|
432
446
|
"""
|
|
433
447
|
return self._first_non_retryable_error
|
|
434
448
|
|
|
449
|
+
@property
|
|
450
|
+
def retryable_outcome_metrics(self) -> dict[str, object]:
|
|
451
|
+
"""Return sanitized rolling and cumulative model-task outcome counts."""
|
|
452
|
+
rolling = Counter(self._recent_retryable_kinds)
|
|
453
|
+
return {
|
|
454
|
+
"window_size": self._degraded_warn_window,
|
|
455
|
+
"rolling_total": len(self._recent_retryable_kinds),
|
|
456
|
+
"rolling_counts": dict(sorted(rolling.items())),
|
|
457
|
+
"cumulative_counts": dict(sorted(self._retryable_outcome_counts.items())),
|
|
458
|
+
"retryable_details": dict(sorted(self._retryable_detail_counts.items())),
|
|
459
|
+
}
|
|
460
|
+
|
|
435
461
|
def request_cancel(self) -> None:
|
|
436
462
|
"""Signal cancellation to scheduler tasks and bridged sync generator work."""
|
|
437
463
|
self._cancel_requested.set()
|
|
@@ -580,6 +606,7 @@ class AsyncTaskScheduler:
|
|
|
580
606
|
"request_pressure_advisory_skips": self._request_pressure_advisory_skips,
|
|
581
607
|
"row_group_admission_blocked_reasons": dict(self._row_group_admission_blocked_reasons),
|
|
582
608
|
"request_pressure": self._request_pressure_diagnostics(),
|
|
609
|
+
"retryable_outcomes": self.retryable_outcome_metrics,
|
|
583
610
|
}
|
|
584
611
|
|
|
585
612
|
def _scheduler_job_diagnostics(self) -> dict[str, object]:
|
|
@@ -1593,7 +1620,7 @@ class AsyncTaskScheduler:
|
|
|
1593
1620
|
completed = [
|
|
1594
1621
|
(rg_id, state.size)
|
|
1595
1622
|
for rg_id, state in self._rg_states.items()
|
|
1596
|
-
if self._tracker.is_row_group_complete(rg_id, state.size, all_columns)
|
|
1623
|
+
if state.in_flight_count == 0 and self._tracker.is_row_group_complete(rg_id, state.size, all_columns)
|
|
1597
1624
|
]
|
|
1598
1625
|
for rg_id, rg_size in completed:
|
|
1599
1626
|
dropped_rows = sum(1 for ri in range(rg_size) if self._tracker.is_dropped(rg_id, ri))
|
|
@@ -1630,6 +1657,7 @@ class AsyncTaskScheduler:
|
|
|
1630
1657
|
self._rg_semaphore.release()
|
|
1631
1658
|
self._row_group_admission_event.set()
|
|
1632
1659
|
if checkpointed:
|
|
1660
|
+
self._tracker.compact_row_group(rg_id)
|
|
1633
1661
|
self._emit_scheduler_event(
|
|
1634
1662
|
"row_group_checkpointed",
|
|
1635
1663
|
diagnostics={
|
|
@@ -1778,7 +1806,44 @@ class AsyncTaskScheduler:
|
|
|
1778
1806
|
if errors / self._shutdown_error_window >= self._shutdown_error_rate:
|
|
1779
1807
|
self._early_shutdown = True
|
|
1780
1808
|
|
|
1781
|
-
|
|
1809
|
+
@staticmethod
|
|
1810
|
+
def _retryable_error_kind(exc: Exception | None) -> str:
|
|
1811
|
+
if isinstance(exc, ModelRequestAdmissionTimeoutError):
|
|
1812
|
+
return "request_admission_timeout"
|
|
1813
|
+
if isinstance(exc, ModelRateLimitError):
|
|
1814
|
+
return "rate_limit"
|
|
1815
|
+
if isinstance(exc, ModelTimeoutError):
|
|
1816
|
+
return "timeout"
|
|
1817
|
+
if isinstance(exc, ModelInternalServerError):
|
|
1818
|
+
return "internal_server"
|
|
1819
|
+
if isinstance(exc, ModelAPIConnectionError):
|
|
1820
|
+
return "connection"
|
|
1821
|
+
return "other_retryable"
|
|
1822
|
+
|
|
1823
|
+
@staticmethod
|
|
1824
|
+
def _provider_error_details(exc: Exception | None) -> tuple[int | None, float | None]:
|
|
1825
|
+
"""Extract only safe transport metadata from a wrapped provider error.
|
|
1826
|
+
|
|
1827
|
+
Model-error normalization raises ``from None`` to hide provider details,
|
|
1828
|
+
but Python retains the originating error in ``__context__``. Walking both
|
|
1829
|
+
chains preserves access to bounded transport metadata without exposing
|
|
1830
|
+
provider messages.
|
|
1831
|
+
"""
|
|
1832
|
+
seen: set[int] = set()
|
|
1833
|
+
current: BaseException | None = exc
|
|
1834
|
+
while current is not None and id(current) not in seen:
|
|
1835
|
+
seen.add(id(current))
|
|
1836
|
+
if isinstance(current, ProviderError):
|
|
1837
|
+
return current.status_code, current.retry_after
|
|
1838
|
+
current = current.__cause__ or current.__context__
|
|
1839
|
+
return None, None
|
|
1840
|
+
|
|
1841
|
+
def _record_retryable_outcome(
|
|
1842
|
+
self,
|
|
1843
|
+
*,
|
|
1844
|
+
retryable: bool,
|
|
1845
|
+
exc: Exception | None = None,
|
|
1846
|
+
) -> None:
|
|
1782
1847
|
"""Track retryable-error rate and emit a rate-limited WARN under provider degradation.
|
|
1783
1848
|
|
|
1784
1849
|
Distinct from ``_check_error_rate``: every LLM-bound task outcome (success
|
|
@@ -1786,11 +1851,38 @@ class AsyncTaskScheduler:
|
|
|
1786
1851
|
health, not just the error mix. The call site filters on ``is_llm`` so
|
|
1787
1852
|
non-LLM tasks (samplers, expressions, non-LLM customs) don't dilute the
|
|
1788
1853
|
rate. Only retryable errors (rate-limit, timeout, 5xx, connection) count
|
|
1789
|
-
toward the rate; non-retryable failures register as 0
|
|
1854
|
+
toward the rate; non-retryable failures register as 0 and are categorized
|
|
1855
|
+
separately from successful outcomes.
|
|
1790
1856
|
"""
|
|
1857
|
+
if retryable:
|
|
1858
|
+
kind = self._retryable_error_kind(exc)
|
|
1859
|
+
elif exc is not None:
|
|
1860
|
+
kind = "non_retryable_failure"
|
|
1861
|
+
else:
|
|
1862
|
+
kind = "success"
|
|
1863
|
+
self._retryable_outcome_counts[kind] += 1
|
|
1864
|
+
if retryable:
|
|
1865
|
+
status_code, retry_after = self._provider_error_details(exc)
|
|
1866
|
+
detail = kind
|
|
1867
|
+
if status_code is not None:
|
|
1868
|
+
detail = f"{detail}:http_{status_code}"
|
|
1869
|
+
self._retryable_detail_counts[detail] += 1
|
|
1870
|
+
if kind not in self._logged_retryable_kinds:
|
|
1871
|
+
# Ongoing pressure is reported by the rate-limited degradation
|
|
1872
|
+
# warning; this first-observation warning is once per scheduler.
|
|
1873
|
+
self._logged_retryable_kinds.add(kind)
|
|
1874
|
+
retry_after_text = f", retry_after={retry_after:g}s" if retry_after is not None else ""
|
|
1875
|
+
status_text = f", http_status={status_code}" if status_code is not None else ""
|
|
1876
|
+
logger.warning(
|
|
1877
|
+
"Observed retryable model-task error: kind=%s%s%s; the row task will be deferred.",
|
|
1878
|
+
kind,
|
|
1879
|
+
status_text,
|
|
1880
|
+
retry_after_text,
|
|
1881
|
+
)
|
|
1791
1882
|
if self._degraded_warn_window <= 0:
|
|
1792
1883
|
return
|
|
1793
1884
|
self._recent_retryable.append(retryable)
|
|
1885
|
+
self._recent_retryable_kinds.append(kind)
|
|
1794
1886
|
if len(self._recent_retryable) < self._degraded_warn_window:
|
|
1795
1887
|
return
|
|
1796
1888
|
rate = sum(self._recent_retryable) / self._degraded_warn_window
|
|
@@ -1801,10 +1893,20 @@ class AsyncTaskScheduler:
|
|
|
1801
1893
|
return
|
|
1802
1894
|
self._last_degraded_warn_at = now
|
|
1803
1895
|
pct = int(round(rate * 100))
|
|
1896
|
+
rolling = Counter(self._recent_retryable_kinds)
|
|
1897
|
+
rolling_summary = ", ".join(f"{key}={rolling[key]}" for key in sorted(rolling))
|
|
1898
|
+
cumulative_summary = ", ".join(
|
|
1899
|
+
f"{key}={self._retryable_outcome_counts[key]}" for key in sorted(self._retryable_outcome_counts)
|
|
1900
|
+
)
|
|
1804
1901
|
logger.warning(
|
|
1805
|
-
|
|
1806
|
-
"
|
|
1807
|
-
"Run may take longer than expected; salvage will retry these."
|
|
1902
|
+
"Provider showing degraded performance: %s%% of last %s task outcomes were "
|
|
1903
|
+
"retryable errors (%s); cumulative outcomes: %s; deferred_tasks=%s. "
|
|
1904
|
+
"Run may take longer than expected; salvage will retry these.",
|
|
1905
|
+
pct,
|
|
1906
|
+
self._degraded_warn_window,
|
|
1907
|
+
rolling_summary,
|
|
1908
|
+
cumulative_summary,
|
|
1909
|
+
len(self._deferred),
|
|
1808
1910
|
)
|
|
1809
1911
|
|
|
1810
1912
|
async def _dispatch_seeds(self, rg_id: int, rg_size: int) -> None:
|
|
@@ -1874,6 +1976,7 @@ class AsyncTaskScheduler:
|
|
|
1874
1976
|
# from the frontier (it was never completed, so it stays in the frontier).
|
|
1875
1977
|
skipped = False
|
|
1876
1978
|
uses_model_stage_resource = "llm_wait" in lease.resources
|
|
1979
|
+
generator_call_state = _GeneratorCallState()
|
|
1877
1980
|
stateful_lock_acquired = False
|
|
1878
1981
|
|
|
1879
1982
|
try:
|
|
@@ -1893,11 +1996,11 @@ class AsyncTaskScheduler:
|
|
|
1893
1996
|
|
|
1894
1997
|
cell_skipped = False
|
|
1895
1998
|
if task.task_type == "from_scratch":
|
|
1896
|
-
await self._run_from_scratch(task, generator)
|
|
1999
|
+
await self._run_from_scratch(task, generator, call_state=generator_call_state)
|
|
1897
2000
|
elif task.task_type == "cell":
|
|
1898
|
-
_result, cell_skipped = await self._run_cell(task, generator)
|
|
2001
|
+
_result, cell_skipped = await self._run_cell(task, generator, call_state=generator_call_state)
|
|
1899
2002
|
elif task.task_type == "batch":
|
|
1900
|
-
await self._run_batch(task, generator)
|
|
2003
|
+
await self._run_batch(task, generator, call_state=generator_call_state)
|
|
1901
2004
|
else:
|
|
1902
2005
|
raise ValueError(f"Unknown task type: {task.task_type}")
|
|
1903
2006
|
|
|
@@ -1915,7 +2018,7 @@ class AsyncTaskScheduler:
|
|
|
1915
2018
|
# window from LLM-bound tasks so a healthy non-model task mix
|
|
1916
2019
|
# (samplers, expressions, non-LLM customs) doesn't dilute the
|
|
1917
2020
|
# rate and silence the WARN under genuine provider stress.
|
|
1918
|
-
if uses_model_stage_resource:
|
|
2021
|
+
if uses_model_stage_resource and generator_call_state.invoked:
|
|
1919
2022
|
self._record_retryable_outcome(retryable=False)
|
|
1920
2023
|
if self._reporter:
|
|
1921
2024
|
if cell_skipped:
|
|
@@ -1934,14 +2037,17 @@ class AsyncTaskScheduler:
|
|
|
1934
2037
|
|
|
1935
2038
|
except Exception as exc:
|
|
1936
2039
|
retryable = self._is_retryable(exc)
|
|
2040
|
+
if retryable:
|
|
2041
|
+
self._deferred.append(task)
|
|
2042
|
+
self._deferred_errors[task] = exc
|
|
1937
2043
|
# Only non-retryable errors (auth, schema, code bugs) count toward
|
|
1938
2044
|
# the early-shutdown gate. Retryable errors (rate-limit, timeout,
|
|
1939
2045
|
# transient 5xx, connection blips) cluster under provider degradation
|
|
1940
2046
|
# and would otherwise trip the gate even when salvage could recover.
|
|
1941
2047
|
if not retryable:
|
|
1942
2048
|
self._check_error_rate(success=False)
|
|
1943
|
-
if uses_model_stage_resource:
|
|
1944
|
-
self._record_retryable_outcome(retryable=retryable)
|
|
2049
|
+
if uses_model_stage_resource and generator_call_state.invoked:
|
|
2050
|
+
self._record_retryable_outcome(retryable=retryable, exc=exc)
|
|
1945
2051
|
if not retryable and self._reporter:
|
|
1946
2052
|
self._reporter.record_failure(task.column)
|
|
1947
2053
|
if self._trace and trace:
|
|
@@ -1962,8 +2068,6 @@ class AsyncTaskScheduler:
|
|
|
1962
2068
|
raise
|
|
1963
2069
|
|
|
1964
2070
|
if retryable:
|
|
1965
|
-
self._deferred.append(task)
|
|
1966
|
-
self._deferred_errors[task] = exc
|
|
1967
2071
|
self._emit_scheduler_event(
|
|
1968
2072
|
"retry_deferred", task=task, lease=lease, task_execution_id=task_execution_id
|
|
1969
2073
|
)
|
|
@@ -2043,8 +2147,16 @@ class AsyncTaskScheduler:
|
|
|
2043
2147
|
self._record_observed_task_state()
|
|
2044
2148
|
self._wake_event.set()
|
|
2045
2149
|
|
|
2046
|
-
async def _run_generator_call(
|
|
2150
|
+
async def _run_generator_call(
|
|
2151
|
+
self,
|
|
2152
|
+
task: Task,
|
|
2153
|
+
operation: str,
|
|
2154
|
+
call: Coroutine[Any, Any, Any],
|
|
2155
|
+
*,
|
|
2156
|
+
call_state: _GeneratorCallState,
|
|
2157
|
+
) -> Any:
|
|
2047
2158
|
"""Run user/plugin generator code while preserving scheduler-owned failures."""
|
|
2159
|
+
call_state.invoked = True
|
|
2048
2160
|
try:
|
|
2049
2161
|
return await call
|
|
2050
2162
|
except Exception as exc:
|
|
@@ -2092,7 +2204,13 @@ class AsyncTaskScheduler:
|
|
|
2092
2204
|
) -> bool:
|
|
2093
2205
|
return self._task_supports_row_drops(task, generator) and isinstance(exc, UserTemplateError)
|
|
2094
2206
|
|
|
2095
|
-
async def _run_from_scratch(
|
|
2207
|
+
async def _run_from_scratch(
|
|
2208
|
+
self,
|
|
2209
|
+
task: Task,
|
|
2210
|
+
generator: ColumnGenerator,
|
|
2211
|
+
*,
|
|
2212
|
+
call_state: _GeneratorCallState,
|
|
2213
|
+
) -> Any:
|
|
2096
2214
|
"""Execute a from_scratch task."""
|
|
2097
2215
|
rg_size = self._get_rg_size(task.row_group)
|
|
2098
2216
|
# Runtime import: needed for isinstance check; module-level would cause circular import
|
|
@@ -2103,6 +2221,7 @@ class AsyncTaskScheduler:
|
|
|
2103
2221
|
task,
|
|
2104
2222
|
"from-scratch generation",
|
|
2105
2223
|
generator.agenerate_from_scratch(rg_size),
|
|
2224
|
+
call_state=call_state,
|
|
2106
2225
|
)
|
|
2107
2226
|
result_operation = "From-scratch generator"
|
|
2108
2227
|
else:
|
|
@@ -2114,7 +2233,12 @@ class AsyncTaskScheduler:
|
|
|
2114
2233
|
# raises ``UserTemplateError`` instead of silently dropping the
|
|
2115
2234
|
# whole row group.
|
|
2116
2235
|
if self._task_supports_row_drops(task, generator):
|
|
2117
|
-
return await self._run_full_column_from_scratch_with_row_drops(
|
|
2236
|
+
return await self._run_full_column_from_scratch_with_row_drops(
|
|
2237
|
+
task,
|
|
2238
|
+
generator,
|
|
2239
|
+
rg_size,
|
|
2240
|
+
call_state=call_state,
|
|
2241
|
+
)
|
|
2118
2242
|
|
|
2119
2243
|
# Non-FromScratch generators dispatched as seeds (no upstream columns)
|
|
2120
2244
|
# operate on existing buffer rows. Pass an ``rg_size``-row snapshot
|
|
@@ -2130,6 +2254,7 @@ class AsyncTaskScheduler:
|
|
|
2130
2254
|
task,
|
|
2131
2255
|
"full-column generation",
|
|
2132
2256
|
generator.agenerate(input_df),
|
|
2257
|
+
call_state=call_state,
|
|
2133
2258
|
)
|
|
2134
2259
|
result_operation = "Full-column generator"
|
|
2135
2260
|
result_df = self._require_dataframe_result(
|
|
@@ -2154,6 +2279,8 @@ class AsyncTaskScheduler:
|
|
|
2154
2279
|
task: Task,
|
|
2155
2280
|
generator: ColumnGenerator,
|
|
2156
2281
|
rg_size: int,
|
|
2282
|
+
*,
|
|
2283
|
+
call_state: _GeneratorCallState,
|
|
2157
2284
|
) -> Any:
|
|
2158
2285
|
"""Execute a row-drop-capable seed task (root expression columns).
|
|
2159
2286
|
|
|
@@ -2179,6 +2306,7 @@ class AsyncTaskScheduler:
|
|
|
2179
2306
|
task,
|
|
2180
2307
|
"full-column generation",
|
|
2181
2308
|
generator.agenerate(input_df),
|
|
2309
|
+
call_state=call_state,
|
|
2182
2310
|
)
|
|
2183
2311
|
|
|
2184
2312
|
result_df = self._require_expression_row_drop_result(
|
|
@@ -2208,7 +2336,13 @@ class AsyncTaskScheduler:
|
|
|
2208
2336
|
|
|
2209
2337
|
return result_df
|
|
2210
2338
|
|
|
2211
|
-
async def _run_cell(
|
|
2339
|
+
async def _run_cell(
|
|
2340
|
+
self,
|
|
2341
|
+
task: Task,
|
|
2342
|
+
generator: ColumnGenerator,
|
|
2343
|
+
*,
|
|
2344
|
+
call_state: _GeneratorCallState,
|
|
2345
|
+
) -> tuple[Any, bool]:
|
|
2212
2346
|
"""Execute a cell-by-cell task. Returns ``(result, skipped)``."""
|
|
2213
2347
|
if task.row_index is None:
|
|
2214
2348
|
raise ValueError(f"Cell task requires a row_index, got None for column '{task.column}'")
|
|
@@ -2234,6 +2368,7 @@ class AsyncTaskScheduler:
|
|
|
2234
2368
|
task,
|
|
2235
2369
|
"cell generation",
|
|
2236
2370
|
generator.agenerate(dict(record)),
|
|
2371
|
+
call_state=call_state,
|
|
2237
2372
|
)
|
|
2238
2373
|
|
|
2239
2374
|
# Write back to buffer (include side-effect columns)
|
|
@@ -2266,7 +2401,13 @@ class AsyncTaskScheduler:
|
|
|
2266
2401
|
side_effect_columns=self._graph.get_side_effect_columns(task.column),
|
|
2267
2402
|
)
|
|
2268
2403
|
|
|
2269
|
-
async def _run_batch(
|
|
2404
|
+
async def _run_batch(
|
|
2405
|
+
self,
|
|
2406
|
+
task: Task,
|
|
2407
|
+
generator: ColumnGenerator,
|
|
2408
|
+
*,
|
|
2409
|
+
call_state: _GeneratorCallState,
|
|
2410
|
+
) -> Any:
|
|
2270
2411
|
"""Execute a full-column/batch task."""
|
|
2271
2412
|
rg_size = self._get_rg_size(task.row_group)
|
|
2272
2413
|
|
|
@@ -2312,6 +2453,7 @@ class AsyncTaskScheduler:
|
|
|
2312
2453
|
task,
|
|
2313
2454
|
"batch generation",
|
|
2314
2455
|
generator.agenerate(batch_df),
|
|
2456
|
+
call_state=call_state,
|
|
2315
2457
|
)
|
|
2316
2458
|
if self._task_supports_row_drops(task, generator):
|
|
2317
2459
|
result_df = self._require_expression_row_drop_result(
|
|
@@ -456,7 +456,7 @@ class DatasetBuilder:
|
|
|
456
456
|
the source of truth for run *progress* (``num_completed_batches``,
|
|
457
457
|
``actual_num_records``). Splitting the two sources is what lets resume
|
|
458
458
|
survive a crash between writing a batch and updating metadata: the
|
|
459
|
-
filesystem reflects the durable state even when metadata lags
|
|
459
|
+
filesystem reflects the durable state even when metadata lags behind.
|
|
460
460
|
|
|
461
461
|
``num_records`` must be >= the number of records already on disk (you may
|
|
462
462
|
extend a dataset, but cannot shrink it below what has been written).
|
|
@@ -767,7 +767,7 @@ class DatasetBuilder:
|
|
|
767
767
|
state = self._load_resume_state(num_records, buffer_size)
|
|
768
768
|
# _load_resume_state already scans the filesystem for completed row groups
|
|
769
769
|
# and exposes them via state.completed_row_groups. The filesystem is the
|
|
770
|
-
# source of truth for progress (metadata may lag
|
|
770
|
+
# source of truth for progress (metadata may lag between
|
|
771
771
|
# move_partial_result_to_final_file_path and write_metadata).
|
|
772
772
|
completed_row_groups = state.completed_row_groups
|
|
773
773
|
completed_ids = set(completed_row_groups)
|
|
@@ -788,6 +788,14 @@ class DatasetBuilder:
|
|
|
788
788
|
remaining_row_group_count = len(resume_plan.remaining_row_groups)
|
|
789
789
|
completed_row_group_count = resume_plan.total_row_groups - remaining_row_group_count
|
|
790
790
|
if remaining_row_group_count == 0:
|
|
791
|
+
self.artifact_storage.update_metadata(
|
|
792
|
+
{
|
|
793
|
+
"actual_num_records": state.actual_num_records,
|
|
794
|
+
"total_num_batches": state.num_completed_batches,
|
|
795
|
+
"file_paths": self.artifact_storage.get_file_paths(),
|
|
796
|
+
"num_completed_batches": state.num_completed_batches,
|
|
797
|
+
}
|
|
798
|
+
)
|
|
791
799
|
logger.warning(
|
|
792
800
|
"⚠️ Dataset is already complete — all row groups were found in the existing artifact "
|
|
793
801
|
"directory. Nothing to resume. Use resume=ResumeMode.NEVER if you want to generate a new dataset."
|
|
@@ -801,18 +809,24 @@ class DatasetBuilder:
|
|
|
801
809
|
|
|
802
810
|
precomputed_row_groups = resume_plan.remaining_row_groups
|
|
803
811
|
|
|
812
|
+
incremental_metadata_written = False
|
|
813
|
+
|
|
804
814
|
def finalize_row_group(rg_id: int) -> None:
|
|
815
|
+
nonlocal incremental_metadata_written
|
|
816
|
+
|
|
805
817
|
def on_complete(final_path: Path | str | None) -> None:
|
|
806
818
|
if final_path is not None and on_batch_complete:
|
|
807
819
|
on_batch_complete(final_path)
|
|
808
820
|
|
|
809
821
|
buffer_manager.checkpoint_row_group(rg_id, on_complete=on_complete)
|
|
810
|
-
#
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
822
|
+
# Persist the first durable checkpoint; resume scans parquet files for later progress.
|
|
823
|
+
if not incremental_metadata_written:
|
|
824
|
+
buffer_manager.write_metadata(
|
|
825
|
+
target_num_records=num_records,
|
|
826
|
+
original_target_num_records=original_target,
|
|
827
|
+
buffer_size=buffer_size,
|
|
828
|
+
)
|
|
829
|
+
incremental_metadata_written = True
|
|
816
830
|
|
|
817
831
|
# Telemetry snapshot
|
|
818
832
|
group_id = uuid.uuid4().hex
|
|
@@ -861,7 +875,7 @@ class DatasetBuilder:
|
|
|
861
875
|
except Exception:
|
|
862
876
|
logger.debug("Failed to emit batch telemetry for async run", exc_info=True)
|
|
863
877
|
|
|
864
|
-
#
|
|
878
|
+
# Refresh metadata with the final checkpoint state.
|
|
865
879
|
buffer_manager.write_metadata(
|
|
866
880
|
target_num_records=num_records,
|
|
867
881
|
original_target_num_records=original_target,
|
|
@@ -52,6 +52,8 @@ class CompletionTracker:
|
|
|
52
52
|
self._row_group_plan: RowGroupPlanLike | None = None
|
|
53
53
|
self._batch_complete: dict[int, set[str]] = defaultdict(set)
|
|
54
54
|
self._frontier: set[Task] = set()
|
|
55
|
+
# Checkpointed row group → compact bitset of dropped row indices.
|
|
56
|
+
self._compacted_dropped: dict[int, bytes] = {}
|
|
55
57
|
|
|
56
58
|
@classmethod
|
|
57
59
|
def with_graph(cls, graph: ExecutionGraph, row_groups: RowGroupInput) -> CompletionTracker:
|
|
@@ -134,8 +136,27 @@ class CompletionTracker:
|
|
|
134
136
|
return self._record_delta(added=added, removed=removed)
|
|
135
137
|
|
|
136
138
|
def is_dropped(self, row_group: int, row_index: int) -> bool:
|
|
139
|
+
dropped_mask = self._compacted_dropped.get(row_group)
|
|
140
|
+
if dropped_mask is not None:
|
|
141
|
+
byte_index, bit_index = divmod(row_index, 8)
|
|
142
|
+
return 0 <= byte_index < len(dropped_mask) and bool(dropped_mask[byte_index] & (1 << bit_index))
|
|
137
143
|
return row_index in self._dropped.get(row_group, set())
|
|
138
144
|
|
|
145
|
+
def compact_row_group(self, row_group: int) -> None:
|
|
146
|
+
"""Release detailed state while retaining terminal group and drop queries."""
|
|
147
|
+
if row_group in self._compacted_dropped:
|
|
148
|
+
return
|
|
149
|
+
self._validate_row_group(row_group)
|
|
150
|
+
dropped = self._dropped.pop(row_group, set())
|
|
151
|
+
dropped_mask = bytearray((max(dropped, default=-1) // 8) + 1)
|
|
152
|
+
for row_index in dropped:
|
|
153
|
+
byte_index, bit_index = divmod(row_index, 8)
|
|
154
|
+
dropped_mask[byte_index] |= 1 << bit_index
|
|
155
|
+
self._compacted_dropped[row_group] = bytes(dropped_mask)
|
|
156
|
+
self._completed.pop(row_group, None)
|
|
157
|
+
self._batch_complete.pop(row_group, None)
|
|
158
|
+
self._frontier = {task for task in self._frontier if task.row_group != row_group}
|
|
159
|
+
|
|
139
160
|
def is_row_group_complete(
|
|
140
161
|
self,
|
|
141
162
|
row_group: int,
|
|
@@ -143,6 +164,8 @@ class CompletionTracker:
|
|
|
143
164
|
all_columns: list[str],
|
|
144
165
|
) -> bool:
|
|
145
166
|
"""All non-dropped rows have all columns done."""
|
|
167
|
+
if row_group in self._compacted_dropped:
|
|
168
|
+
return True
|
|
146
169
|
dropped = self._dropped.get(row_group, set())
|
|
147
170
|
completed = self._completed.get(row_group, {})
|
|
148
171
|
for ri in range(row_group_size):
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
import heapq
|
|
7
6
|
from collections import Counter, defaultdict, deque
|
|
8
7
|
from collections.abc import Callable, Iterable, Mapping
|
|
9
8
|
from dataclasses import dataclass
|
|
@@ -50,9 +49,7 @@ class FairTaskQueue:
|
|
|
50
49
|
self._queued_resource_demand_by_group: dict[TaskGroupKey, Counter[SchedulerResourceKey]] = defaultdict(Counter)
|
|
51
50
|
self._queued_peer_demand_by_resource: Counter[SchedulerResourceKey] = Counter()
|
|
52
51
|
self._group_finish: dict[TaskGroupKey, float] = {}
|
|
53
|
-
self.
|
|
54
|
-
self._active_heap_keys: set[TaskGroupKey] = set()
|
|
55
|
-
self._active_heap_entries: dict[TaskGroupKey, tuple[float, int]] = {}
|
|
52
|
+
self._active_entries: dict[TaskGroupKey, tuple[float, int]] = {}
|
|
56
53
|
self._sequence = 0
|
|
57
54
|
self._sequence_version = 0
|
|
58
55
|
self._virtual_time = 0.0
|
|
@@ -93,16 +90,8 @@ class FairTaskQueue:
|
|
|
93
90
|
def select_next(self, is_eligible: Callable[[SchedulableTask, QueueView], bool]) -> QueueSelection | None:
|
|
94
91
|
"""Return the next eligible task without mutating queue state."""
|
|
95
92
|
view = self.view()
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
active_seen: set[TaskGroupKey] = set()
|
|
99
|
-
while heap_copy:
|
|
100
|
-
finish, sequence, key = heapq.heappop(heap_copy)
|
|
101
|
-
if key in active_seen:
|
|
102
|
-
continue
|
|
103
|
-
if self._active_heap_entries.get(key) != (finish, sequence):
|
|
104
|
-
continue
|
|
105
|
-
active_seen.add(key)
|
|
93
|
+
active_entries = sorted((finish, sequence, key) for key, (finish, sequence) in self._active_entries.items())
|
|
94
|
+
for _finish, _sequence, key in active_entries:
|
|
106
95
|
item = self._first_valid_item(key)
|
|
107
96
|
if item is None:
|
|
108
97
|
continue
|
|
@@ -128,8 +117,7 @@ class FairTaskQueue:
|
|
|
128
117
|
|
|
129
118
|
queue.popleft()
|
|
130
119
|
self._remove_queued_item(item.task_id)
|
|
131
|
-
self.
|
|
132
|
-
self._active_heap_entries.pop(key, None)
|
|
120
|
+
self._active_entries.pop(key, None)
|
|
133
121
|
group = self._group_specs[key]
|
|
134
122
|
finish = self._group_finish.get(key, self._virtual_time)
|
|
135
123
|
self._virtual_time = max(self._virtual_time, finish)
|
|
@@ -168,13 +156,11 @@ class FairTaskQueue:
|
|
|
168
156
|
def _activate_group(self, key: TaskGroupKey) -> None:
|
|
169
157
|
self._purge_queue_head(key)
|
|
170
158
|
queue = self._queues.get(key)
|
|
171
|
-
if not queue or key in self.
|
|
159
|
+
if not queue or key in self._active_entries:
|
|
172
160
|
return
|
|
173
161
|
self._sequence += 1
|
|
174
162
|
finish = self._group_finish.get(key, self._virtual_time)
|
|
175
|
-
|
|
176
|
-
self._active_heap_keys.add(key)
|
|
177
|
-
self._active_heap_entries[key] = (finish, self._sequence)
|
|
163
|
+
self._active_entries[key] = (finish, self._sequence)
|
|
178
164
|
|
|
179
165
|
def _first_valid_item(self, key: TaskGroupKey) -> SchedulableTask | None:
|
|
180
166
|
self._purge_queue_head(key)
|
|
@@ -206,6 +192,8 @@ class FairTaskQueue:
|
|
|
206
192
|
if item is None or key is None:
|
|
207
193
|
return item
|
|
208
194
|
self._decrement_queue_accounting(item, key)
|
|
195
|
+
if key not in self._queued_by_group:
|
|
196
|
+
self._active_entries.pop(key, None)
|
|
209
197
|
return item
|
|
210
198
|
|
|
211
199
|
def _decrement_queue_accounting(self, item: SchedulableTask, key: TaskGroupKey) -> None:
|
|
@@ -29,7 +29,8 @@ TaskAdmissionDenyReason = Literal[
|
|
|
29
29
|
"shutdown",
|
|
30
30
|
"policy_denial",
|
|
31
31
|
]
|
|
32
|
-
|
|
32
|
+
# A future peer can take the next released slot; do not reserve idle capacity.
|
|
33
|
+
DEFAULT_DYNAMIC_BORROW_RESERVE_FRACTION = 0.0
|
|
33
34
|
DEFAULT_DYNAMIC_BORROW_MAX_RESERVED_SLOTS = 8
|
|
34
35
|
|
|
35
36
|
|
|
@@ -40,9 +41,8 @@ class BoundedBorrowTaskAdmissionPolicyConfig:
|
|
|
40
41
|
Borrow debt is tracked by task group and scheduler resource. Any completed
|
|
41
42
|
lease in the same group repays debt for the released resources; repayment is
|
|
42
43
|
not tied to the specific lease that originally borrowed. When no explicit
|
|
43
|
-
borrow ceiling is configured,
|
|
44
|
-
|
|
45
|
-
up to the remaining capacity.
|
|
44
|
+
borrow ceiling is configured, a solo group may use the full resource;
|
|
45
|
+
borrow debt gives a newly queued peer priority as leases complete.
|
|
46
46
|
"""
|
|
47
47
|
|
|
48
48
|
borrow_ceiling_by_group_resource: Mapping[tuple[TaskGroupKey, SchedulerResourceKey], int] = field(
|
|
@@ -320,7 +320,7 @@ def _strict_share(
|
|
|
320
320
|
|
|
321
321
|
|
|
322
322
|
def _dynamic_reserved_slots(resource_limit: int, *, reserve_fraction: float, max_reserved_slots: int) -> int:
|
|
323
|
-
return min(max_reserved_slots,
|
|
323
|
+
return min(max_reserved_slots, math.ceil(resource_limit * reserve_fraction))
|
|
324
324
|
|
|
325
325
|
|
|
326
326
|
def _competing_group_specs(
|
|
@@ -15,6 +15,7 @@ from data_designer.config.utils.media_helpers import (
|
|
|
15
15
|
from data_designer.engine.models.clients.parsing import extract_usage, fill_reasoning_token_count_from_content
|
|
16
16
|
from data_designer.engine.models.clients.types import (
|
|
17
17
|
AssistantMessage,
|
|
18
|
+
ChatCompletionChoice,
|
|
18
19
|
ChatCompletionRequest,
|
|
19
20
|
ChatCompletionResponse,
|
|
20
21
|
ToolCall,
|
|
@@ -124,7 +125,16 @@ def parse_anthropic_response(response_json: dict[str, Any]) -> ChatCompletionRes
|
|
|
124
125
|
usage = extract_usage(raw_usage)
|
|
125
126
|
usage = fill_reasoning_token_count_from_content(usage, message.reasoning_content)
|
|
126
127
|
|
|
127
|
-
|
|
128
|
+
choice = ChatCompletionChoice(
|
|
129
|
+
message=message,
|
|
130
|
+
finish_reason=response_json.get("stop_reason"),
|
|
131
|
+
)
|
|
132
|
+
return ChatCompletionResponse(
|
|
133
|
+
message=message,
|
|
134
|
+
usage=usage,
|
|
135
|
+
raw=response_json,
|
|
136
|
+
choices=[choice],
|
|
137
|
+
)
|
|
128
138
|
|
|
129
139
|
|
|
130
140
|
def translate_request_messages(
|