signalwire-agents 0.1.27__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.
Files changed (139) hide show
  1. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/CHANGELOG.md +4 -0
  2. {signalwire_agents-0.1.27/signalwire_agents.egg-info → signalwire_agents-0.1.28}/PKG-INFO +1 -59
  3. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/README.md +0 -58
  4. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/pyproject.toml +1 -1
  5. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/__init__.py +1 -4
  6. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/config.py +11 -1
  7. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/data_overrides.py +6 -2
  8. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/test_swaig.py +6 -0
  9. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent_base.py +1 -12
  10. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/state_mixin.py +1 -67
  11. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/tool_mixin.py +0 -65
  12. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/concierge.py +0 -3
  13. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/faq_bot.py +0 -3
  14. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/info_gatherer.py +0 -3
  15. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/receptionist.py +0 -3
  16. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/survey.py +0 -3
  17. signalwire_agents-0.1.28/signalwire_agents/skills/mcp_gateway/README.md +230 -0
  18. signalwire_agents-0.1.28/signalwire_agents/skills/mcp_gateway/__init__.py +1 -0
  19. signalwire_agents-0.1.28/signalwire_agents/skills/mcp_gateway/skill.py +339 -0
  20. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28/signalwire_agents.egg-info}/PKG-INFO +1 -59
  21. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/SOURCES.txt +3 -3
  22. signalwire_agents-0.1.27/signalwire_agents/core/state/__init__.py +0 -17
  23. signalwire_agents-0.1.27/signalwire_agents/core/state/file_state_manager.py +0 -219
  24. signalwire_agents-0.1.27/signalwire_agents/core/state/state_manager.py +0 -101
  25. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/LICENSE +0 -0
  26. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/requirements-dev.txt +0 -0
  27. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/requirements.txt +0 -0
  28. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/schema.json +0 -0
  29. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/setup.cfg +0 -0
  30. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/setup.py +0 -0
  31. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/agent_server.py +0 -0
  32. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/__init__.py +0 -0
  33. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/build_search.py +0 -0
  34. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/__init__.py +0 -0
  35. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/agent_loader.py +0 -0
  36. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/argparse_helpers.py +0 -0
  37. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/core/dynamic_config.py +0 -0
  38. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/execution/__init__.py +0 -0
  39. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/execution/datamap_exec.py +0 -0
  40. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/execution/webhook_exec.py +0 -0
  41. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/output/__init__.py +0 -0
  42. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/output/output_formatter.py +0 -0
  43. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/output/swml_dump.py +0 -0
  44. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/__init__.py +0 -0
  45. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/data_generation.py +0 -0
  46. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/simulation/mock_env.py +0 -0
  47. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/cli/types.py +0 -0
  48. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/__init__.py +0 -0
  49. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/__init__.py +0 -0
  50. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/config/__init__.py +0 -0
  51. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/deployment/__init__.py +0 -0
  52. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
  53. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/prompt/__init__.py +0 -0
  54. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/prompt/manager.py +0 -0
  55. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/routing/__init__.py +0 -0
  56. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/security/__init__.py +0 -0
  57. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/swml/__init__.py +0 -0
  58. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/tools/__init__.py +0 -0
  59. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/tools/decorator.py +0 -0
  60. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/agent/tools/registry.py +0 -0
  61. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/contexts.py +0 -0
  62. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/data_map.py +0 -0
  63. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/function_result.py +0 -0
  64. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/logging_config.py +0 -0
  65. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/__init__.py +0 -0
  66. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/ai_config_mixin.py +0 -0
  67. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/auth_mixin.py +0 -0
  68. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/prompt_mixin.py +0 -0
  69. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/serverless_mixin.py +0 -0
  70. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/skill_mixin.py +0 -0
  71. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/mixins/web_mixin.py +0 -0
  72. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/pom_builder.py +0 -0
  73. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/security/__init__.py +0 -0
  74. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/security/session_manager.py +0 -0
  75. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/skill_base.py +0 -0
  76. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/skill_manager.py +0 -0
  77. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/swaig_function.py +0 -0
  78. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_builder.py +0 -0
  79. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_handler.py +0 -0
  80. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_renderer.py +0 -0
  81. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/core/swml_service.py +0 -0
  82. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/prefabs/__init__.py +0 -0
  83. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/schema.json +0 -0
  84. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/search/__init__.py +0 -0
  85. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/search/document_processor.py +0 -0
  86. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/search/index_builder.py +0 -0
  87. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/search/query_processor.py +0 -0
  88. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/search/search_engine.py +0 -0
  89. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/search/search_service.py +0 -0
  90. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/README.md +0 -0
  91. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/__init__.py +0 -0
  92. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/api_ninjas_trivia/README.md +0 -0
  93. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/api_ninjas_trivia/__init__.py +0 -0
  94. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/api_ninjas_trivia/skill.py +0 -0
  95. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere/README.md +0 -0
  96. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere/__init__.py +0 -0
  97. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere/skill.py +0 -0
  98. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere_serverless/README.md +0 -0
  99. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
  100. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
  101. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datetime/README.md +0 -0
  102. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datetime/__init__.py +0 -0
  103. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/datetime/skill.py +0 -0
  104. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/joke/README.md +0 -0
  105. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/joke/__init__.py +0 -0
  106. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/joke/skill.py +0 -0
  107. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/math/README.md +0 -0
  108. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/math/__init__.py +0 -0
  109. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/math/skill.py +0 -0
  110. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
  111. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
  112. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/play_background_file/README.md +0 -0
  113. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/play_background_file/__init__.py +0 -0
  114. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/play_background_file/skill.py +0 -0
  115. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/registry.py +0 -0
  116. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/spider/README.md +0 -0
  117. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/spider/__init__.py +0 -0
  118. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/spider/skill.py +0 -0
  119. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/swml_transfer/README.md +0 -0
  120. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/swml_transfer/__init__.py +0 -0
  121. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/swml_transfer/skill.py +0 -0
  122. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/weather_api/README.md +0 -0
  123. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/weather_api/__init__.py +0 -0
  124. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/weather_api/skill.py +0 -0
  125. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/web_search/README.md +0 -0
  126. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/web_search/__init__.py +0 -0
  127. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/web_search/skill.py +0 -0
  128. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/wikipedia_search/README.md +0 -0
  129. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
  130. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
  131. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/utils/__init__.py +0 -0
  132. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/utils/pom_utils.py +0 -0
  133. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/utils/schema_utils.py +0 -0
  134. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/utils/token_generators.py +0 -0
  135. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents/utils/validators.py +0 -0
  136. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/dependency_links.txt +0 -0
  137. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/entry_points.txt +0 -0
  138. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/requires.txt +0 -0
  139. {signalwire_agents-0.1.27 → signalwire_agents-0.1.28}/signalwire_agents.egg-info/top_level.txt +0 -0
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.28] - 2025-06-23
4
+
5
+ - Version bump
6
+
3
7
  ## [0.1.27] - 2025-06-20
4
8
 
5
9
  - Version bump
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 0.1.27
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire_agents"
7
- version = "0.1.27"
7
+ version = "0.1.28"
8
8
  description = "SignalWire AI Agents SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -18,13 +18,12 @@ A package for building AI agents using SignalWire's AI and SWML capabilities.
18
18
  from .core.logging_config import configure_logging
19
19
  configure_logging()
20
20
 
21
- __version__ = "0.1.27"
21
+ __version__ = "0.1.28"
22
22
 
23
23
  # Import core classes for easier access
24
24
  from .core.agent_base import AgentBase
25
25
  from .core.contexts import ContextBuilder, Context, Step, create_simple_context
26
26
  from .core.data_map import DataMap, create_simple_api_tool, create_expression_tool
27
- from .core.state import StateManager, FileStateManager
28
27
  from signalwire_agents.agent_server import AgentServer
29
28
  from signalwire_agents.core.swml_service import SWMLService
30
29
  from signalwire_agents.core.swml_builder import SWMLBuilder
@@ -68,8 +67,6 @@ __all__ = [
68
67
  "AgentServer",
69
68
  "SWMLService",
70
69
  "SWMLBuilder",
71
- "StateManager",
72
- "FileStateManager",
73
70
  "SwaigFunctionResult",
74
71
  "SWAIGFunction",
75
72
  "DataMap",
@@ -41,12 +41,22 @@ ERROR_FUNCTION_NOT_FOUND = "Function '{function_name}' not found in agent"
41
41
  ERROR_CGI_HOST_REQUIRED = "CGI simulation requires --cgi-host"
42
42
 
43
43
  # Help messages
44
- HELP_DESCRIPTION = "Test SWAIG functions and generate SWML documents for SignalWire AI agents"
44
+ HELP_DESCRIPTION = """Test SWAIG functions and generate SWML documents for SignalWire AI agents
45
+
46
+ IMPORTANT: When using --exec, ALL options (like --call-id, --verbose, etc.) must come BEFORE --exec.
47
+ Everything after --exec <function_name> is treated as arguments to the function."""
48
+
45
49
  HELP_EPILOG_SHORT = """
46
50
  examples:
47
51
  # Execute a function
48
52
  %(prog)s agent.py --exec search --query "test" --limit 5
49
53
 
54
+ # Execute with persistent session (--call-id MUST come BEFORE --exec)
55
+ %(prog)s agent.py --call-id my-session --exec add_todo --text "Buy milk"
56
+
57
+ # WRONG: This won't work! --call-id is treated as a function argument
58
+ %(prog)s agent.py --exec add_todo --text "Buy milk" --call-id my-session
59
+
50
60
  # Generate SWML
51
61
  %(prog)s agent.py --dump-swml --raw | jq '.'
52
62
 
@@ -120,8 +120,12 @@ def apply_convenience_mappings(data: Dict[str, Any], args: argparse.Namespace) -
120
120
 
121
121
  # Map high-level arguments to specific paths
122
122
  if hasattr(args, 'call_id') and args.call_id:
123
- set_nested_value(data, "call.call_id", args.call_id)
124
- set_nested_value(data, "call.tag", args.call_id) # tag often matches call_id
123
+ # Set at root level for SWAIG functions
124
+ data["call_id"] = args.call_id
125
+ # Also set in call object if it exists
126
+ if "call" in data:
127
+ set_nested_value(data, "call.call_id", args.call_id)
128
+ set_nested_value(data, "call.tag", args.call_id) # tag often matches call_id
125
129
 
126
130
  if hasattr(args, 'project_id') and args.project_id:
127
131
  set_nested_value(data, "call.project_id", args.project_id)
@@ -727,6 +727,12 @@ def main():
727
727
  # Default behavior - minimal data
728
728
  post_data = generate_minimal_post_data(args.tool_name, function_args)
729
729
 
730
+ # Apply convenience mappings from CLI args (e.g., --call-id)
731
+ post_data = apply_convenience_mappings(post_data, args)
732
+
733
+ # Apply explicit overrides
734
+ post_data = apply_overrides(post_data, args.override, args.override_json)
735
+
730
736
  if args.verbose:
731
737
  print(f"Post data: {json.dumps(post_data, indent=2)}")
732
738
  print("-" * 60)
@@ -49,7 +49,6 @@ from signalwire_agents.core.swaig_function import SWAIGFunction
49
49
  from signalwire_agents.core.function_result import SwaigFunctionResult
50
50
  from signalwire_agents.core.swml_renderer import SwmlRenderer
51
51
  from signalwire_agents.core.security.session_manager import SessionManager
52
- from signalwire_agents.core.state import StateManager, FileStateManager
53
52
  from signalwire_agents.core.swml_service import SWMLService
54
53
  from signalwire_agents.core.swml_handler import AIVerbHandler
55
54
  from signalwire_agents.core.skill_manager import SkillManager
@@ -113,13 +112,11 @@ class AgentBase(
113
112
  port: int = 3000,
114
113
  basic_auth: Optional[Tuple[str, str]] = None,
115
114
  use_pom: bool = True,
116
- enable_state_tracking: bool = False,
117
115
  token_expiry_secs: int = 3600,
118
116
  auto_answer: bool = True,
119
117
  record_call: bool = False,
120
118
  record_format: str = "mp4",
121
119
  record_stereo: bool = True,
122
- state_manager: Optional[StateManager] = None,
123
120
  default_webhook_url: Optional[str] = None,
124
121
  agent_id: Optional[str] = None,
125
122
  native_functions: Optional[List[str]] = None,
@@ -138,13 +135,11 @@ class AgentBase(
138
135
  port: Port to bind the web server to
139
136
  basic_auth: Optional (username, password) tuple for basic auth
140
137
  use_pom: Whether to use POM for prompt building
141
- enable_state_tracking: Whether to register startup_hook and hangup_hook SWAIG functions to track conversation state
142
138
  token_expiry_secs: Seconds until tokens expire
143
139
  auto_answer: Whether to automatically answer calls
144
140
  record_call: Whether to record calls
145
141
  record_format: Recording format
146
142
  record_stereo: Whether to record in stereo
147
- state_manager: Optional state manager for this agent
148
143
  default_webhook_url: Optional default webhook URL for all SWAIG functions
149
144
  agent_id: Optional unique ID for this agent, generated if not provided
150
145
  native_functions: Optional list of native functions to include in the SWAIG object
@@ -207,7 +202,6 @@ class AgentBase(
207
202
 
208
203
  # Initialize session manager
209
204
  self._session_manager = SessionManager(token_expiry_secs=token_expiry_secs)
210
- self._enable_state_tracking = enable_state_tracking
211
205
 
212
206
  # URL override variables
213
207
  self._web_hook_url_override = None
@@ -229,8 +223,6 @@ class AgentBase(
229
223
  # Process declarative PROMPT_SECTIONS if defined in subclass
230
224
  self._process_prompt_sections()
231
225
 
232
- # Initialize state manager
233
- self._state_manager = state_manager or FileStateManager()
234
226
 
235
227
  # Process class-decorated tools (using @AgentBase.tool)
236
228
  self._tool_registry.register_class_decorated_tools()
@@ -238,9 +230,6 @@ class AgentBase(
238
230
  # Add native_functions parameter
239
231
  self.native_functions = native_functions or []
240
232
 
241
- # Register state tracking tools if enabled
242
- if enable_state_tracking:
243
- self._register_state_tracking_tools()
244
233
 
245
234
  # Initialize new configuration containers
246
235
  self._hints = []
@@ -581,7 +570,7 @@ class AgentBase(
581
570
  post_prompt = agent_to_use.get_post_prompt()
582
571
 
583
572
  # Generate a call ID if needed
584
- if agent_to_use._enable_state_tracking and call_id is None:
573
+ if call_id is None:
585
574
  call_id = agent_to_use._session_manager.create_session()
586
575
 
587
576
  # Start with any SWAIG query params that were set
@@ -150,70 +150,4 @@ class StateMixin:
150
150
  self.log.error("token_validation_error", error=str(e), function=function_name)
151
151
  return False
152
152
 
153
- # Note: set_dynamic_config_callback is implemented in WebMixin
154
-
155
- def _register_state_tracking_tools(self):
156
- """
157
- Register special tools for state tracking
158
-
159
- This adds startup_hook and hangup_hook SWAIG functions that automatically
160
- activate and deactivate the session when called. These are useful for
161
- tracking call state and cleaning up resources when a call ends.
162
- """
163
- # Register startup hook to activate session
164
- self.define_tool(
165
- name="startup_hook",
166
- description="Called when a new conversation starts to initialize state",
167
- parameters={},
168
- handler=lambda args, raw_data: self._handle_startup_hook(args, raw_data),
169
- secure=False # No auth needed for this system function
170
- )
171
-
172
- # Register hangup hook to end session
173
- self.define_tool(
174
- name="hangup_hook",
175
- description="Called when conversation ends to clean up resources",
176
- parameters={},
177
- handler=lambda args, raw_data: self._handle_hangup_hook(args, raw_data),
178
- secure=False # No auth needed for this system function
179
- )
180
-
181
- def _handle_startup_hook(self, args, raw_data):
182
- """
183
- Handle the startup hook function call
184
-
185
- Args:
186
- args: Function arguments (empty for this hook)
187
- raw_data: Raw request data containing call_id
188
-
189
- Returns:
190
- Success response
191
- """
192
- call_id = raw_data.get("call_id") if raw_data else None
193
- if call_id:
194
- self.log.info("session_activated", call_id=call_id)
195
- self._session_manager.activate_session(call_id)
196
- return SwaigFunctionResult("Session activated")
197
- else:
198
- self.log.warning("session_activation_failed", error="No call_id provided")
199
- return SwaigFunctionResult("Failed to activate session: No call_id provided")
200
-
201
- def _handle_hangup_hook(self, args, raw_data):
202
- """
203
- Handle the hangup hook function call
204
-
205
- Args:
206
- args: Function arguments (empty for this hook)
207
- raw_data: Raw request data containing call_id
208
-
209
- Returns:
210
- Success response
211
- """
212
- call_id = raw_data.get("call_id") if raw_data else None
213
- if call_id:
214
- self.log.info("session_ended", call_id=call_id)
215
- self._session_manager.end_session(call_id)
216
- return SwaigFunctionResult("Session ended")
217
- else:
218
- self.log.warning("session_end_failed", error="No call_id provided")
219
- return SwaigFunctionResult("Failed to end session: No call_id provided")
153
+ # Note: set_dynamic_config_callback is implemented in WebMixin
@@ -161,71 +161,6 @@ class ToolMixin:
161
161
  # If the handler raises an exception, return an error response
162
162
  return {"response": f"Error executing function '{name}': {str(e)}"}
163
163
 
164
- def _register_state_tracking_tools(self):
165
- """
166
- Register special tools for state tracking
167
-
168
- This adds startup_hook and hangup_hook SWAIG functions that automatically
169
- activate and deactivate the session when called. These are useful for
170
- tracking call state and cleaning up resources when a call ends.
171
- """
172
- # Register startup hook to activate session
173
- self.define_tool(
174
- name="startup_hook",
175
- description="Called when a new conversation starts to initialize state",
176
- parameters={},
177
- handler=lambda args, raw_data: self._handle_startup_hook(args, raw_data),
178
- secure=False # No auth needed for this system function
179
- )
180
-
181
- # Register hangup hook to end session
182
- self.define_tool(
183
- name="hangup_hook",
184
- description="Called when conversation ends to clean up resources",
185
- parameters={},
186
- handler=lambda args, raw_data: self._handle_hangup_hook(args, raw_data),
187
- secure=False # No auth needed for this system function
188
- )
189
-
190
- def _handle_startup_hook(self, args, raw_data):
191
- """
192
- Handle the startup hook function call
193
-
194
- Args:
195
- args: Function arguments (empty for this hook)
196
- raw_data: Raw request data containing call_id
197
-
198
- Returns:
199
- Success response
200
- """
201
- call_id = raw_data.get("call_id") if raw_data else None
202
- if call_id:
203
- self.log.info("session_activated", call_id=call_id)
204
- self._session_manager.activate_session(call_id)
205
- return SwaigFunctionResult("Session activated")
206
- else:
207
- self.log.warning("session_activation_failed", error="No call_id provided")
208
- return SwaigFunctionResult("Failed to activate session: No call_id provided")
209
-
210
- def _handle_hangup_hook(self, args, raw_data):
211
- """
212
- Handle the hangup hook function call
213
-
214
- Args:
215
- args: Function arguments (empty for this hook)
216
- raw_data: Raw request data containing call_id
217
-
218
- Returns:
219
- Success response
220
- """
221
- call_id = raw_data.get("call_id") if raw_data else None
222
- if call_id:
223
- self.log.info("session_ended", call_id=call_id)
224
- self._session_manager.end_session(call_id)
225
- return SwaigFunctionResult("Session ended")
226
- else:
227
- self.log.warning("session_end_failed", error="No call_id provided")
228
- return SwaigFunctionResult("Failed to end session: No call_id provided")
229
164
 
230
165
  def _execute_swaig_function(self, function_name: str, args: Optional[Dict[str, Any]] = None, call_id: Optional[str] = None, raw_data: Optional[Dict[str, Any]] = None):
231
166
  """
@@ -52,7 +52,6 @@ class ConciergeAgent(AgentBase):
52
52
  welcome_message: Optional[str] = None,
53
53
  name: str = "concierge",
54
54
  route: str = "/concierge",
55
- enable_state_tracking: bool = True,
56
55
  **kwargs
57
56
  ):
58
57
  """
@@ -67,7 +66,6 @@ class ConciergeAgent(AgentBase):
67
66
  welcome_message: Optional custom welcome message
68
67
  name: Agent name for the route
69
68
  route: HTTP route for this agent
70
- enable_state_tracking: Whether to enable state tracking (default: True)
71
69
  **kwargs: Additional arguments for AgentBase
72
70
  """
73
71
  # Initialize the base agent
@@ -75,7 +73,6 @@ class ConciergeAgent(AgentBase):
75
73
  name=name,
76
74
  route=route,
77
75
  use_pom=True,
78
- enable_state_tracking=enable_state_tracking,
79
76
  **kwargs
80
77
  )
81
78
 
@@ -51,7 +51,6 @@ class FAQBotAgent(AgentBase):
51
51
  persona: Optional[str] = None,
52
52
  name: str = "faq_bot",
53
53
  route: str = "/faq",
54
- enable_state_tracking: bool = True, # Enable state tracking by default
55
54
  **kwargs
56
55
  ):
57
56
  """
@@ -66,7 +65,6 @@ class FAQBotAgent(AgentBase):
66
65
  persona: Optional custom personality description
67
66
  name: Agent name for the route
68
67
  route: HTTP route for this agent
69
- enable_state_tracking: Whether to enable state tracking (default: True)
70
68
  **kwargs: Additional arguments for AgentBase
71
69
  """
72
70
  # Initialize the base agent
@@ -74,7 +72,6 @@ class FAQBotAgent(AgentBase):
74
72
  name=name,
75
73
  route=route,
76
74
  use_pom=True,
77
- enable_state_tracking=enable_state_tracking, # Pass state tracking parameter to base
78
75
  **kwargs
79
76
  )
80
77
 
@@ -45,7 +45,6 @@ class InfoGathererAgent(AgentBase):
45
45
  questions: Optional[List[Dict[str, str]]] = None,
46
46
  name: str = "info_gatherer",
47
47
  route: str = "/info_gatherer",
48
- enable_state_tracking: bool = True, # Enable state tracking by default for InfoGatherer
49
48
  **kwargs
50
49
  ):
51
50
  """
@@ -59,7 +58,6 @@ class InfoGathererAgent(AgentBase):
59
58
  - confirm: (Optional) If set to True, the agent will confirm the answer before submitting
60
59
  name: Agent name for the route
61
60
  route: HTTP route for this agent
62
- enable_state_tracking: Whether to enable state tracking (default: True)
63
61
  **kwargs: Additional arguments for AgentBase
64
62
  """
65
63
  # Initialize the base agent
@@ -67,7 +65,6 @@ class InfoGathererAgent(AgentBase):
67
65
  name=name,
68
66
  route=route,
69
67
  use_pom=True,
70
- enable_state_tracking=enable_state_tracking, # Pass state tracking parameter to base
71
68
  **kwargs
72
69
  )
73
70
 
@@ -41,7 +41,6 @@ class ReceptionistAgent(AgentBase):
41
41
  route: str = "/receptionist",
42
42
  greeting: str = "Thank you for calling. How can I help you today?",
43
43
  voice: str = "rime.spore",
44
- enable_state_tracking: bool = True, # Enable state tracking by default
45
44
  **kwargs
46
45
  ):
47
46
  """
@@ -56,7 +55,6 @@ class ReceptionistAgent(AgentBase):
56
55
  route: HTTP route for this agent
57
56
  greeting: Initial greeting message
58
57
  voice: Voice ID to use
59
- enable_state_tracking: Whether to enable state tracking (default: True)
60
58
  **kwargs: Additional arguments for AgentBase
61
59
  """
62
60
  # Initialize the base agent
@@ -64,7 +62,6 @@ class ReceptionistAgent(AgentBase):
64
62
  name=name,
65
63
  route=route,
66
64
  use_pom=True,
67
- enable_state_tracking=enable_state_tracking, # Pass state tracking parameter to base
68
65
  **kwargs
69
66
  )
70
67
 
@@ -62,7 +62,6 @@ class SurveyAgent(AgentBase):
62
62
  max_retries: int = 2,
63
63
  name: str = "survey",
64
64
  route: str = "/survey",
65
- enable_state_tracking: bool = True, # Enable state tracking by default
66
65
  **kwargs
67
66
  ):
68
67
  """
@@ -83,7 +82,6 @@ class SurveyAgent(AgentBase):
83
82
  max_retries: Maximum number of times to retry invalid answers
84
83
  name: Name for the agent (default: "survey")
85
84
  route: HTTP route for the agent (default: "/survey")
86
- enable_state_tracking: Whether to enable state tracking (default: True)
87
85
  **kwargs: Additional arguments for AgentBase
88
86
  """
89
87
  # Initialize the base agent
@@ -91,7 +89,6 @@ class SurveyAgent(AgentBase):
91
89
  name=name,
92
90
  route=route,
93
91
  use_pom=True,
94
- enable_state_tracking=enable_state_tracking, # Pass state tracking parameter to base
95
92
  **kwargs
96
93
  )
97
94