@@ -23,6 +23,7 @@ def create_test_azure_ai_client(
2323 conversation_id : str | None = None ,
2424 azure_ai_settings : AzureAISettings | None = None ,
2525 should_close_client : bool = False ,
26+ use_latest_version : bool | None = None ,
2627) -> AzureAIClient :
2728 """Helper function to create AzureAIClient instances for testing, bypassing normal validation."""
2829 if azure_ai_settings is None :
@@ -36,6 +37,7 @@ def create_test_azure_ai_client(
3637 client .credential = None
3738 client .agent_name = agent_name
3839 client .agent_version = agent_version
40+ client .use_latest_version = use_latest_version
3941 client .model_id = azure_ai_settings .model_deployment_name
4042 client .conversation_id = conversation_id
4143 client ._should_close_client = should_close_client # type: ignore
@@ -437,6 +439,98 @@ async def test_azure_ai_client_agent_creation_with_tools(
437439 assert call_args [1 ]["definition" ].tools == test_tools
438440
439441
442+ async def test_azure_ai_client_use_latest_version_existing_agent (
443+ mock_project_client : MagicMock ,
444+ ) -> None :
445+ """Test _get_agent_reference_or_create when use_latest_version=True and agent exists."""
446+ client = create_test_azure_ai_client (mock_project_client , agent_name = "existing-agent" , use_latest_version = True )
447+
448+ # Mock existing agent response
449+ mock_existing_agent = MagicMock ()
450+ mock_existing_agent .name = "existing-agent"
451+ mock_existing_agent .versions .latest .version = "2.5"
452+ mock_project_client .agents .retrieve = AsyncMock (return_value = mock_existing_agent )
453+
454+ run_options = {"model" : "test-model" }
455+ agent_ref = await client ._get_agent_reference_or_create (run_options , None ) # type: ignore
456+
457+ # Verify existing agent was retrieved and used
458+ mock_project_client .agents .retrieve .assert_called_once_with ("existing-agent" )
459+ mock_project_client .agents .create_version .assert_not_called ()
460+
461+ assert agent_ref == {"name" : "existing-agent" , "version" : "2.5" , "type" : "agent_reference" }
462+ assert client .agent_name == "existing-agent"
463+ assert client .agent_version == "2.5"
464+
465+
466+ async def test_azure_ai_client_use_latest_version_agent_not_found (
467+ mock_project_client : MagicMock ,
468+ ) -> None :
469+ """Test _get_agent_reference_or_create when use_latest_version=True but agent doesn't exist."""
470+ from azure .core .exceptions import ResourceNotFoundError
471+
472+ client = create_test_azure_ai_client (mock_project_client , agent_name = "non-existing-agent" , use_latest_version = True )
473+
474+ # Mock ResourceNotFoundError when trying to retrieve agent
475+ mock_project_client .agents .retrieve = AsyncMock (side_effect = ResourceNotFoundError ("Agent not found" ))
476+
477+ # Mock agent creation response for fallback
478+ mock_created_agent = MagicMock ()
479+ mock_created_agent .name = "non-existing-agent"
480+ mock_created_agent .version = "1.0"
481+ mock_project_client .agents .create_version = AsyncMock (return_value = mock_created_agent )
482+
483+ run_options = {"model" : "test-model" }
484+ agent_ref = await client ._get_agent_reference_or_create (run_options , None ) # type: ignore
485+
486+ # Verify retrieval was attempted and creation was used as fallback
487+ mock_project_client .agents .retrieve .assert_called_once_with ("non-existing-agent" )
488+ mock_project_client .agents .create_version .assert_called_once ()
489+
490+ assert agent_ref == {"name" : "non-existing-agent" , "version" : "1.0" , "type" : "agent_reference" }
491+ assert client .agent_name == "non-existing-agent"
492+ assert client .agent_version == "1.0"
493+
494+
495+ async def test_azure_ai_client_use_latest_version_false (
496+ mock_project_client : MagicMock ,
497+ ) -> None :
498+ """Test _get_agent_reference_or_create when use_latest_version=False (default behavior)."""
499+ client = create_test_azure_ai_client (mock_project_client , agent_name = "test-agent" , use_latest_version = False )
500+
501+ # Mock agent creation response
502+ mock_created_agent = MagicMock ()
503+ mock_created_agent .name = "test-agent"
504+ mock_created_agent .version = "1.0"
505+ mock_project_client .agents .create_version = AsyncMock (return_value = mock_created_agent )
506+
507+ run_options = {"model" : "test-model" }
508+ agent_ref = await client ._get_agent_reference_or_create (run_options , None ) # type: ignore
509+
510+ # Verify retrieval was not attempted and creation was used directly
511+ mock_project_client .agents .retrieve .assert_not_called ()
512+ mock_project_client .agents .create_version .assert_called_once ()
513+
514+ assert agent_ref == {"name" : "test-agent" , "version" : "1.0" , "type" : "agent_reference" }
515+
516+
517+ async def test_azure_ai_client_use_latest_version_with_existing_agent_version (
518+ mock_project_client : MagicMock ,
519+ ) -> None :
520+ """Test that use_latest_version is ignored when agent_version is already provided."""
521+ client = create_test_azure_ai_client (
522+ mock_project_client , agent_name = "test-agent" , agent_version = "3.0" , use_latest_version = True
523+ )
524+
525+ agent_ref = await client ._get_agent_reference_or_create ({}, None ) # type: ignore
526+
527+ # Verify neither retrieval nor creation was attempted since version is already set
528+ mock_project_client .agents .retrieve .assert_not_called ()
529+ mock_project_client .agents .create_version .assert_not_called ()
530+
531+ assert agent_ref == {"name" : "test-agent" , "version" : "3.0" , "type" : "agent_reference" }
532+
533+
440534@pytest .fixture
441535def mock_project_client () -> MagicMock :
442536 """Fixture that provides a mock AIProjectClient."""
0 commit comments