signalwire-sdk 3.0.2.dev64__tar.gz → 3.0.2.dev65__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 (211) hide show
  1. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/pyproject.toml +2 -2
  3. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/__init__.py +1 -1
  4. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/agent_server.py +17 -20
  5. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/agents/bedrock.py +8 -8
  6. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/build_search.py +4 -6
  7. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/agent_loader.py +15 -15
  8. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/argparse_helpers.py +4 -4
  9. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/dynamic_config.py +2 -2
  10. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/service_loader.py +12 -12
  11. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/dokku.py +2 -2
  12. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/execution/datamap_exec.py +4 -4
  13. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/execution/webhook_exec.py +5 -5
  14. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/init_project.py +12 -12
  15. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/data_generation.py +9 -9
  16. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/data_overrides.py +6 -6
  17. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/mock_env.py +18 -18
  18. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/test_swaig.py +2 -2
  19. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/types.py +15 -15
  20. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/prompt/manager.py +15 -15
  21. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/registry.py +11 -10
  22. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/type_inference.py +6 -6
  23. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent_base.py +48 -56
  24. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/auth_handler.py +7 -6
  25. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/config_loader.py +13 -13
  26. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/contexts.py +67 -67
  27. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/data_map.py +29 -28
  28. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/function_result.py +67 -70
  29. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/ai_config_mixin.py +25 -25
  30. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/auth_mixin.py +1 -2
  31. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +4 -4
  32. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/prompt_mixin.py +11 -11
  33. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/serverless_mixin.py +4 -4
  34. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/skill_mixin.py +3 -3
  35. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/tool_mixin.py +13 -12
  36. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/web_mixin.py +16 -15
  37. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/pom_builder.py +11 -11
  38. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/session_manager.py +5 -5
  39. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/webhook_middleware.py +4 -3
  40. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/webhook_validator.py +9 -8
  41. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security_config.py +10 -14
  42. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/skill_base.py +13 -13
  43. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/skill_manager.py +6 -6
  44. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swaig_function.py +15 -14
  45. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_builder.py +27 -27
  46. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_handler.py +14 -14
  47. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_renderer.py +12 -12
  48. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_service.py +36 -35
  49. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/livewire/__init__.py +20 -19
  50. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/livewire/plugins.py +2 -2
  51. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/gateway_service.py +4 -4
  52. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/mcp_manager.py +22 -22
  53. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/session_manager.py +9 -9
  54. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/pom/pom.py +22 -22
  55. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/concierge.py +6 -7
  56. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/faq_bot.py +4 -4
  57. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/info_gatherer.py +6 -6
  58. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/receptionist.py +1 -3
  59. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/survey.py +5 -5
  60. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/call.py +192 -193
  61. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/client.py +27 -26
  62. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/event.py +26 -26
  63. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/message.py +9 -8
  64. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/phone_numbers.py +4 -6
  65. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/__init__.py +2 -2
  66. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/document_processor.py +55 -55
  67. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/index_builder.py +31 -31
  68. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/migration.py +7 -7
  69. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/pgvector_backend.py +40 -40
  70. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/query_processor.py +12 -12
  71. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/search_engine.py +52 -52
  72. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/search_service.py +33 -33
  73. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +6 -6
  74. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/claude_skills/skill.py +15 -15
  75. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere/skill.py +8 -8
  76. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere_serverless/skill.py +7 -7
  77. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datetime/skill.py +6 -6
  78. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/google_maps/skill.py +7 -7
  79. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/info_gatherer/skill.py +6 -6
  80. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/joke/skill.py +7 -7
  81. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/math/skill.py +9 -8
  82. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/mcp_gateway/skill.py +12 -12
  83. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/native_vector_search/skill.py +10 -10
  84. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/play_background_file/skill.py +5 -5
  85. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/registry.py +12 -12
  86. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/spider/skill.py +14 -14
  87. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/swml_transfer/skill.py +7 -7
  88. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/weather_api/skill.py +5 -5
  89. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/skill.py +17 -17
  90. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/skill_improved.py +12 -12
  91. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/skill_original.py +9 -9
  92. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/wikipedia_search/skill.py +4 -4
  93. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/schema_utils.py +19 -21
  94. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/web/web_service.py +13 -13
  95. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
  96. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/LICENSE +0 -0
  97. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/README.md +0 -0
  98. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/man/sw-agent-init.1 +0 -0
  99. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/man/sw-search.1 +0 -0
  100. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/man/swaig-test.1 +0 -0
  101. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/setup.cfg +0 -0
  102. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/setup.py +0 -0
  103. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/__init__.py +0 -0
  104. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/config.py +0 -0
  105. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/__init__.py +0 -0
  106. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  107. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/output/__init__.py +0 -0
  108. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  109. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  110. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  111. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  112. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/__init__.py +0 -0
  113. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/_agent_host.py +0 -0
  114. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/__init__.py +0 -0
  115. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  116. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  117. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  118. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  119. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  120. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  121. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  122. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  123. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  124. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/logging_config.py +0 -0
  125. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  126. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
  127. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  128. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/__init__.py +0 -0
  129. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/security_utils.py +0 -0
  130. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  131. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/pom/__init__.py +0 -0
  132. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/pom/pom_tool.py +0 -0
  133. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/__init__.py +0 -0
  134. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/__init__.py +0 -0
  135. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/constants.py +0 -0
  136. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/__init__.py +0 -0
  137. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/_base.py +0 -0
  138. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/_pagination.py +0 -0
  139. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/call_handler.py +0 -0
  140. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/client.py +0 -0
  141. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  142. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  143. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  144. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  145. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/compat.py +0 -0
  146. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  147. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  148. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  149. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  150. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  151. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  152. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  153. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  154. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  155. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  156. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  157. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  158. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  159. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  160. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  161. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  162. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/schema.json +0 -0
  163. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/models.py +0 -0
  164. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/README.md +0 -0
  165. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/__init__.py +0 -0
  166. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  167. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  168. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  169. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  170. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  171. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  172. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  173. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  174. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datetime/README.md +0 -0
  175. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  176. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  177. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  178. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  179. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/joke/README.md +0 -0
  180. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  181. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/math/README.md +0 -0
  182. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/math/__init__.py +0 -0
  183. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  184. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  185. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  186. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  187. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  188. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  189. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/spider/README.md +0 -0
  190. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  191. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  192. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  193. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  194. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  195. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/README.md +0 -0
  196. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  197. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  198. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  199. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/__init__.py +0 -0
  200. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/pom_utils.py +0 -0
  201. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/token_generators.py +0 -0
  202. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/url_validator.py +0 -0
  203. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/validators.py +0 -0
  204. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/web/__init__.py +0 -0
  205. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
  206. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  207. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  208. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  209. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  210. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/tests/test_examples.py +0 -0
  211. {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/tests/test_mcp_integration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.0.2.dev64
3
+ Version: 3.0.2.dev65
4
4
  Summary: SignalWire 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-sdk"
7
- version = "3.0.2.dev64"
7
+ version = "3.0.2.dev65"
8
8
  description = "SignalWire SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -170,7 +170,7 @@ line-length = 88
170
170
  # E4/E7/E9 + F are the ruff defaults (E501 line-length intentionally excluded —
171
171
  # formatting is owned by `ruff format`, not the linter). B = flake8-bugbear
172
172
  # (likely-bug patterns), S = flake8-bandit (security smells).
173
- select = ["E4", "E7", "E9", "F", "B", "S", "C4", "PERF", "SIM", "PTH", "RET", "RUF"]
173
+ select = ["E4", "E7", "E9", "F", "B", "S", "C4", "PERF", "SIM", "PTH", "RET", "RUF", "UP"]
174
174
 
175
175
  [tool.ruff.lint.per-file-ignores]
176
176
  # Tests are built on assert; bandit's S101 is noise there.
@@ -17,7 +17,7 @@ from .core.logging_config import configure_logging
17
17
 
18
18
  configure_logging()
19
19
 
20
- __version__ = "3.0.2.dev64"
20
+ __version__ = "3.0.2.dev65"
21
21
 
22
22
  # Import core classes for easier access.
23
23
  # These imports are intentionally placed after configure_logging() so the SDK's
@@ -12,7 +12,8 @@ AgentServer - Class for hosting multiple SignalWire AI Agents in a single server
12
12
  import os
13
13
  import re
14
14
  from pathlib import Path
15
- from typing import Dict, Any, Optional, List, Tuple, Callable
15
+ from typing import Any
16
+ from collections.abc import Callable
16
17
 
17
18
  try:
18
19
  from fastapi import FastAPI, Request, Response
@@ -66,7 +67,7 @@ class AgentServer:
66
67
  self.app = FastAPI(
67
68
  title="SignalWire AI Agents",
68
69
  description="Hosted SignalWire AI Agents",
69
- version="3.0.2.dev64",
70
+ version="3.0.2.dev65",
70
71
  redirect_slashes=False,
71
72
  docs_url=None,
72
73
  redoc_url=None,
@@ -88,12 +89,12 @@ class AgentServer:
88
89
  return response
89
90
 
90
91
  # Keep track of registered agents
91
- self.agents: Dict[str, AgentBase] = {}
92
+ self.agents: dict[str, AgentBase] = {}
92
93
 
93
94
  # Keep track of SIP routing configuration
94
95
  self._sip_routing_enabled = False
95
- self._sip_route: Optional[str] = None
96
- self._sip_username_mapping: Dict[str, str] = {} # Maps SIP usernames to routes
96
+ self._sip_route: str | None = None
97
+ self._sip_username_mapping: dict[str, str] = {} # Maps SIP usernames to routes
97
98
 
98
99
  # Register health endpoints immediately so they're available
99
100
  # whether using server.run() or server.app with gunicorn
@@ -106,7 +107,7 @@ class AgentServer:
106
107
  async def _setup_catch_all():
107
108
  self._register_catch_all_handler()
108
109
 
109
- def register(self, agent: AgentBase, route: Optional[str] = None) -> None:
110
+ def register(self, agent: AgentBase, route: str | None = None) -> None:
110
111
  """
111
112
  Register an agent with the server
112
113
 
@@ -188,8 +189,8 @@ class AgentServer:
188
189
 
189
190
  # Create a unified routing callback that checks all registered usernames
190
191
  def server_sip_routing_callback(
191
- request: Request, body: Dict[str, Any]
192
- ) -> Optional[str]:
192
+ request: Request, body: dict[str, Any]
193
+ ) -> str | None:
193
194
  """Unified SIP routing callback that checks all registered usernames"""
194
195
  # Extract the SIP username
195
196
  sip_username = SWMLService.extract_sip_username(body)
@@ -248,7 +249,7 @@ class AgentServer:
248
249
  self._sip_username_mapping[username.lower()] = route
249
250
  self.logger.info(f"Registered SIP username '{username}' to route '{route}'")
250
251
 
251
- def _lookup_sip_route(self, username: str) -> Optional[str]:
252
+ def _lookup_sip_route(self, username: str) -> str | None:
252
253
  """
253
254
  Look up the route for a SIP username
254
255
 
@@ -313,7 +314,7 @@ class AgentServer:
313
314
  self.logger.info("agent_unregistered", extra={"route": route})
314
315
  return True
315
316
 
316
- def get_agents(self) -> List[Tuple[str, AgentBase]]:
317
+ def get_agents(self) -> list[tuple[str, AgentBase]]:
317
318
  """
318
319
  Get all registered agents
319
320
 
@@ -322,7 +323,7 @@ class AgentServer:
322
323
  """
323
324
  return [(route, agent) for route, agent in self.agents.items()]
324
325
 
325
- def get_agent(self, route: str) -> Optional[AgentBase]:
326
+ def get_agent(self, route: str) -> AgentBase | None:
326
327
  """
327
328
  Get an agent by route
328
329
 
@@ -344,8 +345,8 @@ class AgentServer:
344
345
  self,
345
346
  event=None,
346
347
  context=None,
347
- host: Optional[str] = None,
348
- port: Optional[int] = None,
348
+ host: str | None = None,
349
+ port: int | None = None,
349
350
  ) -> Any:
350
351
  """
351
352
  Universal run method that automatically detects environment and handles accordingly
@@ -644,9 +645,7 @@ class AgentServer:
644
645
  def readiness_check():
645
646
  return {"status": "ready", "agents": len(self.agents)}
646
647
 
647
- def _run_server(
648
- self, host: Optional[str] = None, port: Optional[int] = None
649
- ) -> None:
648
+ def _run_server(self, host: str | None = None, port: int | None = None) -> None:
650
649
  """Original server mode logic"""
651
650
  if not self.agents:
652
651
  self.logger.warning("Starting server with no registered agents")
@@ -710,7 +709,7 @@ class AgentServer:
710
709
  uvicorn.run(self.app, host=host, port=port, log_level=self.log_level)
711
710
 
712
711
  def register_global_routing_callback(
713
- self, callback_fn: Callable[[Request, Dict[str, Any]], Optional[str]], path: str
712
+ self, callback_fn: Callable[[Request, dict[str, Any]], str | None], path: str
714
713
  ) -> None:
715
714
  """
716
715
  Register a routing callback across all agents
@@ -781,9 +780,7 @@ class AgentServer:
781
780
  f"Serving static files from '{directory}' at route '{route or '/'}'"
782
781
  )
783
782
 
784
- def _serve_static_file(
785
- self, file_path: str, route: str = "/"
786
- ) -> Optional[Response]:
783
+ def _serve_static_file(self, file_path: str, route: str = "/") -> Response | None:
787
784
  """
788
785
  Internal method to serve a static file.
789
786
 
@@ -14,7 +14,7 @@ with all SignalWire agent features like skills, POM, and SWAIG functions.
14
14
  """
15
15
 
16
16
  import json
17
- from typing import Dict, Any, Optional
17
+ from typing import Any
18
18
  from signalwire.core.agent_base import AgentBase
19
19
  from signalwire.core.logging_config import get_logger
20
20
 
@@ -41,7 +41,7 @@ class BedrockAgent(AgentBase):
41
41
  self,
42
42
  name: str = "bedrock_agent",
43
43
  route: str = "/bedrock",
44
- system_prompt: Optional[str] = None,
44
+ system_prompt: str | None = None,
45
45
  voice_id: str = "matthew",
46
46
  temperature: float = 0.7,
47
47
  top_p: float = 0.9,
@@ -77,7 +77,7 @@ class BedrockAgent(AgentBase):
77
77
  logger.info(f"BedrockAgent initialized: {name} on route {route}")
78
78
 
79
79
  def _render_swml(
80
- self, call_id: Optional[str] = None, modifications: Optional[dict] = None
80
+ self, call_id: str | None = None, modifications: dict | None = None
81
81
  ) -> str:
82
82
  """
83
83
  Render SWML document with amazon_bedrock verb
@@ -143,7 +143,7 @@ class BedrockAgent(AgentBase):
143
143
  # Convert back to JSON string
144
144
  return json.dumps(swml)
145
145
 
146
- def _add_voice_to_prompt(self, prompt_config: Dict[str, Any]) -> Dict[str, Any]:
146
+ def _add_voice_to_prompt(self, prompt_config: dict[str, Any]) -> dict[str, Any]:
147
147
  """
148
148
  Add voice configuration to the prompt object
149
149
 
@@ -176,7 +176,7 @@ class BedrockAgent(AgentBase):
176
176
 
177
177
  return filtered_config
178
178
 
179
- def _build_bedrock_params(self, base_params: Dict[str, Any]) -> Dict[str, Any]:
179
+ def _build_bedrock_params(self, base_params: dict[str, Any]) -> dict[str, Any]:
180
180
  """
181
181
  Build Bedrock-specific parameters
182
182
 
@@ -214,9 +214,9 @@ class BedrockAgent(AgentBase):
214
214
 
215
215
  def set_inference_params(
216
216
  self,
217
- temperature: Optional[float] = None,
218
- top_p: Optional[float] = None,
219
- max_tokens: Optional[int] = None,
217
+ temperature: float | None = None,
218
+ top_p: float | None = None,
219
+ max_tokens: int | None = None,
220
220
  ) -> None:
221
221
  """
222
222
  Update Bedrock inference parameters
@@ -11,7 +11,7 @@ import argparse
11
11
  import sys
12
12
  from pathlib import Path
13
13
  from datetime import datetime
14
- from typing import List, cast
14
+ from typing import cast
15
15
  from urllib.parse import urlparse, urlunparse
16
16
 
17
17
  from signalwire.search.models import MODEL_ALIASES, DEFAULT_MODEL, resolve_model_alias
@@ -866,9 +866,7 @@ def search_command():
866
866
  print(" help - Show this help")
867
867
  print(" exit/quit/q - Exit shell")
868
868
  print(
869
- " count=N - Set result count (current: {})".format(
870
- args.count
871
- )
869
+ f" count=N - Set result count (current: {args.count})"
872
870
  )
873
871
  print(
874
872
  " tags=tag1,tag2 - Set tag filter (current: {})".format(
@@ -927,7 +925,7 @@ def search_command():
927
925
  # Perform search
928
926
  results = engine.search(
929
927
  query_vector=cast(
930
- List[float], enhanced.get("vector")
928
+ list[float], enhanced.get("vector")
931
929
  ), # vector is None for keyword-only search; search() tolerates it at runtime
932
930
  enhanced_text=enhanced.get("enhanced_text", query),
933
931
  count=args.count,
@@ -1012,7 +1010,7 @@ def search_command():
1012
1010
  # Perform search
1013
1011
  results = engine.search(
1014
1012
  query_vector=cast(
1015
- List[float], enhanced.get("vector")
1013
+ list[float], enhanced.get("vector")
1016
1014
  ), # vector is None for keyword-only search; search() tolerates it at runtime
1017
1015
  enhanced_text=enhanced.get("enhanced_text", args.query),
1018
1016
  count=args.count,
@@ -12,7 +12,7 @@ Agent discovery and loading functionality
12
12
 
13
13
  import importlib.util
14
14
  from pathlib import Path
15
- from typing import List, Dict, Any, Optional, cast, Type, TYPE_CHECKING
15
+ from typing import Any, cast, TYPE_CHECKING
16
16
 
17
17
  # Import after checking if available
18
18
  if TYPE_CHECKING:
@@ -51,7 +51,7 @@ else:
51
51
  NEW_LOADER_AVAILABLE = False
52
52
 
53
53
 
54
- def discover_services_in_file(service_path: str) -> List[Dict[str, Any]]:
54
+ def discover_services_in_file(service_path: str) -> list[dict[str, Any]]:
55
55
  """
56
56
  Discover all available SWML services (including agents) in a Python file without instantiating them
57
57
 
@@ -74,7 +74,7 @@ def discover_services_in_file(service_path: str) -> List[Dict[str, Any]]:
74
74
  return _discover_services_impl(service_path)
75
75
 
76
76
 
77
- def discover_agents_in_file(agent_path: str) -> List[Dict[str, Any]]:
77
+ def discover_agents_in_file(agent_path: str) -> list[dict[str, Any]]:
78
78
  """
79
79
  Backward compatibility wrapper - discovers agents in a file
80
80
 
@@ -89,7 +89,7 @@ def discover_agents_in_file(agent_path: str) -> List[Dict[str, Any]]:
89
89
  return [s for s in all_services if s.get("is_agent", False)]
90
90
 
91
91
 
92
- def _discover_services_impl(service_path: str) -> List[Dict[str, Any]]:
92
+ def _discover_services_impl(service_path: str) -> list[dict[str, Any]]:
93
93
  """
94
94
  Internal implementation for discovering services
95
95
  """
@@ -130,7 +130,7 @@ def _discover_services_impl(service_path: str) -> List[Dict[str, Any]]:
130
130
  if sys_path_added and module_dir in sys.path:
131
131
  sys.path.remove(module_dir)
132
132
 
133
- services_found: List[Dict[str, Any]] = []
133
+ services_found: list[dict[str, Any]] = []
134
134
 
135
135
  # Look for SWMLService instances (including AgentBase which inherits from it)
136
136
  for name, obj in vars(module).items():
@@ -198,7 +198,7 @@ def _discover_services_impl(service_path: str) -> List[Dict[str, Any]]:
198
198
 
199
199
  def load_service_from_file(
200
200
  service_path: str,
201
- service_identifier: Optional[str] = None,
201
+ service_identifier: str | None = None,
202
202
  prefer_route: bool = True,
203
203
  ) -> "SWMLService":
204
204
  """
@@ -226,7 +226,7 @@ def load_service_from_file(
226
226
 
227
227
 
228
228
  def load_agent_from_file(
229
- agent_path: str, agent_class_name: Optional[str] = None
229
+ agent_path: str, agent_class_name: str | None = None
230
230
  ) -> "AgentBase":
231
231
  """
232
232
  Load an agent from a Python file
@@ -271,7 +271,7 @@ def load_agent_from_file(
271
271
 
272
272
  def _load_service_impl(
273
273
  service_path: str,
274
- service_identifier: Optional[str] = None,
274
+ service_identifier: str | None = None,
275
275
  prefer_route: bool = True,
276
276
  ) -> "SWMLService":
277
277
  """
@@ -340,7 +340,7 @@ def _load_service_impl(
340
340
  try:
341
341
  # Discovered subclasses define their own (often no-arg)
342
342
  # constructors; cast away the abstract base signature.
343
- temp_instance = cast(Type[Any], obj)()
343
+ temp_instance = cast(type[Any], obj)()
344
344
  if (
345
345
  hasattr(temp_instance, "route")
346
346
  and temp_instance.route == service_identifier
@@ -356,7 +356,7 @@ def _load_service_impl(
356
356
  obj = getattr(module, service_identifier)
357
357
  if isinstance(obj, type) and issubclass(obj, SWMLService):
358
358
  try:
359
- service = cast(Type[Any], obj)()
359
+ service = cast(type[Any], obj)()
360
360
  except Exception as e:
361
361
  raise ValueError(
362
362
  f"No service found with route '{service_identifier}' and failed to instantiate class '{service_identifier}': {e}"
@@ -373,14 +373,14 @@ def _load_service_impl(
373
373
  obj = getattr(module, service_identifier)
374
374
  if isinstance(obj, type) and issubclass(obj, SWMLService):
375
375
  try:
376
- service = cast(Type[Any], obj)()
376
+ service = cast(type[Any], obj)()
377
377
  if service and not service.route.endswith(
378
378
  "dummy"
379
379
  ): # Avoid test services with dummy routes
380
380
  pass # Successfully created specific service
381
381
  else:
382
382
  service = cast(
383
- Type[Any], obj
383
+ type[Any], obj
384
384
  )() # Create anyway if requested specifically
385
385
  except Exception as e:
386
386
  raise ValueError(
@@ -443,7 +443,7 @@ def _load_service_impl(
443
443
 
444
444
  if len(service_classes_found) == 1:
445
445
  try:
446
- service = cast(Type[Any], service_classes_found[0][1])()
446
+ service = cast(type[Any], service_classes_found[0][1])()
447
447
  except Exception as e:
448
448
  print(
449
449
  f"Warning: Failed to instantiate {service_classes_found[0][0]}: {e}"
@@ -454,7 +454,7 @@ def _load_service_impl(
454
454
  for name, cls in service_classes_found:
455
455
  try:
456
456
  # Try to instantiate temporarily to get route
457
- temp_instance = cast(Type[Any], cls)()
457
+ temp_instance = cast(type[Any], cls)()
458
458
  route = getattr(temp_instance, "route", "Unknown")
459
459
  service_name = getattr(temp_instance, "name", "Unknown")
460
460
  service_info.append(
@@ -496,7 +496,7 @@ def _load_service_impl(
496
496
  and obj not in (SWMLService, AgentBase)
497
497
  ):
498
498
  try:
499
- service = cast(Type[Any], obj)()
499
+ service = cast(type[Any], obj)()
500
500
  break
501
501
  except Exception as e:
502
502
  print(f"Warning: Failed to instantiate {name}: {e}")
@@ -12,7 +12,7 @@ Custom argument parsing and function argument parsing
12
12
 
13
13
  import sys
14
14
  import argparse
15
- from typing import List, Dict, Any
15
+ from typing import Any
16
16
 
17
17
 
18
18
  class CustomArgumentParser(argparse.ArgumentParser):
@@ -82,8 +82,8 @@ class CustomArgumentParser(argparse.ArgumentParser):
82
82
 
83
83
 
84
84
  def parse_function_arguments(
85
- function_args_list: List[str], func_schema: Any
86
- ) -> Dict[str, Any]:
85
+ function_args_list: list[str], func_schema: Any
86
+ ) -> dict[str, Any]:
87
87
  """
88
88
  Parse function arguments from command line with type coercion based on schema
89
89
 
@@ -94,7 +94,7 @@ def parse_function_arguments(
94
94
  Returns:
95
95
  Dictionary of parsed function arguments
96
96
  """
97
- parsed_args: Dict[str, Any] = {}
97
+ parsed_args: dict[str, Any] = {}
98
98
  i = 0
99
99
 
100
100
  # Get parameter schema
@@ -10,7 +10,7 @@ See LICENSE file in the project root for full license information.
10
10
  Apply dynamic configuration to agents
11
11
  """
12
12
 
13
- from typing import Optional, Dict, Any, TYPE_CHECKING
13
+ from typing import Optional, Any, TYPE_CHECKING
14
14
 
15
15
  if TYPE_CHECKING:
16
16
  from signalwire.core.agent_base import AgentBase
@@ -47,7 +47,7 @@ def apply_dynamic_config(
47
47
 
48
48
  # Extract request data
49
49
  query_params = dict(mock_request.query_params)
50
- body_params: Dict[str, Any] = {} # Empty for GET requests
50
+ body_params: dict[str, Any] = {} # Empty for GET requests
51
51
  headers = dict(mock_request.headers)
52
52
 
53
53
  if verbose:
@@ -12,7 +12,7 @@ Service discovery and loading functionality - new simplified approach
12
12
 
13
13
  import importlib.util
14
14
  from pathlib import Path
15
- from typing import List, Dict, Any, Optional, cast, TYPE_CHECKING
15
+ from typing import Any, cast, TYPE_CHECKING
16
16
  import asyncio
17
17
  import io
18
18
  import contextlib
@@ -45,12 +45,12 @@ class ServiceCapture:
45
45
  """Captures SWMLService instances when they try to run/serve"""
46
46
 
47
47
  def __init__(self):
48
- self.captured_services: List[SWMLService] = []
48
+ self.captured_services: list[SWMLService] = []
49
49
  self.original_methods = {}
50
50
 
51
51
  def capture(
52
52
  self, service_path: str, suppress_output: bool = False
53
- ) -> List[SWMLService]:
53
+ ) -> list[SWMLService]:
54
54
  """
55
55
  Execute a service file and capture any services that try to run
56
56
 
@@ -156,9 +156,9 @@ class ServiceCapture:
156
156
  async def simulate_request_to_service(
157
157
  service: SWMLService,
158
158
  method: str = "POST",
159
- body: Optional[dict] = None,
160
- query_params: Optional[dict] = None,
161
- headers: Optional[dict] = None,
159
+ body: dict | None = None,
160
+ query_params: dict | None = None,
161
+ headers: dict | None = None,
162
162
  ) -> dict:
163
163
  """
164
164
  Simulate a request to a SWMLService instance
@@ -204,11 +204,11 @@ async def simulate_request_to_service(
204
204
 
205
205
  def load_and_simulate_service(
206
206
  service_path: str,
207
- route: Optional[str] = None,
207
+ route: str | None = None,
208
208
  method: str = "POST",
209
- body: Optional[dict] = None,
210
- query_params: Optional[dict] = None,
211
- headers: Optional[dict] = None,
209
+ body: dict | None = None,
210
+ query_params: dict | None = None,
211
+ headers: dict | None = None,
212
212
  suppress_output: bool = False,
213
213
  ) -> dict:
214
214
  """
@@ -277,7 +277,7 @@ def load_and_simulate_service(
277
277
  # Backward compatibility
278
278
  def load_agent_from_file(
279
279
  agent_path: str,
280
- agent_class_name: Optional[str] = None,
280
+ agent_class_name: str | None = None,
281
281
  suppress_output: bool = False,
282
282
  ) -> "AgentBase":
283
283
  """
@@ -308,7 +308,7 @@ def load_agent_from_file(
308
308
  return agents[0]
309
309
 
310
310
 
311
- def discover_agents_in_file(agent_path: str) -> List[Dict[str, Any]]:
311
+ def discover_agents_in_file(agent_path: str) -> list[dict[str, Any]]:
312
312
  """
313
313
  Backward compatibility wrapper
314
314
  """
@@ -23,7 +23,7 @@ import secrets
23
23
  import argparse
24
24
  import shutil
25
25
  from pathlib import Path
26
- from typing import Dict, Any
26
+ from typing import Any
27
27
 
28
28
 
29
29
  # =============================================================================
@@ -1814,7 +1814,7 @@ swaig-test app.py --list-tools
1814
1814
  class DokkuProjectGenerator:
1815
1815
  """Generates Dokku deployment files for SignalWire agents."""
1816
1816
 
1817
- def __init__(self, app_name: str, options: Dict[str, Any]):
1817
+ def __init__(self, app_name: str, options: dict[str, Any]):
1818
1818
  self.app_name = app_name
1819
1819
  self.options = options
1820
1820
  self.project_dir = Path(options.get("project_dir", f"./{app_name}"))
@@ -13,11 +13,11 @@ DataMap function execution and template expansion
13
13
  import re
14
14
  import json
15
15
  import requests
16
- from typing import Dict, Any
16
+ from typing import Any
17
17
  from ..config import HTTP_REQUEST_TIMEOUT
18
18
 
19
19
 
20
- def simple_template_expand(template: str, data: Dict[str, Any]) -> str:
20
+ def simple_template_expand(template: str, data: dict[str, Any]) -> str:
21
21
  """
22
22
  Simple template expansion for DataMap testing
23
23
  Supports both ${key} and %{key} syntax with nested object access and array indexing
@@ -120,7 +120,7 @@ def simple_template_expand(template: str, data: Dict[str, Any]) -> str:
120
120
 
121
121
 
122
122
  def execute_datamap_function(
123
- datamap_config: Dict[str, Any], args: Dict[str, Any], verbose: bool = False
123
+ datamap_config: dict[str, Any], args: dict[str, Any], verbose: bool = False
124
124
  ) -> Any:
125
125
  """
126
126
  Execute a DataMap function following the actual DataMap processing pipeline:
@@ -151,7 +151,7 @@ def execute_datamap_function(
151
151
  print(f"Extracted data_map: {json.dumps(actual_datamap, indent=2)}")
152
152
 
153
153
  # Initialize context with function arguments
154
- context: Dict[str, Any] = {"args": args}
154
+ context: dict[str, Any] = {"args": args}
155
155
  context.update(
156
156
  args
157
157
  ) # Also make args available at top level for backward compatibility
@@ -12,7 +12,7 @@ Webhook function execution (including external)
12
12
 
13
13
  import json
14
14
  import requests
15
- from typing import Dict, Any, TYPE_CHECKING
15
+ from typing import Any, TYPE_CHECKING
16
16
  from ..config import HTTP_REQUEST_TIMEOUT
17
17
 
18
18
  if TYPE_CHECKING:
@@ -22,10 +22,10 @@ if TYPE_CHECKING:
22
22
  def execute_external_webhook_function(
23
23
  func: "SWAIGFunction",
24
24
  function_name: str,
25
- function_args: Dict[str, Any],
26
- post_data: Dict[str, Any],
25
+ function_args: dict[str, Any],
26
+ post_data: dict[str, Any],
27
27
  verbose: bool = False,
28
- ) -> Dict[str, Any]:
28
+ ) -> dict[str, Any]:
29
29
  """
30
30
  Execute an external webhook SWAIG function by making an HTTP request to the external service.
31
31
  This simulates what SignalWire would do when calling an external webhook function.
@@ -51,7 +51,7 @@ def execute_external_webhook_function(
51
51
  print("-" * 60)
52
52
 
53
53
  # Prepare the SWAIG function call payload that SignalWire would send
54
- swaig_payload: Dict[str, Any] = {
54
+ swaig_payload: dict[str, Any] = {
55
55
  "function": function_name,
56
56
  "argument": {
57
57
  "parsed": [function_args] if function_args else [{}],