signalwire-sdk 3.0.2.dev63__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.dev63 → signalwire_sdk-3.0.2.dev64}/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/pyproject.toml +35 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/__init__.py +15 -15
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agent_server.py +28 -35
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/build_search.py +18 -13
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/agent_loader.py +15 -12
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/argparse_helpers.py +5 -12
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/service_loader.py +18 -22
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/dokku.py +16 -13
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/datamap_exec.py +10 -12
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/init_project.py +17 -20
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/output_formatter.py +8 -17
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/swml_dump.py +18 -19
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_generation.py +5 -7
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/data_overrides.py +3 -4
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/mock_env.py +5 -4
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/swaig_test_wrapper.py +3 -2
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/test_swaig.py +10 -6
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/registry.py +65 -64
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/type_inference.py +4 -6
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent_base.py +65 -59
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/auth_handler.py +3 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/config_loader.py +13 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/contexts.py +13 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/data_map.py +2 -7
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/function_result.py +15 -21
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/logging_config.py +6 -11
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/ai_config_mixin.py +6 -5
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/auth_mixin.py +5 -7
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/prompt_mixin.py +49 -56
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/serverless_mixin.py +75 -90
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/state_mixin.py +3 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/tool_mixin.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/web_mixin.py +18 -22
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/session_manager.py +1 -4
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_validator.py +8 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security_config.py +9 -5
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_base.py +5 -5
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/skill_manager.py +11 -16
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swaig_function.py +9 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_builder.py +6 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_handler.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_renderer.py +8 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/swml_service.py +34 -38
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/__init__.py +12 -11
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/gateway_service.py +24 -23
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/mcp_manager.py +17 -16
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom.py +7 -16
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/pom_tool.py +13 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/concierge.py +9 -11
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/faq_bot.py +4 -5
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/info_gatherer.py +11 -12
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/receptionist.py +3 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/survey.py +5 -4
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/call.py +32 -17
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/client.py +35 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/message.py +17 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/__init__.py +9 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/document_processor.py +47 -54
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/index_builder.py +9 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/migration.py +2 -2
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/pgvector_backend.py +21 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/query_processor.py +4 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_engine.py +38 -42
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/search_service.py +28 -30
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +3 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/skill.py +8 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/skill.py +5 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/skill.py +7 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/skill.py +6 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/skill.py +7 -6
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/skill.py +4 -4
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/skill.py +5 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/skill.py +9 -12
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/skill.py +25 -29
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/skill.py +37 -36
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/registry.py +6 -6
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/skill.py +18 -16
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/skill.py +10 -9
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/skill.py +2 -2
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill.py +13 -20
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_improved.py +11 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/skill_original.py +13 -14
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/skill.py +7 -8
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/schema_utils.py +45 -40
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/web_service.py +32 -36
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/PKG-INFO +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/LICENSE +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/setup.cfg +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/setup.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/agents/bedrock.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/__init__.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/_agent_host.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/__init__.py +2 -2
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/__init__.py +5 -5
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/__init__.py +5 -5
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/security_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/core/security/webhook_middleware.py +1 -1
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/__init__.py +4 -4
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/prefabs/__init__.py +3 -3
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/compat.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.0.2.dev63 → 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"}
|
|
@@ -166,6 +166,40 @@ signalwire = [
|
|
|
166
166
|
target-version = "py310"
|
|
167
167
|
line-length = 88
|
|
168
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
|
+
|
|
169
203
|
[tool.mypy]
|
|
170
204
|
python_version = "3.10"
|
|
171
205
|
files = ["signalwire/signalwire"]
|
|
@@ -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.dev63 → 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,
|
|
@@ -198,10 +203,7 @@ class AgentServer:
|
|
|
198
203
|
if target_route:
|
|
199
204
|
self.logger.info(f"Routing SIP request to {target_route}")
|
|
200
205
|
return target_route
|
|
201
|
-
|
|
202
|
-
self.logger.warning(
|
|
203
|
-
f"No route found for SIP username: {sip_username}"
|
|
204
|
-
)
|
|
206
|
+
self.logger.warning(f"No route found for SIP username: {sip_username}")
|
|
205
207
|
|
|
206
208
|
# No routing needed (will be handled by the current agent)
|
|
207
209
|
return None
|
|
@@ -372,11 +374,10 @@ class AgentServer:
|
|
|
372
374
|
|
|
373
375
|
if mode == "cgi":
|
|
374
376
|
return self._handle_cgi_request()
|
|
375
|
-
|
|
377
|
+
if mode == "lambda":
|
|
376
378
|
return self._handle_lambda_request(event, context)
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
return self._run_server(host, port)
|
|
379
|
+
# Server mode - use existing logic
|
|
380
|
+
return self._run_server(host, port)
|
|
380
381
|
|
|
381
382
|
def _handle_cgi_request(self) -> str:
|
|
382
383
|
"""Handle CGI request using same routing logic as server"""
|
|
@@ -405,7 +406,7 @@ class AgentServer:
|
|
|
405
406
|
swml, content_type="application/json"
|
|
406
407
|
)
|
|
407
408
|
except Exception as e:
|
|
408
|
-
self.logger.error(f"Failed to generate SWML: {
|
|
409
|
+
self.logger.error(f"Failed to generate SWML: {e!s}")
|
|
409
410
|
error_response = {"error": "Failed to generate SWML"}
|
|
410
411
|
return self._format_cgi_response(
|
|
411
412
|
error_response, status="500 Internal Server Error"
|
|
@@ -449,7 +450,7 @@ class AgentServer:
|
|
|
449
450
|
)
|
|
450
451
|
|
|
451
452
|
except Exception as e:
|
|
452
|
-
self.logger.error(f"SWAIG function failed: {
|
|
453
|
+
self.logger.error(f"SWAIG function failed: {e!s}")
|
|
453
454
|
error_response = {"error": "SWAIG function failed"}
|
|
454
455
|
return self._format_cgi_response(
|
|
455
456
|
error_response, status="500 Internal Server Error"
|
|
@@ -499,7 +500,7 @@ class AgentServer:
|
|
|
499
500
|
)
|
|
500
501
|
|
|
501
502
|
except Exception as e:
|
|
502
|
-
self.logger.error(f"Function call failed: {
|
|
503
|
+
self.logger.error(f"Function call failed: {e!s}")
|
|
503
504
|
error_response = {"error": "Function call failed"}
|
|
504
505
|
return self._format_cgi_response(
|
|
505
506
|
error_response, status="500 Internal Server Error"
|
|
@@ -544,7 +545,7 @@ class AgentServer:
|
|
|
544
545
|
"body": json.dumps(swml) if isinstance(swml, dict) else swml,
|
|
545
546
|
}
|
|
546
547
|
except Exception as e:
|
|
547
|
-
self.logger.error(f"Failed to generate SWML: {
|
|
548
|
+
self.logger.error(f"Failed to generate SWML: {e!s}")
|
|
548
549
|
return {
|
|
549
550
|
"statusCode": 500,
|
|
550
551
|
"headers": {"Content-Type": "application/json"},
|
|
@@ -568,10 +569,8 @@ class AgentServer:
|
|
|
568
569
|
# Get POST data from Lambda event body
|
|
569
570
|
post_data = {}
|
|
570
571
|
if event and "body" in event and event["body"]:
|
|
571
|
-
|
|
572
|
+
with contextlib.suppress(json.JSONDecodeError, ValueError):
|
|
572
573
|
post_data = json.loads(event["body"])
|
|
573
|
-
except (json.JSONDecodeError, ValueError):
|
|
574
|
-
pass
|
|
575
574
|
|
|
576
575
|
result = agent._execute_swaig_function(
|
|
577
576
|
function_name, post_data, None, None
|
|
@@ -585,7 +584,7 @@ class AgentServer:
|
|
|
585
584
|
}
|
|
586
585
|
|
|
587
586
|
except Exception as e:
|
|
588
|
-
self.logger.error(f"Function call failed: {
|
|
587
|
+
self.logger.error(f"Function call failed: {e!s}")
|
|
589
588
|
return {
|
|
590
589
|
"statusCode": 500,
|
|
591
590
|
"headers": {"Content-Type": "application/json"},
|
|
@@ -607,10 +606,7 @@ class AgentServer:
|
|
|
607
606
|
import sys
|
|
608
607
|
|
|
609
608
|
# Format the body
|
|
610
|
-
if isinstance(data, dict)
|
|
611
|
-
body = json.dumps(data)
|
|
612
|
-
else:
|
|
613
|
-
body = str(data)
|
|
609
|
+
body = json.dumps(data) if isinstance(data, dict) else str(data)
|
|
614
610
|
|
|
615
611
|
# Build CGI response with headers
|
|
616
612
|
response_lines = [
|
|
@@ -668,10 +664,10 @@ class AgentServer:
|
|
|
668
664
|
|
|
669
665
|
# Validate SSL configuration if enabled
|
|
670
666
|
if ssl_enabled:
|
|
671
|
-
if not ssl_cert_path or not
|
|
667
|
+
if not ssl_cert_path or not Path(ssl_cert_path).exists():
|
|
672
668
|
self.logger.warning(f"SSL cert not found: {ssl_cert_path}")
|
|
673
669
|
ssl_enabled = False
|
|
674
|
-
elif not ssl_key_path or not
|
|
670
|
+
elif not ssl_key_path or not Path(ssl_key_path).exists():
|
|
675
671
|
self.logger.warning(f"SSL key not found: {ssl_key_path}")
|
|
676
672
|
ssl_enabled = False
|
|
677
673
|
|
|
@@ -687,7 +683,7 @@ class AgentServer:
|
|
|
687
683
|
display_host = f"{host}:{port}"
|
|
688
684
|
|
|
689
685
|
self.logger.info(f"Starting server on {protocol}://{display_host}")
|
|
690
|
-
for
|
|
686
|
+
for agent in self.agents.values():
|
|
691
687
|
# include_source defaults False -> 2-tuple at runtime; index to
|
|
692
688
|
# avoid the union-tuple unpack ambiguity mypy sees.
|
|
693
689
|
creds = agent.get_basic_auth_credentials()
|
|
@@ -860,7 +856,7 @@ class AgentServer:
|
|
|
860
856
|
if full_path == route.lstrip("/"):
|
|
861
857
|
# This is a request to an agent's root without trailing slash
|
|
862
858
|
return await agent._handle_root_request(request)
|
|
863
|
-
|
|
859
|
+
if full_path.startswith(route.lstrip("/") + "/"):
|
|
864
860
|
# This is a request to an agent's sub-path
|
|
865
861
|
relative_path = full_path[len(route.lstrip("/")) :]
|
|
866
862
|
relative_path = relative_path.lstrip("/")
|
|
@@ -872,21 +868,18 @@ class AgentServer:
|
|
|
872
868
|
clean_path = relative_path.rstrip("/")
|
|
873
869
|
if clean_path == "debug":
|
|
874
870
|
return await agent._handle_debug_request(request)
|
|
875
|
-
|
|
871
|
+
if clean_path == "swaig":
|
|
876
872
|
from fastapi import Response
|
|
877
873
|
|
|
878
874
|
return await agent._handle_swaig_request(request, Response())
|
|
879
|
-
|
|
875
|
+
if clean_path == "post_prompt":
|
|
880
876
|
return await agent._handle_post_prompt_request(request)
|
|
881
|
-
|
|
877
|
+
if clean_path == "check_for_input":
|
|
882
878
|
return await agent._handle_check_for_input_request(request)
|
|
883
879
|
|
|
884
880
|
# Check for custom routing callbacks
|
|
885
881
|
if hasattr(agent, "_routing_callbacks"):
|
|
886
|
-
for
|
|
887
|
-
callback_path,
|
|
888
|
-
callback_fn,
|
|
889
|
-
) in agent._routing_callbacks.items():
|
|
882
|
+
for callback_path in agent._routing_callbacks:
|
|
890
883
|
cb_path_clean = callback_path.strip("/")
|
|
891
884
|
if clean_path == cb_path_clean:
|
|
892
885
|
request.state.callback_path = callback_path
|
|
@@ -895,7 +888,7 @@ class AgentServer:
|
|
|
895
888
|
# No matching agent - check for static files
|
|
896
889
|
if hasattr(self, "_static_directories"):
|
|
897
890
|
# Check each static directory route
|
|
898
|
-
for static_route
|
|
891
|
+
for static_route in self._static_directories:
|
|
899
892
|
# For root static route, serve any unmatched path
|
|
900
893
|
if static_route == "" or static_route == "/":
|
|
901
894
|
response = self._serve_static_file(full_path, "")
|
{signalwire_sdk-3.0.2.dev63 → signalwire_sdk-3.0.2.dev64}/signalwire/signalwire/cli/build_search.py
RENAMED
|
@@ -27,7 +27,7 @@ def _mask_connection_string(conn_str):
|
|
|
27
27
|
+ (f":{parsed.port}" if parsed.port else "")
|
|
28
28
|
)
|
|
29
29
|
return urlunparse(masked)
|
|
30
|
-
except Exception:
|
|
30
|
+
except Exception: # noqa: S110 # best-effort password masking for display; falls through to "****" on any parse failure
|
|
31
31
|
pass
|
|
32
32
|
return "****"
|
|
33
33
|
|
|
@@ -538,7 +538,7 @@ Examples:
|
|
|
538
538
|
},
|
|
539
539
|
}
|
|
540
540
|
|
|
541
|
-
with open(
|
|
541
|
+
with json_path.open("w", encoding="utf-8") as f:
|
|
542
542
|
json.dump(chunk_data, f, indent=2, ensure_ascii=False)
|
|
543
543
|
|
|
544
544
|
chunk_files_created.append(json_path)
|
|
@@ -548,7 +548,7 @@ Examples:
|
|
|
548
548
|
# Accumulate all chunks for single file output
|
|
549
549
|
all_chunks.extend(chunks)
|
|
550
550
|
|
|
551
|
-
except Exception as e:
|
|
551
|
+
except Exception as e: # noqa: PERF203 # per-iteration error isolation: one failed file must not abort the batch
|
|
552
552
|
print(f"Error processing {file_path}: {e}")
|
|
553
553
|
if args.verbose:
|
|
554
554
|
import traceback
|
|
@@ -567,7 +567,7 @@ Examples:
|
|
|
567
567
|
},
|
|
568
568
|
}
|
|
569
569
|
|
|
570
|
-
with
|
|
570
|
+
with Path(args.output).open("w", encoding="utf-8") as f:
|
|
571
571
|
json.dump(output_data, f, indent=2, ensure_ascii=False)
|
|
572
572
|
|
|
573
573
|
print(f"✓ Exported {len(all_chunks)} chunks to {args.output}")
|
|
@@ -577,7 +577,7 @@ Examples:
|
|
|
577
577
|
)
|
|
578
578
|
total_chunks = 0
|
|
579
579
|
for chunk_file in chunk_files_created:
|
|
580
|
-
with open(
|
|
580
|
+
with chunk_file.open() as fh:
|
|
581
581
|
total_chunks += len(json.load(fh)["chunks"])
|
|
582
582
|
print(f" Total chunks: {total_chunks}")
|
|
583
583
|
|
|
@@ -634,7 +634,11 @@ Examples:
|
|
|
634
634
|
# Check if the index was actually created
|
|
635
635
|
import os
|
|
636
636
|
|
|
637
|
-
|
|
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
|
|
638
642
|
print(f"\n✓ Search index created successfully: {args.output}")
|
|
639
643
|
else:
|
|
640
644
|
print("\n✗ Search index creation failed - no files were processed")
|
|
@@ -771,10 +775,11 @@ def search_command():
|
|
|
771
775
|
args.model = MODEL_ALIASES[args.model]
|
|
772
776
|
|
|
773
777
|
# Validate keyword weight if provided
|
|
774
|
-
if args.keyword_weight is not None
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
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)
|
|
778
783
|
|
|
779
784
|
# Validate backend configuration
|
|
780
785
|
if args.backend == "pgvector" and not args.connection_string:
|
|
@@ -1540,17 +1545,17 @@ Examples:
|
|
|
1540
1545
|
sys.argv.pop(1)
|
|
1541
1546
|
validate_command()
|
|
1542
1547
|
return
|
|
1543
|
-
|
|
1548
|
+
if sys.argv[1] == "search":
|
|
1544
1549
|
# Remove 'search' from argv and call search_command
|
|
1545
1550
|
sys.argv.pop(1)
|
|
1546
1551
|
search_command()
|
|
1547
1552
|
return
|
|
1548
|
-
|
|
1553
|
+
if sys.argv[1] == "remote":
|
|
1549
1554
|
# Remove 'remote' from argv and call remote_command
|
|
1550
1555
|
sys.argv.pop(1)
|
|
1551
1556
|
remote_command()
|
|
1552
1557
|
return
|
|
1553
|
-
|
|
1558
|
+
if sys.argv[1] == "migrate":
|
|
1554
1559
|
# Remove 'migrate' from argv and call migrate_command
|
|
1555
1560
|
sys.argv.pop(1)
|
|
1556
1561
|
migrate_command()
|
|
@@ -124,7 +124,7 @@ def _discover_services_impl(service_path: str) -> List[Dict[str, Any]]:
|
|
|
124
124
|
# Clean up sys.path if we added to it
|
|
125
125
|
if sys_path_added:
|
|
126
126
|
sys.path.remove(module_dir)
|
|
127
|
-
raise ImportError(f"Failed to load service module: {e}")
|
|
127
|
+
raise ImportError(f"Failed to load service module: {e}") from e
|
|
128
128
|
finally:
|
|
129
129
|
# Clean up sys.path after successful load too
|
|
130
130
|
if sys_path_added and module_dir in sys.path:
|
|
@@ -308,7 +308,7 @@ def _load_service_impl(
|
|
|
308
308
|
# Clean up sys.path if we added to it
|
|
309
309
|
if sys_path_added:
|
|
310
310
|
sys.path.remove(module_dir)
|
|
311
|
-
raise ImportError(f"Failed to load service module: {e}")
|
|
311
|
+
raise ImportError(f"Failed to load service module: {e}") from e
|
|
312
312
|
finally:
|
|
313
313
|
# Clean up sys.path after successful load too
|
|
314
314
|
if sys_path_added and module_dir in sys.path:
|
|
@@ -320,15 +320,18 @@ def _load_service_impl(
|
|
|
320
320
|
# If service_identifier is specified and prefer_route is True, try to find by route first
|
|
321
321
|
if service_identifier and prefer_route:
|
|
322
322
|
# First, try to find an existing instance with matching route
|
|
323
|
-
for
|
|
324
|
-
if
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
323
|
+
for obj in vars(module).values():
|
|
324
|
+
if (
|
|
325
|
+
isinstance(obj, SWMLService)
|
|
326
|
+
and hasattr(obj, "route")
|
|
327
|
+
and obj.route == service_identifier
|
|
328
|
+
):
|
|
329
|
+
service = obj
|
|
330
|
+
break
|
|
328
331
|
|
|
329
332
|
# If not found, try instantiating classes to check their routes
|
|
330
333
|
if service is None:
|
|
331
|
-
for
|
|
334
|
+
for obj in vars(module).values():
|
|
332
335
|
if (
|
|
333
336
|
isinstance(obj, type)
|
|
334
337
|
and issubclass(obj, SWMLService)
|
|
@@ -344,7 +347,7 @@ def _load_service_impl(
|
|
|
344
347
|
):
|
|
345
348
|
service = temp_instance
|
|
346
349
|
break
|
|
347
|
-
except Exception:
|
|
350
|
+
except Exception: # noqa: S110 # intentional: skip classes that can't be instantiated during discovery
|
|
348
351
|
# Skip classes that can't be instantiated
|
|
349
352
|
pass
|
|
350
353
|
|
|
@@ -357,7 +360,7 @@ def _load_service_impl(
|
|
|
357
360
|
except Exception as e:
|
|
358
361
|
raise ValueError(
|
|
359
362
|
f"No service found with route '{service_identifier}' and failed to instantiate class '{service_identifier}': {e}"
|
|
360
|
-
)
|
|
363
|
+
) from e
|
|
361
364
|
elif isinstance(obj, SWMLService):
|
|
362
365
|
service = obj
|
|
363
366
|
|
|
@@ -382,7 +385,7 @@ def _load_service_impl(
|
|
|
382
385
|
except Exception as e:
|
|
383
386
|
raise ValueError(
|
|
384
387
|
f"Failed to instantiate service class '{service_identifier}': {e}"
|
|
385
|
-
)
|
|
388
|
+
) from e
|
|
386
389
|
elif isinstance(obj, SWMLService):
|
|
387
390
|
# It's already an instance
|
|
388
391
|
service = obj
|
|
@@ -461,7 +464,7 @@ def _load_service_impl(
|
|
|
461
464
|
"service_name": service_name,
|
|
462
465
|
}
|
|
463
466
|
)
|
|
464
|
-
except Exception:
|
|
467
|
+
except Exception: # noqa: PERF203 # per-iteration error isolation: one class that fails to instantiate must not abort discovery
|
|
465
468
|
# If instantiation fails, still include the class
|
|
466
469
|
service_info.append(
|
|
467
470
|
{
|
|
@@ -104,20 +104,14 @@ def parse_function_arguments(
|
|
|
104
104
|
# DataMap function
|
|
105
105
|
if "parameters" in func_schema:
|
|
106
106
|
params = func_schema["parameters"]
|
|
107
|
-
|
|
108
|
-
parameters = params["properties"]
|
|
109
|
-
else:
|
|
110
|
-
parameters = params
|
|
107
|
+
parameters = params.get("properties", params)
|
|
111
108
|
else:
|
|
112
109
|
parameters = func_schema
|
|
113
110
|
else:
|
|
114
111
|
# Regular SWAIG function
|
|
115
112
|
if hasattr(func_schema, "parameters") and func_schema.parameters:
|
|
116
113
|
params = func_schema.parameters
|
|
117
|
-
|
|
118
|
-
parameters = params["properties"]
|
|
119
|
-
else:
|
|
120
|
-
parameters = params
|
|
114
|
+
parameters = params.get("properties", params)
|
|
121
115
|
|
|
122
116
|
# Parse arguments
|
|
123
117
|
while i < len(function_args_list):
|
|
@@ -165,8 +159,7 @@ def parse_function_arguments(
|
|
|
165
159
|
f"CLI flag --{param_name} must come BEFORE --exec, not after.\n"
|
|
166
160
|
f"Example: swaig-test file.py --{param_name} --exec function_name"
|
|
167
161
|
)
|
|
168
|
-
|
|
169
|
-
raise ValueError(f"Parameter --{param_name} requires a value")
|
|
162
|
+
raise ValueError(f"Parameter --{param_name} requires a value")
|
|
170
163
|
|
|
171
164
|
value = function_args_list[i + 1]
|
|
172
165
|
|
|
@@ -177,14 +170,14 @@ def parse_function_arguments(
|
|
|
177
170
|
except ValueError:
|
|
178
171
|
raise ValueError(
|
|
179
172
|
f"Parameter --{param_name} must be an integer, got: {value}"
|
|
180
|
-
)
|
|
173
|
+
) from None
|
|
181
174
|
elif param_type == "number":
|
|
182
175
|
try:
|
|
183
176
|
parsed_args[param_key] = float(value)
|
|
184
177
|
except ValueError:
|
|
185
178
|
raise ValueError(
|
|
186
179
|
f"Parameter --{param_name} must be a number, got: {value}"
|
|
187
|
-
)
|
|
180
|
+
) from None
|
|
188
181
|
elif param_type == "array":
|
|
189
182
|
# Handle comma-separated arrays
|
|
190
183
|
parsed_args[param_key] = [item.strip() for item in value.split(",")]
|
|
@@ -108,7 +108,7 @@ class ServiceCapture:
|
|
|
108
108
|
# Module might have called run/serve which we intercepted
|
|
109
109
|
if not self.captured_services:
|
|
110
110
|
# If we didn't capture anything, the error is real
|
|
111
|
-
raise ImportError(f"Failed to load service module: {e}")
|
|
111
|
+
raise ImportError(f"Failed to load service module: {e}") from e
|
|
112
112
|
finally:
|
|
113
113
|
# Always restore original methods
|
|
114
114
|
self._restore_patches()
|
|
@@ -196,11 +196,10 @@ async def simulate_request_to_service(
|
|
|
196
196
|
import json
|
|
197
197
|
|
|
198
198
|
return json.loads(result.body.decode())
|
|
199
|
-
|
|
199
|
+
if isinstance(result, dict):
|
|
200
200
|
return result
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
return {"error": "Unable to parse response"}
|
|
201
|
+
# Try to get content from response
|
|
202
|
+
return {"error": "Unable to parse response"}
|
|
204
203
|
|
|
205
204
|
|
|
206
205
|
def load_and_simulate_service(
|
|
@@ -263,7 +262,7 @@ def load_and_simulate_service(
|
|
|
263
262
|
)
|
|
264
263
|
|
|
265
264
|
# Simulate the request
|
|
266
|
-
assert service is not None # guaranteed by the selection logic above
|
|
265
|
+
assert service is not None # noqa: S101 # type-narrowing invariant (not input validation): guaranteed by the selection logic above
|
|
267
266
|
return asyncio.run(
|
|
268
267
|
simulate_request_to_service(
|
|
269
268
|
service,
|
|
@@ -317,19 +316,16 @@ def discover_agents_in_file(agent_path: str) -> List[Dict[str, Any]]:
|
|
|
317
316
|
services = capturer.capture(agent_path)
|
|
318
317
|
|
|
319
318
|
# Convert to old format
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
)
|
|
334
|
-
|
|
335
|
-
return agents_found
|
|
319
|
+
return [
|
|
320
|
+
{
|
|
321
|
+
"name": service.name,
|
|
322
|
+
"class_name": service.__class__.__name__,
|
|
323
|
+
"type": "instance",
|
|
324
|
+
"agent_name": service.name,
|
|
325
|
+
"route": service.route,
|
|
326
|
+
"description": service.__class__.__doc__,
|
|
327
|
+
"object": service,
|
|
328
|
+
}
|
|
329
|
+
for service in services
|
|
330
|
+
if isinstance(service, AgentBase)
|
|
331
|
+
]
|