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.
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/pyproject.toml +2 -2
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/agent_server.py +17 -20
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/agents/bedrock.py +8 -8
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/build_search.py +4 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/agent_loader.py +15 -15
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/argparse_helpers.py +4 -4
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/dynamic_config.py +2 -2
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/service_loader.py +12 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/dokku.py +2 -2
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/execution/datamap_exec.py +4 -4
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/execution/webhook_exec.py +5 -5
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/init_project.py +12 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/data_generation.py +9 -9
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/data_overrides.py +6 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/mock_env.py +18 -18
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/test_swaig.py +2 -2
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/types.py +15 -15
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/prompt/manager.py +15 -15
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/registry.py +11 -10
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/type_inference.py +6 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent_base.py +48 -56
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/auth_handler.py +7 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/config_loader.py +13 -13
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/contexts.py +67 -67
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/data_map.py +29 -28
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/function_result.py +67 -70
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/ai_config_mixin.py +25 -25
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/auth_mixin.py +1 -2
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +4 -4
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/prompt_mixin.py +11 -11
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/serverless_mixin.py +4 -4
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/skill_mixin.py +3 -3
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/tool_mixin.py +13 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/web_mixin.py +16 -15
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/pom_builder.py +11 -11
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/session_manager.py +5 -5
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/webhook_middleware.py +4 -3
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/webhook_validator.py +9 -8
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security_config.py +10 -14
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/skill_base.py +13 -13
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/skill_manager.py +6 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swaig_function.py +15 -14
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_builder.py +27 -27
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_handler.py +14 -14
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_renderer.py +12 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/swml_service.py +36 -35
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/livewire/__init__.py +20 -19
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/livewire/plugins.py +2 -2
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/gateway_service.py +4 -4
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/mcp_manager.py +22 -22
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/session_manager.py +9 -9
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/pom/pom.py +22 -22
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/concierge.py +6 -7
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/faq_bot.py +4 -4
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/info_gatherer.py +6 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/receptionist.py +1 -3
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/survey.py +5 -5
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/call.py +192 -193
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/client.py +27 -26
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/event.py +26 -26
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/message.py +9 -8
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/phone_numbers.py +4 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/__init__.py +2 -2
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/document_processor.py +55 -55
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/index_builder.py +31 -31
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/migration.py +7 -7
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/pgvector_backend.py +40 -40
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/query_processor.py +12 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/search_engine.py +52 -52
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/search_service.py +33 -33
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +6 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/claude_skills/skill.py +15 -15
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere/skill.py +8 -8
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere_serverless/skill.py +7 -7
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datetime/skill.py +6 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/google_maps/skill.py +7 -7
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/info_gatherer/skill.py +6 -6
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/joke/skill.py +7 -7
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/math/skill.py +9 -8
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/mcp_gateway/skill.py +12 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/native_vector_search/skill.py +10 -10
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/play_background_file/skill.py +5 -5
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/registry.py +12 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/spider/skill.py +14 -14
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/swml_transfer/skill.py +7 -7
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/weather_api/skill.py +5 -5
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/skill.py +17 -17
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/skill_improved.py +12 -12
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/skill_original.py +9 -9
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/wikipedia_search/skill.py +4 -4
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/schema_utils.py +19 -21
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/web/web_service.py +13 -13
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/LICENSE +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/setup.cfg +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/setup.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/_agent_host.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/logging_config.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/core/security/security_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/pom/pom_tool.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/compat.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/tests/test_mcp_integration.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "signalwire-sdk"
|
|
7
|
-
version = "3.0.2.
|
|
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.
|
|
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
|
{signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/agent_server.py
RENAMED
|
@@ -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
|
|
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.
|
|
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:
|
|
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:
|
|
96
|
-
self._sip_username_mapping:
|
|
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:
|
|
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:
|
|
192
|
-
) ->
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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:
|
|
348
|
-
port:
|
|
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,
|
|
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
|
|
{signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/agents/bedrock.py
RENAMED
|
@@ -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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
218
|
-
top_p:
|
|
219
|
-
max_tokens:
|
|
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
|
{signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/build_search.py
RENAMED
|
@@ -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
|
|
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: {})"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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:
|
|
86
|
-
) ->
|
|
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:
|
|
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,
|
|
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:
|
|
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
|
|
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:
|
|
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
|
-
) ->
|
|
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:
|
|
160
|
-
query_params:
|
|
161
|
-
headers:
|
|
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:
|
|
207
|
+
route: str | None = None,
|
|
208
208
|
method: str = "POST",
|
|
209
|
-
body:
|
|
210
|
-
query_params:
|
|
211
|
-
headers:
|
|
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:
|
|
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) ->
|
|
311
|
+
def discover_agents_in_file(agent_path: str) -> list[dict[str, Any]]:
|
|
312
312
|
"""
|
|
313
313
|
Backward compatibility wrapper
|
|
314
314
|
"""
|
{signalwire_sdk-3.0.2.dev64 → signalwire_sdk-3.0.2.dev65}/signalwire/signalwire/cli/dokku.py
RENAMED
|
@@ -23,7 +23,7 @@ import secrets
|
|
|
23
23
|
import argparse
|
|
24
24
|
import shutil
|
|
25
25
|
from pathlib import Path
|
|
26
|
-
from typing import
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
26
|
-
post_data:
|
|
25
|
+
function_args: dict[str, Any],
|
|
26
|
+
post_data: dict[str, Any],
|
|
27
27
|
verbose: bool = False,
|
|
28
|
-
) ->
|
|
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:
|
|
54
|
+
swaig_payload: dict[str, Any] = {
|
|
55
55
|
"function": function_name,
|
|
56
56
|
"argument": {
|
|
57
57
|
"parsed": [function_args] if function_args else [{}],
|