@@ -7305,18 +7305,21 @@ def get_meaning_of_life() -> int:
73057305 )
73067306
73077307
7308- async def test_file_search_tool_basic (allow_model_requests : None , openai_api_key : str ):
7308+ def test_file_search_tool_basic ():
73097309 """Test that FileSearchTool can be configured without errors."""
7310+ from pydantic_ai import Agent
7311+ from pydantic_ai .models .test import TestModel
7312+
73107313 agent = Agent (
7311- OpenAIResponsesModel ( 'gpt-5' , provider = OpenAIProvider ( api_key = openai_api_key ) ),
7314+ TestModel ( ),
73127315 builtin_tools = [FileSearchTool (vector_store_ids = ['vs_test123' ])],
73137316 )
73147317
73157318 # Just verify the agent initializes properly
73167319 assert agent is not None
73177320
73187321
7319- async def test_file_search_tool_mapping ():
7322+ def test_file_search_tool_mapping ():
73207323 """Test the _map_file_search_tool_call function."""
73217324 from unittest .mock import Mock
73227325
@@ -7344,3 +7347,89 @@ async def test_file_search_tool_mapping():
73447347
73457348 call_part , return_part = _map_file_search_tool_call (mock_item , 'openai' )
73467349 assert call_part .args == {'query' : 'test query' }
7350+
7351+
7352+ async def test_file_search_tool_with_mock_responses (allow_model_requests : None ):
7353+ """Test FileSearchTool with mocked OpenAI Responses API."""
7354+ from unittest .mock import Mock
7355+
7356+ from pydantic_ai .models .openai import OpenAIResponsesModel
7357+
7358+ from .mock_openai import MockOpenAIResponses , response_message
7359+
7360+ # Create mock file_search_call item
7361+ fs_call = Mock ()
7362+ fs_call .type = 'file_search_call'
7363+ fs_call .id = 'fs_test'
7364+ fs_call .status = 'completed'
7365+ fs_call .action = Mock ()
7366+ fs_call .action .model_dump = Mock (return_value = {'query' : 'search documents' })
7367+
7368+ # Create message item
7369+ msg_content = Mock ()
7370+ msg_content .type = 'text'
7371+ msg_content .text = 'Found information in documents'
7372+
7373+ msg_item = Mock ()
7374+ msg_item .type = 'message'
7375+ msg_item .id = 'msg_test'
7376+ msg_item .role = 'assistant'
7377+ msg_item .content = [msg_content ]
7378+ msg_item .status = 'completed'
7379+
7380+ # Create response with both items
7381+ mock_response = response_message ([fs_call , msg_item ])
7382+ mock_responses = MockOpenAIResponses .create_mock (mock_response )
7383+
7384+ model = OpenAIResponsesModel ('gpt-5' )
7385+ model ._client = mock_responses
7386+
7387+ agent = Agent (model , builtin_tools = [FileSearchTool (vector_store_ids = ['vs_test' ])])
7388+
7389+ result = await agent .run ('Search my documents' )
7390+ assert 'Found information in documents' in result .output
7391+
7392+
7393+ async def test_file_search_tool_streaming (allow_model_requests : None ):
7394+ """Test FileSearchTool with streaming responses."""
7395+ from unittest .mock import Mock
7396+
7397+ from pydantic_ai .models .openai import OpenAIResponsesModel
7398+
7399+ from .mock_openai import MockOpenAIResponses
7400+
7401+ # Create file_search_call stream event
7402+ fs_event = Mock ()
7403+ fs_event .type = 'response.output_item.added'
7404+ fs_event .item = Mock ()
7405+ fs_event .item .type = 'file_search_call'
7406+ fs_event .item .id = 'fs_123'
7407+ fs_event .item .status = 'completed'
7408+ fs_event .item .action = Mock ()
7409+ fs_event .item .action .model_dump = Mock (return_value = {'query' : 'test' })
7410+
7411+ # Create message stream event
7412+ msg_event = Mock ()
7413+ msg_event .type = 'response.output_item.added'
7414+ msg_event .item = Mock ()
7415+ msg_event .item .type = 'message'
7416+ msg_event .item .id = 'msg_123'
7417+ msg_event .item .role = 'assistant'
7418+ msg_event .item .status = 'completed'
7419+ msg_content = Mock ()
7420+ msg_content .type = 'text'
7421+ msg_content .text = 'Result from files'
7422+ msg_event .item .content = [msg_content ]
7423+
7424+ mock_responses = MockOpenAIResponses .create_mock_stream ([fs_event , msg_event ])
7425+
7426+ model = OpenAIResponsesModel ('gpt-5' )
7427+ model ._client = mock_responses
7428+
7429+ agent = Agent (model , builtin_tools = [FileSearchTool (vector_store_ids = ['vs_test' ])])
7430+
7431+ async with agent .run_stream ('Search my documents' ) as result :
7432+ async for _ in result .stream ():
7433+ pass
7434+
7435+ assert 'Result from files' in result .output
0 commit comments