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.
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/PKG-INFO +4 -10
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/pyproject.toml +2 -8
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/anthropic.py +1 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/anthropic_translation.py +46 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/errors.py +9 -1
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/types.py +1 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/facade.py +42 -11
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_anthropic.py +97 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_anthropic_translation.py +51 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_client_errors.py +33 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_factory.py +100 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_openai_compatible.py +54 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_facade.py +268 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/.gitignore +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/README.md +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/column_profilers/base.py +0 -0
- {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
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/column_profilers/registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/column_statistics.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/dataset_profiler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/utils/column_statistics_calculations.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/analysis/utils/judge_score_processing.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/capacity.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/custom.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/embedding.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/expression.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/image.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/llm_completion.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/samplers.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/seed_dataset.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/generators/validation.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/utils/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/utils/generator_classification.py +0 -0
- {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
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/column_generators/utils/prompt_renderer.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/compiler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/configurable_task.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/context.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/async_scheduler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/dataset_builder.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/multi_column_configs.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/row_group_plan.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/completion.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/queue.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/resolver.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/resources.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/task_admission.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/task_model.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/scheduling/task_policies.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/async_concurrency.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/concurrency.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/config_compiler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/execution_graph.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/processor_runner.py +0 -0
- {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
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/skip_evaluator.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/dataset_builders/utils/skip_tracker.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/facade.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/factory.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/io.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/mcp/registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/model_provider.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/http_helpers.py +0 -0
- {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
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/httpx_sharding.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/adapters/openai_compatible.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/factory.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/model_request_executor.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/parsing.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/clients/retry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/factory.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/parser.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/postprocessors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/tag_parsers.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/parsers/types.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/recipes/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/recipes/response_recipes.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/config.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/controller.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/limits.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/outcomes.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/pressure.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/queue.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/resolver.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/request_admission/resources.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/resources.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/telemetry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/usage.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/usage_events.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/observability.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/ast.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/environment.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/exceptions.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/ginja/record.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/exceptions.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/schema_transformers.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/types.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/gsonschema/validators.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/drop_columns.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/processors/schema_transform.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/processing/utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/reporter.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/terminal/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/terminal/throughput_panel.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/progress/tracker.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/readiness.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/registry/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/registry/data_designer_registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/registry/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/atif.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/claude_code.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/codex.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/hermes_agent.py +0 -0
- {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
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/types.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/agent_rollout/utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/managed_dataset_generator.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/person_reader.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/resource_provider.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/resources/seed_reader.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/column.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/constraints.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/data_sources/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/data_sources/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/data_sources/sources.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/__init__.py +0 -0
- {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
- {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
- {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
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/errors.py +0 -0
- {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
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/person.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/entities/phone_number.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/generator.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/jinja_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/people_gen.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/person_constants.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/schema.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/schema_builder.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/sampling_gen/utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/secret_resolver.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/storage/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/storage/artifact_storage.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/storage/media_storage.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/fixtures.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/observability.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/seed_readers.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/stubs.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/testing/utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/utils/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/utils/token_counting.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validation.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/local_callable.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/python.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/remote.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/validators/sql.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/column_profilers/test_base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/column_profilers/test_judge_score_profiler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_column_statistics_calculator.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_data/artifacts/dataset/column_configs.json +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_data/artifacts/dataset/dataset.json +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_data/artifacts/dataset/metadata.json +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_dataset_profiler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/test_errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/utils/test_column_statistics_calculations.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/analysis/utils/test_judge_score_processing.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_async_generators.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_column_generator_base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_custom.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_embedding.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_expression.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_image.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_llm_completion_generators.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_samplers.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_seed_dataset.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/generators/test_validation.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/test_registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_column_generator_errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_generator_classification.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_judge_score_factory.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/column_generators/utils/test_prompt_renderer.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_completion.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_queue.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_resolver.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_resources.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_task_admission.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_task_model.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/scheduling/test_task_policies.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_async_builder_integration.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_async_scheduler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_dataset_builder.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/test_multi_column_configs.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_concurrency.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_config_compiler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_execution_graph.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_row_group_buffer.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_skip_evaluator.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_skip_tracker.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/dataset_builders/utils/test_topological_sort.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_facade.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_factory.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_io.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/mcp/test_mcp_registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_httpx_sharding.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_model_request_executor.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_native_http_clients.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_parsing.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_retry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/clients/test_types.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_parser.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_parsers_types.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_postprocessors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/parsers/test_tag_parsers.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/recipes/test_recipe_base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/recipes/test_response_recipes.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/request_admission/test_controller.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/request_admission/test_request_queue.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/stub_secrets.json +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_model_errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_model_registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_model_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_telemetry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/models/test_usage.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_ast.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_environment.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_exceptions.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/ginja/test_record.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_exceptions.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_schema_transformers.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_types.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/gsonschema/test_validators.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/test_drop_columns.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/test_registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/processors/test_schema_transform.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/processing/test_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/progress/terminal/test_throughput_panel.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/progress/test_tracker.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/test_base.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/test_data_designer_registry.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/registry/test_errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_atif.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_claude_code.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_codex.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_hermes_agent.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_pi_coding_agent.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/agent_rollout/test_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_managed_dataset_generator.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_person_reader.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_resource_provider.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/resources/test_seed_reader.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/conftest.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/data_sources/test_sampler_errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/data_sources/test_sources.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_email_address_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_national_id_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_person.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/entities/test_phone_number.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_column.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_constraints.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_generator.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_jinja_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_people_gen.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_schema.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/sampling_gen/test_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/storage/__init__.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/storage/test_artifact_storage.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/storage/test_media_storage.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_capacity.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_compiler.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_configurable_task.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_dataset_metadata.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_engine_errors.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_model_provider.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_observability.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_readiness.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_secret_resolver.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/test_validation.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/testing/test_plugin_testing_utils.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/utils/test_token_counting.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_local_callable.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_python.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_remote.py +0 -0
- {data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/tests/engine/validators/test_sql.py +0 -0
- {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.
|
|
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:
|
|
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
|
|
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.
|
|
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>=
|
|
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.
|
|
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
|
]
|
|
@@ -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
|
{data_designer_engine-0.9.4 → data_designer_engine-0.9.5}/src/data_designer/engine/models/facade.py
RENAMED
|
@@ -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
|
|
95
|
-
#
|
|
96
|
-
#
|
|
97
|
-
#
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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:
|
|
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
|
-
|
|
818
|
-
|
|
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
|
-
|
|
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
|