3939from pydantic_ai .ui import SSE_CONTENT_TYPE
4040from pydantic_ai .ui .ag_ui import AGUIAdapter
4141
42- __version__ = "1.3.10 "
42+ __version__ = "1.3.11 "
4343
4444logging .basicConfig (
4545 level = logging .INFO ,
6060DEFAULT_LLM_API_KEY = os .getenv ("LLM_API_KEY" , "ollama" )
6161DEFAULT_MCP_URL = os .getenv ("MCP_URL" , None )
6262DEFAULT_MCP_CONFIG = os .getenv ("MCP_CONFIG" , get_mcp_config_path ())
63- DEFAULT_SKILLS_DIRECTORY = os .getenv ("SKILLS_DIRECTORY " , get_skills_path () )
63+ DEFAULT_CUSTOM_SKILLS_DIRECTORY = os .getenv ("CUSTOM_SKILLS_DIRECTORY " , None )
6464DEFAULT_ENABLE_WEB_UI = to_boolean (os .getenv ("ENABLE_WEB_UI" , "False" ))
6565DEFAULT_SSL_VERIFY = to_boolean (os .getenv ("SSL_VERIFY" , "True" ))
6666
@@ -285,7 +285,7 @@ def create_agent(
285285 api_key : Optional [str ] = DEFAULT_LLM_API_KEY ,
286286 mcp_url : str = DEFAULT_MCP_URL ,
287287 mcp_config : str = DEFAULT_MCP_CONFIG ,
288- skills_directory : Optional [str ] = DEFAULT_SKILLS_DIRECTORY ,
288+ custom_skills_directory : Optional [str ] = DEFAULT_CUSTOM_SKILLS_DIRECTORY ,
289289 ssl_verify : bool = DEFAULT_SSL_VERIFY ,
290290) -> Agent :
291291 """
@@ -344,8 +344,7 @@ def create_agent(
344344 agent_toolsets .extend (mcp_toolset )
345345 logger .info (f"Connected to MCP Config JSON: { mcp_toolset } " )
346346
347- if skills_directory and os .path .exists (skills_directory ):
348- agent_toolsets .append (SkillsToolset (directories = [str (skills_directory )]))
347+ # Skills are loaded per-agent based on tags
349348
350349 agent_defs = {
351350 "ad_hoc_commands" : (
@@ -395,6 +394,26 @@ def filter_func(ctx, tool_def, t=tag):
395394 else :
396395 pass
397396
397+ # Load specific skills for this tag
398+ skill_dir_name = f"ansible-tower-mcp-{ tag .replace ('_' , '-' )} "
399+
400+ # Check custom skills directory
401+ if custom_skills_directory :
402+ skill_dir_path = os .path .join (custom_skills_directory , skill_dir_name )
403+ if os .path .exists (skill_dir_path ):
404+ tag_toolsets .append (SkillsToolset (directories = [skill_dir_path ]))
405+ logger .info (
406+ f"Loaded specialized skills for { tag } from { skill_dir_path } "
407+ )
408+
409+ # Check default skills directory
410+ default_skill_path = os .path .join (get_skills_path (), skill_dir_name )
411+ if os .path .exists (default_skill_path ):
412+ tag_toolsets .append (SkillsToolset (directories = [default_skill_path ]))
413+ logger .info (
414+ f"Loaded specialized skills for { tag } from { default_skill_path } "
415+ )
416+
398417 # Collect tool names for logging
399418 all_tool_names = []
400419 for ts in tag_toolsets :
@@ -595,7 +614,7 @@ def create_agent_server(
595614 api_key : Optional [str ] = DEFAULT_LLM_API_KEY ,
596615 mcp_url : str = DEFAULT_MCP_URL ,
597616 mcp_config : str = DEFAULT_MCP_CONFIG ,
598- skills_directory : Optional [str ] = DEFAULT_SKILLS_DIRECTORY ,
617+ custom_skills_directory : Optional [str ] = DEFAULT_CUSTOM_SKILLS_DIRECTORY ,
599618 debug : Optional [bool ] = DEFAULT_DEBUG ,
600619 host : Optional [str ] = DEFAULT_HOST ,
601620 port : Optional [int ] = DEFAULT_PORT ,
@@ -617,14 +636,30 @@ def create_agent_server(
617636 api_key = api_key ,
618637 mcp_url = mcp_url ,
619638 mcp_config = mcp_config ,
620- skills_directory = skills_directory ,
639+ custom_skills_directory = custom_skills_directory ,
621640 ssl_verify = ssl_verify ,
622641 )
623642
624- if skills_directory and os .path .exists (skills_directory ):
625- skills = load_skills_from_directory (skills_directory )
626- logger .info (f"Loaded { len (skills )} skills from { skills_directory } " )
627- else :
643+ # Always load default skills
644+
645+ skills = load_skills_from_directory (get_skills_path ())
646+
647+ logger .info (f"Loaded { len (skills )} default skills from { get_skills_path ()} " )
648+
649+ # Load custom skills if provided
650+
651+ if custom_skills_directory and os .path .exists (custom_skills_directory ):
652+
653+ custom_skills = load_skills_from_directory (custom_skills_directory )
654+
655+ skills .extend (custom_skills )
656+
657+ logger .info (
658+ f"Loaded { len (custom_skills )} custom skills from { custom_skills_directory } "
659+ )
660+
661+ if not skills :
662+
628663 skills = [
629664 Skill (
630665 id = "ansible_tower_agent" ,
@@ -741,9 +776,9 @@ def agent_server():
741776 "--mcp-config" , default = DEFAULT_MCP_CONFIG , help = "MCP Server Config"
742777 )
743778 parser .add_argument (
744- "--skills-directory" ,
745- default = DEFAULT_SKILLS_DIRECTORY ,
746- help = "Directory containing agent skills" ,
779+ "--custom- skills-directory" ,
780+ default = DEFAULT_CUSTOM_SKILLS_DIRECTORY ,
781+ help = "Directory containing additional custom agent skills" ,
747782 )
748783 parser .add_argument (
749784 "--web" ,
@@ -791,7 +826,7 @@ def agent_server():
791826 api_key = args .api_key ,
792827 mcp_url = args .mcp_url ,
793828 mcp_config = args .mcp_config ,
794- skills_directory = args .skills_directory ,
829+ custom_skills_directory = args .custom_skills_directory ,
795830 debug = args .debug ,
796831 host = args .host ,
797832 port = args .port ,
@@ -814,12 +849,12 @@ def usage():
814849 "--api-key [ LLM API Key ]\n "
815850 "--mcp-url [ MCP Server URL ]\n "
816851 "--mcp-config [ MCP Server Config ]\n "
817- "--skills-directory [ Directory containing agent skills ]\n "
852+ "--custom- skills-directory [ Directory containing additional custom agent skills ]\n "
818853 "--web [ Enable Pydantic AI Web UI ]\n "
819854 "\n "
820855 "Examples:\n "
821856 " [Simple] ansible-tower-agent \n "
822- ' [Complex] ansible-tower-agent --host "value" --port "value" --debug "value" --reload --provider "value" --model-id "value" --base-url "value" --api-key "value" --mcp-url "value" --mcp-config "value" --skills-directory "value" --web\n '
857+ ' [Complex] ansible-tower-agent --host "value" --port "value" --debug "value" --reload --provider "value" --model-id "value" --base-url "value" --api-key "value" --mcp-url "value" --mcp-config "value" --custom- skills-directory "value" --web\n '
823858 )
824859
825860
0 commit comments