@@ -420,17 +420,110 @@ def test_init_with_path_object(stub_artifact_path, stub_model_providers):
420420 assert designer is not None
421421
422422
423+ def test_init_user_supplied_providers_ignore_unrelated_yaml_default (
424+ stub_artifact_path : Path ,
425+ stub_model_providers : list [ModelProvider ],
426+ stub_managed_assets_path : Path ,
427+ ) -> None :
428+ """Regression for #588: a YAML ``default:`` that names a provider absent
429+ from a user-supplied ``model_providers`` list must not leak into
430+ construction.
431+
432+ Pre-fix this raised ``ValidationError: Specified default 'unrelated' not
433+ found in providers list``.
434+ """
435+ with patch .object (dd_mod , "get_default_provider_name" , return_value = "unrelated" ):
436+ data_designer = DataDesigner (
437+ artifact_path = stub_artifact_path ,
438+ model_providers = stub_model_providers ,
439+ secret_resolver = PlaintextResolver (),
440+ managed_assets_path = stub_managed_assets_path ,
441+ )
442+
443+ assert data_designer .model_provider_registry .get_default_provider_name () == "stub-model-provider"
444+
445+
446+ def test_init_user_supplied_providers_preserve_first_wins_over_yaml_default (
447+ stub_artifact_path : Path ,
448+ stub_managed_assets_path : Path ,
449+ ) -> None :
450+ """Regression for #588: when the YAML ``default:`` matches a user-supplied
451+ provider that isn't first in the list, the documented ``model_providers[0]``
452+ "first wins" behavior must not be silently overridden.
453+ """
454+ user_providers = [
455+ ModelProvider (
456+ name = "first-provider" ,
457+ endpoint = "https://first.example.com/v1" ,
458+ api_key = "FIRST_API_KEY" ,
459+ ),
460+ ModelProvider (
461+ name = "second-provider" ,
462+ endpoint = "https://second.example.com/v1" ,
463+ api_key = "SECOND_API_KEY" ,
464+ ),
465+ ]
466+
467+ with patch .object (dd_mod , "get_default_provider_name" , return_value = "second-provider" ):
468+ data_designer = DataDesigner (
469+ artifact_path = stub_artifact_path ,
470+ model_providers = user_providers ,
471+ secret_resolver = PlaintextResolver (),
472+ managed_assets_path = stub_managed_assets_path ,
473+ )
474+
475+ assert data_designer .model_provider_registry .get_default_provider_name () == "first-provider"
476+
477+
478+ def test_init_no_user_providers_uses_yaml_default (
479+ stub_artifact_path : Path ,
480+ stub_managed_assets_path : Path ,
481+ ) -> None :
482+ """Pin the unchanged YAML-fallback path: when the caller omits
483+ ``model_providers``, DataDesigner consults both ``providers:`` and
484+ ``default:`` from the YAML.
485+
486+ The fix in #588 only changes the user-supplied branch; this test locks the
487+ YAML-fallback branch's contract so a future refactor can't silently regress
488+ it.
489+ """
490+ yaml_providers = [
491+ ModelProvider (
492+ name = "yaml-first" ,
493+ endpoint = "https://yaml-first.example.com/v1" ,
494+ api_key = "yaml-first-key" ,
495+ ),
496+ ModelProvider (
497+ name = "yaml-second" ,
498+ endpoint = "https://yaml-second.example.com/v1" ,
499+ api_key = "yaml-second-key" ,
500+ ),
501+ ]
502+
503+ with (
504+ patch .object (dd_mod , "get_default_providers" , return_value = yaml_providers ),
505+ patch .object (dd_mod , "get_default_provider_name" , return_value = "yaml-second" ),
506+ ):
507+ data_designer = DataDesigner (
508+ artifact_path = stub_artifact_path ,
509+ secret_resolver = PlaintextResolver (),
510+ managed_assets_path = stub_managed_assets_path ,
511+ )
512+
513+ assert data_designer .model_provider_registry .get_default_provider_name () == "yaml-second"
514+
515+
423516def test_run_config_setting_persists (stub_artifact_path , stub_model_providers ):
424517 """Test that run config setting persists across multiple calls."""
425518 data_designer = DataDesigner (artifact_path = stub_artifact_path , model_providers = stub_model_providers )
426519
427520 # Test default values
428- assert data_designer ._run_config .disable_early_shutdown is False
429- assert data_designer ._run_config .shutdown_error_rate == 0.5
430- assert data_designer ._run_config .shutdown_error_window == 10
431- assert data_designer ._run_config .buffer_size == 1000
432- assert data_designer ._run_config .max_conversation_restarts == 5
433- assert data_designer ._run_config .max_conversation_correction_steps == 0
521+ assert data_designer .run_config .disable_early_shutdown is False
522+ assert data_designer .run_config .shutdown_error_rate == 0.5
523+ assert data_designer .run_config .shutdown_error_window == 10
524+ assert data_designer .run_config .buffer_size == 1000
525+ assert data_designer .run_config .max_conversation_restarts == 5
526+ assert data_designer .run_config .max_conversation_correction_steps == 0
434527
435528 # Test setting custom values
436529 data_designer .set_run_config (
@@ -443,12 +536,12 @@ def test_run_config_setting_persists(stub_artifact_path, stub_model_providers):
443536 max_conversation_correction_steps = 2 ,
444537 )
445538 )
446- assert data_designer ._run_config .disable_early_shutdown is True
447- assert data_designer ._run_config .shutdown_error_rate == 1.0 # normalized when disabled
448- assert data_designer ._run_config .shutdown_error_window == 25
449- assert data_designer ._run_config .buffer_size == 500
450- assert data_designer ._run_config .max_conversation_restarts == 7
451- assert data_designer ._run_config .max_conversation_correction_steps == 2
539+ assert data_designer .run_config .disable_early_shutdown is True
540+ assert data_designer .run_config .shutdown_error_rate == 1.0 # normalized when disabled
541+ assert data_designer .run_config .shutdown_error_window == 25
542+ assert data_designer .run_config .buffer_size == 500
543+ assert data_designer .run_config .max_conversation_restarts == 7
544+ assert data_designer .run_config .max_conversation_correction_steps == 2
452545
453546 # Test updating values
454547 data_designer .set_run_config (
@@ -461,12 +554,12 @@ def test_run_config_setting_persists(stub_artifact_path, stub_model_providers):
461554 max_conversation_correction_steps = 1 ,
462555 )
463556 )
464- assert data_designer ._run_config .disable_early_shutdown is False
465- assert data_designer ._run_config .shutdown_error_rate == 0.3
466- assert data_designer ._run_config .shutdown_error_window == 5
467- assert data_designer ._run_config .buffer_size == 750
468- assert data_designer ._run_config .max_conversation_restarts == 9
469- assert data_designer ._run_config .max_conversation_correction_steps == 1
557+ assert data_designer .run_config .disable_early_shutdown is False
558+ assert data_designer .run_config .shutdown_error_rate == 0.3
559+ assert data_designer .run_config .shutdown_error_window == 5
560+ assert data_designer .run_config .buffer_size == 750
561+ assert data_designer .run_config .max_conversation_restarts == 9
562+ assert data_designer .run_config .max_conversation_correction_steps == 1
470563
471564
472565def test_run_config_normalizes_error_rate_when_disabled (stub_artifact_path , stub_model_providers ):
@@ -480,7 +573,7 @@ def test_run_config_normalizes_error_rate_when_disabled(stub_artifact_path, stub
480573 shutdown_error_rate = 0.7 ,
481574 )
482575 )
483- assert data_designer ._run_config .shutdown_error_rate == 0.7
576+ assert data_designer .run_config .shutdown_error_rate == 0.7
484577
485578 # When disabled, shutdown_error_rate should be normalized to 1.0
486579 data_designer .set_run_config (
@@ -489,7 +582,7 @@ def test_run_config_normalizes_error_rate_when_disabled(stub_artifact_path, stub
489582 shutdown_error_rate = 0.7 ,
490583 )
491584 )
492- assert data_designer ._run_config .shutdown_error_rate == 1.0
585+ assert data_designer .run_config .shutdown_error_rate == 1.0
493586
494587
495588def test_run_config_rejects_invalid_buffer_size () -> None :
@@ -858,13 +951,12 @@ def test_create_logs_secure_jinja_rendering_mode(
858951 stub_sampler_only_config_builder : DataDesignerConfigBuilder ,
859952 stub_managed_assets_path : Path ,
860953) -> None :
861- with patch .object (dd_mod , "get_default_provider_name" , return_value = "stub-model-provider" ):
862- data_designer = DataDesigner (
863- artifact_path = stub_artifact_path ,
864- model_providers = stub_model_providers ,
865- secret_resolver = PlaintextResolver (),
866- managed_assets_path = stub_managed_assets_path ,
867- )
954+ data_designer = DataDesigner (
955+ artifact_path = stub_artifact_path ,
956+ model_providers = stub_model_providers ,
957+ secret_resolver = PlaintextResolver (),
958+ managed_assets_path = stub_managed_assets_path ,
959+ )
868960 data_designer .set_run_config (RunConfig (jinja_rendering_engine = JinjaRenderingEngine .SECURE ))
869961
870962 with (
@@ -898,13 +990,12 @@ def test_preview_logs_native_jinja_rendering_mode(
898990 stub_sampler_only_config_builder : DataDesignerConfigBuilder ,
899991 stub_managed_assets_path : Path ,
900992) -> None :
901- with patch .object (dd_mod , "get_default_provider_name" , return_value = "stub-model-provider" ):
902- data_designer = DataDesigner (
903- artifact_path = stub_artifact_path ,
904- model_providers = stub_model_providers ,
905- secret_resolver = PlaintextResolver (),
906- managed_assets_path = stub_managed_assets_path ,
907- )
993+ data_designer = DataDesigner (
994+ artifact_path = stub_artifact_path ,
995+ model_providers = stub_model_providers ,
996+ secret_resolver = PlaintextResolver (),
997+ managed_assets_path = stub_managed_assets_path ,
998+ )
908999 data_designer .set_run_config (RunConfig (jinja_rendering_engine = JinjaRenderingEngine .NATIVE ))
9091000
9101001 with (
0 commit comments