signalwire-sdk 3.0.2.dev70__tar.gz → 3.0.2.dev73__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.dev70/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.0.2.dev73}/PKG-INFO +5 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/README.md +4 -1
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/pyproject.toml +25 -8
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/__init__.py +14 -7
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/agent_server.py +34 -18
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/service_loader.py +4 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/test_swaig.py +41 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/_agent_host.py +3 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/prompt/manager.py +4 -4
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/decorator.py +17 -10
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/registry.py +5 -5
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/type_inference.py +16 -11
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent_base.py +113 -14
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/auth_handler.py +7 -5
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/config_loader.py +3 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/contexts.py +2 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/data_map.py +3 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/function_result.py +3 -1
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/logging_config.py +18 -14
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/_mixin_host.py +5 -1
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/ai_config_mixin.py +30 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/auth_mixin.py +8 -7
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +2 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/prompt_mixin.py +7 -4
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/serverless_mixin.py +10 -5
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/skill_mixin.py +1 -1
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/state_mixin.py +1 -1
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/tool_mixin.py +14 -6
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/web_mixin.py +124 -69
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/pom_builder.py +1 -1
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/post_prompt_generated.py +257 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/security_utils.py +8 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/webhook_middleware.py +70 -23
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/webhook_validator.py +3 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security_config.py +16 -12
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/skill_base.py +1 -1
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/skill_manager.py +5 -2
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/swaig_actions_generated.py +187 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swaig_function.py +15 -9
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/swaig_request_generated.py +50 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_builder.py +42 -13
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_handler.py +4 -4
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_service.py +269 -83
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/swml_verbs_generated.py +2004 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/core/web.py +30 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/gateway_service.py +11 -11
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/pom/pom.py +2 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/pom/pom_tool.py +4 -4
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/concierge.py +6 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/faq_bot.py +6 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/receptionist.py +6 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/survey.py +6 -2
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/py.typed +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/call.py +70 -84
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/relay/protocol_types_generated.py +1722 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/rest/__init__.py +1 -1
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/_base.py +202 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/rest/_pagination.py +17 -9
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/call_handler.py +21 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/client.py +63 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +175 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/addresses.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/calling.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +775 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/calling_types_generated.py +1906 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/chat.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +51 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/chat_types_generated.py +90 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/datasphere.py +22 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +120 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +240 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fabric.py +54 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +1471 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +3672 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/fax_types_generated.py +173 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/imported_numbers.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/logs.py +25 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +29 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/logs_types_generated.py +150 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/lookup.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/message_resources_generated.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/message_types_generated.py +167 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/mfa.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/number_groups.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/phone_numbers.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/project.py +22 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/project_resources_generated.py +70 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/project_types_generated.py +101 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/pubsub.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +51 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +101 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/queues.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/recordings.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/registry.py +33 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +945 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +1780 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/short_codes.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/sip_profile.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +143 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/verified_callers.py +24 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/video.py +39 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/video_resources_generated.py +491 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/video_types_generated.py +746 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +31 -0
- signalwire_sdk-3.0.2.dev73/signalwire/signalwire/rest/namespaces/voice_types_generated.py +265 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/document_processor.py +4 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere_serverless/README.md +3 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/google_maps/skill.py +21 -5
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/mcp_gateway/README.md +2 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/registry.py +8 -4
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/spider/skill.py +6 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/weather_api/README.md +2 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/__init__.py +1 -5
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/web/web_service.py +3 -3
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73/signalwire/signalwire_sdk.egg-info}/PKG-INFO +5 -2
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +33 -1
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/tests/test_examples.py +29 -28
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/tests/test_mcp_integration.py +19 -18
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/_base.py +0 -117
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/call_handler.py +0 -60
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/client.py +0 -111
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/addresses.py +0 -31
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/calling.py +0 -152
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/chat.py +0 -22
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/compat.py +0 -278
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/datasphere.py +0 -38
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/fabric.py +0 -243
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -22
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/logs.py +0 -62
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/lookup.py +0 -22
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/mfa.py +0 -28
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/number_groups.py +0 -43
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -161
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/project.py +0 -35
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/pubsub.py +0 -22
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/queues.py +0 -30
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/recordings.py +0 -28
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/registry.py +0 -75
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/short_codes.py +0 -28
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -25
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -27
- signalwire_sdk-3.0.2.dev70/signalwire/signalwire/rest/namespaces/video.py +0 -127
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/LICENSE +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/setup.cfg +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/setup.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/agents/bedrock.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/build_search.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/dokku.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/init_project.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/security/session_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/swml_renderer.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/livewire/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/client.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/relay/message.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/index_builder.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/migration.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/pgvector_backend.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/query_processor.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/search_engine.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/search/search_service.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/datetime/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/joke/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/math/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/schema_utils.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: signalwire-sdk
|
|
3
|
-
Version: 3.0.2.
|
|
3
|
+
Version: 3.0.2.dev73
|
|
4
4
|
Summary: SignalWire SDK
|
|
5
5
|
Author-email: SignalWire Team <info@signalwire.com>
|
|
6
6
|
License: MIT
|
|
@@ -138,6 +138,7 @@ pip install signalwire-sdk
|
|
|
138
138
|
|
|
139
139
|
Each agent is a self-contained microservice that generates [SWML](docs/swml_service_guide.md) (SignalWire Markup Language) and handles [SWAIG](docs/swaig_reference.md) (SignalWire AI Gateway) tool calls. The SignalWire platform runs the entire AI pipeline (STT, LLM, TTS) -- your agent just defines the behavior.
|
|
140
140
|
|
|
141
|
+
<!-- include: examples/quickstart_agent.py#agent -->
|
|
141
142
|
```python
|
|
142
143
|
from signalwire import AgentBase
|
|
143
144
|
from signalwire.core.function_result import FunctionResult
|
|
@@ -209,6 +210,7 @@ See [examples/README.md](examples/README.md) for the full list organized by cate
|
|
|
209
210
|
|
|
210
211
|
Real-time call control and messaging over WebSocket. The RELAY client connects to SignalWire via the Blade protocol and gives you imperative, async control over live phone calls and SMS/MMS.
|
|
211
212
|
|
|
213
|
+
<!-- include: examples/quickstart_relay.py#relay -->
|
|
212
214
|
```python
|
|
213
215
|
from signalwire.relay import RelayClient
|
|
214
216
|
|
|
@@ -237,6 +239,7 @@ See the **[RELAY documentation](relay/README.md)** for the full guide, API refer
|
|
|
237
239
|
|
|
238
240
|
Synchronous REST client for managing SignalWire resources and controlling calls over HTTP. No WebSocket required.
|
|
239
241
|
|
|
242
|
+
<!-- include: examples/quickstart_rest.py#rest -->
|
|
240
243
|
```python
|
|
241
244
|
from signalwire.rest import RestClient
|
|
242
245
|
|
|
@@ -248,7 +251,7 @@ client.phone_numbers.search(area_code="512")
|
|
|
248
251
|
client.datasphere.documents.search(query_string="billing policy")
|
|
249
252
|
```
|
|
250
253
|
|
|
251
|
-
-
|
|
254
|
+
- 20 namespaced API surfaces: Fabric (13 resource types), Calling (37 commands), Video, Datasphere, Phone Numbers, SIP, Queues, Recordings, and more
|
|
252
255
|
- Shared `requests.Session` for connection pooling
|
|
253
256
|
- Dict returns -- raw JSON, no wrapper objects
|
|
254
257
|
|
|
@@ -40,6 +40,7 @@ pip install signalwire-sdk
|
|
|
40
40
|
|
|
41
41
|
Each agent is a self-contained microservice that generates [SWML](docs/swml_service_guide.md) (SignalWire Markup Language) and handles [SWAIG](docs/swaig_reference.md) (SignalWire AI Gateway) tool calls. The SignalWire platform runs the entire AI pipeline (STT, LLM, TTS) -- your agent just defines the behavior.
|
|
42
42
|
|
|
43
|
+
<!-- include: examples/quickstart_agent.py#agent -->
|
|
43
44
|
```python
|
|
44
45
|
from signalwire import AgentBase
|
|
45
46
|
from signalwire.core.function_result import FunctionResult
|
|
@@ -111,6 +112,7 @@ See [examples/README.md](examples/README.md) for the full list organized by cate
|
|
|
111
112
|
|
|
112
113
|
Real-time call control and messaging over WebSocket. The RELAY client connects to SignalWire via the Blade protocol and gives you imperative, async control over live phone calls and SMS/MMS.
|
|
113
114
|
|
|
115
|
+
<!-- include: examples/quickstart_relay.py#relay -->
|
|
114
116
|
```python
|
|
115
117
|
from signalwire.relay import RelayClient
|
|
116
118
|
|
|
@@ -139,6 +141,7 @@ See the **[RELAY documentation](relay/README.md)** for the full guide, API refer
|
|
|
139
141
|
|
|
140
142
|
Synchronous REST client for managing SignalWire resources and controlling calls over HTTP. No WebSocket required.
|
|
141
143
|
|
|
144
|
+
<!-- include: examples/quickstart_rest.py#rest -->
|
|
142
145
|
```python
|
|
143
146
|
from signalwire.rest import RestClient
|
|
144
147
|
|
|
@@ -150,7 +153,7 @@ client.phone_numbers.search(area_code="512")
|
|
|
150
153
|
client.datasphere.documents.search(query_string="billing policy")
|
|
151
154
|
```
|
|
152
155
|
|
|
153
|
-
-
|
|
156
|
+
- 20 namespaced API surfaces: Fabric (13 resource types), Calling (37 commands), Video, Datasphere, Phone Numbers, SIP, Queues, Recordings, and more
|
|
154
157
|
- Shared `requests.Session` for connection pooling
|
|
155
158
|
- Dict returns -- raw JSON, no wrapper objects
|
|
156
159
|
|
|
@@ -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.dev73"
|
|
8
8
|
description = "SignalWire SDK"
|
|
9
9
|
authors = [
|
|
10
10
|
{name = "SignalWire Team", email = "info@signalwire.com"}
|
|
@@ -149,6 +149,7 @@ include-package-data = true
|
|
|
149
149
|
|
|
150
150
|
[tool.setuptools.package-data]
|
|
151
151
|
signalwire = [
|
|
152
|
+
"py.typed",
|
|
152
153
|
"schema.json",
|
|
153
154
|
"**/*.json",
|
|
154
155
|
"skills/*/README.md",
|
|
@@ -182,6 +183,16 @@ select = ["E4", "E7", "E9", "F", "B", "S", "C4", "PERF", "SIM", "PTH", "RET", "R
|
|
|
182
183
|
# call) and S607 (partial executable path: git/ssh resolved via PATH, the normal
|
|
183
184
|
# idiom) are expected and safe across this file.
|
|
184
185
|
"signalwire/signalwire/cli/dokku.py" = ["S603", "S607"]
|
|
186
|
+
# REST namespace files import spec-generated types under TYPE_CHECKING and use
|
|
187
|
+
# them ONLY inside quoted forward-refs — method return annotations
|
|
188
|
+
# (`-> "RoomResponse"`) and the generic CRUD-base subscript bindings
|
|
189
|
+
# (`class VideoRooms(CrudResource["ListRoomsResponse", "RoomResponse", ...])`).
|
|
190
|
+
# Ruff's F401 cannot see usages inside a class-base subscript's string literals,
|
|
191
|
+
# so it false-positives "unused import" and `--fix` would strip imports that ARE
|
|
192
|
+
# used (breaking mypy). The bindings must stay quoted (a bare name in the base
|
|
193
|
+
# subscript is a runtime NameError under TYPE_CHECKING). Exempt F401 here; mypy +
|
|
194
|
+
# the SIGNATURES/DRIFT gate prove these imports are real and correct.
|
|
195
|
+
"signalwire/signalwire/rest/namespaces/*.py" = ["F401"]
|
|
185
196
|
|
|
186
197
|
[tool.ruff.lint.flake8-bugbear]
|
|
187
198
|
# FastAPI's dependency-injection idiom puts Depends()/Query()/etc. in argument
|
|
@@ -202,16 +213,22 @@ extend-immutable-calls = [
|
|
|
202
213
|
|
|
203
214
|
[tool.mypy]
|
|
204
215
|
python_version = "3.10"
|
|
205
|
-
|
|
216
|
+
# Both the source tree AND the test suite are in scope — the generated REST tests are
|
|
217
|
+
# strict-clean by construction, and the hand-written tests were fully annotated, so the
|
|
218
|
+
# strict bar now covers tests too (a new untyped test fails the gate).
|
|
219
|
+
files = ["signalwire/signalwire", "tests"]
|
|
206
220
|
# Third-party packages without type stubs (nltk, sentence_transformers, the
|
|
207
221
|
# search/relay stacks) are out of scope — we type our own code, not theirs.
|
|
208
222
|
ignore_missing_imports = true
|
|
209
|
-
# The bar:
|
|
210
|
-
#
|
|
211
|
-
|
|
212
|
-
warn_unused_ignores
|
|
213
|
-
|
|
214
|
-
#
|
|
223
|
+
# The bar: the whole source tree is mypy --strict clean (full annotations + all
|
|
224
|
+
# the strict sub-flags). Achieved by typing handlers with REAL types (FastAPI
|
|
225
|
+
# Response/dict, generated payload types where they exist) — never papered with
|
|
226
|
+
# bare `Any`. `strict` subsumes check_untyped_defs / warn_unused_ignores / etc.
|
|
227
|
+
strict = true
|
|
228
|
+
# `# type: ignore` is reserved for genuinely-unfixable third-party-stub gaps (e.g.
|
|
229
|
+
# flask/flask-limiter optional extras with no stubs) and the documented
|
|
230
|
+
# _HostTyped/AgentBase TYPE_CHECKING-vs-runtime split; each must carry an error
|
|
231
|
+
# code + reason. warn_unused_ignores (via strict) keeps them honest.
|
|
215
232
|
show_error_codes = true
|
|
216
233
|
|
|
217
234
|
# numpy (a search/relay-extra runtime dep we do NOT type — same class as nltk /
|
|
@@ -12,12 +12,19 @@ SignalWire SDK
|
|
|
12
12
|
A package for building AI agents using SignalWire's AI and SWML capabilities.
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
+
from typing import TYPE_CHECKING, Any
|
|
16
|
+
|
|
15
17
|
# Configure logging before any other imports to ensure early initialization
|
|
16
18
|
from .core.logging_config import configure_logging
|
|
17
19
|
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from signalwire.rest.client import RestClient as _RestClient
|
|
22
|
+
from signalwire.core.skill_base import SkillBase
|
|
23
|
+
from signalwire.skills.registry import SkillRegistry
|
|
24
|
+
|
|
18
25
|
configure_logging()
|
|
19
26
|
|
|
20
|
-
__version__ = "3.0.2.
|
|
27
|
+
__version__ = "3.0.2.dev73"
|
|
21
28
|
|
|
22
29
|
# Import core classes for easier access.
|
|
23
30
|
# These imports are intentionally placed after configure_logging() so the SDK's
|
|
@@ -53,14 +60,14 @@ from signalwire.web import WebService # noqa: E402
|
|
|
53
60
|
|
|
54
61
|
# Lazy import skills to avoid slow startup for CLI tools
|
|
55
62
|
# Skills are now loaded on-demand when requested
|
|
56
|
-
def _get_skill_registry():
|
|
63
|
+
def _get_skill_registry() -> "SkillRegistry":
|
|
57
64
|
"""Lazy import and return skill registry"""
|
|
58
65
|
import signalwire.skills
|
|
59
66
|
|
|
60
67
|
return signalwire.skills.skill_registry
|
|
61
68
|
|
|
62
69
|
|
|
63
|
-
def list_skills():
|
|
70
|
+
def list_skills() -> list[dict[str, Any]]:
|
|
64
71
|
"""List all available skills with metadata.
|
|
65
72
|
|
|
66
73
|
Returns one dict per skill (name, description, version, required packages /
|
|
@@ -71,7 +78,7 @@ def list_skills():
|
|
|
71
78
|
return skill_registry.list_skills()
|
|
72
79
|
|
|
73
80
|
|
|
74
|
-
def list_skills_with_params():
|
|
81
|
+
def list_skills_with_params() -> dict[str, dict[str, Any]]:
|
|
75
82
|
"""
|
|
76
83
|
Get complete schema for all available skills including parameter metadata
|
|
77
84
|
|
|
@@ -98,7 +105,7 @@ def list_skills_with_params():
|
|
|
98
105
|
return skill_registry.get_all_skills_schema()
|
|
99
106
|
|
|
100
107
|
|
|
101
|
-
def register_skill(skill_class):
|
|
108
|
+
def register_skill(skill_class: "type[SkillBase]") -> None:
|
|
102
109
|
"""
|
|
103
110
|
Register a custom skill class
|
|
104
111
|
|
|
@@ -119,7 +126,7 @@ def register_skill(skill_class):
|
|
|
119
126
|
return skill_registry.register_skill(skill_class)
|
|
120
127
|
|
|
121
128
|
|
|
122
|
-
def add_skill_directory(path):
|
|
129
|
+
def add_skill_directory(path: str) -> None:
|
|
123
130
|
"""
|
|
124
131
|
Add a directory to search for skills
|
|
125
132
|
|
|
@@ -138,7 +145,7 @@ def add_skill_directory(path):
|
|
|
138
145
|
return skill_registry.add_skill_directory(path)
|
|
139
146
|
|
|
140
147
|
|
|
141
|
-
def RestClient(*args, **kwargs):
|
|
148
|
+
def RestClient(*args: Any, **kwargs: Any) -> "_RestClient":
|
|
142
149
|
"""Create a SignalWire REST API client (lazy import)"""
|
|
143
150
|
from signalwire.rest import RestClient as _RestClient
|
|
144
151
|
|
{signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/agent_server.py
RENAMED
|
@@ -13,7 +13,7 @@ import os
|
|
|
13
13
|
import re
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any
|
|
16
|
-
from collections.abc import Callable
|
|
16
|
+
from collections.abc import Awaitable, Callable
|
|
17
17
|
|
|
18
18
|
try:
|
|
19
19
|
from fastapi import FastAPI, Request, Response
|
|
@@ -26,6 +26,7 @@ except ImportError:
|
|
|
26
26
|
from signalwire.core.agent_base import AgentBase
|
|
27
27
|
from signalwire.core.swml_service import SWMLService
|
|
28
28
|
from signalwire.core.logging_config import get_logger
|
|
29
|
+
from signalwire.core.mixins.web_mixin import _as_response
|
|
29
30
|
import contextlib
|
|
30
31
|
|
|
31
32
|
|
|
@@ -67,7 +68,7 @@ class AgentServer:
|
|
|
67
68
|
self.app = FastAPI(
|
|
68
69
|
title="SignalWire AI Agents",
|
|
69
70
|
description="Hosted SignalWire AI Agents",
|
|
70
|
-
version="3.0.2.
|
|
71
|
+
version="3.0.2.dev73",
|
|
71
72
|
redirect_slashes=False,
|
|
72
73
|
docs_url=None,
|
|
73
74
|
redoc_url=None,
|
|
@@ -76,7 +77,9 @@ class AgentServer:
|
|
|
76
77
|
|
|
77
78
|
# Add security headers middleware
|
|
78
79
|
@self.app.middleware("http")
|
|
79
|
-
async def add_security_headers(
|
|
80
|
+
async def add_security_headers(
|
|
81
|
+
request: Request, call_next: Callable[[Request], Awaitable[Response]]
|
|
82
|
+
) -> Response:
|
|
80
83
|
response = await call_next(request)
|
|
81
84
|
response.headers["X-Content-Type-Options"] = "nosniff"
|
|
82
85
|
response.headers["X-Frame-Options"] = "DENY"
|
|
@@ -104,7 +107,7 @@ class AgentServer:
|
|
|
104
107
|
# all other routes are registered. This ensures custom routes like /get_token
|
|
105
108
|
# don't get overshadowed by the catch-all /{full_path:path} route.
|
|
106
109
|
@self.app.on_event("startup")
|
|
107
|
-
async def _setup_catch_all():
|
|
110
|
+
async def _setup_catch_all() -> None:
|
|
108
111
|
self._register_catch_all_handler()
|
|
109
112
|
|
|
110
113
|
def register(self, agent: AgentBase, route: str | None = None) -> None:
|
|
@@ -187,9 +190,10 @@ class AgentServer:
|
|
|
187
190
|
for agent_route, agent in self.agents.items():
|
|
188
191
|
self._auto_map_agent_sip_usernames(agent, agent_route)
|
|
189
192
|
|
|
190
|
-
# Create a unified routing callback that checks all registered usernames
|
|
193
|
+
# Create a unified routing callback that checks all registered usernames.
|
|
194
|
+
# Framework-free (body, headers) shape; this callback only reads the body.
|
|
191
195
|
def server_sip_routing_callback(
|
|
192
|
-
|
|
196
|
+
body: dict[str, Any], headers: dict[str, Any]
|
|
193
197
|
) -> str | None:
|
|
194
198
|
"""Unified SIP routing callback that checks all registered usernames"""
|
|
195
199
|
# Extract the SIP username
|
|
@@ -343,8 +347,8 @@ class AgentServer:
|
|
|
343
347
|
|
|
344
348
|
def run(
|
|
345
349
|
self,
|
|
346
|
-
event=None,
|
|
347
|
-
context=None,
|
|
350
|
+
event: Any = None,
|
|
351
|
+
context: Any = None,
|
|
348
352
|
host: str | None = None,
|
|
349
353
|
port: int | None = None,
|
|
350
354
|
) -> Any:
|
|
@@ -511,7 +515,7 @@ class AgentServer:
|
|
|
511
515
|
error_response = {"error": "Not Found"}
|
|
512
516
|
return self._format_cgi_response(error_response, status="404 Not Found")
|
|
513
517
|
|
|
514
|
-
def _handle_lambda_request(self, event, context) -> dict:
|
|
518
|
+
def _handle_lambda_request(self, event: Any, context: Any) -> dict[str, Any]:
|
|
515
519
|
"""Handle Lambda request using same routing logic as server"""
|
|
516
520
|
import json
|
|
517
521
|
|
|
@@ -600,7 +604,7 @@ class AgentServer:
|
|
|
600
604
|
}
|
|
601
605
|
|
|
602
606
|
def _format_cgi_response(
|
|
603
|
-
self, data, content_type: str = "application/json", status: str = "200 OK"
|
|
607
|
+
self, data: Any, content_type: str = "application/json", status: str = "200 OK"
|
|
604
608
|
) -> str:
|
|
605
609
|
"""Format response for CGI output"""
|
|
606
610
|
import json
|
|
@@ -634,7 +638,7 @@ class AgentServer:
|
|
|
634
638
|
"""
|
|
635
639
|
|
|
636
640
|
@self.app.get("/health")
|
|
637
|
-
def health_check():
|
|
641
|
+
def health_check() -> dict[str, Any]:
|
|
638
642
|
return {
|
|
639
643
|
"status": "ok",
|
|
640
644
|
"agents": len(self.agents),
|
|
@@ -642,7 +646,7 @@ class AgentServer:
|
|
|
642
646
|
}
|
|
643
647
|
|
|
644
648
|
@self.app.get("/ready")
|
|
645
|
-
def readiness_check():
|
|
649
|
+
def readiness_check() -> dict[str, Any]:
|
|
646
650
|
return {"status": "ready", "agents": len(self.agents)}
|
|
647
651
|
|
|
648
652
|
def _run_server(self, host: str | None = None, port: int | None = None) -> None:
|
|
@@ -709,15 +713,18 @@ class AgentServer:
|
|
|
709
713
|
uvicorn.run(self.app, host=host, port=port, log_level=self.log_level)
|
|
710
714
|
|
|
711
715
|
def register_global_routing_callback(
|
|
712
|
-
self,
|
|
716
|
+
self,
|
|
717
|
+
callback_fn: Callable[[dict[str, Any], dict[str, Any]], str | None],
|
|
718
|
+
path: str,
|
|
713
719
|
) -> None:
|
|
714
720
|
"""
|
|
715
721
|
Register a routing callback across all agents
|
|
716
722
|
|
|
717
723
|
This allows you to add unified routing logic to all agents at the same path.
|
|
724
|
+
The callback receives ``(body, headers)`` — the framework-free shape.
|
|
718
725
|
|
|
719
726
|
Args:
|
|
720
|
-
callback_fn: The callback function to register
|
|
727
|
+
callback_fn: The callback function to register, ``(body, headers)``.
|
|
721
728
|
path: The path to register the callback at
|
|
722
729
|
"""
|
|
723
730
|
# Normalize the path
|
|
@@ -845,7 +852,7 @@ class AgentServer:
|
|
|
845
852
|
|
|
846
853
|
@self.app.get("/{full_path:path}")
|
|
847
854
|
@self.app.post("/{full_path:path}")
|
|
848
|
-
async def handle_all_routes(request: Request, full_path: str):
|
|
855
|
+
async def handle_all_routes(request: Request, full_path: str) -> Response:
|
|
849
856
|
"""Handle requests that don't match registered routes (e.g. /matti instead of /matti/)"""
|
|
850
857
|
# Check if this path maps to one of our registered agents
|
|
851
858
|
for route, agent in self.agents.items():
|
|
@@ -868,11 +875,20 @@ class AgentServer:
|
|
|
868
875
|
if clean_path == "swaig":
|
|
869
876
|
from fastapi import Response
|
|
870
877
|
|
|
871
|
-
|
|
878
|
+
# _handle_swaig_request returns Response | dict (the dict is a
|
|
879
|
+
# SWAIG-result passthrough); funnel through _as_response so this
|
|
880
|
+
# route handler stays -> Response (FastAPI-safe).
|
|
881
|
+
return _as_response(
|
|
882
|
+
await agent._handle_swaig_request(request, Response())
|
|
883
|
+
)
|
|
872
884
|
if clean_path == "post_prompt":
|
|
873
|
-
return
|
|
885
|
+
return _as_response(
|
|
886
|
+
await agent._handle_post_prompt_request(request)
|
|
887
|
+
)
|
|
874
888
|
if clean_path == "check_for_input":
|
|
875
|
-
return
|
|
889
|
+
return _as_response(
|
|
890
|
+
await agent._handle_check_for_input_request(request)
|
|
891
|
+
)
|
|
876
892
|
|
|
877
893
|
# Check for custom routing callbacks
|
|
878
894
|
if hasattr(agent, "_routing_callbacks"):
|
|
@@ -196,8 +196,10 @@ async def simulate_request_to_service(
|
|
|
196
196
|
import json
|
|
197
197
|
|
|
198
198
|
# json.loads() is typed -> Any; a FastAPI Response body is the rendered
|
|
199
|
-
# SWML JSON object, matching the declared dict return.
|
|
200
|
-
|
|
199
|
+
# SWML JSON object, matching the declared dict return. result.body is
|
|
200
|
+
# bytes | memoryview — bytes() handles both before decode (memoryview has
|
|
201
|
+
# no .decode()), a real latent bug strict typing surfaced.
|
|
202
|
+
return cast(dict[str, Any], json.loads(bytes(result.body).decode()))
|
|
201
203
|
if isinstance(result, dict):
|
|
202
204
|
return result
|
|
203
205
|
# Try to get content from response
|
{signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/cli/test_swaig.py
RENAMED
|
@@ -226,8 +226,25 @@ swaig-test agent.py --simulate-serverless cgi --cgi-host example.com --dump-swml
|
|
|
226
226
|
|
|
227
227
|
def main() -> int:
|
|
228
228
|
"""Main entry point for the CLI tool"""
|
|
229
|
-
#
|
|
230
|
-
|
|
229
|
+
# Detect --parse-only / --dry-run FIRST and strip it from argv.
|
|
230
|
+
# It is detected before everything else because:
|
|
231
|
+
# 1. --dump-swml installs a global stdout suppressor below; parse-only must
|
|
232
|
+
# still be able to print its one "parse OK" line, so we skip that setup.
|
|
233
|
+
# 2. The --exec split further down consumes every token after the function
|
|
234
|
+
# name as a function argument, so a --parse-only trailing an --exec
|
|
235
|
+
# invocation (the position the DOC-CLI gate appends it) would otherwise be
|
|
236
|
+
# swallowed and never reach argparse. Stripping it here makes the flag
|
|
237
|
+
# position-independent — it works whether it precedes or follows --exec.
|
|
238
|
+
# It is still declared as a normal argparse argument below so it appears in
|
|
239
|
+
# --help and validates like any flag.
|
|
240
|
+
parse_only_early = False
|
|
241
|
+
if "--parse-only" in sys.argv or "--dry-run" in sys.argv:
|
|
242
|
+
parse_only_early = True
|
|
243
|
+
sys.argv = [a for a in sys.argv if a not in ("--parse-only", "--dry-run")]
|
|
244
|
+
|
|
245
|
+
# Set up suppression early if we're dumping SWML (but never under --parse-only,
|
|
246
|
+
# which must be free to print its result line).
|
|
247
|
+
if "--dump-swml" in sys.argv and not parse_only_early:
|
|
231
248
|
setup_output_suppression()
|
|
232
249
|
|
|
233
250
|
# Check for help sections early
|
|
@@ -410,6 +427,18 @@ def main() -> int:
|
|
|
410
427
|
"--help-examples", action="store_true", help="Show comprehensive usage examples"
|
|
411
428
|
)
|
|
412
429
|
|
|
430
|
+
# Parse-only / dry-run: validate the invocation's arguments and exit WITHOUT
|
|
431
|
+
# loading the agent or hitting the network. Used by the DOC-CLI gate to prove a
|
|
432
|
+
# documented invocation's arguments are well-formed. Canonical contract mirrored
|
|
433
|
+
# by every port -- see the "--parse-only / --dry-run" section of docs/cli_guide.md.
|
|
434
|
+
parser.add_argument(
|
|
435
|
+
"--parse-only",
|
|
436
|
+
"--dry-run",
|
|
437
|
+
action="store_true",
|
|
438
|
+
dest="parse_only",
|
|
439
|
+
help="Validate arguments and exit without running the agent (prints 'parse OK')",
|
|
440
|
+
)
|
|
441
|
+
|
|
413
442
|
args = parser.parse_args()
|
|
414
443
|
|
|
415
444
|
# Restore original sys.argv
|
|
@@ -434,6 +463,16 @@ def main() -> int:
|
|
|
434
463
|
# If no tool_name and no special flags, default to listing tools
|
|
435
464
|
args.list_tools = True
|
|
436
465
|
|
|
466
|
+
# ===== PARSE-ONLY / DRY-RUN =====
|
|
467
|
+
# All argparse parsing + cross-flag validation has succeeded by this point.
|
|
468
|
+
# Report success and exit WITHOUT loading the agent, touching the filesystem,
|
|
469
|
+
# or hitting the network. (parser.parse_args()/parser.error() already exited
|
|
470
|
+
# non-zero on any bad flag or invalid combination above.) The flag is detected
|
|
471
|
+
# both early (stripped from argv, position-independent) and via argparse.
|
|
472
|
+
if parse_only_early or args.parse_only:
|
|
473
|
+
print("parse OK")
|
|
474
|
+
return 0
|
|
475
|
+
|
|
437
476
|
# ===== SERVERLESS SIMULATION SETUP =====
|
|
438
477
|
serverless_simulator = None
|
|
439
478
|
|
{signalwire_sdk-3.0.2.dev70 → signalwire_sdk-3.0.2.dev73}/signalwire/signalwire/core/_agent_host.py
RENAMED
|
@@ -22,3 +22,6 @@ if TYPE_CHECKING:
|
|
|
22
22
|
from signalwire.core.agent_base import AgentBase as AgentHost # type: ignore[attr-defined] # intentional TYPE_CHECKING-only re-export; agent_base imports this module's consumers (the mixins), so the name resolves for them but not in self-check
|
|
23
23
|
else:
|
|
24
24
|
AgentHost = object
|
|
25
|
+
|
|
26
|
+
# Explicit re-export so --strict (no_implicit_reexport) lets _mixin_host import AgentHost.
|
|
27
|
+
__all__ = ["AgentHost"]
|
|
@@ -20,7 +20,7 @@ logger = get_logger(__name__)
|
|
|
20
20
|
class PromptManager:
|
|
21
21
|
"""Manages prompt building and configuration."""
|
|
22
22
|
|
|
23
|
-
def __init__(self, agent):
|
|
23
|
+
def __init__(self, agent: Any) -> None:
|
|
24
24
|
"""
|
|
25
25
|
Initialize PromptManager with reference to parent agent.
|
|
26
26
|
|
|
@@ -29,10 +29,10 @@ class PromptManager:
|
|
|
29
29
|
"""
|
|
30
30
|
self.agent = agent
|
|
31
31
|
self._prompt_text: str | None = None
|
|
32
|
-
self._post_prompt_text = None
|
|
33
|
-
self._contexts = None
|
|
32
|
+
self._post_prompt_text: str | None = None
|
|
33
|
+
self._contexts: dict[str, Any] | None = None
|
|
34
34
|
|
|
35
|
-
def _validate_prompt_mode_exclusivity(self):
|
|
35
|
+
def _validate_prompt_mode_exclusivity(self) -> None:
|
|
36
36
|
"""
|
|
37
37
|
Check that only one prompt mode is in use.
|
|
38
38
|
|
|
@@ -9,16 +9,23 @@ See LICENSE file in the project root for full license information.
|
|
|
9
9
|
Tool decorator functionality.
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
|
+
from typing import Any, TypeVar
|
|
13
|
+
from collections.abc import Callable
|
|
14
|
+
|
|
12
15
|
from signalwire.core.logging_config import get_logger
|
|
13
16
|
|
|
14
17
|
logger = get_logger(__name__)
|
|
15
18
|
|
|
19
|
+
_F = TypeVar("_F", bound=Callable[..., Any])
|
|
20
|
+
|
|
16
21
|
|
|
17
22
|
class ToolDecorator:
|
|
18
23
|
"""Handles tool decoration logic."""
|
|
19
24
|
|
|
20
25
|
@staticmethod
|
|
21
|
-
def create_instance_decorator(
|
|
26
|
+
def create_instance_decorator(
|
|
27
|
+
registry: Any,
|
|
28
|
+
) -> Callable[..., Callable[[_F], _F]]:
|
|
22
29
|
"""
|
|
23
30
|
Create instance tool decorator.
|
|
24
31
|
|
|
@@ -29,7 +36,7 @@ class ToolDecorator:
|
|
|
29
36
|
Decorator function
|
|
30
37
|
"""
|
|
31
38
|
|
|
32
|
-
def decorator(name=None, **kwargs):
|
|
39
|
+
def decorator(name: str | None = None, **kwargs: Any) -> Callable[[_F], _F]:
|
|
33
40
|
"""
|
|
34
41
|
Decorator for defining SWAIG tools in a class.
|
|
35
42
|
|
|
@@ -78,7 +85,7 @@ class ToolDecorator:
|
|
|
78
85
|
guidance.
|
|
79
86
|
"""
|
|
80
87
|
|
|
81
|
-
def inner_decorator(func):
|
|
88
|
+
def inner_decorator(func: _F) -> _F:
|
|
82
89
|
nonlocal name
|
|
83
90
|
if name is None:
|
|
84
91
|
name = func.__name__
|
|
@@ -90,7 +97,7 @@ class ToolDecorator:
|
|
|
90
97
|
webhook_url = kwargs.pop("webhook_url", None)
|
|
91
98
|
required = kwargs.pop("required", None)
|
|
92
99
|
|
|
93
|
-
handler = func
|
|
100
|
+
handler: Callable[..., Any] = func
|
|
94
101
|
is_typed = False
|
|
95
102
|
|
|
96
103
|
# If parameters not explicitly provided, try type inference
|
|
@@ -138,7 +145,7 @@ class ToolDecorator:
|
|
|
138
145
|
return decorator
|
|
139
146
|
|
|
140
147
|
@classmethod
|
|
141
|
-
def create_class_decorator(cls):
|
|
148
|
+
def create_class_decorator(cls) -> Callable[..., Callable[[_F], _F]]:
|
|
142
149
|
"""
|
|
143
150
|
Create class tool decorator.
|
|
144
151
|
|
|
@@ -146,7 +153,7 @@ class ToolDecorator:
|
|
|
146
153
|
Decorator function
|
|
147
154
|
"""
|
|
148
155
|
|
|
149
|
-
def tool(name=None, **kwargs):
|
|
156
|
+
def tool(name: str | None = None, **kwargs: Any) -> Callable[[_F], _F]:
|
|
150
157
|
"""
|
|
151
158
|
Class method decorator for defining SWAIG tools.
|
|
152
159
|
|
|
@@ -180,11 +187,11 @@ class ToolDecorator:
|
|
|
180
187
|
...
|
|
181
188
|
"""
|
|
182
189
|
|
|
183
|
-
def decorator(func):
|
|
190
|
+
def decorator(func: _F) -> _F:
|
|
184
191
|
# Mark the function as a tool
|
|
185
|
-
func._is_tool = True
|
|
186
|
-
func._tool_name = name if name else func.__name__
|
|
187
|
-
func._tool_params = kwargs
|
|
192
|
+
func._is_tool = True # type: ignore[attr-defined] # dynamic marker attrs read back by ToolRegistry.register_class_decorated_tools
|
|
193
|
+
func._tool_name = name if name else func.__name__ # type: ignore[attr-defined]
|
|
194
|
+
func._tool_params = kwargs # type: ignore[attr-defined]
|
|
188
195
|
|
|
189
196
|
# Return the original function
|
|
190
197
|
return func
|
|
@@ -22,7 +22,7 @@ logger = get_logger(__name__)
|
|
|
22
22
|
class ToolRegistry:
|
|
23
23
|
"""Manages SWAIG function registration."""
|
|
24
24
|
|
|
25
|
-
def __init__(self, agent):
|
|
25
|
+
def __init__(self, agent: Any) -> None:
|
|
26
26
|
"""
|
|
27
27
|
Initialize ToolRegistry with reference to parent agent.
|
|
28
28
|
|
|
@@ -30,15 +30,15 @@ class ToolRegistry:
|
|
|
30
30
|
agent: Parent AgentBase instance
|
|
31
31
|
"""
|
|
32
32
|
self.agent = agent
|
|
33
|
-
self._swaig_functions = {}
|
|
34
|
-
self._class_decorated_tools = []
|
|
33
|
+
self._swaig_functions: dict[str, SWAIGFunction | dict[str, Any]] = {}
|
|
34
|
+
self._class_decorated_tools: list[Any] = []
|
|
35
35
|
|
|
36
36
|
def define_tool(
|
|
37
37
|
self,
|
|
38
38
|
name: str,
|
|
39
39
|
description: str,
|
|
40
40
|
parameters: dict[str, Any],
|
|
41
|
-
handler: Callable,
|
|
41
|
+
handler: Callable[..., Any],
|
|
42
42
|
secure: bool = True,
|
|
43
43
|
fillers: dict[str, list[str]] | None = None,
|
|
44
44
|
wait_file: str | None = None,
|
|
@@ -46,7 +46,7 @@ class ToolRegistry:
|
|
|
46
46
|
webhook_url: str | None = None,
|
|
47
47
|
required: list[str] | None = None,
|
|
48
48
|
is_typed_handler: bool = False,
|
|
49
|
-
**swaig_fields,
|
|
49
|
+
**swaig_fields: Any,
|
|
50
50
|
) -> None:
|
|
51
51
|
"""
|
|
52
52
|
Define a SWAIG function that the AI can call.
|