signalwire-agents 0.1.26__tar.gz → 0.1.28__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/CHANGELOG.md +8 -0
- {signalwire_agents-0.1.26/signalwire_agents.egg-info → signalwire_agents-0.1.28}/PKG-INFO +1 -59
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/README.md +0 -58
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/pyproject.toml +1 -1
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/schema.json +2789 -701
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/__init__.py +1 -4
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/config.py +11 -1
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/data_overrides.py +6 -2
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/test_swaig.py +6 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent_base.py +1 -12
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/contexts.py +1 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/state_mixin.py +1 -67
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/tool_mixin.py +0 -65
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/concierge.py +0 -3
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/faq_bot.py +0 -3
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/info_gatherer.py +0 -3
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/receptionist.py +0 -3
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/survey.py +0 -3
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/schema.json +2789 -701
- signalwire_agents-0.1.28/signalwire_agents/skills/mcp_gateway/README.md +230 -0
- signalwire_agents-0.1.28/signalwire_agents/skills/mcp_gateway/__init__.py +1 -0
- signalwire_agents-0.1.28/signalwire_agents/skills/mcp_gateway/skill.py +339 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28/signalwire_agents.egg-info}/PKG-INFO +1 -59
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/SOURCES.txt +3 -3
- signalwire_agents-0.1.26/signalwire_agents/core/state/__init__.py +0 -17
- signalwire_agents-0.1.26/signalwire_agents/core/state/file_state_manager.py +0 -219
- signalwire_agents-0.1.26/signalwire_agents/core/state/state_manager.py +0 -101
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/LICENSE +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/requirements-dev.txt +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/requirements.txt +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/setup.cfg +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/setup.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/agent_server.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/build_search.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/agent_loader.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/argparse_helpers.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/dynamic_config.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/execution/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/execution/datamap_exec.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/execution/webhook_exec.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/output/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/output/output_formatter.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/output/swml_dump.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/data_generation.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/mock_env.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/cli/types.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/config/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/deployment/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/prompt/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/prompt/manager.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/routing/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/security/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/swml/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/tools/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/tools/decorator.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/tools/registry.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/data_map.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/function_result.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/logging_config.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/ai_config_mixin.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/auth_mixin.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/prompt_mixin.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/serverless_mixin.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/skill_mixin.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/web_mixin.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/pom_builder.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/security/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/security/session_manager.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/skill_base.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/skill_manager.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/swaig_function.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_builder.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_handler.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_renderer.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_service.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/search/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/search/document_processor.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/search/index_builder.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/search/query_processor.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/search/search_engine.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/search/search_service.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere_serverless/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datetime/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datetime/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/datetime/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/joke/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/joke/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/joke/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/math/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/math/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/math/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/play_background_file/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/play_background_file/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/play_background_file/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/registry.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/spider/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/spider/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/spider/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/swml_transfer/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/swml_transfer/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/swml_transfer/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/weather_api/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/weather_api/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/weather_api/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/web_search/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/web_search/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/web_search/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/wikipedia_search/README.md +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/utils/__init__.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/utils/pom_utils.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/utils/schema_utils.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/utils/token_generators.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents/utils/validators.py +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/dependency_links.txt +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/entry_points.txt +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/requires.txt +0 -0
- {signalwire_agents-0.1.26 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: signalwire_agents
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.28
|
4
4
|
Summary: SignalWire AI Agents SDK
|
5
5
|
Author-email: SignalWire Team <info@signalwire.com>
|
6
6
|
License: MIT
|
@@ -593,64 +593,6 @@ if __name__ == "__main__":
|
|
593
593
|
agent.serve(host="0.0.0.0", port=8000)
|
594
594
|
```
|
595
595
|
|
596
|
-
## Using State Management
|
597
|
-
|
598
|
-
```python
|
599
|
-
from signalwire_agents import AgentBase
|
600
|
-
from signalwire_agents.core.function_result import SwaigFunctionResult
|
601
|
-
from signalwire_agents.core.state import FileStateManager
|
602
|
-
|
603
|
-
class StatefulAgent(AgentBase):
|
604
|
-
def __init__(self):
|
605
|
-
# Configure state management
|
606
|
-
state_manager = FileStateManager(storage_dir="./state_data")
|
607
|
-
|
608
|
-
super().__init__(
|
609
|
-
name="stateful",
|
610
|
-
route="/stateful",
|
611
|
-
enable_state_tracking=True, # Enable state tracking
|
612
|
-
state_manager=state_manager # Use custom state manager
|
613
|
-
)
|
614
|
-
|
615
|
-
# When enable_state_tracking=True, startup_hook and hangup_hook
|
616
|
-
# are automatically registered to track session lifecycle
|
617
|
-
|
618
|
-
# Custom tool for accessing and updating state
|
619
|
-
@AgentBase.tool(
|
620
|
-
name="save_preference",
|
621
|
-
description="Save a user preference",
|
622
|
-
parameters={
|
623
|
-
"preference_name": {
|
624
|
-
"type": "string",
|
625
|
-
"description": "Name of the preference to save"
|
626
|
-
},
|
627
|
-
"preference_value": {
|
628
|
-
"type": "string",
|
629
|
-
"description": "Value of the preference"
|
630
|
-
}
|
631
|
-
}
|
632
|
-
)
|
633
|
-
def save_preference(self, args, raw_data):
|
634
|
-
# Get the call ID from the raw data
|
635
|
-
call_id = raw_data.get("call_id")
|
636
|
-
|
637
|
-
if call_id:
|
638
|
-
# Get current state or empty dict if none exists
|
639
|
-
state = self.get_state(call_id) or {}
|
640
|
-
|
641
|
-
# Update the state
|
642
|
-
preferences = state.get("preferences", {})
|
643
|
-
preferences[args.get("preference_name")] = args.get("preference_value")
|
644
|
-
state["preferences"] = preferences
|
645
|
-
|
646
|
-
# Save the updated state
|
647
|
-
self.update_state(call_id, state)
|
648
|
-
|
649
|
-
return SwaigFunctionResult("Preference saved successfully")
|
650
|
-
else:
|
651
|
-
return SwaigFunctionResult("Could not save preference: No call ID")
|
652
|
-
```
|
653
|
-
|
654
596
|
## Using Prefab Agents
|
655
597
|
|
656
598
|
```python
|
@@ -519,64 +519,6 @@ if __name__ == "__main__":
|
|
519
519
|
agent.serve(host="0.0.0.0", port=8000)
|
520
520
|
```
|
521
521
|
|
522
|
-
## Using State Management
|
523
|
-
|
524
|
-
```python
|
525
|
-
from signalwire_agents import AgentBase
|
526
|
-
from signalwire_agents.core.function_result import SwaigFunctionResult
|
527
|
-
from signalwire_agents.core.state import FileStateManager
|
528
|
-
|
529
|
-
class StatefulAgent(AgentBase):
|
530
|
-
def __init__(self):
|
531
|
-
# Configure state management
|
532
|
-
state_manager = FileStateManager(storage_dir="./state_data")
|
533
|
-
|
534
|
-
super().__init__(
|
535
|
-
name="stateful",
|
536
|
-
route="/stateful",
|
537
|
-
enable_state_tracking=True, # Enable state tracking
|
538
|
-
state_manager=state_manager # Use custom state manager
|
539
|
-
)
|
540
|
-
|
541
|
-
# When enable_state_tracking=True, startup_hook and hangup_hook
|
542
|
-
# are automatically registered to track session lifecycle
|
543
|
-
|
544
|
-
# Custom tool for accessing and updating state
|
545
|
-
@AgentBase.tool(
|
546
|
-
name="save_preference",
|
547
|
-
description="Save a user preference",
|
548
|
-
parameters={
|
549
|
-
"preference_name": {
|
550
|
-
"type": "string",
|
551
|
-
"description": "Name of the preference to save"
|
552
|
-
},
|
553
|
-
"preference_value": {
|
554
|
-
"type": "string",
|
555
|
-
"description": "Value of the preference"
|
556
|
-
}
|
557
|
-
}
|
558
|
-
)
|
559
|
-
def save_preference(self, args, raw_data):
|
560
|
-
# Get the call ID from the raw data
|
561
|
-
call_id = raw_data.get("call_id")
|
562
|
-
|
563
|
-
if call_id:
|
564
|
-
# Get current state or empty dict if none exists
|
565
|
-
state = self.get_state(call_id) or {}
|
566
|
-
|
567
|
-
# Update the state
|
568
|
-
preferences = state.get("preferences", {})
|
569
|
-
preferences[args.get("preference_name")] = args.get("preference_value")
|
570
|
-
state["preferences"] = preferences
|
571
|
-
|
572
|
-
# Save the updated state
|
573
|
-
self.update_state(call_id, state)
|
574
|
-
|
575
|
-
return SwaigFunctionResult("Preference saved successfully")
|
576
|
-
else:
|
577
|
-
return SwaigFunctionResult("Could not save preference: No call ID")
|
578
|
-
```
|
579
|
-
|
580
522
|
## Using Prefab Agents
|
581
523
|
|
582
524
|
```python
|