signalwire-sdk 3.0.2.dev62__tar.gz → 3.0.2.dev64__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.dev62/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.0.2.dev64}/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/pyproject.toml +49 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/__init__.py +15 -15
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agent_server.py +36 -41
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agents/bedrock.py +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/build_search.py +27 -17
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/agent_loader.py +73 -46
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/argparse_helpers.py +7 -14
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/dynamic_config.py +2 -2
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/service_loader.py +48 -37
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/dokku.py +16 -13
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/datamap_exec.py +15 -17
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/webhook_exec.py +3 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/init_project.py +17 -20
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/output_formatter.py +8 -17
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/swml_dump.py +23 -21
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_generation.py +6 -8
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_overrides.py +3 -4
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/mock_env.py +7 -6
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/swaig_test_wrapper.py +3 -2
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/test_swaig.py +21 -10
- signalwire_sdk-3.0.2.dev64/signalwire/signalwire/core/_agent_host.py +24 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/manager.py +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/registry.py +65 -64
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/type_inference.py +5 -7
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent_base.py +115 -82
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/auth_handler.py +30 -16
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/config_loader.py +17 -16
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/contexts.py +16 -17
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/data_map.py +10 -15
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/function_result.py +26 -28
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/logging_config.py +8 -12
- signalwire_sdk-3.0.2.dev64/signalwire/signalwire/core/mixins/_mixin_host.py +42 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/ai_config_mixin.py +15 -11
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/auth_mixin.py +9 -8
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +3 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/prompt_mixin.py +58 -58
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/serverless_mixin.py +77 -91
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/skill_mixin.py +5 -2
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/state_mixin.py +6 -9
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/tool_mixin.py +7 -6
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/web_mixin.py +37 -38
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/session_manager.py +1 -4
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_middleware.py +3 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_validator.py +8 -8
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security_config.py +9 -5
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_base.py +9 -9
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_manager.py +13 -18
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swaig_function.py +11 -16
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_builder.py +12 -14
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_handler.py +3 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_renderer.py +15 -12
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_service.py +47 -44
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/__init__.py +15 -13
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/gateway_service.py +27 -26
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/mcp_manager.py +33 -27
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/session_manager.py +3 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom.py +14 -22
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom_tool.py +13 -14
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/concierge.py +9 -11
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/faq_bot.py +7 -8
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/info_gatherer.py +14 -13
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/receptionist.py +3 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/survey.py +5 -4
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/call.py +39 -20
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/client.py +59 -25
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/message.py +17 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_base.py +3 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/compat.py +9 -9
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/__init__.py +24 -20
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/document_processor.py +130 -106
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/index_builder.py +30 -24
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/migration.py +12 -9
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/pgvector_backend.py +38 -26
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/query_processor.py +11 -15
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_engine.py +65 -58
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_service.py +73 -66
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +4 -4
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/skill.py +9 -15
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/skill.py +5 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/skill.py +7 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/skill.py +6 -8
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/skill.py +8 -7
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/skill.py +4 -4
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/skill.py +5 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/skill.py +10 -13
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/skill.py +26 -30
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/skill.py +53 -39
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/skill.py +2 -2
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/registry.py +21 -17
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/skill.py +32 -28
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/skill.py +10 -9
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/skill.py +3 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill.py +22 -28
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_improved.py +15 -17
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_original.py +15 -16
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/skill.py +7 -8
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/schema_utils.py +60 -50
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/web_service.py +62 -62
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +2 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/LICENSE +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/setup.cfg +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/setup.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/__init__.py +2 -2
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/__init__.py +5 -5
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/__init__.py +5 -5
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/security_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/__init__.py +4 -4
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/__init__.py +3 -3
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/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.dev64"
|
|
8
8
|
description = "SignalWire SDK"
|
|
9
9
|
authors = [
|
|
10
10
|
{name = "SignalWire Team", email = "info@signalwire.com"}
|
|
@@ -165,3 +165,51 @@ signalwire = [
|
|
|
165
165
|
[tool.ruff]
|
|
166
166
|
target-version = "py310"
|
|
167
167
|
line-length = 88
|
|
168
|
+
|
|
169
|
+
[tool.ruff.lint]
|
|
170
|
+
# E4/E7/E9 + F are the ruff defaults (E501 line-length intentionally excluded —
|
|
171
|
+
# formatting is owned by `ruff format`, not the linter). B = flake8-bugbear
|
|
172
|
+
# (likely-bug patterns), S = flake8-bandit (security smells).
|
|
173
|
+
select = ["E4", "E7", "E9", "F", "B", "S", "C4", "PERF", "SIM", "PTH", "RET", "RUF"]
|
|
174
|
+
|
|
175
|
+
[tool.ruff.lint.per-file-ignores]
|
|
176
|
+
# Tests are built on assert; bandit's S101 is noise there.
|
|
177
|
+
"tests/**" = ["S101"]
|
|
178
|
+
# sw-agent-dokku is a developer-run deploy CLI that shells out to git/ssh with
|
|
179
|
+
# fixed list-form arg vectors (shell=False, so no shell interpolation). The
|
|
180
|
+
# dynamic parts (app name, dokku host, config vars) are the operator's own CLI
|
|
181
|
+
# args for their own deployment — not untrusted server input. S603 (subprocess
|
|
182
|
+
# call) and S607 (partial executable path: git/ssh resolved via PATH, the normal
|
|
183
|
+
# idiom) are expected and safe across this file.
|
|
184
|
+
"signalwire/signalwire/cli/dokku.py" = ["S603", "S607"]
|
|
185
|
+
|
|
186
|
+
[tool.ruff.lint.flake8-bugbear]
|
|
187
|
+
# FastAPI's dependency-injection idiom puts Depends()/Query()/etc. in argument
|
|
188
|
+
# defaults on purpose; B008 (function-call-in-default) is a false positive for it.
|
|
189
|
+
# Both the bare (`from fastapi import Depends`) and qualified forms are listed
|
|
190
|
+
# because the code imports these names directly.
|
|
191
|
+
extend-immutable-calls = [
|
|
192
|
+
"Depends", "fastapi.Depends",
|
|
193
|
+
"Query", "fastapi.Query",
|
|
194
|
+
"Body", "fastapi.Body",
|
|
195
|
+
"Header", "fastapi.Header",
|
|
196
|
+
"Cookie", "fastapi.Cookie",
|
|
197
|
+
"Path", "fastapi.Path",
|
|
198
|
+
"Form", "fastapi.Form",
|
|
199
|
+
"File", "fastapi.File",
|
|
200
|
+
"Security", "fastapi.Security",
|
|
201
|
+
]
|
|
202
|
+
|
|
203
|
+
[tool.mypy]
|
|
204
|
+
python_version = "3.10"
|
|
205
|
+
files = ["signalwire/signalwire"]
|
|
206
|
+
# Third-party packages without type stubs (nltk, sentence_transformers, the
|
|
207
|
+
# search/relay stacks) are out of scope — we type our own code, not theirs.
|
|
208
|
+
ignore_missing_imports = true
|
|
209
|
+
# The bar: our own code is clean. Bodies of untyped defs are checked so real
|
|
210
|
+
# type errors inside them surface (this is what found the mixin cluster).
|
|
211
|
+
check_untyped_defs = true
|
|
212
|
+
warn_unused_ignores = true
|
|
213
|
+
# `# type: ignore` is reserved for genuinely-unfixable third-party-stub gaps and
|
|
214
|
+
# must carry an error code + reason. warn_unused_ignores keeps them honest.
|
|
215
|
+
show_error_codes = true
|
|
@@ -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.dev64"
|
|
21
21
|
|
|
22
22
|
# Import core classes for easier access.
|
|
23
23
|
# These imports are intentionally placed after configure_logging() so the SDK's
|
|
@@ -148,26 +148,26 @@ def RestClient(*args, **kwargs):
|
|
|
148
148
|
__all__ = [
|
|
149
149
|
"AgentBase",
|
|
150
150
|
"AgentServer",
|
|
151
|
-
"
|
|
152
|
-
"SWMLBuilder",
|
|
153
|
-
"FunctionResult",
|
|
154
|
-
"SWAIGFunction",
|
|
155
|
-
"DataMap",
|
|
156
|
-
"create_simple_api_tool",
|
|
157
|
-
"create_expression_tool",
|
|
158
|
-
"ContextBuilder",
|
|
151
|
+
"BedrockAgent",
|
|
159
152
|
"Context",
|
|
160
|
-
"
|
|
153
|
+
"ContextBuilder",
|
|
154
|
+
"DataMap",
|
|
155
|
+
"FunctionResult",
|
|
161
156
|
"GatherInfo",
|
|
162
157
|
"GatherQuestion",
|
|
163
|
-
"
|
|
164
|
-
"
|
|
158
|
+
"RestClient",
|
|
159
|
+
"SWAIGFunction",
|
|
160
|
+
"SWMLBuilder",
|
|
161
|
+
"SWMLService",
|
|
165
162
|
"SchemaValidationError",
|
|
163
|
+
"Step",
|
|
164
|
+
"SwaigFunctionResult",
|
|
166
165
|
"WebService",
|
|
166
|
+
"add_skill_directory",
|
|
167
|
+
"create_expression_tool",
|
|
168
|
+
"create_simple_api_tool",
|
|
169
|
+
"create_simple_context",
|
|
167
170
|
"list_skills",
|
|
168
171
|
"list_skills_with_params",
|
|
169
172
|
"register_skill",
|
|
170
|
-
"add_skill_directory",
|
|
171
|
-
"BedrockAgent",
|
|
172
|
-
"RestClient",
|
|
173
173
|
]
|
{signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agent_server.py
RENAMED
|
@@ -11,6 +11,7 @@ AgentServer - Class for hosting multiple SignalWire AI Agents in a single server
|
|
|
11
11
|
|
|
12
12
|
import os
|
|
13
13
|
import re
|
|
14
|
+
from pathlib import Path
|
|
14
15
|
from typing import Dict, Any, Optional, List, Tuple, Callable
|
|
15
16
|
|
|
16
17
|
try:
|
|
@@ -19,11 +20,12 @@ try:
|
|
|
19
20
|
except ImportError:
|
|
20
21
|
raise ImportError(
|
|
21
22
|
"fastapi and uvicorn are required. Install them with: pip install fastapi uvicorn"
|
|
22
|
-
)
|
|
23
|
+
) from None
|
|
23
24
|
|
|
24
25
|
from signalwire.core.agent_base import AgentBase
|
|
25
26
|
from signalwire.core.swml_service import SWMLService
|
|
26
27
|
from signalwire.core.logging_config import get_logger
|
|
28
|
+
import contextlib
|
|
27
29
|
|
|
28
30
|
|
|
29
31
|
class AgentServer:
|
|
@@ -41,7 +43,10 @@ class AgentServer:
|
|
|
41
43
|
"""
|
|
42
44
|
|
|
43
45
|
def __init__(
|
|
44
|
-
self,
|
|
46
|
+
self,
|
|
47
|
+
host: str = "0.0.0.0", # noqa: S104 # intended server default: listen on all interfaces (overridable)
|
|
48
|
+
port: int = 3000,
|
|
49
|
+
log_level: str = "info",
|
|
45
50
|
):
|
|
46
51
|
"""
|
|
47
52
|
Initialize a new agent server
|
|
@@ -61,7 +66,7 @@ class AgentServer:
|
|
|
61
66
|
self.app = FastAPI(
|
|
62
67
|
title="SignalWire AI Agents",
|
|
63
68
|
description="Hosted SignalWire AI Agents",
|
|
64
|
-
version="3.0.2.
|
|
69
|
+
version="3.0.2.dev64",
|
|
65
70
|
redirect_slashes=False,
|
|
66
71
|
docs_url=None,
|
|
67
72
|
redoc_url=None,
|
|
@@ -87,7 +92,7 @@ class AgentServer:
|
|
|
87
92
|
|
|
88
93
|
# Keep track of SIP routing configuration
|
|
89
94
|
self._sip_routing_enabled = False
|
|
90
|
-
self._sip_route = None
|
|
95
|
+
self._sip_route: Optional[str] = None
|
|
91
96
|
self._sip_username_mapping: Dict[str, str] = {} # Maps SIP usernames to routes
|
|
92
97
|
|
|
93
98
|
# Register health endpoints immediately so they're available
|
|
@@ -145,10 +150,9 @@ class AgentServer:
|
|
|
145
150
|
self._auto_map_agent_sip_usernames(agent, route)
|
|
146
151
|
|
|
147
152
|
# Register the SIP routing callback with this agent if we have one
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
)
|
|
153
|
+
sip_cb = getattr(self, "_sip_routing_callback", None)
|
|
154
|
+
if sip_cb is not None and self._sip_route is not None:
|
|
155
|
+
agent.register_routing_callback(sip_cb, path=self._sip_route)
|
|
152
156
|
|
|
153
157
|
def setup_sip_routing(self, route: str = "/sip", auto_map: bool = True) -> None:
|
|
154
158
|
"""
|
|
@@ -199,10 +203,7 @@ class AgentServer:
|
|
|
199
203
|
if target_route:
|
|
200
204
|
self.logger.info(f"Routing SIP request to {target_route}")
|
|
201
205
|
return target_route
|
|
202
|
-
|
|
203
|
-
self.logger.warning(
|
|
204
|
-
f"No route found for SIP username: {sip_username}"
|
|
205
|
-
)
|
|
206
|
+
self.logger.warning(f"No route found for SIP username: {sip_username}")
|
|
206
207
|
|
|
207
208
|
# No routing needed (will be handled by the current agent)
|
|
208
209
|
return None
|
|
@@ -373,11 +374,10 @@ class AgentServer:
|
|
|
373
374
|
|
|
374
375
|
if mode == "cgi":
|
|
375
376
|
return self._handle_cgi_request()
|
|
376
|
-
|
|
377
|
+
if mode == "lambda":
|
|
377
378
|
return self._handle_lambda_request(event, context)
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
return self._run_server(host, port)
|
|
379
|
+
# Server mode - use existing logic
|
|
380
|
+
return self._run_server(host, port)
|
|
381
381
|
|
|
382
382
|
def _handle_cgi_request(self) -> str:
|
|
383
383
|
"""Handle CGI request using same routing logic as server"""
|
|
@@ -406,7 +406,7 @@ class AgentServer:
|
|
|
406
406
|
swml, content_type="application/json"
|
|
407
407
|
)
|
|
408
408
|
except Exception as e:
|
|
409
|
-
self.logger.error(f"Failed to generate SWML: {
|
|
409
|
+
self.logger.error(f"Failed to generate SWML: {e!s}")
|
|
410
410
|
error_response = {"error": "Failed to generate SWML"}
|
|
411
411
|
return self._format_cgi_response(
|
|
412
412
|
error_response, status="500 Internal Server Error"
|
|
@@ -450,7 +450,7 @@ class AgentServer:
|
|
|
450
450
|
)
|
|
451
451
|
|
|
452
452
|
except Exception as e:
|
|
453
|
-
self.logger.error(f"SWAIG function failed: {
|
|
453
|
+
self.logger.error(f"SWAIG function failed: {e!s}")
|
|
454
454
|
error_response = {"error": "SWAIG function failed"}
|
|
455
455
|
return self._format_cgi_response(
|
|
456
456
|
error_response, status="500 Internal Server Error"
|
|
@@ -500,7 +500,7 @@ class AgentServer:
|
|
|
500
500
|
)
|
|
501
501
|
|
|
502
502
|
except Exception as e:
|
|
503
|
-
self.logger.error(f"Function call failed: {
|
|
503
|
+
self.logger.error(f"Function call failed: {e!s}")
|
|
504
504
|
error_response = {"error": "Function call failed"}
|
|
505
505
|
return self._format_cgi_response(
|
|
506
506
|
error_response, status="500 Internal Server Error"
|
|
@@ -545,7 +545,7 @@ class AgentServer:
|
|
|
545
545
|
"body": json.dumps(swml) if isinstance(swml, dict) else swml,
|
|
546
546
|
}
|
|
547
547
|
except Exception as e:
|
|
548
|
-
self.logger.error(f"Failed to generate SWML: {
|
|
548
|
+
self.logger.error(f"Failed to generate SWML: {e!s}")
|
|
549
549
|
return {
|
|
550
550
|
"statusCode": 500,
|
|
551
551
|
"headers": {"Content-Type": "application/json"},
|
|
@@ -569,10 +569,8 @@ class AgentServer:
|
|
|
569
569
|
# Get POST data from Lambda event body
|
|
570
570
|
post_data = {}
|
|
571
571
|
if event and "body" in event and event["body"]:
|
|
572
|
-
|
|
572
|
+
with contextlib.suppress(json.JSONDecodeError, ValueError):
|
|
573
573
|
post_data = json.loads(event["body"])
|
|
574
|
-
except (json.JSONDecodeError, ValueError):
|
|
575
|
-
pass
|
|
576
574
|
|
|
577
575
|
result = agent._execute_swaig_function(
|
|
578
576
|
function_name, post_data, None, None
|
|
@@ -586,7 +584,7 @@ class AgentServer:
|
|
|
586
584
|
}
|
|
587
585
|
|
|
588
586
|
except Exception as e:
|
|
589
|
-
self.logger.error(f"Function call failed: {
|
|
587
|
+
self.logger.error(f"Function call failed: {e!s}")
|
|
590
588
|
return {
|
|
591
589
|
"statusCode": 500,
|
|
592
590
|
"headers": {"Content-Type": "application/json"},
|
|
@@ -608,10 +606,7 @@ class AgentServer:
|
|
|
608
606
|
import sys
|
|
609
607
|
|
|
610
608
|
# Format the body
|
|
611
|
-
if isinstance(data, dict)
|
|
612
|
-
body = json.dumps(data)
|
|
613
|
-
else:
|
|
614
|
-
body = str(data)
|
|
609
|
+
body = json.dumps(data) if isinstance(data, dict) else str(data)
|
|
615
610
|
|
|
616
611
|
# Build CGI response with headers
|
|
617
612
|
response_lines = [
|
|
@@ -669,10 +664,10 @@ class AgentServer:
|
|
|
669
664
|
|
|
670
665
|
# Validate SSL configuration if enabled
|
|
671
666
|
if ssl_enabled:
|
|
672
|
-
if not ssl_cert_path or not
|
|
667
|
+
if not ssl_cert_path or not Path(ssl_cert_path).exists():
|
|
673
668
|
self.logger.warning(f"SSL cert not found: {ssl_cert_path}")
|
|
674
669
|
ssl_enabled = False
|
|
675
|
-
elif not ssl_key_path or not
|
|
670
|
+
elif not ssl_key_path or not Path(ssl_key_path).exists():
|
|
676
671
|
self.logger.warning(f"SSL key not found: {ssl_key_path}")
|
|
677
672
|
ssl_enabled = False
|
|
678
673
|
|
|
@@ -688,8 +683,11 @@ class AgentServer:
|
|
|
688
683
|
display_host = f"{host}:{port}"
|
|
689
684
|
|
|
690
685
|
self.logger.info(f"Starting server on {protocol}://{display_host}")
|
|
691
|
-
for
|
|
692
|
-
|
|
686
|
+
for agent in self.agents.values():
|
|
687
|
+
# include_source defaults False -> 2-tuple at runtime; index to
|
|
688
|
+
# avoid the union-tuple unpack ambiguity mypy sees.
|
|
689
|
+
creds = agent.get_basic_auth_credentials()
|
|
690
|
+
username = creds[0]
|
|
693
691
|
agent_url = agent.get_full_url(include_auth=False)
|
|
694
692
|
self.logger.info(f"Agent '{agent.get_name()}' available at:")
|
|
695
693
|
self.logger.info(f"URL: {agent_url}")
|
|
@@ -858,7 +856,7 @@ class AgentServer:
|
|
|
858
856
|
if full_path == route.lstrip("/"):
|
|
859
857
|
# This is a request to an agent's root without trailing slash
|
|
860
858
|
return await agent._handle_root_request(request)
|
|
861
|
-
|
|
859
|
+
if full_path.startswith(route.lstrip("/") + "/"):
|
|
862
860
|
# This is a request to an agent's sub-path
|
|
863
861
|
relative_path = full_path[len(route.lstrip("/")) :]
|
|
864
862
|
relative_path = relative_path.lstrip("/")
|
|
@@ -870,21 +868,18 @@ class AgentServer:
|
|
|
870
868
|
clean_path = relative_path.rstrip("/")
|
|
871
869
|
if clean_path == "debug":
|
|
872
870
|
return await agent._handle_debug_request(request)
|
|
873
|
-
|
|
871
|
+
if clean_path == "swaig":
|
|
874
872
|
from fastapi import Response
|
|
875
873
|
|
|
876
874
|
return await agent._handle_swaig_request(request, Response())
|
|
877
|
-
|
|
875
|
+
if clean_path == "post_prompt":
|
|
878
876
|
return await agent._handle_post_prompt_request(request)
|
|
879
|
-
|
|
877
|
+
if clean_path == "check_for_input":
|
|
880
878
|
return await agent._handle_check_for_input_request(request)
|
|
881
879
|
|
|
882
880
|
# Check for custom routing callbacks
|
|
883
881
|
if hasattr(agent, "_routing_callbacks"):
|
|
884
|
-
for
|
|
885
|
-
callback_path,
|
|
886
|
-
callback_fn,
|
|
887
|
-
) in agent._routing_callbacks.items():
|
|
882
|
+
for callback_path in agent._routing_callbacks:
|
|
888
883
|
cb_path_clean = callback_path.strip("/")
|
|
889
884
|
if clean_path == cb_path_clean:
|
|
890
885
|
request.state.callback_path = callback_path
|
|
@@ -893,7 +888,7 @@ class AgentServer:
|
|
|
893
888
|
# No matching agent - check for static files
|
|
894
889
|
if hasattr(self, "_static_directories"):
|
|
895
890
|
# Check each static directory route
|
|
896
|
-
for static_route
|
|
891
|
+
for static_route in self._static_directories:
|
|
897
892
|
# For root static route, serve any unmatched path
|
|
898
893
|
if static_route == "" or static_route == "/":
|
|
899
894
|
response = self._serve_static_file(full_path, "")
|
{signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agents/bedrock.py
RENAMED
|
@@ -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: str = None, modifications: Optional[dict] = None
|
|
80
|
+
self, call_id: Optional[str] = None, modifications: Optional[dict] = None
|
|
81
81
|
) -> str:
|
|
82
82
|
"""
|
|
83
83
|
Render SWML document with amazon_bedrock verb
|
{signalwire_sdk-3.0.2.dev62 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/build_search.py
RENAMED
|
@@ -11,6 +11,7 @@ import argparse
|
|
|
11
11
|
import sys
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from datetime import datetime
|
|
14
|
+
from typing import List, cast
|
|
14
15
|
from urllib.parse import urlparse, urlunparse
|
|
15
16
|
|
|
16
17
|
from signalwire.search.models import MODEL_ALIASES, DEFAULT_MODEL, resolve_model_alias
|
|
@@ -26,7 +27,7 @@ def _mask_connection_string(conn_str):
|
|
|
26
27
|
+ (f":{parsed.port}" if parsed.port else "")
|
|
27
28
|
)
|
|
28
29
|
return urlunparse(masked)
|
|
29
|
-
except Exception:
|
|
30
|
+
except Exception: # noqa: S110 # best-effort password masking for display; falls through to "****" on any parse failure
|
|
30
31
|
pass
|
|
31
32
|
return "****"
|
|
32
33
|
|
|
@@ -518,7 +519,7 @@ Examples:
|
|
|
518
519
|
relative_path = (
|
|
519
520
|
file_path.relative_to(base_dir)
|
|
520
521
|
if base_dir
|
|
521
|
-
else file_path.name
|
|
522
|
+
else Path(file_path.name)
|
|
522
523
|
)
|
|
523
524
|
json_filename = relative_path.with_suffix(".json")
|
|
524
525
|
json_path = Path(args.output_dir) / json_filename
|
|
@@ -537,7 +538,7 @@ Examples:
|
|
|
537
538
|
},
|
|
538
539
|
}
|
|
539
540
|
|
|
540
|
-
with open(
|
|
541
|
+
with json_path.open("w", encoding="utf-8") as f:
|
|
541
542
|
json.dump(chunk_data, f, indent=2, ensure_ascii=False)
|
|
542
543
|
|
|
543
544
|
chunk_files_created.append(json_path)
|
|
@@ -547,7 +548,7 @@ Examples:
|
|
|
547
548
|
# Accumulate all chunks for single file output
|
|
548
549
|
all_chunks.extend(chunks)
|
|
549
550
|
|
|
550
|
-
except Exception as e:
|
|
551
|
+
except Exception as e: # noqa: PERF203 # per-iteration error isolation: one failed file must not abort the batch
|
|
551
552
|
print(f"Error processing {file_path}: {e}")
|
|
552
553
|
if args.verbose:
|
|
553
554
|
import traceback
|
|
@@ -566,7 +567,7 @@ Examples:
|
|
|
566
567
|
},
|
|
567
568
|
}
|
|
568
569
|
|
|
569
|
-
with
|
|
570
|
+
with Path(args.output).open("w", encoding="utf-8") as f:
|
|
570
571
|
json.dump(output_data, f, indent=2, ensure_ascii=False)
|
|
571
572
|
|
|
572
573
|
print(f"✓ Exported {len(all_chunks)} chunks to {args.output}")
|
|
@@ -575,8 +576,8 @@ Examples:
|
|
|
575
576
|
f"✓ Created {len(chunk_files_created)} JSON files in {args.output_dir}"
|
|
576
577
|
)
|
|
577
578
|
total_chunks = 0
|
|
578
|
-
for
|
|
579
|
-
with open(
|
|
579
|
+
for chunk_file in chunk_files_created:
|
|
580
|
+
with chunk_file.open() as fh:
|
|
580
581
|
total_chunks += len(json.load(fh)["chunks"])
|
|
581
582
|
print(f" Total chunks: {total_chunks}")
|
|
582
583
|
|
|
@@ -633,7 +634,11 @@ Examples:
|
|
|
633
634
|
# Check if the index was actually created
|
|
634
635
|
import os
|
|
635
636
|
|
|
636
|
-
|
|
637
|
+
# Rationale for PTH110 suppression below: tests patch global
|
|
638
|
+
# os.path.exists separately from pathlib.Path.exists to drive this
|
|
639
|
+
# post-build check; Path.exists() would pick up the unrelated Path
|
|
640
|
+
# mock and break the test seam.
|
|
641
|
+
if os.path.exists(args.output): # noqa: PTH110
|
|
637
642
|
print(f"\n✓ Search index created successfully: {args.output}")
|
|
638
643
|
else:
|
|
639
644
|
print("\n✗ Search index creation failed - no files were processed")
|
|
@@ -770,10 +775,11 @@ def search_command():
|
|
|
770
775
|
args.model = MODEL_ALIASES[args.model]
|
|
771
776
|
|
|
772
777
|
# Validate keyword weight if provided
|
|
773
|
-
if args.keyword_weight is not None
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
778
|
+
if args.keyword_weight is not None and (
|
|
779
|
+
args.keyword_weight < 0.0 or args.keyword_weight > 1.0
|
|
780
|
+
):
|
|
781
|
+
print("Error: --keyword-weight must be between 0.0 and 1.0")
|
|
782
|
+
sys.exit(1)
|
|
777
783
|
|
|
778
784
|
# Validate backend configuration
|
|
779
785
|
if args.backend == "pgvector" and not args.connection_string:
|
|
@@ -920,7 +926,9 @@ def search_command():
|
|
|
920
926
|
|
|
921
927
|
# Perform search
|
|
922
928
|
results = engine.search(
|
|
923
|
-
query_vector=
|
|
929
|
+
query_vector=cast(
|
|
930
|
+
List[float], enhanced.get("vector")
|
|
931
|
+
), # vector is None for keyword-only search; search() tolerates it at runtime
|
|
924
932
|
enhanced_text=enhanced.get("enhanced_text", query),
|
|
925
933
|
count=args.count,
|
|
926
934
|
similarity_threshold=args.distance_threshold,
|
|
@@ -1003,7 +1011,9 @@ def search_command():
|
|
|
1003
1011
|
|
|
1004
1012
|
# Perform search
|
|
1005
1013
|
results = engine.search(
|
|
1006
|
-
query_vector=
|
|
1014
|
+
query_vector=cast(
|
|
1015
|
+
List[float], enhanced.get("vector")
|
|
1016
|
+
), # vector is None for keyword-only search; search() tolerates it at runtime
|
|
1007
1017
|
enhanced_text=enhanced.get("enhanced_text", args.query),
|
|
1008
1018
|
count=args.count,
|
|
1009
1019
|
similarity_threshold=args.distance_threshold,
|
|
@@ -1535,17 +1545,17 @@ Examples:
|
|
|
1535
1545
|
sys.argv.pop(1)
|
|
1536
1546
|
validate_command()
|
|
1537
1547
|
return
|
|
1538
|
-
|
|
1548
|
+
if sys.argv[1] == "search":
|
|
1539
1549
|
# Remove 'search' from argv and call search_command
|
|
1540
1550
|
sys.argv.pop(1)
|
|
1541
1551
|
search_command()
|
|
1542
1552
|
return
|
|
1543
|
-
|
|
1553
|
+
if sys.argv[1] == "remote":
|
|
1544
1554
|
# Remove 'remote' from argv and call remote_command
|
|
1545
1555
|
sys.argv.pop(1)
|
|
1546
1556
|
remote_command()
|
|
1547
1557
|
return
|
|
1548
|
-
|
|
1558
|
+
if sys.argv[1] == "migrate":
|
|
1549
1559
|
# Remove 'migrate' from argv and call migrate_command
|
|
1550
1560
|
sys.argv.pop(1)
|
|
1551
1561
|
migrate_command()
|