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.
Files changed (338) hide show
  1. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/PKG-INFO +3 -3
  2. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/pyproject.toml +1 -1
  3. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/async_scheduler.py +161 -19
  4. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/dataset_builder.py +23 -9
  5. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/completion.py +23 -0
  6. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/queue.py +8 -20
  7. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/task_policies.py +5 -5
  8. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/anthropic_translation.py +11 -1
  9. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/errors.py +10 -1
  10. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/facade.py +33 -2
  11. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/telemetry.py +15 -8
  12. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/utils.py +54 -1
  13. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/readiness.py +6 -0
  14. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_completion.py +17 -0
  15. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_queue.py +16 -0
  16. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_task_admission.py +17 -10
  17. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_task_policies.py +1 -1
  18. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_async_scheduler.py +319 -3
  19. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_dataset_builder.py +40 -4
  20. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_anthropic_translation.py +16 -0
  21. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_facade.py +241 -2
  22. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_model_errors.py +52 -0
  23. data_designer_engine-0.9.0/tests/engine/models/test_model_utils.py +142 -0
  24. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_telemetry.py +9 -0
  25. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_readiness.py +18 -0
  26. data_designer_engine-0.8.0/tests/engine/models/test_model_utils.py +0 -51
  27. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/.gitignore +0 -0
  28. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/README.md +0 -0
  29. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/__init__.py +0 -0
  30. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/column_profilers/base.py +0 -0
  31. {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
  32. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/column_profilers/registry.py +0 -0
  33. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/column_statistics.py +0 -0
  34. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/dataset_profiler.py +0 -0
  35. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/errors.py +0 -0
  36. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/utils/column_statistics_calculations.py +0 -0
  37. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/analysis/utils/judge_score_processing.py +0 -0
  38. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/capacity.py +0 -0
  39. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/__init__.py +0 -0
  40. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/__init__.py +0 -0
  41. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/base.py +0 -0
  42. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/custom.py +0 -0
  43. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/embedding.py +0 -0
  44. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/expression.py +0 -0
  45. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/image.py +0 -0
  46. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/llm_completion.py +0 -0
  47. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/samplers.py +0 -0
  48. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/seed_dataset.py +0 -0
  49. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/generators/validation.py +0 -0
  50. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/registry.py +0 -0
  51. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/utils/errors.py +0 -0
  52. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/utils/generator_classification.py +0 -0
  53. {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
  54. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/column_generators/utils/prompt_renderer.py +0 -0
  55. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/compiler.py +0 -0
  56. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/configurable_task.py +0 -0
  57. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/context.py +0 -0
  58. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/errors.py +0 -0
  59. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/multi_column_configs.py +0 -0
  60. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/row_group_plan.py +0 -0
  61. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/resolver.py +0 -0
  62. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/resources.py +0 -0
  63. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/task_admission.py +0 -0
  64. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/scheduling/task_model.py +0 -0
  65. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/__init__.py +0 -0
  66. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/async_concurrency.py +0 -0
  67. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/concurrency.py +0 -0
  68. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/config_compiler.py +0 -0
  69. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/errors.py +0 -0
  70. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/execution_graph.py +0 -0
  71. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/processor_runner.py +0 -0
  72. {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
  73. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/skip_evaluator.py +0 -0
  74. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/dataset_builders/utils/skip_tracker.py +0 -0
  75. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/errors.py +0 -0
  76. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/__init__.py +0 -0
  77. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/errors.py +0 -0
  78. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/facade.py +0 -0
  79. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/factory.py +0 -0
  80. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/io.py +0 -0
  81. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/mcp/registry.py +0 -0
  82. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/model_provider.py +0 -0
  83. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/__init__.py +0 -0
  84. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/__init__.py +0 -0
  85. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/__init__.py +0 -0
  86. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/anthropic.py +0 -0
  87. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/http_helpers.py +0 -0
  88. {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
  89. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/adapters/openai_compatible.py +0 -0
  90. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/base.py +0 -0
  91. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/errors.py +0 -0
  92. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/factory.py +0 -0
  93. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/model_request_executor.py +0 -0
  94. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/parsing.py +0 -0
  95. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/retry.py +0 -0
  96. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/clients/types.py +0 -0
  97. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/factory.py +0 -0
  98. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/__init__.py +0 -0
  99. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/errors.py +0 -0
  100. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/parser.py +0 -0
  101. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/postprocessors.py +0 -0
  102. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/tag_parsers.py +0 -0
  103. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/parsers/types.py +0 -0
  104. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/recipes/base.py +0 -0
  105. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/recipes/response_recipes.py +0 -0
  106. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/registry.py +0 -0
  107. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/config.py +0 -0
  108. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/controller.py +0 -0
  109. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/limits.py +0 -0
  110. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/outcomes.py +0 -0
  111. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/pressure.py +0 -0
  112. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/queue.py +0 -0
  113. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/resolver.py +0 -0
  114. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/request_admission/resources.py +0 -0
  115. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/resources.py +0 -0
  116. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/usage.py +0 -0
  117. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/models/usage_events.py +0 -0
  118. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/observability.py +0 -0
  119. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/__init__.py +0 -0
  120. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/__init__.py +0 -0
  121. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/ast.py +0 -0
  122. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/environment.py +0 -0
  123. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/exceptions.py +0 -0
  124. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/ginja/record.py +0 -0
  125. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/__init__.py +0 -0
  126. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/exceptions.py +0 -0
  127. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/schema_transformers.py +0 -0
  128. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/types.py +0 -0
  129. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/gsonschema/validators.py +0 -0
  130. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/__init__.py +0 -0
  131. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/base.py +0 -0
  132. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/drop_columns.py +0 -0
  133. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/registry.py +0 -0
  134. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/processors/schema_transform.py +0 -0
  135. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/processing/utils.py +0 -0
  136. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/__init__.py +0 -0
  137. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/reporter.py +0 -0
  138. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/terminal/__init__.py +0 -0
  139. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/terminal/throughput_panel.py +0 -0
  140. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/progress/tracker.py +0 -0
  141. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/registry/base.py +0 -0
  142. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/registry/data_designer_registry.py +0 -0
  143. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/registry/errors.py +0 -0
  144. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/__init__.py +0 -0
  145. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/__init__.py +0 -0
  146. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/atif.py +0 -0
  147. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/base.py +0 -0
  148. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/claude_code.py +0 -0
  149. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/codex.py +0 -0
  150. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/hermes_agent.py +0 -0
  151. {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
  152. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/registry.py +0 -0
  153. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/types.py +0 -0
  154. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/agent_rollout/utils.py +0 -0
  155. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/managed_dataset_generator.py +0 -0
  156. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/person_reader.py +0 -0
  157. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/resource_provider.py +0 -0
  158. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/resources/seed_reader.py +0 -0
  159. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/column.py +0 -0
  160. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/constraints.py +0 -0
  161. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/data_sources/base.py +0 -0
  162. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/data_sources/errors.py +0 -0
  163. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/data_sources/sources.py +0 -0
  164. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/__init__.py +0 -0
  165. {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
  166. {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
  167. {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
  168. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/errors.py +0 -0
  169. {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
  170. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/person.py +0 -0
  171. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/entities/phone_number.py +0 -0
  172. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/errors.py +0 -0
  173. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/generator.py +0 -0
  174. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/jinja_utils.py +0 -0
  175. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/people_gen.py +0 -0
  176. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/person_constants.py +0 -0
  177. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/schema.py +0 -0
  178. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/schema_builder.py +0 -0
  179. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/sampling_gen/utils.py +0 -0
  180. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/secret_resolver.py +0 -0
  181. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/storage/__init__.py +0 -0
  182. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/storage/artifact_storage.py +0 -0
  183. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/storage/media_storage.py +0 -0
  184. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/__init__.py +0 -0
  185. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/fixtures.py +0 -0
  186. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/observability.py +0 -0
  187. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/seed_readers.py +0 -0
  188. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/stubs.py +0 -0
  189. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/testing/utils.py +0 -0
  190. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/utils/__init__.py +0 -0
  191. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/utils/token_counting.py +0 -0
  192. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validation.py +0 -0
  193. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/__init__.py +0 -0
  194. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/base.py +0 -0
  195. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/local_callable.py +0 -0
  196. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/python.py +0 -0
  197. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/remote.py +0 -0
  198. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/src/data_designer/engine/validators/sql.py +0 -0
  199. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/__init__.py +0 -0
  200. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/conftest.py +0 -0
  201. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/__init__.py +0 -0
  202. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/column_profilers/test_base.py +0 -0
  203. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/column_profilers/test_judge_score_profiler.py +0 -0
  204. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/conftest.py +0 -0
  205. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_column_statistics_calculator.py +0 -0
  206. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_data/artifacts/dataset/column_configs.json +0 -0
  207. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_data/artifacts/dataset/dataset.json +0 -0
  208. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_data/artifacts/dataset/metadata.json +0 -0
  209. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_dataset_profiler.py +0 -0
  210. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/test_errors.py +0 -0
  211. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/utils/test_column_statistics_calculations.py +0 -0
  212. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/analysis/utils/test_judge_score_processing.py +0 -0
  213. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/__init__.py +0 -0
  214. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_async_generators.py +0 -0
  215. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_column_generator_base.py +0 -0
  216. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_custom.py +0 -0
  217. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_embedding.py +0 -0
  218. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_expression.py +0 -0
  219. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_image.py +0 -0
  220. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_llm_completion_generators.py +0 -0
  221. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_samplers.py +0 -0
  222. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_seed_dataset.py +0 -0
  223. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/generators/test_validation.py +0 -0
  224. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/test_registry.py +0 -0
  225. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_column_generator_errors.py +0 -0
  226. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_generator_classification.py +0 -0
  227. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_judge_score_factory.py +0 -0
  228. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/column_generators/utils/test_prompt_renderer.py +0 -0
  229. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/conftest.py +0 -0
  230. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_resolver.py +0 -0
  231. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_resources.py +0 -0
  232. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/scheduling/test_task_model.py +0 -0
  233. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_async_builder_integration.py +0 -0
  234. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/test_multi_column_configs.py +0 -0
  235. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_concurrency.py +0 -0
  236. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_config_compiler.py +0 -0
  237. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_execution_graph.py +0 -0
  238. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_row_group_buffer.py +0 -0
  239. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_skip_evaluator.py +0 -0
  240. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_skip_tracker.py +0 -0
  241. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/dataset_builders/utils/test_topological_sort.py +0 -0
  242. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/conftest.py +0 -0
  243. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_facade.py +0 -0
  244. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_factory.py +0 -0
  245. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_io.py +0 -0
  246. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/mcp/test_mcp_registry.py +0 -0
  247. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/__init__.py +0 -0
  248. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/__init__.py +0 -0
  249. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/conftest.py +0 -0
  250. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_anthropic.py +0 -0
  251. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_client_errors.py +0 -0
  252. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_factory.py +0 -0
  253. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_model_request_executor.py +0 -0
  254. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_native_http_clients.py +0 -0
  255. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_openai_compatible.py +0 -0
  256. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_parsing.py +0 -0
  257. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_retry.py +0 -0
  258. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/clients/test_types.py +0 -0
  259. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/conftest.py +0 -0
  260. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_parser.py +0 -0
  261. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_parsers_types.py +0 -0
  262. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_postprocessors.py +0 -0
  263. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/parsers/test_tag_parsers.py +0 -0
  264. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/recipes/test_recipe_base.py +0 -0
  265. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/recipes/test_response_recipes.py +0 -0
  266. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/request_admission/test_controller.py +0 -0
  267. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/stub_secrets.json +0 -0
  268. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_model_registry.py +0 -0
  269. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/models/test_usage.py +0 -0
  270. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/__init__.py +0 -0
  271. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/__init__.py +0 -0
  272. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_ast.py +0 -0
  273. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_environment.py +0 -0
  274. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_exceptions.py +0 -0
  275. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/ginja/test_record.py +0 -0
  276. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/__init__.py +0 -0
  277. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_exceptions.py +0 -0
  278. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_schema_transformers.py +0 -0
  279. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_types.py +0 -0
  280. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/gsonschema/test_validators.py +0 -0
  281. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/__init__.py +0 -0
  282. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/test_drop_columns.py +0 -0
  283. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/test_registry.py +0 -0
  284. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/processors/test_schema_transform.py +0 -0
  285. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/processing/test_utils.py +0 -0
  286. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/progress/terminal/test_throughput_panel.py +0 -0
  287. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/progress/test_tracker.py +0 -0
  288. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/__init__.py +0 -0
  289. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/conftest.py +0 -0
  290. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/test_base.py +0 -0
  291. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/test_data_designer_registry.py +0 -0
  292. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/registry/test_errors.py +0 -0
  293. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/__init__.py +0 -0
  294. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/__init__.py +0 -0
  295. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_atif.py +0 -0
  296. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_claude_code.py +0 -0
  297. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_codex.py +0 -0
  298. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_hermes_agent.py +0 -0
  299. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_pi_coding_agent.py +0 -0
  300. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/agent_rollout/test_utils.py +0 -0
  301. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/conftest.py +0 -0
  302. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_managed_dataset_generator.py +0 -0
  303. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_person_reader.py +0 -0
  304. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_resource_provider.py +0 -0
  305. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/resources/test_seed_reader.py +0 -0
  306. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/conftest.py +0 -0
  307. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/data_sources/test_sampler_errors.py +0 -0
  308. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/data_sources/test_sources.py +0 -0
  309. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_email_address_utils.py +0 -0
  310. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_national_id_utils.py +0 -0
  311. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_person.py +0 -0
  312. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/entities/test_phone_number.py +0 -0
  313. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_column.py +0 -0
  314. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_constraints.py +0 -0
  315. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_generator.py +0 -0
  316. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_jinja_utils.py +0 -0
  317. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_people_gen.py +0 -0
  318. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_schema.py +0 -0
  319. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/sampling_gen/test_utils.py +0 -0
  320. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/storage/__init__.py +0 -0
  321. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/storage/test_artifact_storage.py +0 -0
  322. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/storage/test_media_storage.py +0 -0
  323. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_capacity.py +0 -0
  324. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_compiler.py +0 -0
  325. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_configurable_task.py +0 -0
  326. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_dataset_metadata.py +0 -0
  327. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_engine_errors.py +0 -0
  328. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_model_provider.py +0 -0
  329. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_observability.py +0 -0
  330. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_secret_resolver.py +0 -0
  331. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/test_validation.py +0 -0
  332. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/testing/test_plugin_testing_utils.py +0 -0
  333. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/utils/test_token_counting.py +0 -0
  334. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_local_callable.py +0 -0
  335. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_python.py +0 -0
  336. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_remote.py +0 -0
  337. {data_designer_engine-0.8.0 → data_designer_engine-0.9.0}/tests/engine/validators/test_sql.py +0 -0
  338. {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.8.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.8.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.26.0
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
@@ -50,7 +50,7 @@ dependencies = [
50
50
  "jsonschema>=4.0.0,<5",
51
51
  "lxml>=6.1.0,<7",
52
52
  "marko>=2.1.2,<3",
53
- "mcp>=1.26.0,<2",
53
+ "mcp>=1.29.0,<2", # 1.29.0 fixes MCP security advisories
54
54
  "networkx>=3.0,<4",
55
55
  "numpy>=1.23.5,<3",
56
56
  "pandas>=2.3.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
- def _record_retryable_outcome(self, *, retryable: bool) -> None:
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
- f"Provider showing degraded performance: {pct}% of last {self._degraded_warn_window} "
1806
- "task outcomes were retryable errors (rate-limit, timeout, 5xx, connection). "
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(self, task: Task, operation: str, call: Coroutine[Any, Any, Any]) -> Any:
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(self, task: Task, generator: ColumnGenerator) -> Any:
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(task, generator, rg_size)
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(self, task: Task, generator: ColumnGenerator) -> tuple[Any, bool]:
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(self, task: Task, generator: ColumnGenerator) -> Any:
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 by a step.
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 by one row group between
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
- # Write incremental metadata after each row group so interrupted runs can be resumed.
811
- buffer_manager.write_metadata(
812
- target_num_records=num_records,
813
- original_target_num_records=original_target,
814
- buffer_size=buffer_size,
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
- # Write final metadata (overwrites the last incremental write with identical content).
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._heap: list[tuple[float, int, TaskGroupKey]] = []
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
- heap_copy = list(self._heap)
97
- heapq.heapify(heap_copy)
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._active_heap_keys.discard(key)
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._active_heap_keys:
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
- heapq.heappush(self._heap, (finish, self._sequence, key))
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
- DEFAULT_DYNAMIC_BORROW_RESERVE_FRACTION = 0.125
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, the policy reserves one slot per eight
44
- resource slots, capped at eight reserved slots, and lets solo groups borrow
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, max(1, math.ceil(resource_limit * reserve_fraction)))
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
- return ChatCompletionResponse(message=message, usage=usage, raw=response_json)
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(