*** id: 5afc0673-c841-4db2-b22f-09436f60c0e3 title: Skill Config sidebar-title: Skill Config slug: /python/guides/skill-config max-toc-depth: 3 ---------------- ## Skill Configuration Configure skills with parameters, environment variables, and SWAIG field overrides. Understand the parameter schema and discovery options. ### Configuration Methods | Method | Description | | --------------------- | -------------------------------------- | | Parameters dict | Pass config when calling `add_skill()` | | Environment variables | Set via OS environment | | SWAIG fields | Customize tool metadata | | External directories | Register custom skill paths | ### Parameter Dictionary Pass configuration when adding a skill: ```python self.add_skill("web_search", { "api_key": "your-api-key", "search_engine_id": "your-engine-id", "num_results": 5, "min_quality_score": 0.4 }) ``` ### Parameter Schema Skills define their parameters via `get_parameter_schema()`: ```python { "api_key": { "type": "string", "description": "Google API key", "required": True, "hidden": True, "env_var": "GOOGLE_API_KEY" }, "num_results": { "type": "integer", "description": "Number of results", "default": 3, "min": 1, "max": 10 }, "style": { "type": "string", "description": "Output style", "enum": ["brief", "detailed"], "default": "brief" } } ``` ### Parameter Properties | Property | Type | Description | | ------------- | ------ | ---------------------------------------------------------- | | `type` | string | Data type: string, integer, number, boolean, object, array | | `description` | string | Human-readable description | | `default` | any | Default value if not provided | | `required` | bool | Whether parameter is required | | `hidden` | bool | Hide in UIs (for secrets) | | `env_var` | string | Environment variable source | | `enum` | array | Allowed values | | `min`/`max` | number | Value range for numbers | ### Environment Variables Skills can read from environment variables: ```python import os ## Set environment variable os.environ["GOOGLE_API_KEY"] = "your-key" ## Skill reads from params or falls back to env self.add_skill("web_search", { "api_key": os.getenv("GOOGLE_API_KEY"), "search_engine_id": os.getenv("SEARCH_ENGINE_ID") }) ``` ### SWAIG Fields Override SWAIG function metadata for skill tools: ```python self.add_skill("datetime", { "swaig_fields": { # Add filler phrases while function executes "fillers": { "en-US": [ "Let me check the time...", "One moment..." ] }, # Disable security for testing "secure": False } }) ``` Available SWAIG fields: | Field | Description | | ------------- | -------------------------------- | | `fillers` | Language-specific filler phrases | | `secure` | Enable/disable token validation | | `webhook_url` | Override webhook URL | ### External Skill Directories Register custom skill directories: ```python from signalwire_agents.skills.registry import skill_registry ## Add directory at runtime skill_registry.add_skill_directory("/opt/custom_skills") ## Environment variable (colon-separated paths) ## SIGNALWIRE_SKILL_PATHS=/path1:/path2:/path3 ``` ### Entry Points Install skills via pip packages: ```python ## In setup.py setup( name="my-skills-package", entry_points={ "signalwire_agents.skills": [ "weather = my_package.skills:WeatherSkill", "stock = my_package.skills:StockSkill" ] } ) ``` ### Listing Available Skills ```python from signalwire_agents.skills.registry import skill_registry ## List all available skills skills = skill_registry.list_skills() for skill in skills: print(f"{skill['name']}: {skill['description']}") ## Get complete schema for all skills schema = skill_registry.get_all_skills_schema() print(schema) ``` ### Multi-Instance Configuration Skills supporting multiple instances need unique tool names: ```python ## Instance 1: News search self.add_skill("web_search", { "tool_name": "search_news", # Unique function name "api_key": "KEY", "search_engine_id": "NEWS_ENGINE" }) ## Instance 2: Documentation search self.add_skill("web_search", { "tool_name": "search_docs", # Different function name "api_key": "KEY", "search_engine_id": "DOCS_ENGINE" }) ``` ### Configuration Validation Skills validate configuration in `setup()`: Validation Flow. ### Complete Configuration Example ```python from signalwire_agents import AgentBase from signalwire_agents.skills.registry import skill_registry import os ## Register external skills skill_registry.add_skill_directory("/opt/my_company/skills") class ConfiguredAgent(AgentBase): def __init__(self): super().__init__(name="configured-agent") self.add_language("English", "en-US", "rime.spore") # Simple skill - no config self.add_skill("datetime") # Skill with parameters self.add_skill("web_search", { "api_key": os.getenv("GOOGLE_API_KEY"), "search_engine_id": os.getenv("SEARCH_ENGINE_ID"), "num_results": 5, "min_quality_score": 0.4 }) # Skill with SWAIG field overrides self.add_skill("math", { "swaig_fields": { "fillers": { "en-US": ["Calculating..."] } } }) # Multi-instance skill self.add_skill("native_vector_search", { "tool_name": "search_products", "index_path": "/data/products.swsearch" }) self.add_skill("native_vector_search", { "tool_name": "search_faqs", "index_path": "/data/faqs.swsearch" }) self.prompt_add_section( "Role", "You are a customer service agent." ) if __name__ == "__main__": agent = ConfiguredAgent() agent.run() ``` ### Configuration Best Practices #### Security * Store API keys in environment variables * Never commit secrets to version control * Use hidden: true for sensitive parameters #### Organization * Group related configuration * Use descriptive tool\_name for multi-instance * Document required configuration #### Validation * Check has\_skill() before using conditionally * Handle ValueError from add\_skill() * Validate parameters early in setup() ### Next Steps You've learned the complete skills system. Next, explore advanced topics like contexts, workflows, and state management.