55import httpx
66import pytest
77from llama_stack .core .library_client import AsyncLlamaStackAsLibraryClient
8+ from llama_stack_client import AsyncLlamaStackClient
9+ from pydantic_ai_skills import SkillsCapability
810from pytest_mock import MockerFixture
911
12+ from models .common .responses .responses_api_params import ResponsesApiParams
13+ from models .config import SkillsConfiguration
1014from utils .pydantic_ai import (
1115 _LLS_RESPONSES_EXTRA_FIELDS ,
16+ _agent_capabilities ,
1217 _llama_stack_provider_from_client ,
1318 _model_settings_from_responses_params ,
19+ _skills_capability ,
1420 build_agent ,
1521)
1622
@@ -196,6 +202,45 @@ def test_contains_expected_fields(self) -> None:
196202 assert expected == _LLS_RESPONSES_EXTRA_FIELDS
197203
198204
205+ class TestSkillsCapability :
206+ """Tests for _skills_capability."""
207+
208+ def test_returns_none_when_skills_not_configured (self ) -> None :
209+ """Test that missing skills configuration returns None."""
210+ assert _skills_capability (None ) is None
211+
212+ def test_returns_none_when_paths_empty (self ) -> None :
213+ """Test that an empty paths list returns None."""
214+ assert _skills_capability (SkillsConfiguration (paths = [])) is None
215+
216+ def test_returns_capability_for_configured_paths (
217+ self , mock_skills_configuration : SkillsConfiguration
218+ ) -> None :
219+ """Test that configured paths produce a SkillsCapability."""
220+ capability = _skills_capability (mock_skills_configuration )
221+
222+ assert isinstance (capability , SkillsCapability )
223+ assert list (capability .toolset .skills ) == ["test-skill" ]
224+
225+
226+ class TestAgentCapabilities :
227+ """Tests for _agent_capabilities."""
228+
229+ def test_returns_none_when_no_capabilities_configured (self ) -> None :
230+ """Test that missing configuration yields None for Agent construction."""
231+ assert _agent_capabilities (None ) is None
232+ assert _agent_capabilities (SkillsConfiguration (paths = [])) is None
233+
234+ def test_returns_skills_capability_when_configured (
235+ self , mock_skills_configuration : SkillsConfiguration
236+ ) -> None :
237+ """Test that configured skills are included in the capability list."""
238+ capabilities = _agent_capabilities (mock_skills_configuration ) or []
239+
240+ assert len (capabilities ) == 1
241+ assert isinstance (capabilities [0 ], SkillsCapability )
242+
243+
199244class TestBuildAgent :
200245 """Tests for the build_agent factory function."""
201246
@@ -220,7 +265,7 @@ def test_returns_agent_with_correct_model(self, mocker: MockerFixture) -> None:
220265 mock_params .store = False
221266 mock_params .previous_response_id = None
222267
223- agent = build_agent (mock_client , mock_params )
268+ agent = build_agent (mock_client , mock_params , None )
224269
225270 assert agent is not None
226271
@@ -242,7 +287,7 @@ def test_agent_has_instructions(self, mocker: MockerFixture) -> None:
242287 mock_params .store = False
243288 mock_params .previous_response_id = None
244289
245- agent = build_agent (mock_client , mock_params )
290+ agent = build_agent (mock_client , mock_params , None )
246291
247292 assert "You are a helpful assistant." in agent ._instructions
248293
@@ -265,6 +310,37 @@ def test_agent_with_library_client(self, mocker: MockerFixture) -> None:
265310 mock_params .store = True
266311 mock_params .previous_response_id = None
267312
268- agent = build_agent (mock_lib_client , mock_params )
313+ agent = build_agent (mock_lib_client , mock_params , None )
269314
270315 assert agent is not None
316+
317+ def test_agent_includes_skills_capability_when_configured (
318+ self ,
319+ mock_client : AsyncLlamaStackClient ,
320+ mock_params : ResponsesApiParams ,
321+ mock_skills_configuration : SkillsConfiguration ,
322+ ) -> None :
323+ """Test that build_agent attaches SkillsCapability when skills are passed."""
324+ agent = build_agent (
325+ mock_client ,
326+ mock_params ,
327+ mock_skills_configuration ,
328+ )
329+
330+ capability_types = {
331+ type (capability ) for capability in agent ._root_capability .capabilities
332+ }
333+ assert SkillsCapability in capability_types
334+
335+ def test_agent_has_no_skills_capability_when_not_configured (
336+ self ,
337+ mock_client : AsyncLlamaStackClient ,
338+ mock_params : ResponsesApiParams ,
339+ ) -> None :
340+ """Test that build_agent omits SkillsCapability when skills are not passed."""
341+ agent = build_agent (mock_client , mock_params , None )
342+
343+ capability_types = {
344+ type (capability ) for capability in agent ._root_capability .capabilities
345+ }
346+ assert SkillsCapability not in capability_types
0 commit comments