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.
- {signalwire_sdk-3.0.2.dev38/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.0.2.dev40}/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/pyproject.toml +1 -1
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/agent_server.py +1 -1
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/ai_config_mixin.py +64 -11
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/skill.py +129 -30
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/LICENSE +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/setup.cfg +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/setup.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/agents/bedrock.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/build_search.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/service_loader.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/dokku.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/init_project.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/test_swaig.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent_base.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/auth_handler.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/config_loader.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/contexts.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/data_map.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/function_result.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/logging_config.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/session_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/security_config.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/skill_base.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/skill_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swaig_function.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_builder.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_handler.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_renderer.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_service.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/livewire/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/pom.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/pom_tool.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/concierge.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/receptionist.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/survey.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/call.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/client.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/message.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/compat.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/document_processor.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/index_builder.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/migration.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/pgvector_backend.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/query_processor.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/search_engine.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/search/search_service.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/datetime/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/joke/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/math/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/registry.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/spider/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/schema_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/web/web_service.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/tests/test_mcp_integration.py +0 -0
|
@@ -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.
|
|
21
|
+
__version__ = "3.0.2.dev40"
|
|
22
22
|
|
|
23
23
|
# Import core classes for easier access
|
|
24
24
|
from .core.agent_base import AgentBase
|
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
#
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
metrics = self.
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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
|
-
|
|
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:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/agents/bedrock.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/build_search.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/config.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/dokku.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/init_project.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/test_swaig.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/cli/types.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/agent_base.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/auth_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/contexts.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/data_map.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/pom_builder.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/skill_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_builder.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/core/swml_service.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/livewire/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/livewire/plugins.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/pom/pom_tool.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/concierge.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/faq_bot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/prefabs/survey.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/call.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/client.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/constants.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/event.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/relay/message.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/__init__.py
RENAMED
|
File without changes
|
{signalwire_sdk-3.0.2.dev38 → signalwire_sdk-3.0.2.dev40}/signalwire/signalwire/rest/_base.py
RENAMED
|
File without changes
|