signalwire-agents 0.1.39__tar.gz → 0.1.41__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 (140) hide show
  1. {signalwire_agents-0.1.39/signalwire_agents.egg-info → signalwire_agents-0.1.41}/PKG-INFO +1 -1
  2. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/pyproject.toml +1 -1
  3. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/__init__.py +4 -2
  4. signalwire_agents-0.1.41/signalwire_agents/agents/bedrock.py +296 -0
  5. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent_base.py +3 -7
  6. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/function_result.py +3 -1
  7. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/swml_transfer/skill.py +16 -4
  8. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/weather_api/skill.py +1 -1
  9. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41/signalwire_agents.egg-info}/PKG-INFO +1 -1
  10. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents.egg-info/SOURCES.txt +1 -0
  11. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/LICENSE +0 -0
  12. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/README.md +0 -0
  13. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/setup.cfg +0 -0
  14. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/setup.py +0 -0
  15. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/agent_server.py +0 -0
  16. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/__init__.py +0 -0
  17. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/build_search.py +0 -0
  18. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/config.py +0 -0
  19. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/core/__init__.py +0 -0
  20. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/core/agent_loader.py +0 -0
  21. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/core/argparse_helpers.py +0 -0
  22. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/core/dynamic_config.py +0 -0
  23. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/core/service_loader.py +0 -0
  24. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/execution/__init__.py +0 -0
  25. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/execution/datamap_exec.py +0 -0
  26. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/execution/webhook_exec.py +0 -0
  27. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/output/__init__.py +0 -0
  28. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/output/output_formatter.py +0 -0
  29. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/output/swml_dump.py +0 -0
  30. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/simulation/__init__.py +0 -0
  31. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/simulation/data_generation.py +0 -0
  32. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/simulation/data_overrides.py +0 -0
  33. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/simulation/mock_env.py +0 -0
  34. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/swaig_test_wrapper.py +0 -0
  35. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/test_swaig.py +0 -0
  36. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/cli/types.py +0 -0
  37. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/__init__.py +0 -0
  38. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/__init__.py +0 -0
  39. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/config/__init__.py +0 -0
  40. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/deployment/__init__.py +0 -0
  41. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
  42. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/prompt/__init__.py +0 -0
  43. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/prompt/manager.py +0 -0
  44. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/routing/__init__.py +0 -0
  45. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/security/__init__.py +0 -0
  46. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/swml/__init__.py +0 -0
  47. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/tools/__init__.py +0 -0
  48. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/tools/decorator.py +0 -0
  49. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/agent/tools/registry.py +0 -0
  50. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/auth_handler.py +0 -0
  51. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/config_loader.py +0 -0
  52. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/contexts.py +0 -0
  53. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/data_map.py +0 -0
  54. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/logging_config.py +0 -0
  55. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/__init__.py +0 -0
  56. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/ai_config_mixin.py +0 -0
  57. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/auth_mixin.py +0 -0
  58. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/prompt_mixin.py +0 -0
  59. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/serverless_mixin.py +0 -0
  60. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/skill_mixin.py +0 -0
  61. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/state_mixin.py +0 -0
  62. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/tool_mixin.py +0 -0
  63. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/mixins/web_mixin.py +0 -0
  64. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/pom_builder.py +0 -0
  65. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/security/__init__.py +0 -0
  66. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/security/session_manager.py +0 -0
  67. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/security_config.py +0 -0
  68. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/skill_base.py +0 -0
  69. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/skill_manager.py +0 -0
  70. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/swaig_function.py +0 -0
  71. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/swml_builder.py +0 -0
  72. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/swml_handler.py +0 -0
  73. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/swml_renderer.py +0 -0
  74. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/core/swml_service.py +0 -0
  75. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/prefabs/__init__.py +0 -0
  76. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/prefabs/concierge.py +0 -0
  77. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/prefabs/faq_bot.py +0 -0
  78. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/prefabs/info_gatherer.py +0 -0
  79. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/prefabs/receptionist.py +0 -0
  80. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/prefabs/survey.py +0 -0
  81. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/schema.json +0 -0
  82. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/search/__init__.py +0 -0
  83. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/search/document_processor.py +0 -0
  84. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/search/index_builder.py +0 -0
  85. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/search/pgvector_backend.py +0 -0
  86. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/search/query_processor.py +0 -0
  87. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/search/search_engine.py +0 -0
  88. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/search/search_service.py +0 -0
  89. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/README.md +0 -0
  90. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/__init__.py +0 -0
  91. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/api_ninjas_trivia/README.md +0 -0
  92. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/api_ninjas_trivia/__init__.py +0 -0
  93. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/api_ninjas_trivia/skill.py +0 -0
  94. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datasphere/README.md +0 -0
  95. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datasphere/__init__.py +0 -0
  96. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datasphere/skill.py +0 -0
  97. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datasphere_serverless/README.md +0 -0
  98. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
  99. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
  100. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datetime/README.md +0 -0
  101. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datetime/__init__.py +0 -0
  102. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/datetime/skill.py +0 -0
  103. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/joke/README.md +0 -0
  104. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/joke/__init__.py +0 -0
  105. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/joke/skill.py +0 -0
  106. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/math/README.md +0 -0
  107. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/math/__init__.py +0 -0
  108. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/math/skill.py +0 -0
  109. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/mcp_gateway/README.md +0 -0
  110. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/mcp_gateway/__init__.py +0 -0
  111. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/mcp_gateway/skill.py +0 -0
  112. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/native_vector_search/README.md +0 -0
  113. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
  114. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
  115. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/play_background_file/README.md +0 -0
  116. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/play_background_file/__init__.py +0 -0
  117. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/play_background_file/skill.py +0 -0
  118. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/registry.py +0 -0
  119. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/spider/README.md +0 -0
  120. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/spider/__init__.py +0 -0
  121. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/spider/skill.py +0 -0
  122. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/swml_transfer/README.md +0 -0
  123. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/swml_transfer/__init__.py +0 -0
  124. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/weather_api/README.md +0 -0
  125. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/weather_api/__init__.py +0 -0
  126. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/web_search/README.md +0 -0
  127. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/web_search/__init__.py +0 -0
  128. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/web_search/skill.py +0 -0
  129. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/wikipedia_search/README.md +0 -0
  130. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
  131. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
  132. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/utils/__init__.py +0 -0
  133. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/utils/pom_utils.py +0 -0
  134. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/utils/schema_utils.py +0 -0
  135. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/utils/token_generators.py +0 -0
  136. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents/utils/validators.py +0 -0
  137. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents.egg-info/dependency_links.txt +0 -0
  138. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents.egg-info/entry_points.txt +0 -0
  139. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/signalwire_agents.egg-info/requires.txt +0 -0
  140. {signalwire_agents-0.1.39 → signalwire_agents-0.1.41}/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.39
3
+ Version: 0.1.41
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire_agents"
7
- version = "0.1.39"
7
+ version = "0.1.41"
8
8
  description = "SignalWire AI Agents SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -18,7 +18,7 @@ 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.39"
21
+ __version__ = "0.1.41"
22
22
 
23
23
  # Import core classes for easier access
24
24
  from .core.agent_base import AgentBase
@@ -29,6 +29,7 @@ from signalwire_agents.core.swml_service import SWMLService
29
29
  from signalwire_agents.core.swml_builder import SWMLBuilder
30
30
  from signalwire_agents.core.function_result import SwaigFunctionResult
31
31
  from signalwire_agents.core.swaig_function import SWAIGFunction
32
+ from signalwire_agents.agents.bedrock import BedrockAgent
32
33
 
33
34
  # Lazy import skills to avoid slow startup for CLI tools
34
35
  # Skills are now loaded on-demand when requested
@@ -142,5 +143,6 @@ __all__ = [
142
143
  "list_skills",
143
144
  "list_skills_with_params",
144
145
  "register_skill",
145
- "add_skill_directory"
146
+ "add_skill_directory",
147
+ "BedrockAgent"
146
148
  ]
@@ -0,0 +1,296 @@
1
+ """
2
+ Copyright (c) 2025 SignalWire
3
+
4
+ This file is part of the SignalWire AI Agents SDK.
5
+
6
+ Licensed under the MIT License.
7
+ See LICENSE file in the project root for full license information.
8
+ """
9
+
10
+ """
11
+ Bedrock Agent - Amazon Bedrock voice-to-voice integration
12
+
13
+ This module provides BedrockAgent, which extends AgentBase to support
14
+ Amazon Bedrock's voice-to-voice model while maintaining compatibility
15
+ with all SignalWire agent features like skills, POM, and SWAIG functions.
16
+ """
17
+
18
+ import json
19
+ from typing import Dict, List, Any, Optional, Union
20
+ from signalwire_agents.core.agent_base import AgentBase
21
+ from signalwire_agents.core.logging_config import get_logger
22
+
23
+ logger = get_logger("bedrock_agent")
24
+
25
+
26
+ class BedrockAgent(AgentBase):
27
+ """
28
+ Agent implementation for Amazon Bedrock voice-to-voice model
29
+
30
+ This agent extends AgentBase to provide full compatibility with
31
+ SignalWire's agent ecosystem while using Amazon Bedrock as the
32
+ AI backend. It supports all standard agent features including:
33
+ - Prompt building with text and POM
34
+ - Skills and SWAIG functions
35
+ - Post-prompt functionality
36
+ - Dynamic configuration
37
+
38
+ The main difference from the standard agent is that it generates
39
+ SWML with the "amazon_bedrock" verb instead of "ai".
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ name: str = "bedrock_agent",
45
+ route: str = "/bedrock",
46
+ system_prompt: Optional[str] = None,
47
+ voice_id: str = "matthew",
48
+ temperature: float = 0.7,
49
+ top_p: float = 0.9,
50
+ max_tokens: int = 1024,
51
+ **kwargs
52
+ ):
53
+ """
54
+ Initialize BedrockAgent
55
+
56
+ Args:
57
+ name: Agent name
58
+ route: HTTP route for the agent
59
+ system_prompt: Initial system prompt (can be overridden with set_prompt)
60
+ voice_id: Bedrock voice ID (default: matthew)
61
+ temperature: Generation temperature (0-1)
62
+ top_p: Nucleus sampling parameter (0-1)
63
+ max_tokens: Maximum tokens to generate
64
+ **kwargs: Additional arguments passed to AgentBase
65
+ """
66
+ # Store Bedrock-specific parameters first
67
+ self._voice_id = voice_id
68
+ self._temperature = temperature
69
+ self._top_p = top_p
70
+ self._max_tokens = max_tokens
71
+
72
+ # Initialize base class
73
+ super().__init__(name=name, route=route, **kwargs)
74
+
75
+ # Set initial prompt if provided (after super init)
76
+ if system_prompt:
77
+ self.set_prompt_text(system_prompt)
78
+
79
+ logger.info(f"BedrockAgent initialized: {name} on route {route}")
80
+
81
+ def _render_swml(self, call_id: str = None, modifications: Optional[dict] = None) -> str:
82
+ """
83
+ Render SWML document with amazon_bedrock verb
84
+
85
+ This method overrides the base implementation to generate
86
+ SWML with the amazon_bedrock verb structure that matches
87
+ the ai verb structure for consistency.
88
+
89
+ Args:
90
+ call_id: Optional call ID for session-specific tokens
91
+ modifications: Optional dict of modifications to apply
92
+
93
+ Returns:
94
+ SWML document as JSON string with amazon_bedrock verb
95
+ """
96
+ # Call parent to build the base SWML with ai verb
97
+ base_swml_json = super()._render_swml(call_id, modifications)
98
+
99
+ # Parse the JSON to modify it
100
+ swml = json.loads(base_swml_json)
101
+
102
+ # Find and transform the ai verb to amazon_bedrock
103
+ sections = swml.get("sections", {})
104
+ main_section = sections.get("main", [])
105
+
106
+ # Look for ai verb and transform it
107
+ for i, verb in enumerate(main_section):
108
+ if "ai" in verb:
109
+ ai_config = verb["ai"]
110
+
111
+ # Build amazon_bedrock verb with same structure
112
+ bedrock_verb = {
113
+ "amazon_bedrock": {
114
+ # Add voice configuration and inference params inside prompt
115
+ # Note: In Bedrock, voice and inference params are part of prompt config
116
+ "prompt": self._add_voice_to_prompt(ai_config.get("prompt", {})),
117
+
118
+ # Copy SWAIG if present
119
+ "SWAIG": ai_config.get("SWAIG", {}),
120
+
121
+ # Include params only if they were explicitly set via set_params()
122
+ # The C++ code ignores params for now (marked for future extensibility)
123
+ "params": ai_config.get("params", {}),
124
+
125
+ # Copy global_data if present
126
+ "global_data": ai_config.get("global_data", {}),
127
+
128
+ # Copy post_prompt if present
129
+ "post_prompt": ai_config.get("post_prompt"),
130
+
131
+ # Copy post_prompt_url if present
132
+ "post_prompt_url": ai_config.get("post_prompt_url")
133
+ }
134
+ }
135
+
136
+ # Remove None values
137
+ bedrock_config = bedrock_verb["amazon_bedrock"]
138
+ bedrock_verb["amazon_bedrock"] = {
139
+ k: v for k, v in bedrock_config.items()
140
+ if v is not None
141
+ }
142
+
143
+ # Replace ai verb with amazon_bedrock verb
144
+ main_section[i] = bedrock_verb
145
+ break
146
+
147
+ # Convert back to JSON string
148
+ return json.dumps(swml)
149
+
150
+ def _add_voice_to_prompt(self, prompt_config: Dict[str, Any]) -> Dict[str, Any]:
151
+ """
152
+ Add voice configuration to the prompt object
153
+
154
+ In Bedrock, voice configuration is part of the prompt object,
155
+ not a separate field like in OpenAI.
156
+
157
+ Args:
158
+ prompt_config: Current prompt configuration
159
+
160
+ Returns:
161
+ Updated prompt configuration with voice
162
+ """
163
+ # Create a clean copy, filtering out text-model-specific parameters
164
+ # that don't apply to Bedrock's voice-to-voice model
165
+ filtered_config = {}
166
+
167
+ # Copy over only the relevant fields
168
+ for key, value in prompt_config.items():
169
+ # Skip text-model-specific parameters
170
+ if key in ['barge_confidence', 'presence_penalty', 'frequency_penalty']:
171
+ continue
172
+ filtered_config[key] = value
173
+
174
+ # Add voice_id to the prompt configuration
175
+ filtered_config["voice_id"] = self._voice_id
176
+
177
+ # Add/override inference parameters (where C code expects them)
178
+ filtered_config["temperature"] = self._temperature
179
+ filtered_config["top_p"] = self._top_p
180
+
181
+ return filtered_config
182
+
183
+ def _build_bedrock_params(self, base_params: Dict[str, Any]) -> Dict[str, Any]:
184
+ """
185
+ Build Bedrock-specific parameters
186
+
187
+ Merges base parameters with Bedrock-specific inference settings.
188
+
189
+ Args:
190
+ base_params: Base parameters from AgentBase
191
+
192
+ Returns:
193
+ Combined parameters for Bedrock
194
+ """
195
+ # Start with base params
196
+ params = base_params.copy()
197
+
198
+ # Add Bedrock inference parameters
199
+ params.update({
200
+ "temperature": self._temperature,
201
+ "top_p": self._top_p,
202
+ "max_tokens": self._max_tokens
203
+ })
204
+
205
+ return params
206
+
207
+ def set_voice(self, voice_id: str) -> None:
208
+ """
209
+ Set the Bedrock voice ID
210
+
211
+ Args:
212
+ voice_id: Bedrock voice identifier (e.g., 'matthew', 'joanna')
213
+ """
214
+ self._voice_id = voice_id
215
+ logger.debug(f"Voice set to: {voice_id}")
216
+
217
+ def set_inference_params(
218
+ self,
219
+ temperature: Optional[float] = None,
220
+ top_p: Optional[float] = None,
221
+ max_tokens: Optional[int] = None
222
+ ) -> None:
223
+ """
224
+ Update Bedrock inference parameters
225
+
226
+ Args:
227
+ temperature: Generation temperature (0-1)
228
+ top_p: Nucleus sampling parameter (0-1)
229
+ max_tokens: Maximum tokens to generate
230
+ """
231
+ if temperature is not None:
232
+ self._temperature = temperature
233
+ if top_p is not None:
234
+ self._top_p = top_p
235
+ if max_tokens is not None:
236
+ self._max_tokens = max_tokens
237
+
238
+ logger.debug(f"Inference params updated: temp={self._temperature}, "
239
+ f"top_p={self._top_p}, max_tokens={self._max_tokens}")
240
+
241
+ # Methods that may not be relevant to Bedrock
242
+ # These are overridden to provide appropriate behavior or warnings
243
+
244
+ def set_llm_model(self, model: str) -> None:
245
+ """
246
+ Set LLM model - not applicable for Bedrock
247
+
248
+ Bedrock uses a fixed voice-to-voice model, so this method
249
+ logs a warning and does nothing.
250
+
251
+ Args:
252
+ model: Model name (ignored)
253
+ """
254
+ logger.warning(f"set_llm_model('{model}') called but Bedrock uses a fixed voice-to-voice model")
255
+
256
+ def set_llm_temperature(self, temperature: float) -> None:
257
+ """
258
+ Set LLM temperature - redirects to set_inference_params
259
+
260
+ Args:
261
+ temperature: Temperature value
262
+ """
263
+ self.set_inference_params(temperature=temperature)
264
+
265
+ def set_post_prompt_llm_params(self, **params) -> None:
266
+ """
267
+ Set post-prompt LLM parameters - not applicable for Bedrock
268
+
269
+ Bedrock uses OpenAI for post-prompt summarization, but those
270
+ parameters are configured in the C code.
271
+
272
+ Args:
273
+ **params: Ignored parameters
274
+ """
275
+ logger.warning("set_post_prompt_llm_params() called but Bedrock post-prompt uses OpenAI configured in C code")
276
+
277
+ def set_prompt_llm_params(self, **params) -> None:
278
+ """
279
+ Set prompt LLM parameters - use set_inference_params instead
280
+
281
+ For Bedrock, use set_inference_params() to configure temperature,
282
+ top_p, and max_tokens.
283
+
284
+ Args:
285
+ **params: Parameters (ignored, use set_inference_params)
286
+ """
287
+ logger.warning("set_prompt_llm_params() called - use set_inference_params() for Bedrock")
288
+
289
+ # Note: We don't override prompt methods like set_prompt_text, set_prompt_pom
290
+ # because those work fine - they just build the prompt structure that we
291
+ # transform in _render_swml()
292
+
293
+ def __repr__(self) -> str:
294
+ """String representation of the agent"""
295
+ return (f"BedrockAgent(name='{self.name}', route='{self.route}', "
296
+ f"voice='{self._voice_id}')")
@@ -274,6 +274,9 @@ class AgentBase(
274
274
  # Initialize contexts system
275
275
  self._contexts_builder = None
276
276
  self._contexts_defined = False
277
+
278
+ # Initialize SWAIG query params for dynamic config
279
+ self._swaig_query_params = {}
277
280
 
278
281
  @staticmethod
279
282
  def _load_service_config(config_file: Optional[str], service_name: str) -> dict:
@@ -298,13 +301,6 @@ class AgentBase(
298
301
  return service_config
299
302
 
300
303
  return {}
301
-
302
- # Initialize SWAIG query params for dynamic config
303
- self._swaig_query_params = {}
304
-
305
- self.schema_utils = SchemaUtils(schema_path)
306
- if self.schema_utils and self.schema_utils.schema:
307
- self.log.debug("schema_loaded", path=self.schema_utils.schema_path)
308
304
 
309
305
  def get_name(self) -> str:
310
306
  """
@@ -611,7 +611,8 @@ class SwaigFunctionResult:
611
611
  currency: str = "usd", language: str = "en-US", voice: str = "woman",
612
612
  description: Optional[str] = None, valid_card_types: str = "visa mastercard amex",
613
613
  parameters: Optional[List[Dict[str, str]]] = None,
614
- prompts: Optional[List[Dict[str, Any]]] = None) -> 'SwaigFunctionResult':
614
+ prompts: Optional[List[Dict[str, Any]]] = None,
615
+ ai_response: Optional[str] = "The payment status is ${pay_result}, do not mention anything else about collecting payment if successful.") -> 'SwaigFunctionResult':
615
616
  """
616
617
  Process payment using SWML pay action.
617
618
 
@@ -679,6 +680,7 @@ class SwaigFunctionResult:
679
680
  "version": "1.0.0",
680
681
  "sections": {
681
682
  "main": [
683
+ {"set": {"ai_response": ai_response}},
682
684
  {"pay": pay_params}
683
685
  ]
684
686
  }
@@ -270,9 +270,15 @@ class SWMLTransferSkill(SkillBase):
270
270
  # Extract common words from patterns for hints
271
271
  for pattern in self.transfers.keys():
272
272
  # Remove regex delimiters and flags
273
- clean_pattern = pattern.strip('/')
274
- if clean_pattern.endswith('i'):
273
+ clean_pattern = pattern
274
+ # Remove leading and trailing slashes
275
+ if clean_pattern.startswith('/'):
276
+ clean_pattern = clean_pattern[1:]
277
+ if clean_pattern.endswith('/'):
275
278
  clean_pattern = clean_pattern[:-1]
279
+ # Remove flags after the pattern (e.g., 'i' for case-insensitive)
280
+ elif clean_pattern.endswith('/i'):
281
+ clean_pattern = clean_pattern[:-2]
276
282
 
277
283
  # Only add if it's not a catch-all pattern
278
284
  if clean_pattern and not clean_pattern.startswith('.'):
@@ -299,9 +305,15 @@ class SWMLTransferSkill(SkillBase):
299
305
  for pattern, config in self.transfers.items():
300
306
  # Extract meaningful name from pattern
301
307
  # Remove regex delimiters and flags
302
- clean_pattern = pattern.strip('/')
303
- if clean_pattern.endswith('i'):
308
+ clean_pattern = pattern
309
+ # Remove leading and trailing slashes
310
+ if clean_pattern.startswith('/'):
311
+ clean_pattern = clean_pattern[1:]
312
+ if clean_pattern.endswith('/'):
304
313
  clean_pattern = clean_pattern[:-1]
314
+ # Remove flags after the pattern (e.g., 'i' for case-insensitive)
315
+ elif clean_pattern.endswith('/i'):
316
+ clean_pattern = clean_pattern[:-2]
305
317
 
306
318
  # Only add if it's not a catch-all pattern
307
319
  if clean_pattern and not clean_pattern.startswith('.'):
@@ -176,7 +176,7 @@ class WeatherApiSkill(SkillBase):
176
176
  "data_map": {
177
177
  "webhooks": [
178
178
  {
179
- "url": f"https://api.weatherapi.com/v1/current.json?key={self.api_key}&q=%{{args.location}}&aqi=no",
179
+ "url": f"https://api.weatherapi.com/v1/current.json?key={self.api_key}&q=${{args.location}}&aqi=no",
180
180
  "method": "GET",
181
181
  "output": SwaigFunctionResult(weather_template).to_dict()
182
182
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 0.1.39
3
+ Version: 0.1.41
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -11,6 +11,7 @@ signalwire_agents.egg-info/dependency_links.txt
11
11
  signalwire_agents.egg-info/entry_points.txt
12
12
  signalwire_agents.egg-info/requires.txt
13
13
  signalwire_agents.egg-info/top_level.txt
14
+ signalwire_agents/agents/bedrock.py
14
15
  signalwire_agents/cli/__init__.py
15
16
  signalwire_agents/cli/build_search.py
16
17
  signalwire_agents/cli/config.py