data-designer-engine 0.9.4__tar.gz → 0.9.5__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 (340) hide show
  1. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/PKG-INFO +4 -10
  2. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/pyproject.toml +2 -8
  3. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/anthropic.py +1 -0
  4. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/anthropic_translation.py +46 -0
  5. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/errors.py +9 -1
  6. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/types.py +1 -0
  7. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/facade.py +42 -11
  8. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_anthropic.py +97 -0
  9. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_anthropic_translation.py +51 -0
  10. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_client_errors.py +33 -0
  11. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_factory.py +100 -0
  12. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_openai_compatible.py +54 -0
  13. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_facade.py +268 -0
  14. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/.gitignore +0 -0
  15. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/README.md +0 -0
  16. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/__init__.py +0 -0
  17. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/column_profilers/base.py +0 -0
  18. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/column_profilers/judge_score_profiler.py +0 -0
  19. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/column_profilers/registry.py +0 -0
  20. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/column_statistics.py +0 -0
  21. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/dataset_profiler.py +0 -0
  22. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/errors.py +0 -0
  23. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/utils/column_statistics_calculations.py +0 -0
  24. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/utils/judge_score_processing.py +0 -0
  25. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/capacity.py +0 -0
  26. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/__init__.py +0 -0
  27. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/__init__.py +0 -0
  28. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/base.py +0 -0
  29. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/custom.py +0 -0
  30. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/embedding.py +0 -0
  31. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/expression.py +0 -0
  32. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/image.py +0 -0
  33. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/llm_completion.py +0 -0
  34. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/samplers.py +0 -0
  35. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/seed_dataset.py +0 -0
  36. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/validation.py +0 -0
  37. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/registry.py +0 -0
  38. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/utils/errors.py +0 -0
  39. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/utils/generator_classification.py +0 -0
  40. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/utils/judge_score_factory.py +0 -0
  41. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/utils/prompt_renderer.py +0 -0
  42. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/compiler.py +0 -0
  43. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/configurable_task.py +0 -0
  44. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/context.py +0 -0
  45. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/async_scheduler.py +0 -0
  46. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/dataset_builder.py +0 -0
  47. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/errors.py +0 -0
  48. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/multi_column_configs.py +0 -0
  49. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/row_group_plan.py +0 -0
  50. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/completion.py +0 -0
  51. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/queue.py +0 -0
  52. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/resolver.py +0 -0
  53. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/resources.py +0 -0
  54. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/task_admission.py +0 -0
  55. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/task_model.py +0 -0
  56. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/task_policies.py +0 -0
  57. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/__init__.py +0 -0
  58. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/async_concurrency.py +0 -0
  59. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/concurrency.py +0 -0
  60. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/config_compiler.py +0 -0
  61. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/errors.py +0 -0
  62. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/execution_graph.py +0 -0
  63. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/processor_runner.py +0 -0
  64. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/row_group_buffer.py +0 -0
  65. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/skip_evaluator.py +0 -0
  66. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/skip_tracker.py +0 -0
  67. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/errors.py +0 -0
  68. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/__init__.py +0 -0
  69. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/errors.py +0 -0
  70. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/facade.py +0 -0
  71. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/factory.py +0 -0
  72. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/io.py +0 -0
  73. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/registry.py +0 -0
  74. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/model_provider.py +0 -0
  75. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/__init__.py +0 -0
  76. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/__init__.py +0 -0
  77. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/__init__.py +0 -0
  78. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/http_helpers.py +0 -0
  79. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/http_model_client.py +0 -0
  80. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/httpx_sharding.py +0 -0
  81. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/openai_compatible.py +0 -0
  82. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/base.py +0 -0
  83. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/factory.py +0 -0
  84. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/model_request_executor.py +0 -0
  85. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/parsing.py +0 -0
  86. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/retry.py +0 -0
  87. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/errors.py +0 -0
  88. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/factory.py +0 -0
  89. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/__init__.py +0 -0
  90. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/errors.py +0 -0
  91. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/parser.py +0 -0
  92. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/postprocessors.py +0 -0
  93. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/tag_parsers.py +0 -0
  94. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/types.py +0 -0
  95. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/recipes/base.py +0 -0
  96. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/recipes/response_recipes.py +0 -0
  97. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/registry.py +0 -0
  98. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/config.py +0 -0
  99. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/controller.py +0 -0
  100. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/limits.py +0 -0
  101. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/outcomes.py +0 -0
  102. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/pressure.py +0 -0
  103. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/queue.py +0 -0
  104. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/resolver.py +0 -0
  105. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/resources.py +0 -0
  106. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/resources.py +0 -0
  107. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/telemetry.py +0 -0
  108. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/usage.py +0 -0
  109. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/usage_events.py +0 -0
  110. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/utils.py +0 -0
  111. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/observability.py +0 -0
  112. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/__init__.py +0 -0
  113. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/__init__.py +0 -0
  114. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/ast.py +0 -0
  115. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/environment.py +0 -0
  116. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/exceptions.py +0 -0
  117. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/record.py +0 -0
  118. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/__init__.py +0 -0
  119. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/exceptions.py +0 -0
  120. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/schema_transformers.py +0 -0
  121. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/types.py +0 -0
  122. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/validators.py +0 -0
  123. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/__init__.py +0 -0
  124. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/base.py +0 -0
  125. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/drop_columns.py +0 -0
  126. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/registry.py +0 -0
  127. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/schema_transform.py +0 -0
  128. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/utils.py +0 -0
  129. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/__init__.py +0 -0
  130. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/reporter.py +0 -0
  131. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/terminal/__init__.py +0 -0
  132. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/terminal/throughput_panel.py +0 -0
  133. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/tracker.py +0 -0
  134. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/readiness.py +0 -0
  135. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/registry/base.py +0 -0
  136. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/registry/data_designer_registry.py +0 -0
  137. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/registry/errors.py +0 -0
  138. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/__init__.py +0 -0
  139. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/__init__.py +0 -0
  140. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/atif.py +0 -0
  141. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/base.py +0 -0
  142. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/claude_code.py +0 -0
  143. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/codex.py +0 -0
  144. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/hermes_agent.py +0 -0
  145. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/pi_coding_agent.py +0 -0
  146. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/registry.py +0 -0
  147. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/types.py +0 -0
  148. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/utils.py +0 -0
  149. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/managed_dataset_generator.py +0 -0
  150. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/person_reader.py +0 -0
  151. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/resource_provider.py +0 -0
  152. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/seed_reader.py +0 -0
  153. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/column.py +0 -0
  154. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/constraints.py +0 -0
  155. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/data_sources/base.py +0 -0
  156. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/data_sources/errors.py +0 -0
  157. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/data_sources/sources.py +0 -0
  158. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/__init__.py +0 -0
  159. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/assets/zip_area_code_map.parquet +0 -0
  160. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/dataset_based_person_fields.py +0 -0
  161. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/email_address_utils.py +0 -0
  162. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/errors.py +0 -0
  163. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/national_id_utils.py +0 -0
  164. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/person.py +0 -0
  165. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/phone_number.py +0 -0
  166. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/errors.py +0 -0
  167. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/generator.py +0 -0
  168. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/jinja_utils.py +0 -0
  169. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/people_gen.py +0 -0
  170. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/person_constants.py +0 -0
  171. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/schema.py +0 -0
  172. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/schema_builder.py +0 -0
  173. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/utils.py +0 -0
  174. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/secret_resolver.py +0 -0
  175. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/storage/__init__.py +0 -0
  176. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/storage/artifact_storage.py +0 -0
  177. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/storage/media_storage.py +0 -0
  178. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/__init__.py +0 -0
  179. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/fixtures.py +0 -0
  180. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/observability.py +0 -0
  181. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/seed_readers.py +0 -0
  182. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/stubs.py +0 -0
  183. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/utils.py +0 -0
  184. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/utils/__init__.py +0 -0
  185. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/utils/token_counting.py +0 -0
  186. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validation.py +0 -0
  187. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/__init__.py +0 -0
  188. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/base.py +0 -0
  189. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/local_callable.py +0 -0
  190. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/python.py +0 -0
  191. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/remote.py +0 -0
  192. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/sql.py +0 -0
  193. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/__init__.py +0 -0
  194. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/conftest.py +0 -0
  195. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/__init__.py +0 -0
  196. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/column_profilers/test_base.py +0 -0
  197. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/column_profilers/test_judge_score_profiler.py +0 -0
  198. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/conftest.py +0 -0
  199. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_column_statistics_calculator.py +0 -0
  200. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_data/artifacts/dataset/column_configs.json +0 -0
  201. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_data/artifacts/dataset/dataset.json +0 -0
  202. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_data/artifacts/dataset/metadata.json +0 -0
  203. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_dataset_profiler.py +0 -0
  204. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_errors.py +0 -0
  205. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/utils/test_column_statistics_calculations.py +0 -0
  206. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/utils/test_judge_score_processing.py +0 -0
  207. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/__init__.py +0 -0
  208. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_async_generators.py +0 -0
  209. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_column_generator_base.py +0 -0
  210. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_custom.py +0 -0
  211. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_embedding.py +0 -0
  212. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_expression.py +0 -0
  213. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_image.py +0 -0
  214. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_llm_completion_generators.py +0 -0
  215. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_samplers.py +0 -0
  216. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_seed_dataset.py +0 -0
  217. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_validation.py +0 -0
  218. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/test_registry.py +0 -0
  219. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_column_generator_errors.py +0 -0
  220. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_generator_classification.py +0 -0
  221. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_judge_score_factory.py +0 -0
  222. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_prompt_renderer.py +0 -0
  223. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/conftest.py +0 -0
  224. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_completion.py +0 -0
  225. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_queue.py +0 -0
  226. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_resolver.py +0 -0
  227. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_resources.py +0 -0
  228. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_task_admission.py +0 -0
  229. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_task_model.py +0 -0
  230. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_task_policies.py +0 -0
  231. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_async_builder_integration.py +0 -0
  232. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_async_scheduler.py +0 -0
  233. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_dataset_builder.py +0 -0
  234. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_multi_column_configs.py +0 -0
  235. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_concurrency.py +0 -0
  236. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_config_compiler.py +0 -0
  237. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_execution_graph.py +0 -0
  238. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_row_group_buffer.py +0 -0
  239. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_skip_evaluator.py +0 -0
  240. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_skip_tracker.py +0 -0
  241. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_topological_sort.py +0 -0
  242. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/conftest.py +0 -0
  243. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_facade.py +0 -0
  244. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_factory.py +0 -0
  245. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_io.py +0 -0
  246. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_registry.py +0 -0
  247. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/__init__.py +0 -0
  248. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/__init__.py +0 -0
  249. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/conftest.py +0 -0
  250. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_httpx_sharding.py +0 -0
  251. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_model_request_executor.py +0 -0
  252. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_native_http_clients.py +0 -0
  253. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_parsing.py +0 -0
  254. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_retry.py +0 -0
  255. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_types.py +0 -0
  256. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/conftest.py +0 -0
  257. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_parser.py +0 -0
  258. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_parsers_types.py +0 -0
  259. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_postprocessors.py +0 -0
  260. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_tag_parsers.py +0 -0
  261. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/recipes/test_recipe_base.py +0 -0
  262. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/recipes/test_response_recipes.py +0 -0
  263. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/request_admission/test_controller.py +0 -0
  264. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/request_admission/test_request_queue.py +0 -0
  265. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/stub_secrets.json +0 -0
  266. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_model_errors.py +0 -0
  267. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_model_registry.py +0 -0
  268. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_model_utils.py +0 -0
  269. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_telemetry.py +0 -0
  270. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_usage.py +0 -0
  271. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/__init__.py +0 -0
  272. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/__init__.py +0 -0
  273. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_ast.py +0 -0
  274. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_environment.py +0 -0
  275. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_exceptions.py +0 -0
  276. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_record.py +0 -0
  277. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/__init__.py +0 -0
  278. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_exceptions.py +0 -0
  279. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_schema_transformers.py +0 -0
  280. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_types.py +0 -0
  281. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_validators.py +0 -0
  282. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/__init__.py +0 -0
  283. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/test_drop_columns.py +0 -0
  284. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/test_registry.py +0 -0
  285. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/test_schema_transform.py +0 -0
  286. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/test_utils.py +0 -0
  287. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/progress/terminal/test_throughput_panel.py +0 -0
  288. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/progress/test_tracker.py +0 -0
  289. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/__init__.py +0 -0
  290. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/conftest.py +0 -0
  291. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/test_base.py +0 -0
  292. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/test_data_designer_registry.py +0 -0
  293. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/test_errors.py +0 -0
  294. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/__init__.py +0 -0
  295. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/__init__.py +0 -0
  296. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_atif.py +0 -0
  297. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_claude_code.py +0 -0
  298. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_codex.py +0 -0
  299. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_hermes_agent.py +0 -0
  300. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_pi_coding_agent.py +0 -0
  301. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_utils.py +0 -0
  302. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/conftest.py +0 -0
  303. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_managed_dataset_generator.py +0 -0
  304. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_person_reader.py +0 -0
  305. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_resource_provider.py +0 -0
  306. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_seed_reader.py +0 -0
  307. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/conftest.py +0 -0
  308. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/data_sources/test_sampler_errors.py +0 -0
  309. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/data_sources/test_sources.py +0 -0
  310. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_email_address_utils.py +0 -0
  311. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_national_id_utils.py +0 -0
  312. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_person.py +0 -0
  313. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_phone_number.py +0 -0
  314. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_column.py +0 -0
  315. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_constraints.py +0 -0
  316. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_generator.py +0 -0
  317. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_jinja_utils.py +0 -0
  318. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_people_gen.py +0 -0
  319. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_schema.py +0 -0
  320. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_utils.py +0 -0
  321. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/storage/__init__.py +0 -0
  322. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/storage/test_artifact_storage.py +0 -0
  323. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/storage/test_media_storage.py +0 -0
  324. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_capacity.py +0 -0
  325. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_compiler.py +0 -0
  326. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_configurable_task.py +0 -0
  327. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_dataset_metadata.py +0 -0
  328. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_engine_errors.py +0 -0
  329. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_model_provider.py +0 -0
  330. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_observability.py +0 -0
  331. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_readiness.py +0 -0
  332. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_secret_resolver.py +0 -0
  333. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_validation.py +0 -0
  334. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/testing/test_plugin_testing_utils.py +0 -0
  335. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/utils/test_token_counting.py +0 -0
  336. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_local_callable.py +0 -0
  337. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_python.py +0 -0
  338. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_remote.py +0 -0
  339. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_sql.py +0 -0
  340. {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/test_plugin_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: data-designer-engine
3
- Version: 0.9.4
3
+ Version: 0.9.5
4
4
  Summary: Generation engine for DataDesigner synthetic data generation
5
5
  License-Expression: Apache-2.0
6
6
  Classifier: Development Status :: 4 - Beta
@@ -15,14 +15,11 @@ Classifier: Programming Language :: Python :: 3.14
15
15
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
16
16
  Requires-Python: >=3.10
17
17
  Requires-Dist: anyascii<1,>=0.3.3
18
- Requires-Dist: anyio<5,>=4.14.2
19
18
  Requires-Dist: asciichartpy<2,>=1.5.25
20
- Requires-Dist: chardet<6,>=3.0.2
21
- Requires-Dist: cryptography<51,>=50.0.0
22
- Requires-Dist: data-designer-config==0.9.4
19
+ Requires-Dist: data-designer-config==0.9.5
23
20
  Requires-Dist: duckdb<2,>=1.5.0
24
21
  Requires-Dist: faker<21,>=20.1.0
25
- Requires-Dist: fsspec<2026,>=2025.3.0
22
+ Requires-Dist: fsspec<2027,>=2026.6.0
26
23
  Requires-Dist: httpx-retries<1,>=0.4.2
27
24
  Requires-Dist: httpx<1,>=0.27.2
28
25
  Requires-Dist: huggingface-hub<2,>=1.0.1
@@ -30,7 +27,7 @@ Requires-Dist: jinja2<4,>=3.1.6
30
27
  Requires-Dist: json-repair<1,>=0.48.0
31
28
  Requires-Dist: jsonpath-rust-bindings<2,>=1.0
32
29
  Requires-Dist: jsonschema<5,>=4.0.0
33
- Requires-Dist: lxml<7,>=6.1.0
30
+ Requires-Dist: lxml<7,>=6.1.1
34
31
  Requires-Dist: marko<3,>=2.1.2
35
32
  Requires-Dist: mcp<2,>=1.29.0
36
33
  Requires-Dist: networkx<4,>=3.0
@@ -38,13 +35,10 @@ Requires-Dist: numpy<3,>=1.23.5
38
35
  Requires-Dist: pandas<4,>=2.3.3
39
36
  Requires-Dist: pyarrow<25,>=24
40
37
  Requires-Dist: pydantic<3,>=2.9.2
41
- Requires-Dist: pyjwt[crypto]<3,>=2.15.0
42
- Requires-Dist: python-multipart<1,>=0.0.32
43
38
  Requires-Dist: rich<15,>=13.7.1
44
39
  Requires-Dist: ruff<1,>=0.14.10
45
40
  Requires-Dist: scipy<2,>=1.11.0
46
41
  Requires-Dist: sqlfluff<5,>=4.1.0
47
- Requires-Dist: starlette<2,>=1.2.0
48
42
  Requires-Dist: tiktoken<1,>=0.8.0
49
43
  Requires-Dist: wcwidth<1,>=0.2.13
50
44
  Description-Content-Type: text/markdown
@@ -34,14 +34,11 @@ bump = true
34
34
  [tool.hatch.metadata.hooks.uv-dynamic-versioning]
35
35
  dependencies = [
36
36
  "anyascii>=0.3.3,<1",
37
- "anyio>=4.14.2,<5", # 4.14.2 fixes AnyIO security advisories pulled in by HTTP clients
38
37
  "asciichartpy>=1.5.25,<2",
39
- "chardet>=3.0.2,<6", # Pulled in by sqlfluff
40
- "cryptography>=50.0.0,<51", # 50.0.0 fixes certificate and PKCS#7 security advisories
41
38
  "data-designer-config=={{ version }}",
42
39
  "duckdb>=1.5.0,<2",
43
40
  "faker>=20.1.0,<21",
44
- "fsspec>=2025.3.0,<2026",
41
+ "fsspec>=2026.6.0,<2027", # 2026.6.0 fixes CVE-2026-104851
45
42
  "httpx>=0.27.2,<1",
46
43
  "httpx-retries>=0.4.2,<1",
47
44
  "huggingface-hub>=1.0.1,<2",
@@ -49,7 +46,7 @@ dependencies = [
49
46
  "json-repair>=0.48.0,<1",
50
47
  "jsonpath-rust-bindings>=1.0,<2",
51
48
  "jsonschema>=4.0.0,<5",
52
- "lxml>=6.1.0,<7",
49
+ "lxml>=6.1.1,<7", # 6.1.1 fixes CVE-2026-49825
53
50
  "marko>=2.1.2,<3",
54
51
  "mcp>=1.29.0,<2", # 1.29.0 fixes MCP security advisories
55
52
  "networkx>=3.0,<4",
@@ -57,13 +54,10 @@ dependencies = [
57
54
  "pandas>=2.3.3,<4",
58
55
  "pyarrow>=24,<25", # 24.0.0 fixes PyArrow security advisories
59
56
  "pydantic>=2.9.2,<3",
60
- "pyjwt[crypto]>=2.15.0,<3", # 2.15.0 fixes PyJWT security advisories pulled in by mcp
61
- "python-multipart>=0.0.32,<1", # 0.0.32 addresses multipart security advisories pulled in by mcp
62
57
  "rich>=13.7.1,<15",
63
58
  "ruff>=0.14.10,<1",
64
59
  "scipy>=1.11.0,<2",
65
60
  "sqlfluff>=4.1.0,<5",
66
- "starlette>=1.2.0,<2", # 1.2.0 fixes security advisory pulled in by mcp
67
61
  "tiktoken>=0.8.0,<1",
68
62
  "wcwidth>=0.2.13,<1",
69
63
  ]
@@ -45,6 +45,7 @@ class AnthropicClient(HttpModelClient):
45
45
  "stop",
46
46
  "max_tokens",
47
47
  "tools",
48
+ "tool_choice",
48
49
  "n",
49
50
  "response_format",
50
51
  "frequency_penalty",
@@ -33,6 +33,12 @@ _UNSUPPORTED_MEDIA_BLOCK_MODALITIES: dict[str, str] = {
33
33
  "video_url": "video",
34
34
  "input_video": "video",
35
35
  }
36
+ _OPENAI_TOOL_CHOICE_TO_ANTHROPIC_TYPE: dict[str, str] = {
37
+ "auto": "auto",
38
+ "required": "any",
39
+ "none": "none",
40
+ }
41
+ _ANTHROPIC_TOOL_CHOICE_TYPES = frozenset({"auto", "any", "none", "tool"})
36
42
 
37
43
 
38
44
  class UnsupportedAnthropicMediaBlockError(ValueError):
@@ -77,6 +83,9 @@ def build_anthropic_payload(request: ChatCompletionRequest) -> dict[str, Any]:
77
83
  if request.tools:
78
84
  payload["tools"] = [translate_tool_definition(tool) for tool in request.tools]
79
85
 
86
+ if request.tool_choice is not None:
87
+ payload["tool_choice"] = translate_tool_choice(request.tool_choice)
88
+
80
89
  if request.stop is not None:
81
90
  if isinstance(request.stop, str):
82
91
  payload["stop_sequences"] = [request.stop]
@@ -276,6 +285,43 @@ def translate_tool_definition(tool: dict[str, Any]) -> dict[str, Any]:
276
285
  return translated_tool
277
286
 
278
287
 
288
+ def translate_tool_choice(tool_choice: Any) -> dict[str, Any]:
289
+ """Translate an OpenAI-style ``tool_choice`` into Anthropic's format.
290
+
291
+ Anthropic-native values (``{"type": "auto" | "any" | "none"}`` or
292
+ ``{"type": "tool", "name": ...}``) pass through unchanged.
293
+
294
+ Raises:
295
+ ValueError: If the value has no Anthropic equivalent.
296
+ """
297
+ if isinstance(tool_choice, str):
298
+ choice_type = _OPENAI_TOOL_CHOICE_TO_ANTHROPIC_TYPE.get(tool_choice)
299
+ if choice_type is None:
300
+ raise ValueError(
301
+ f"Anthropic tool_choice must be 'auto', 'required', 'none', or a named function, got: {tool_choice!r}"
302
+ )
303
+ return {"type": choice_type}
304
+
305
+ if not isinstance(tool_choice, dict):
306
+ raise ValueError(f"Anthropic tool_choice must be a string or an object, got: {tool_choice!r}")
307
+
308
+ choice_type = tool_choice.get("type")
309
+ if choice_type == "function":
310
+ function = tool_choice.get("function")
311
+ name = function.get("name") if isinstance(function, dict) else None
312
+ if not isinstance(name, str) or not name:
313
+ raise ValueError(f"Anthropic tool_choice is missing a function name, got: {tool_choice!r}")
314
+ return {"type": "tool", "name": name}
315
+
316
+ if not isinstance(choice_type, str) or choice_type not in _ANTHROPIC_TOOL_CHOICE_TYPES:
317
+ raise ValueError(f"Anthropic tool_choice has an unsupported type, got: {tool_choice!r}")
318
+ if choice_type == "tool":
319
+ name = tool_choice.get("name")
320
+ if not isinstance(name, str) or not name:
321
+ raise ValueError(f"Anthropic tool_choice is missing a tool name, got: {tool_choice!r}")
322
+ return dict(tool_choice)
323
+
324
+
279
325
  def translate_tool_calls(tool_calls: Any) -> list[dict[str, Any]]:
280
326
  if not isinstance(tool_calls, list):
281
327
  raise ValueError(f"Anthropic assistant tool calls must be a list, got: {tool_calls!r}")
@@ -8,6 +8,7 @@ import email.utils
8
8
  import time
9
9
  from enum import Enum
10
10
 
11
+ import data_designer.lazy_heavy_imports as lazy
11
12
  from data_designer.engine.models.clients.types import HttpResponse
12
13
 
13
14
 
@@ -204,11 +205,18 @@ def _parse_http_date_as_delay(value: str) -> float | None:
204
205
 
205
206
 
206
207
  def infer_error_kind_from_exception(exc: Exception) -> ProviderErrorKind:
207
- """Infer a ``ProviderErrorKind`` from an exception's type name.
208
+ """Infer a ``ProviderErrorKind`` from HTTPX types or an exception's type name.
208
209
 
209
210
  Used by adapters to classify transport-level exceptions (timeouts,
210
211
  connection failures, etc.) that don't carry an HTTP status code.
211
212
  """
213
+ # Include stale keep-alive failures so the request executor can retry them.
214
+ # These can also occur after a POST was processed. We accept possible duplicate
215
+ # generation or billing to recover from transient failures, matching the
216
+ # existing transport retry policy.
217
+ # Local protocol errors are client mistakes and should not be retried.
218
+ if isinstance(exc, (lazy.httpx.NetworkError, lazy.httpx.RemoteProtocolError)):
219
+ return ProviderErrorKind.API_CONNECTION
212
220
  type_name = type(exc).__name__.lower()
213
221
  if "timeout" in type_name:
214
222
  return ProviderErrorKind.TIMEOUT
@@ -61,6 +61,7 @@ class ChatCompletionRequest:
61
61
  model: str
62
62
  messages: list[dict[str, Any]]
63
63
  tools: list[dict[str, Any]] | None = None
64
+ tool_choice: str | dict[str, Any] | None = None
64
65
  n: int | None = None
65
66
  temperature: float | None = None
66
67
  top_p: float | None = None
@@ -91,10 +91,11 @@ def _build_generation_validation_error(
91
91
 
92
92
  # Known keyword arguments extracted into request fields for each modality.
93
93
  # Note: `extra_body` and `extra_headers` appear in every set but receive special
94
- # treatment in `consolidate_kwargs` (merged with provider-level overrides) and in
95
- # `TransportKwargs` (extra_body is either flattened into the request body or
96
- # preserved as a nested dict depending on the adapter; extra_headers are
97
- # forwarded as HTTP headers). They are NOT regular model parameters.
94
+ # treatment in `consolidate_kwargs` (`extra_body` is merged key by key: model
95
+ # config, then the call, then the provider) and in `TransportKwargs`
96
+ # (extra_body keys are merged into the request body and take precedence over
97
+ # same-named request fields; extra_headers are forwarded as HTTP headers).
98
+ # They are NOT regular model parameters.
98
99
  _COMPLETION_REQUEST_FIELDS = frozenset(
99
100
  {
100
101
  "temperature",
@@ -108,6 +109,7 @@ _COMPLETION_REQUEST_FIELDS = frozenset(
108
109
  "presence_penalty",
109
110
  "timeout",
110
111
  "tools",
112
+ "tool_choice",
111
113
  "extra_body",
112
114
  "extra_headers",
113
115
  }
@@ -146,6 +148,7 @@ class ModelFacade:
146
148
  self._client = client
147
149
  self._mcp_registry = mcp_registry
148
150
  self._usage_stats = ModelUsageStats()
151
+ self._warned_dropped_kwargs: set[frozenset[str]] = set()
149
152
 
150
153
  @property
151
154
  def model_name(self) -> str:
@@ -187,11 +190,23 @@ class ModelFacade:
187
190
  return self._usage_stats
188
191
 
189
192
  def consolidate_kwargs(self, **kwargs: Any) -> dict[str, Any]:
193
+ """Combine the model's inference parameters, the call's kwargs, and the provider's extras.
194
+
195
+ Call kwargs override inference parameters. ``extra_body`` is merged key by key in the order
196
+ model config, call, provider, so a later source wins only for the keys it sets; nested values
197
+ are replaced, not merged. Provider ``extra_headers`` override the call's.
198
+ """
190
199
  # Remove purpose from kwargs to avoid passing it to the model
191
200
  kwargs.pop("purpose", None)
192
- kwargs = {**self._model_config.inference_parameters.generate_kwargs, **kwargs}
193
- if self.model_provider.extra_body:
194
- kwargs["extra_body"] = {**kwargs.get("extra_body", {}), **self.model_provider.extra_body}
201
+ inference_kwargs = self._model_config.inference_parameters.generate_kwargs
202
+ extra_body = {
203
+ **(inference_kwargs.get("extra_body") or {}),
204
+ **(kwargs.get("extra_body") or {}),
205
+ **(self.model_provider.extra_body or {}),
206
+ }
207
+ kwargs = {**inference_kwargs, **kwargs}
208
+ if extra_body:
209
+ kwargs["extra_body"] = extra_body
195
210
  if self.model_provider.extra_headers:
196
211
  kwargs["extra_headers"] = {**(kwargs.get("extra_headers") or {}), **self.model_provider.extra_headers}
197
212
  # Inject framework-level attribution header when telemetry is enabled.
@@ -337,7 +352,10 @@ class ModelFacade:
337
352
  skip_usage_tracking (bool): Whether to skip usage tracking. Default: `False`.
338
353
  purpose (str): The purpose of the model usage to show as context in the error message.
339
354
  It is expected to be used by the @catch_llm_exceptions decorator.
340
- **kwargs: Additional arguments to pass to the model.
355
+ **kwargs: Request arguments sent with every completion, such as ``temperature``,
356
+ ``tool_choice``, or ``extra_body`` (merged as described in ``consolidate_kwargs``).
357
+ With ``tool_alias``, ``tool_choice`` applies only until the first tool call; a
358
+ ``tool_choice`` inside ``extra_body`` is sent unchanged on every round.
341
359
 
342
360
  Returns:
343
361
  A tuple containing:
@@ -380,6 +398,10 @@ class ModelFacade:
380
398
  completion_kwargs.pop("allow_multiple_choices", None)
381
399
  if tool_schemas is not None:
382
400
  completion_kwargs["tools"] = tool_schemas
401
+ if tool_call_turns > 0:
402
+ # A forced tool_choice holds only until the first tool call. Repeating it would make every
403
+ # response a tool call, so the tool loop could never end.
404
+ completion_kwargs.pop("tool_choice", None)
383
405
 
384
406
  completion_response = self.completion(
385
407
  messages,
@@ -497,6 +519,10 @@ class ModelFacade:
497
519
  completion_kwargs.pop("allow_multiple_choices", None)
498
520
  if tool_schemas is not None:
499
521
  completion_kwargs["tools"] = tool_schemas
522
+ if tool_call_turns > 0:
523
+ # A forced tool_choice holds only until the first tool call. Repeating it would make every
524
+ # response a tool call, so the tool loop could never end.
525
+ completion_kwargs.pop("tool_choice", None)
500
526
 
501
527
  completion_response = await self.acompletion(
502
528
  messages,
@@ -814,10 +840,15 @@ class ModelFacade:
814
840
  metadata[key] = value
815
841
 
816
842
  if metadata:
817
- logger.debug(
818
- "Unknown kwargs %s dropped (not forwarded as model parameters). "
843
+ # Warn once per set of names; repeats go to DEBUG so a per-record call can't flood the log.
844
+ dropped = frozenset(metadata)
845
+ log = logger.debug if dropped in self._warned_dropped_kwargs else logger.warning
846
+ self._warned_dropped_kwargs.add(dropped)
847
+ log(
848
+ "Unknown kwargs %s dropped for model %r (not forwarded as model parameters). "
819
849
  "Use 'extra_body' to pass non-standard parameters to the model.",
820
- metadata.keys(),
850
+ sorted(dropped),
851
+ self.model_alias,
821
852
  )
822
853
 
823
854
  return ChatCompletionRequest(**request_fields)
@@ -267,6 +267,57 @@ def test_completion_translates_openai_tool_schema_to_anthropic() -> None:
267
267
  "input_schema": {"type": "object", "properties": {"query": {"type": "string"}}},
268
268
  }
269
269
  ]
270
+ assert "tool_choice" not in payload
271
+
272
+
273
+ def test_completion_translates_tool_choice_to_anthropic() -> None:
274
+ sync_mock = make_mock_sync_client(_text_response())
275
+ client = _make_client(sync_client=sync_mock)
276
+
277
+ request = ChatCompletionRequest(
278
+ model=MODEL,
279
+ messages=[{"role": "user", "content": "Hi"}],
280
+ tools=[{"type": "function", "function": {"name": "search"}}],
281
+ tool_choice={"type": "function", "function": {"name": "search"}},
282
+ )
283
+ client.completion(request)
284
+
285
+ payload = sync_mock.post.call_args.kwargs["json"]
286
+ assert payload["tool_choice"] == {"type": "tool", "name": "search"}
287
+
288
+
289
+ @pytest.mark.asyncio
290
+ async def test_acompletion_translates_tool_choice_to_anthropic() -> None:
291
+ async_mock = make_mock_async_client(_text_response())
292
+ client = _make_client(async_client=async_mock)
293
+
294
+ request = ChatCompletionRequest(
295
+ model=MODEL,
296
+ messages=[{"role": "user", "content": "Hi"}],
297
+ tools=[{"type": "function", "function": {"name": "search"}}],
298
+ tool_choice="required",
299
+ )
300
+ await client.acompletion(request)
301
+
302
+ payload = async_mock.post.call_args.kwargs["json"]
303
+ assert payload["tool_choice"] == {"type": "any"}
304
+
305
+
306
+ def test_completion_extra_body_tool_choice_overrides_translated_value() -> None:
307
+ sync_mock = make_mock_sync_client(_text_response())
308
+ client = _make_client(sync_client=sync_mock)
309
+
310
+ request = ChatCompletionRequest(
311
+ model=MODEL,
312
+ messages=[{"role": "user", "content": "Hi"}],
313
+ tools=[{"type": "function", "function": {"name": "search"}}],
314
+ tool_choice="required",
315
+ extra_body={"tool_choice": {"type": "auto", "disable_parallel_tool_use": True}},
316
+ )
317
+ client.completion(request)
318
+
319
+ payload = sync_mock.post.call_args.kwargs["json"]
320
+ assert payload["tool_choice"] == {"type": "auto", "disable_parallel_tool_use": True}
270
321
 
271
322
 
272
323
  def test_completion_translates_tool_turns_from_chat_messages() -> None:
@@ -666,6 +717,30 @@ def test_http_error_maps_to_provider_error(status_code: int, expected_kind: Prov
666
717
  assert exc_info.value.kind == expected_kind
667
718
 
668
719
 
720
+ def test_http_400_tool_choice_rejection_maps_to_unsupported_params() -> None:
721
+ error_json = {
722
+ "error": {
723
+ "type": "invalid_request_error",
724
+ "message": 'tool_choice: type "tool" and "any" are not supported for this model.',
725
+ }
726
+ }
727
+ sync_mock = make_mock_sync_client(error_json, status_code=400)
728
+ client = _make_client(sync_client=sync_mock)
729
+
730
+ request = ChatCompletionRequest(
731
+ model=MODEL,
732
+ messages=[{"role": "user", "content": "Hi"}],
733
+ tools=[{"type": "function", "function": {"name": "search"}}],
734
+ tool_choice="required",
735
+ )
736
+ with pytest.raises(ProviderError) as exc_info:
737
+ client.completion(request)
738
+
739
+ assert exc_info.value.kind == ProviderErrorKind.UNSUPPORTED_PARAMS
740
+ assert "not supported for this model" in exc_info.value.message
741
+ sync_mock.post.assert_called_once()
742
+
743
+
669
744
  def test_transport_timeout_raises_provider_error() -> None:
670
745
  sync_mock = MagicMock()
671
746
  sync_mock.post = MagicMock(side_effect=TimeoutError("timed out"))
@@ -721,6 +796,28 @@ def test_completion_wraps_invalid_tool_schema_as_bad_request() -> None:
721
796
  assert "missing a function name" in exc_info.value.message
722
797
 
723
798
 
799
+ @pytest.mark.parametrize(
800
+ "tool_choice",
801
+ [
802
+ pytest.param("always", id="unknown-string"),
803
+ pytest.param({"type": []}, id="malformed-type"),
804
+ ],
805
+ )
806
+ def test_completion_wraps_unsupported_tool_choice_as_bad_request(tool_choice: object) -> None:
807
+ client = _make_client()
808
+ request = ChatCompletionRequest(
809
+ model=MODEL,
810
+ messages=[{"role": "user", "content": "Hi"}],
811
+ tool_choice=tool_choice,
812
+ )
813
+
814
+ with pytest.raises(ProviderError) as exc_info:
815
+ client.completion(request)
816
+
817
+ assert exc_info.value.kind == ProviderErrorKind.BAD_REQUEST
818
+ assert "tool_choice" in exc_info.value.message
819
+
820
+
724
821
  # --- Unsupported capabilities ---
725
822
 
726
823
 
@@ -24,6 +24,7 @@ from data_designer.engine.models.clients.adapters.anthropic_translation import (
24
24
  translate_request_messages,
25
25
  translate_tool_call,
26
26
  translate_tool_calls,
27
+ translate_tool_choice,
27
28
  translate_tool_definition,
28
29
  translate_tool_result_content,
29
30
  translate_tool_result_message,
@@ -345,6 +346,56 @@ def test_translate_tool_definition_normalizes_supported_shapes(
345
346
  assert translate_tool_definition(tool) == expected
346
347
 
347
348
 
349
+ @pytest.mark.parametrize(
350
+ ("tool_choice", "expected"),
351
+ [
352
+ pytest.param("auto", {"type": "auto"}, id="openai-auto"),
353
+ pytest.param("required", {"type": "any"}, id="openai-required"),
354
+ pytest.param("none", {"type": "none"}, id="openai-none"),
355
+ pytest.param(
356
+ {"type": "function", "function": {"name": "search"}},
357
+ {"type": "tool", "name": "search"},
358
+ id="openai-named-function",
359
+ ),
360
+ pytest.param(
361
+ {"type": "tool", "name": "search"},
362
+ {"type": "tool", "name": "search"},
363
+ id="anthropic-named-tool",
364
+ ),
365
+ pytest.param(
366
+ {"type": "any", "disable_parallel_tool_use": True},
367
+ {"type": "any", "disable_parallel_tool_use": True},
368
+ id="anthropic-any",
369
+ ),
370
+ ],
371
+ )
372
+ def test_translate_tool_choice_normalizes_supported_shapes(
373
+ tool_choice: object,
374
+ expected: dict[str, object],
375
+ ) -> None:
376
+ translated = translate_tool_choice(tool_choice)
377
+
378
+ assert translated == expected
379
+ assert translated is not tool_choice
380
+
381
+
382
+ @pytest.mark.parametrize(
383
+ ("tool_choice", "match"),
384
+ [
385
+ pytest.param("always", "must be 'auto', 'required', 'none', or a named function", id="unknown-string"),
386
+ pytest.param({"type": "function", "function": {}}, "missing a function name", id="function-without-name"),
387
+ pytest.param({"type": "tool"}, "missing a tool name", id="tool-without-name"),
388
+ pytest.param({"type": "bogus"}, "unsupported type", id="unknown-type"),
389
+ pytest.param({"type": []}, "unsupported type", id="list-type"),
390
+ pytest.param({"type": {}}, "unsupported type", id="dict-type"),
391
+ pytest.param(1, "must be a string or an object", id="wrong-type"),
392
+ ],
393
+ )
394
+ def test_translate_tool_choice_rejects_unsupported_values(tool_choice: object, match: str) -> None:
395
+ with pytest.raises(ValueError, match=match):
396
+ translate_tool_choice(tool_choice)
397
+
398
+
348
399
  def test_translate_content_blocks_converts_images_and_preserves_other_blocks() -> None:
349
400
  blocks = translate_content_blocks(
350
401
  [
@@ -5,16 +5,49 @@ from __future__ import annotations
5
5
 
6
6
  from typing import Any
7
7
 
8
+ import httpx
8
9
  import pytest
9
10
 
10
11
  from data_designer.engine.models.clients.errors import (
11
12
  ProviderError,
12
13
  ProviderErrorKind,
14
+ infer_error_kind_from_exception,
13
15
  map_http_error_to_provider_error,
14
16
  map_http_status_to_provider_error_kind,
15
17
  )
16
18
 
17
19
 
20
+ class PeerDropped(httpx.ReadError):
21
+ pass
22
+
23
+
24
+ @pytest.mark.parametrize(
25
+ "exception_type,expected_kind",
26
+ [
27
+ (httpx.NetworkError, ProviderErrorKind.API_CONNECTION),
28
+ (httpx.ConnectError, ProviderErrorKind.API_CONNECTION),
29
+ (httpx.ReadError, ProviderErrorKind.API_CONNECTION),
30
+ (httpx.WriteError, ProviderErrorKind.API_CONNECTION),
31
+ (httpx.CloseError, ProviderErrorKind.API_CONNECTION),
32
+ (httpx.RemoteProtocolError, ProviderErrorKind.API_CONNECTION),
33
+ (PeerDropped, ProviderErrorKind.API_CONNECTION),
34
+ (httpx.ConnectTimeout, ProviderErrorKind.TIMEOUT),
35
+ (httpx.ReadTimeout, ProviderErrorKind.TIMEOUT),
36
+ (httpx.WriteTimeout, ProviderErrorKind.TIMEOUT),
37
+ (httpx.PoolTimeout, ProviderErrorKind.TIMEOUT),
38
+ (httpx.LocalProtocolError, ProviderErrorKind.API_ERROR),
39
+ (httpx.UnsupportedProtocol, ProviderErrorKind.API_ERROR),
40
+ (httpx.DecodingError, ProviderErrorKind.API_ERROR),
41
+ (ConnectionError, ProviderErrorKind.API_CONNECTION),
42
+ (TimeoutError, ProviderErrorKind.TIMEOUT),
43
+ (RuntimeError, ProviderErrorKind.API_ERROR),
44
+ ],
45
+ ids=lambda value: value.__name__ if isinstance(value, type) else value.value,
46
+ )
47
+ def test_infer_error_kind_from_exception(exception_type: type[Exception], expected_kind: ProviderErrorKind) -> None:
48
+ assert infer_error_kind_from_exception(exception_type("Server disconnected")) == expected_kind
49
+
50
+
18
51
  class StubHttpResponse:
19
52
  def __init__(
20
53
  self,
@@ -3,9 +3,12 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
+ import asyncio
6
7
  from unittest.mock import MagicMock
7
8
 
9
+ import httpx
8
10
  import pytest
11
+ from pytest_httpx import HTTPXMock
9
12
 
10
13
  from data_designer.config.models import (
11
14
  ChatCompletionInferenceParams,
@@ -17,9 +20,11 @@ from data_designer.engine.model_provider import ModelProviderRegistry
17
20
  from data_designer.engine.models.clients.adapters.anthropic import AnthropicClient
18
21
  from data_designer.engine.models.clients.adapters.http_model_client import ClientConcurrencyMode
19
22
  from data_designer.engine.models.clients.adapters.openai_compatible import OpenAICompatibleClient
23
+ from data_designer.engine.models.clients.errors import ProviderError, ProviderErrorKind
20
24
  from data_designer.engine.models.clients.factory import create_model_client
21
25
  from data_designer.engine.models.clients.model_request_executor import ModelRequestExecutor
22
26
  from data_designer.engine.models.clients.retry import RetryConfig
27
+ from data_designer.engine.models.clients.types import ChatCompletionRequest
23
28
  from data_designer.engine.models.request_admission.controller import AdaptiveRequestAdmissionController
24
29
  from data_designer.engine.secret_resolver import SecretResolver
25
30
  from data_designer.engine.testing import InMemoryAdmissionEventSink
@@ -247,3 +252,98 @@ def test_no_request_admission_returns_inner_client_directly(
247
252
  client = create_model_client(openai_model_config, secret_resolver, openai_registry)
248
253
  assert isinstance(client, OpenAICompatibleClient)
249
254
  assert not isinstance(client, ModelRequestExecutor)
255
+
256
+
257
+ @pytest.mark.asyncio(loop_scope="session")
258
+ @pytest.mark.parametrize("concurrency_mode", [ClientConcurrencyMode.SYNC, ClientConcurrencyMode.ASYNC])
259
+ @pytest.mark.parametrize("exception_type", [httpx.RemoteProtocolError, httpx.ReadError, httpx.WriteError])
260
+ async def test_request_admission_retries_transport_errors(
261
+ openai_model_config: ModelConfig,
262
+ secret_resolver: SecretResolver,
263
+ openai_registry: ModelProviderRegistry,
264
+ httpx_mock: HTTPXMock,
265
+ concurrency_mode: ClientConcurrencyMode,
266
+ exception_type: type[httpx.TransportError],
267
+ ) -> None:
268
+ sink = InMemoryAdmissionEventSink()
269
+ controller = AdaptiveRequestAdmissionController(event_sink=sink)
270
+ controller.register(provider_name="openai-prod", model_id="gpt-test", alias="test-model", max_parallel_requests=1)
271
+ client = create_model_client(
272
+ openai_model_config,
273
+ secret_resolver,
274
+ openai_registry,
275
+ retry_config=RetryConfig(max_retries=1, backoff_factor=0.0),
276
+ client_concurrency_mode=concurrency_mode,
277
+ request_admission=controller,
278
+ request_event_sink=sink,
279
+ )
280
+ httpx_mock.add_exception(exception_type("Server disconnected without sending a response."))
281
+ httpx_mock.add_response(json={"choices": [{"message": {"role": "assistant", "content": "ok"}}]})
282
+ request = ChatCompletionRequest(model="gpt-test", messages=[])
283
+
284
+ try:
285
+ response = (
286
+ await client.acompletion(request)
287
+ if concurrency_mode == ClientConcurrencyMode.ASYNC
288
+ else await asyncio.to_thread(client.completion, request)
289
+ )
290
+ finally:
291
+ await client.aclose()
292
+ client.close()
293
+
294
+ assert response.message.content == "ok"
295
+ assert len(httpx_mock.get_requests()) == 2
296
+ acquired = [event for event in sink.request_events if event.event_kind == "request_lease_acquired"]
297
+ released = [event for event in sink.request_events if event.event_kind == "request_lease_released"]
298
+ assert len(acquired) == len(released) == 2
299
+ assert len({event.request_lease_id for event in acquired}) == 2
300
+ assert {event.request_lease_id for event in acquired} == {event.request_lease_id for event in released}
301
+ completed = [event for event in sink.request_events if event.event_kind == "model_request_completed"]
302
+ assert [event.diagnostics["outcome"] for event in completed] == ["api_connection", "success"]
303
+
304
+
305
+ @pytest.mark.asyncio(loop_scope="session")
306
+ @pytest.mark.parametrize("concurrency_mode", [ClientConcurrencyMode.SYNC, ClientConcurrencyMode.ASYNC])
307
+ @pytest.mark.parametrize("exception_type", [httpx.RemoteProtocolError, httpx.ReadError, httpx.WriteError])
308
+ @pytest.mark.parametrize("max_retries", [0, 2])
309
+ async def test_request_admission_transport_errors_respect_retry_budget(
310
+ openai_model_config: ModelConfig,
311
+ secret_resolver: SecretResolver,
312
+ openai_registry: ModelProviderRegistry,
313
+ httpx_mock: HTTPXMock,
314
+ concurrency_mode: ClientConcurrencyMode,
315
+ exception_type: type[httpx.TransportError],
316
+ max_retries: int,
317
+ ) -> None:
318
+ controller = AdaptiveRequestAdmissionController()
319
+ controller.register(provider_name="openai-prod", model_id="gpt-test", alias="test-model", max_parallel_requests=1)
320
+ client = create_model_client(
321
+ openai_model_config,
322
+ secret_resolver,
323
+ openai_registry,
324
+ retry_config=RetryConfig(max_retries=max_retries, backoff_factor=0.0),
325
+ client_concurrency_mode=concurrency_mode,
326
+ request_admission=controller,
327
+ )
328
+ error = exception_type("Server disconnected")
329
+ httpx_mock.add_exception(error, is_reusable=True)
330
+ request = ChatCompletionRequest(model="gpt-test", messages=[])
331
+
332
+ try:
333
+ with pytest.raises(ProviderError) as exc_info:
334
+ if concurrency_mode == ClientConcurrencyMode.ASYNC:
335
+ await client.acompletion(request)
336
+ else:
337
+ await asyncio.to_thread(client.completion, request)
338
+ finally:
339
+ await client.aclose()
340
+ client.close()
341
+
342
+ assert exc_info.value.kind == ProviderErrorKind.API_CONNECTION
343
+ assert exc_info.value.__cause__ is error
344
+ assert exc_info.value.provider_name == "openai-prod"
345
+ assert exc_info.value.model_name == "gpt-test"
346
+ assert len(httpx_mock.get_requests()) == max_retries + 1
347
+ snapshot = controller.pressure.global_snapshot("openai-prod", "gpt-test")
348
+ assert snapshot is not None
349
+ assert snapshot.aggregate_in_flight == 0