|
22 | 22 | from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor |
23 | 23 | from google.adk.models import llm_request as llm_request_model |
24 | 24 | from google.adk.skills import models |
25 | | -from google.adk.skills.skill_registry import SkillRegistry |
26 | 25 | from google.adk.tools import skill_toolset |
27 | 26 | from google.adk.tools import tool_context |
28 | 27 | from google.genai import types |
@@ -474,128 +473,6 @@ async def test_scripts_resource_not_found(mock_skill1, tool_context_instance): |
474 | 473 | assert result["error_code"] == "RESOURCE_NOT_FOUND" |
475 | 474 |
|
476 | 475 |
|
477 | | -class MockSkillRegistry(SkillRegistry): |
478 | | - |
479 | | - def __init__(self): |
480 | | - self.skills = {} |
481 | | - self.search_results = [] |
482 | | - |
483 | | - async def get_skill(self, *, name, version=None): |
484 | | - return self.skills.get(name) |
485 | | - |
486 | | - async def search_skills(self, *, query, filters=None, **kwargs): |
487 | | - return self.search_results |
488 | | - |
489 | | - def get_filter_schema(self): |
490 | | - return None |
491 | | - |
492 | | - |
493 | | -@pytest.mark.asyncio |
494 | | -async def test_skill_toolset_init_with_registry(mock_skill1): |
495 | | - registry = MockSkillRegistry() |
496 | | - toolset = skill_toolset.SkillToolset([mock_skill1], registry=registry) |
497 | | - assert toolset._registry == registry |
498 | | - tools = await toolset.get_tools() |
499 | | - assert len(tools) == 5 # 4 default + SearchSkillsTool |
500 | | - assert isinstance(tools[4], skill_toolset.SearchSkillsTool) |
501 | | - |
502 | | - |
503 | | -@pytest.mark.asyncio |
504 | | -async def test_search_skills_tool_run_async(mock_skill1, tool_context_instance): |
505 | | - registry = MockSkillRegistry() |
506 | | - frontmatter = mock.create_autospec(models.Frontmatter, instance=True) |
507 | | - frontmatter.name = "remote-skill" |
508 | | - frontmatter.model_dump.return_value = {"name": "remote-skill"} |
509 | | - registry.search_results = [frontmatter] |
510 | | - |
511 | | - toolset = skill_toolset.SkillToolset([mock_skill1], registry=registry) |
512 | | - tool = skill_toolset.SearchSkillsTool(toolset) |
513 | | - |
514 | | - result = await tool.run_async( |
515 | | - args={"query": "test"}, tool_context=tool_context_instance |
516 | | - ) |
517 | | - assert result == [{"name": "remote-skill"}] |
518 | | - |
519 | | - |
520 | | -@pytest.mark.asyncio |
521 | | -async def test_search_skills_tool_collision( |
522 | | - mock_skill1, tool_context_instance, caplog |
523 | | -): |
524 | | - registry = MockSkillRegistry() |
525 | | - frontmatter = mock.create_autospec(models.Frontmatter, instance=True) |
526 | | - frontmatter.name = "skill1" # Same name as mock_skill1 |
527 | | - frontmatter.model_dump.return_value = {"name": "skill1"} |
528 | | - |
529 | | - frontmatter2 = mock.create_autospec(models.Frontmatter, instance=True) |
530 | | - frontmatter2.name = "remote-skill" |
531 | | - frontmatter2.model_dump.return_value = {"name": "remote-skill"} |
532 | | - |
533 | | - registry.search_results = [frontmatter, frontmatter2] |
534 | | - |
535 | | - toolset = skill_toolset.SkillToolset([mock_skill1], registry=registry) |
536 | | - tool = skill_toolset.SearchSkillsTool(toolset) |
537 | | - |
538 | | - with caplog.at_level(logging.WARNING): |
539 | | - result = await tool.run_async( |
540 | | - args={"query": "test"}, tool_context=tool_context_instance |
541 | | - ) |
542 | | - assert result == [{"name": "remote-skill"}] |
543 | | - assert "Naming conflict detected" in caplog.text |
544 | | - |
545 | | - |
546 | | -@pytest.mark.asyncio |
547 | | -async def test_load_skill_tool_fetches_from_registry( |
548 | | - tool_context_instance, mock_skill1 |
549 | | -): |
550 | | - registry = MockSkillRegistry() |
551 | | - registry.skills["my-skill"] = mock_skill1 |
552 | | - |
553 | | - toolset = skill_toolset.SkillToolset([], registry=registry) |
554 | | - tool = skill_toolset.LoadSkillTool(toolset) |
555 | | - |
556 | | - result = await tool.run_async( |
557 | | - args={"skill_name": "my-skill"}, tool_context=tool_context_instance |
558 | | - ) |
559 | | - assert result["skill_name"] == "my-skill" |
560 | | - assert toolset._skills["my-skill"] == mock_skill1 |
561 | | - |
562 | | - |
563 | | -@pytest.mark.asyncio |
564 | | -async def test_load_skill_tool_registry_error(tool_context_instance): |
565 | | - registry = MockSkillRegistry() |
566 | | - registry.get_skill = mock.AsyncMock( |
567 | | - side_effect=Exception("Test registry error") |
568 | | - ) |
569 | | - |
570 | | - toolset = skill_toolset.SkillToolset([], registry=registry) |
571 | | - tool = skill_toolset.LoadSkillTool(toolset) |
572 | | - |
573 | | - result = await tool.run_async( |
574 | | - args={"skill_name": "my-skill"}, tool_context=tool_context_instance |
575 | | - ) |
576 | | - assert result["error_code"] == "REGISTRY_ERROR" |
577 | | - assert "Failed to fetch skill 'my-skill' from registry" in result["error"] |
578 | | - |
579 | | - |
580 | | -@pytest.mark.asyncio |
581 | | -async def test_process_llm_request_with_registry( |
582 | | - mock_skill1, tool_context_instance |
583 | | -): |
584 | | - registry = MockSkillRegistry() |
585 | | - toolset = skill_toolset.SkillToolset([mock_skill1], registry=registry) |
586 | | - llm_req = mock.create_autospec(llm_request_model.LlmRequest, instance=True) |
587 | | - |
588 | | - await toolset.process_llm_request( |
589 | | - tool_context=tool_context_instance, llm_request=llm_req |
590 | | - ) |
591 | | - |
592 | | - llm_req.append_instructions.assert_called_once() |
593 | | - args, _ = llm_req.append_instructions.call_args |
594 | | - instructions = args[0] |
595 | | - assert len(instructions) == 3 # default + search instruction + skills xml |
596 | | - assert "search_skills" in instructions[1] |
597 | | - |
598 | | - |
599 | 476 | # RunSkillScriptTool tests |
600 | 477 |
|
601 | 478 |
|
|
0 commit comments