signalwire-sdk 3.0.2.dev38__tar.gz → 3.0.2.dev40__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 (208) hide show
  1. {signalwire_sdk-3.0.2.dev38/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.0.2.dev40}/PKG-INFO +1 -1
  2. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/pyproject.toml +1 -1
  3. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/__init__.py +1 -1
  4. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/agent_server.py +1 -1
  5. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/ai_config_mixin.py +64 -11
  6. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/skill.py +129 -30
  7. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -1
  8. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/LICENSE +0 -0
  9. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/README.md +0 -0
  10. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/man/sw-agent-init.1 +0 -0
  11. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/man/sw-search.1 +0 -0
  12. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/man/swaig-test.1 +0 -0
  13. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/setup.cfg +0 -0
  14. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/setup.py +0 -0
  15. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/agents/bedrock.py +0 -0
  16. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/__init__.py +0 -0
  17. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/build_search.py +0 -0
  18. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/config.py +0 -0
  19. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/__init__.py +0 -0
  20. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
  21. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
  22. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
  23. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/service_loader.py +0 -0
  24. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/dokku.py +0 -0
  25. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/execution/__init__.py +0 -0
  26. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
  27. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
  28. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/init_project.py +0 -0
  29. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/output/__init__.py +0 -0
  30. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
  31. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
  32. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
  33. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
  34. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
  35. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
  36. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
  37. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/test_swaig.py +0 -0
  38. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/types.py +0 -0
  39. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/__init__.py +0 -0
  40. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/__init__.py +0 -0
  41. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
  42. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
  43. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
  44. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
  45. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
  46. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
  47. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
  48. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
  49. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
  50. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
  51. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
  52. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
  53. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent_base.py +0 -0
  54. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/auth_handler.py +0 -0
  55. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/config_loader.py +0 -0
  56. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/contexts.py +0 -0
  57. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/data_map.py +0 -0
  58. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/function_result.py +0 -0
  59. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/logging_config.py +0 -0
  60. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/__init__.py +0 -0
  61. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
  62. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
  63. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
  64. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
  65. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
  66. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
  67. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
  68. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
  69. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/pom_builder.py +0 -0
  70. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/__init__.py +0 -0
  71. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/session_manager.py +0 -0
  72. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
  73. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
  74. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security_config.py +0 -0
  75. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/skill_base.py +0 -0
  76. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/skill_manager.py +0 -0
  77. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swaig_function.py +0 -0
  78. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_builder.py +0 -0
  79. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_handler.py +0 -0
  80. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_renderer.py +0 -0
  81. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_service.py +0 -0
  82. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/livewire/__init__.py +0 -0
  83. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/livewire/plugins.py +0 -0
  84. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
  85. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
  86. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
  87. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
  88. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/__init__.py +0 -0
  89. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/pom.py +0 -0
  90. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/pom_tool.py +0 -0
  91. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/__init__.py +0 -0
  92. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/concierge.py +0 -0
  93. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
  94. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
  95. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/receptionist.py +0 -0
  96. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/survey.py +0 -0
  97. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/__init__.py +0 -0
  98. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/call.py +0 -0
  99. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/client.py +0 -0
  100. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/constants.py +0 -0
  101. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/event.py +0 -0
  102. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/message.py +0 -0
  103. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/__init__.py +0 -0
  104. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/_base.py +0 -0
  105. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/_pagination.py +0 -0
  106. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/call_handler.py +0 -0
  107. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/client.py +0 -0
  108. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
  109. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
  110. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
  111. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
  112. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/compat.py +0 -0
  113. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
  114. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
  115. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
  116. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
  117. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
  118. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
  119. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
  120. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
  121. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/project.py +0 -0
  122. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
  123. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
  124. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
  125. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
  126. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
  127. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
  128. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
  129. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/video.py +0 -0
  130. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/schema.json +0 -0
  131. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/__init__.py +0 -0
  132. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/document_processor.py +0 -0
  133. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/index_builder.py +0 -0
  134. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/migration.py +0 -0
  135. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/models.py +0 -0
  136. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/pgvector_backend.py +0 -0
  137. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/query_processor.py +0 -0
  138. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/search_engine.py +0 -0
  139. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/search_service.py +0 -0
  140. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/README.md +0 -0
  141. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/__init__.py +0 -0
  142. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
  143. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
  144. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
  145. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
  146. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
  147. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
  148. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere/README.md +0 -0
  149. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
  150. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
  151. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
  152. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
  153. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
  154. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datetime/README.md +0 -0
  155. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
  156. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datetime/skill.py +0 -0
  157. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
  158. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
  159. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
  160. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
  161. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
  162. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/joke/README.md +0 -0
  163. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/joke/__init__.py +0 -0
  164. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/joke/skill.py +0 -0
  165. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/math/README.md +0 -0
  166. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/math/__init__.py +0 -0
  167. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/math/skill.py +0 -0
  168. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
  169. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
  170. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
  171. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
  172. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
  173. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
  174. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
  175. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
  176. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
  177. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/registry.py +0 -0
  178. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/spider/README.md +0 -0
  179. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/spider/__init__.py +0 -0
  180. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/spider/skill.py +0 -0
  181. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
  182. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
  183. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
  184. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/weather_api/README.md +0 -0
  185. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
  186. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
  187. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/README.md +0 -0
  188. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
  189. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
  190. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
  191. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
  192. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
  193. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
  194. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/__init__.py +0 -0
  195. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/pom_utils.py +0 -0
  196. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/schema_utils.py +0 -0
  197. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/token_generators.py +0 -0
  198. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/url_validator.py +0 -0
  199. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/validators.py +0 -0
  200. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/web/__init__.py +0 -0
  201. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/web/web_service.py +0 -0
  202. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
  203. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
  204. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
  205. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
  206. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
  207. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/tests/test_examples.py +0 -0
  208. {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/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.dev38
3
+ Version: 3.0.2.dev40
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.dev38"
7
+ version = "3.0.2.dev40"
8
8
  description = "SignalWire 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__ = "3.0.2.dev38"
21
+ __version__ = "3.0.2.dev40"
22
22
 
23
23
  # Import core classes for easier access
24
24
  from .core.agent_base import AgentBase
@@ -61,7 +61,7 @@ class AgentServer:
61
61
  self.app = FastAPI(
62
62
  title="SignalWire AI Agents",
63
63
  description="Hosted SignalWire AI Agents",
64
- version="3.0.2.dev38",
64
+ version="3.0.2.dev40",
65
65
  redirect_slashes=False,
66
66
  docs_url=None,
67
67
  redoc_url=None,
@@ -72,39 +72,48 @@ class AIConfigMixin:
72
72
  })
73
73
  return self
74
74
 
75
- def add_language(self,
76
- name: str,
77
- code: str,
75
+ def add_language(self,
76
+ name: str,
77
+ code: str,
78
78
  voice: str,
79
79
  speech_fillers: Optional[List[str]] = None,
80
80
  function_fillers: Optional[List[str]] = None,
81
81
  engine: Optional[str] = None,
82
- model: Optional[str] = None) -> 'AgentBase':
82
+ model: Optional[str] = None,
83
+ params: Optional[Dict[str, Any]] = None) -> 'AgentBase':
83
84
  """
84
85
  Add a language configuration to support multilingual conversations
85
-
86
+
86
87
  Args:
87
88
  name: Name of the language (e.g., "English", "French")
88
89
  code: Language code (e.g., "en-US", "fr-FR")
89
- voice: TTS voice to use. Can be a simple name (e.g., "en-US-Neural2-F")
90
+ voice: TTS voice to use. Can be a simple name (e.g., "en-US-Neural2-F")
90
91
  or a combined format "engine.voice:model" (e.g., "elevenlabs.josh:eleven_turbo_v2_5")
91
92
  speech_fillers: Optional list of filler phrases for natural speech
92
93
  function_fillers: Optional list of filler phrases during function calls
93
94
  engine: Optional explicit engine name (e.g., "elevenlabs", "rime")
94
95
  model: Optional explicit model name (e.g., "eleven_turbo_v2_5", "arcana")
95
-
96
+ params: Optional per-language params dict (engine-specific tuning,
97
+ voice settings, etc.). Emitted as the language object's
98
+ ``params`` key in SWML.
99
+
96
100
  Returns:
97
101
  Self for method chaining
98
-
102
+
99
103
  Examples:
100
104
  # Simple voice name
101
105
  agent.add_language("English", "en-US", "en-US-Neural2-F")
102
-
106
+
103
107
  # Explicit parameters
104
108
  agent.add_language("English", "en-US", "josh", engine="elevenlabs", model="eleven_turbo_v2_5")
105
-
109
+
106
110
  # Combined format
107
111
  agent.add_language("English", "en-US", "elevenlabs.josh:eleven_turbo_v2_5")
112
+
113
+ # Per-language params (engine-specific knobs)
114
+ agent.add_language("English", "en-US", "josh",
115
+ engine="elevenlabs",
116
+ params={"stability": 0.5, "similarity_boost": 0.75})
108
117
  """
109
118
  language = {
110
119
  "name": name,
@@ -143,10 +152,54 @@ class AIConfigMixin:
143
152
  # If only one type of fillers is provided, use the deprecated "fillers" field
144
153
  fillers = speech_fillers or function_fillers
145
154
  language["fillers"] = fillers
146
-
155
+
156
+ # Per-language params (engine-specific tuning, voice settings, etc.).
157
+ # Only emit the key when non-empty so we don't pollute SWML with
158
+ # empty objects.
159
+ if params:
160
+ language["params"] = params
161
+
147
162
  self._languages.append(language)
148
163
  return self
149
164
 
165
+ def set_language_params(self, code: str, params: Dict[str, Any]) -> 'AgentBase':
166
+ """
167
+ Set (or replace) the per-language ``params`` dict on an already-added
168
+ language. Useful when language entries are built up via add_language()
169
+ first and engine-specific tuning is added later (e.g., from a config
170
+ loader). Returns self for chaining.
171
+
172
+ Args:
173
+ code: Language code as previously passed to ``add_language`` (e.g. ``"en-US"``).
174
+ params: Engine-specific params dict to attach. Empty dict removes the key.
175
+
176
+ Returns:
177
+ Self for method chaining. No-op if the code isn't found.
178
+ """
179
+ for language in self._languages:
180
+ if language.get("code") == code:
181
+ if params:
182
+ language["params"] = params
183
+ else:
184
+ language.pop("params", None)
185
+ break
186
+ return self
187
+
188
+ def get_language_params(self, code: str) -> Optional[Dict[str, Any]]:
189
+ """
190
+ Read the per-language ``params`` dict for a previously-added language.
191
+
192
+ Args:
193
+ code: Language code as previously passed to ``add_language``.
194
+
195
+ Returns:
196
+ The params dict if set, ``None`` otherwise (including when the code is unknown).
197
+ """
198
+ for language in self._languages:
199
+ if language.get("code") == code:
200
+ return language.get("params")
201
+ return None
202
+
150
203
  def set_languages(self, languages: List[Dict[str, Any]]) -> 'AgentBase':
151
204
  """
152
205
  Set all language configurations at once
@@ -413,57 +413,136 @@ class GoogleSearchScraper:
413
413
 
414
414
  return metrics
415
415
 
416
+ def _format_snippet_results(self, query: str, search_results: list,
417
+ num_results: int) -> str:
418
+ """Format Google CSE snippets without fetching the underlying pages.
419
+
420
+ Used when snippets_only is True, or as a graceful fallback when page
421
+ scraping is abandoned by the overall_deadline. The result is shorter
422
+ than a fully-scraped response but always non-empty when CSE returned
423
+ anything at all, so the kernel never sees a webhook timeout.
424
+ """
425
+ if not search_results:
426
+ return f"No search results found for query: {query}"
427
+
428
+ top = search_results[:max(num_results, 1)]
429
+ lines = [
430
+ f"Snippet-only results for '{query}' "
431
+ f"(page content not scraped):\n"
432
+ ]
433
+ for i, result in enumerate(top, 1):
434
+ lines.append(f"=== RESULT {i} ===")
435
+ lines.append(f"Title: {result.get('title', '')}")
436
+ lines.append(f"URL: {result.get('url', '')}")
437
+ snippet = (result.get('snippet') or '').strip()
438
+ lines.append(f"Snippet: {snippet}")
439
+ lines.append("")
440
+ return "\n".join(lines)
441
+
416
442
  def search_and_scrape_best(self, query: str, num_results: int = 3,
417
443
  oversample_factor: float = 4.0, delay: float = 0.5,
418
- min_quality_score: float = 0.2) -> str:
444
+ min_quality_score: float = 0.2,
445
+ per_page_timeout: float = 2.0,
446
+ overall_deadline: float = 10.0,
447
+ parallel_scrape: bool = True,
448
+ snippets_only: bool = False) -> str:
419
449
  """
420
- Search and scrape with quality filtering and source diversity
450
+ Search and scrape with quality filtering and source diversity.
421
451
 
422
452
  Args:
423
453
  query: Search query
424
454
  num_results: Number of best results to return
425
455
  oversample_factor: How many extra results to fetch (e.g., 4.0 = fetch 4x)
426
- delay: Delay between requests
456
+ delay: Delay between scrape requests (ignored in parallel mode)
427
457
  min_quality_score: Minimum quality score to include a result
458
+ per_page_timeout: Max seconds to wait on each page scrape
459
+ overall_deadline: Wall-clock budget (seconds) for the whole call.
460
+ Anything not yet returned by this deadline is abandoned.
461
+ parallel_scrape: Run all page scrapes concurrently in a thread pool
462
+ snippets_only: Skip page scraping entirely; format the CSE
463
+ snippets directly. Use for fast voice answers when full page
464
+ content is not required.
428
465
 
429
466
  Returns:
430
467
  Formatted string with the best N results from diverse sources
431
468
  """
432
- # Fetch more results than requested (increased to 4x for better pool)
469
+ import concurrent.futures
470
+
471
+ deadline_at = time.monotonic() + overall_deadline
472
+
473
+ # Fetch CSE results. search_google() already uses a 15s timeout
474
+ # internally; this is the slowest non-cancelable step.
433
475
  fetch_count = min(10, int(num_results * oversample_factor))
434
476
  search_results = self.search_google(query, fetch_count)
435
477
 
436
478
  if not search_results:
437
479
  return f"No search results found for query: {query}"
438
480
 
439
- # Process all results and collect quality metrics
440
- processed_results = []
441
-
442
- for result in search_results:
443
- # Extract content and quality metrics (pass query for relevance scoring)
444
- page_text, metrics = self.extract_text_from_url(result['url'])
445
-
446
- # Recalculate metrics with query relevance
447
- if page_text:
448
- metrics = self._calculate_content_quality(page_text, result['url'], query)
449
-
450
- if metrics.get('quality_score', 0) >= min_quality_score and page_text:
451
- processed_results.append({
452
- 'title': result['title'],
453
- 'url': result['url'],
454
- 'snippet': result['snippet'],
455
- 'content': page_text,
456
- 'metrics': metrics,
457
- 'quality_score': metrics.get('quality_score', 0),
458
- 'domain': metrics.get('domain', '')
459
- })
481
+ # Snippets-only fast path: skip scraping entirely. Returns in ~1s.
482
+ if snippets_only:
483
+ return self._format_snippet_results(query, search_results, num_results)
484
+
485
+ def _scrape_one(result):
486
+ """Fetch + score one candidate. Returns enriched dict or None."""
487
+ if time.monotonic() >= deadline_at:
488
+ return None
489
+ try:
490
+ page_text, metrics = self.extract_text_from_url(
491
+ result['url'], timeout=per_page_timeout
492
+ )
493
+ except Exception:
494
+ return None
495
+ if not page_text:
496
+ return None
497
+ metrics = self._calculate_content_quality(page_text, result['url'], query)
498
+ if metrics.get('quality_score', 0) < min_quality_score:
499
+ return None
500
+ return {
501
+ 'title': result['title'],
502
+ 'url': result['url'],
503
+ 'snippet': result['snippet'],
504
+ 'content': page_text,
505
+ 'metrics': metrics,
506
+ 'quality_score': metrics.get('quality_score', 0),
507
+ 'domain': metrics.get('domain', '')
508
+ }
460
509
 
461
- # Small delay between requests
462
- if delay > 0:
463
- time.sleep(delay)
510
+ processed_results = []
511
+ if parallel_scrape:
512
+ # Dispatch all scrapes at once, harvest whatever finishes before
513
+ # the deadline. Abandon the rest.
514
+ with concurrent.futures.ThreadPoolExecutor(
515
+ max_workers=min(8, len(search_results))
516
+ ) as executor:
517
+ future_to_result = {
518
+ executor.submit(_scrape_one, r): r for r in search_results
519
+ }
520
+ for future in concurrent.futures.as_completed(future_to_result):
521
+ if time.monotonic() >= deadline_at:
522
+ # Cancel everything still queued; we are out of time.
523
+ for f in future_to_result:
524
+ if not f.done():
525
+ f.cancel()
526
+ break
527
+ item = future.result()
528
+ if item is not None:
529
+ processed_results.append(item)
530
+ else:
531
+ # Sequential mode (legacy). Still honors overall_deadline.
532
+ for result in search_results:
533
+ if time.monotonic() >= deadline_at:
534
+ break
535
+ item = _scrape_one(result)
536
+ if item is not None:
537
+ processed_results.append(item)
538
+ if delay > 0:
539
+ time.sleep(delay)
464
540
 
465
541
  if not processed_results:
466
- return f"No quality results found for query: {query}. All results were below quality threshold."
542
+ # Time ran out or every page was below quality threshold. Fall
543
+ # back to snippet-only results so we return SOMETHING useful
544
+ # before the kernel webhook timeout fires.
545
+ return self._format_snippet_results(query, search_results, num_results)
467
546
 
468
547
  # Sort by quality score
469
548
  processed_results.sort(key=lambda x: x['quality_score'], reverse=True)
@@ -581,6 +660,22 @@ class WebSearchSkill(SkillBase):
581
660
  self.oversample_factor = self.params.get('oversample_factor', 2.5)
582
661
  self.min_quality_score = self.params.get('min_quality_score', 0.3)
583
662
 
663
+ # Latency-control parameters. The SignalWire kernel times out webhook
664
+ # responses around 55s, so the handler MUST finish under that.
665
+ # per_page_timeout: max seconds to wait on a single page scrape.
666
+ # overall_deadline: wall-clock budget for the whole tool call. Once
667
+ # exceeded, any in-flight scrapes are abandoned and we format
668
+ # whatever results we already have (or fall back to snippets).
669
+ # parallel_scrape: fetch all candidate pages concurrently via a
670
+ # ThreadPoolExecutor instead of one-after-the-other.
671
+ # snippets_only: skip scraping entirely and return Google CSE
672
+ # snippets only. Fastest mode (sub-second) and good enough for
673
+ # most voice answers.
674
+ self.per_page_timeout = float(self.params.get('per_page_timeout', 2.0))
675
+ self.overall_deadline = float(self.params.get('overall_deadline', 10.0))
676
+ self.parallel_scrape = bool(self.params.get('parallel_scrape', True))
677
+ self.snippets_only = bool(self.params.get('snippets_only', False))
678
+
584
679
  self.no_results_message = self.params.get('no_results_message',
585
680
  "I couldn't find quality results for '{query}'. "
586
681
  "The search returned only low-quality or inaccessible pages. "
@@ -642,7 +737,11 @@ class WebSearchSkill(SkillBase):
642
737
  num_results=num_results,
643
738
  oversample_factor=self.oversample_factor,
644
739
  delay=self.default_delay,
645
- min_quality_score=self.min_quality_score
740
+ min_quality_score=self.min_quality_score,
741
+ per_page_timeout=self.per_page_timeout,
742
+ overall_deadline=self.overall_deadline,
743
+ parallel_scrape=self.parallel_scrape,
744
+ snippets_only=self.snippets_only,
646
745
  )
647
746
 
648
747
  if not search_results or "No quality results found" in search_results or "No search results found" in search_results:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire-sdk
3
- Version: 3.0.2.dev38
3
+ Version: 3.0.2.dev40
4
4
  Summary: SignalWire SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT