signalwire-sdk 3.4.3.dev118__tar.gz → 3.4.3.dev119__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.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/CHANGELOG.md +52 -2
- {signalwire_sdk-3.4.3.dev118/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.4.3.dev119}/PKG-INFO +1 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/agent_guide.md +18 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/architecture.md +2 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/pgi_agent_guide.md +1 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/pyproject.toml +1 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/__init__.py +1 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agent_server.py +1 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_topics.py +6 -3
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/_sync_handlers.py +113 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/type_inference.py +24 -5
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent_base.py +95 -29
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +11 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/web_mixin.py +40 -8
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_manager.py +21 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_service.py +126 -34
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/skill.py +15 -7
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -1
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +1 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/LICENSE +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/MANIFEST.in +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/ai_chat_gateway.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/api_reference.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/bedrock_agent.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/cli_guide.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/cloud_functions_guide.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/configuration.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/contexts_guide.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/datamap_guide.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/developer_pain_points.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/llm_parameters.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/mcp_gateway_reference.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/mcp_integration.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/programmatically_governed_inference.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/sdk_features.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_deployment.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_indexing.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_integration.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_overview.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/search_troubleshooting.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/security.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/skills_parameter_schema.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/skills_system.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/swaig_reference.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/swml_service_guide.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/third_party_skills.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/docs/web_service.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/Dockerfile.flexible +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/Dockerfile.k8s +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/advanced_datamap_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/auto_vivified_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/basic_swml_service.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_agent_run.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_agent_test.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_server_test.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/bedrock_with_skills.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/call_flow_and_actions_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/comprehensive_dynamic_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/concierge_agent_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/contexts_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/custom_path_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/data_map_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_multi_instance_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_serverless_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_serverless_env_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/datasphere_webhook_env_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/declarative_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/dynamic_info_gatherer_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/dynamic_swml_service.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/faq_bot_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/gather_info_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/gather_per_question_functions_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/info_gatherer_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/joke_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/joke_skill_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/k8s-deployment.yaml +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/kubernetes_ready_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/lambda_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/llm_params_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/mcp_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/mcp_gateway_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/multi_agent_server.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/multi_endpoint_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/pgvector_search_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/quickstart_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/quickstart_relay.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/quickstart_rest.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/receptionist_agent_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/record_call_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/relay_answer_and_welcome.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/room_and_sip_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/search_server_standalone.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/search_with_custom_formatter.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/session_and_state_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/sigmond_native_search.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/sigmond_remote_search.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/sigmond_simple.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_dynamic_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_dynamic_enhanced.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/simple_static_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/skills_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/static_files/file.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/static_files/static_files/file.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/step_function_inheritance_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/survey_agent_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swaig_features_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swml_service_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swml_service_routing_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swmlservice_ai_sidecar.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/swmlservice_swaig_standalone.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/tap_example.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/web_search_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/web_search_multi_instance_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/examples/wikipedia_demo.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/docs/migration-guide.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/examples/livewire_basic_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/examples/livewire_handoff.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/livewire/examples/livewire_multi_tool.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/sw-pydocs.1 +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp/swml-schema-search/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp/swml-schema-search/swml_schema_mcp.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/.env.example +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/.gitignore +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/Dockerfile +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/certs/.gitignore +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/docker-compose.yml +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/examples/generate_cert.sh +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/mcp-docker.sh +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/sample_config.json +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/test/test_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/test/test_gateway.sh +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/mcp_gateway/test/todo_mcp.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/call-methods.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/client-reference.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/events.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/getting-started.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/docs/messaging.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/examples/relay_answer_and_welcome.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/examples/relay_dial_and_play.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/relay/examples/relay_ivr_connect.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/calling.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/client-reference.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/fabric.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/getting-started.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/docs/namespaces.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_10dlc_registration.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_bind_phone_to_swml_webhook.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_calling_ivr_and_ai.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_calling_play_and_record.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_datasphere_search.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_fabric_conferences_and_routing.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_fabric_subscribers_and_sip.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_fabric_swml_and_callflows.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_manage_resources.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_phone_number_management.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_queues_mfa_and_recordings.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/rest/examples/rest_video_rooms.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/setup.cfg +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/setup.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/AGENTS.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/__main__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/bedrock.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/client.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/gateway.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/handoff.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/build_search.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/service_loader.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/dokku.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/init_project.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_agents_note.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_api.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_bundle.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_files.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/pydocs/_render.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/test_swaig.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/_agent_host.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/auth_handler.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/capabilities.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/config_loader.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/contexts.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/data_map.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/function_result.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/logging_config.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/security_utils.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/session_manager.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security_config.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_base.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_function.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_builder.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_handler.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_renderer.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/web.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/llms.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom_tool.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/concierge.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/receptionist.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/survey.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/py.typed +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/call.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/client.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/message.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_request_options.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/document_processor.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/index_builder.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/migration.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/models.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/pgvector_backend.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/query_processor.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_engine.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_service.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/registry.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/schema_utils.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/web_service.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tests/test_mcp_integration.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/.env.example +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/Dockerfile +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/Dockerfile.multi +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/docker-compose.yml +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/fred.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/fred.sh +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/requirements.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/01-introduction.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/02-setup.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/03-basic-agent.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/04-wikipedia-skill.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/05-custom-functions.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/06-running-testing.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/appendix-complete-code.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/fred/tutorial/appendix-docker-deployment.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/.env.example +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/.gitignore +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/Dockerfile +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/check_docs.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/handlers.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/penny.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/penny.sh +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/requirements.txt +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/reservations.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/test_penny.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/01-why-guardrails.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/02-design-first.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/03-rules-first.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/04-the-shell.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/05-steps-and-scoping.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/06-tools-that-decide.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/07-gather-and-projection.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/08-the-verification-gate.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/09-people-and-endings.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/10-testing-and-running.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/appendix-complete-code.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/appendix-deployment.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/tutorial/appendix-technique-map.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/full-guardrails-agent/workflow.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/README.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson1_first_agent.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson2_knowledge_bases.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson3_multi_agent_systems.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson4_advanced_features.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/lesson5_extending_agents.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/pc_builder.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_agent.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_agent_with_search.py +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_knowledge.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/sales_knowledge.swsearch +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/support_knowledge.md +0 -0
- {signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/tutorial/multi_agents/support_knowledge.swsearch +0 -0
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
Webhook signatures and SWAIG tokens are now enforced on every path, including
|
|
6
6
|
serverless. Skills that fetch URLs no longer reach internal addresses through
|
|
7
7
|
redirects, the agent's `/mcp` endpoint requires basic auth, and `async def`
|
|
8
|
-
tool handlers run.
|
|
9
|
-
|
|
8
|
+
tool handlers run. Synchronous handlers and callbacks run in worker threads,
|
|
9
|
+
so a slow one no longer holds up every other call. The package now installs
|
|
10
|
+
its documentation, and `sw-pydocs` prints it.
|
|
10
11
|
|
|
11
12
|
### Added
|
|
12
13
|
- `sw-pydocs`: the SDK's documentation for the installed version, for people
|
|
@@ -22,6 +23,31 @@ tool handlers run. The package now installs its documentation, and
|
|
|
22
23
|
- The package's `llms.txt` lists the installed docs.
|
|
23
24
|
|
|
24
25
|
### Changed
|
|
26
|
+
- The web server runs synchronous user code in a worker thread, from AnyIO's
|
|
27
|
+
thread pool (40 threads by default), instead of on its event loop: `def`
|
|
28
|
+
tool handlers, the per-request configuration callback and the render of the
|
|
29
|
+
copy it configures, routing callbacks, `on_summary`, the debug event handler
|
|
30
|
+
and tools called through `/mcp`. Before, a handler that waited on an API or
|
|
31
|
+
a database held up every other request on the server, including other
|
|
32
|
+
calls' SWML. The context variables that code sets are applied to the
|
|
33
|
+
request's context when it returns, so they still reach the request's later
|
|
34
|
+
steps, such as the configuration callback's to the tool. `async def`
|
|
35
|
+
handlers are still awaited directly on the event loop, without a worker
|
|
36
|
+
thread.
|
|
37
|
+
An `on_swml_request` override (including `InfoGathererAgent`'s question
|
|
38
|
+
callback) and the render of the agent's own document stay on the event
|
|
39
|
+
loop too, as do a plain `SWMLService`'s `on_request` and render. Set
|
|
40
|
+
`SWML_SYNC_HANDLERS_INLINE=true` to run everything on the event loop, as
|
|
41
|
+
before.
|
|
42
|
+
- With a per-request configuration callback set, a tool handler that's a
|
|
43
|
+
method of the agent (an `@AgentBase.tool` method, or `self.method` passed to
|
|
44
|
+
`define_tool()`, or a partial of one) runs with `self` as that request's
|
|
45
|
+
configured copy, as `on_summary` already did. It used to run on the
|
|
46
|
+
original agent, so it couldn't see what the callback configured. Tools
|
|
47
|
+
called through `/mcp` don't use the callback and still run on the agent.
|
|
48
|
+
- The per-request copy starts with the skills the agent loaded, instead of
|
|
49
|
+
loading each one again, which ran every skill's `setup()` on every
|
|
50
|
+
request and left the copy's skill list empty.
|
|
25
51
|
- Importing `signalwire.cli` no longer imports `swaig-test`, so the SDK's other
|
|
26
52
|
commands start about 0.8 seconds sooner.
|
|
27
53
|
|
|
@@ -164,6 +190,15 @@ tool handlers run. The package now installs its documentation, and
|
|
|
164
190
|
`schema.json` without `SWML_SCHEMA_PATH`.
|
|
165
191
|
- The MCP gateway's Docker image builds and runs, and Compose passes its
|
|
166
192
|
defaults instead of empty strings for unset variables.
|
|
193
|
+
- The per-request copy of an agent shared the agent's SWML document until its
|
|
194
|
+
render, so a verb method such as `play()` called on the copy in the
|
|
195
|
+
per-request callback added the verb to the agent's own document. The copy
|
|
196
|
+
now starts with its own.
|
|
197
|
+
- `add_mcp_server()` in the per-request callback added the server to the
|
|
198
|
+
agent's own list, so every call added another, and later calls saw them
|
|
199
|
+
all. The copy now has its own list, as it does for SIP usernames.
|
|
200
|
+
- The spider skill's page cache could raise `KeyError` when two fetches ran
|
|
201
|
+
at once, which they now can. It's locked.
|
|
167
202
|
|
|
168
203
|
### Deprecated
|
|
169
204
|
- `keyword_weight` (`SearchEngine.search()`, the pgvector backend,
|
|
@@ -201,6 +236,21 @@ tool handlers run. The package now installs its documentation, and
|
|
|
201
236
|
Set `auth_password` (or `MCP_AUTH_PASSWORD`) to accept other connections.
|
|
202
237
|
Compose now requires `MCP_AUTH_PASSWORD`, and the sample configuration,
|
|
203
238
|
Compose file and scripts use port 8080, the code's default, instead of 8100.
|
|
239
|
+
- With a per-request configuration callback set, a tool method's `self` is
|
|
240
|
+
the request's copy of the agent. A method that kept state across calls by
|
|
241
|
+
assigning an attribute (`self.count += 1`) now assigns it on the copy, and
|
|
242
|
+
the value is gone after the request. Keep that state in an object the
|
|
243
|
+
agent already holds, or in your own storage.
|
|
244
|
+
- Synchronous tool handlers and callbacks can now run at the same time as each
|
|
245
|
+
other. Guard state they share, such as a module-level dictionary, with a
|
|
246
|
+
`threading.Lock`, and don't share one `sqlite3` connection between them.
|
|
247
|
+
A synchronous handler no longer runs on the event loop, so
|
|
248
|
+
`asyncio.create_task()`, `asyncio.get_running_loop()` and similar calls in
|
|
249
|
+
it raise `RuntimeError`; make such a handler `async def`.
|
|
250
|
+
Without a per-request configuration callback, a handler that's a method of
|
|
251
|
+
the agent runs with `self` as the agent every call shares. Setting
|
|
252
|
+
`SWML_SYNC_HANDLERS_INLINE=true` restores the previous behavior while you
|
|
253
|
+
check.
|
|
204
254
|
- The MCP gateway's Docker image installs `signalwire-sdk` from PyPI (pin one
|
|
205
255
|
with `--build-arg SDK_VERSION=x.y.z`), so it gets these fixes only from a
|
|
206
256
|
release that includes them.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: signalwire-sdk
|
|
3
|
-
Version: 3.4.3.
|
|
3
|
+
Version: 3.4.3.dev119
|
|
4
4
|
Summary: SignalWire SDK for AI voice agents, live call control (RELAY) and REST. Run sw-pydocs for its documentation.
|
|
5
5
|
Author-email: SignalWire Team <info@signalwire.com>
|
|
6
6
|
License: MIT
|
|
@@ -331,6 +331,21 @@ def get_weather(self, args, raw_data):
|
|
|
331
331
|
|
|
332
332
|
A handler can also be an `async def` function, so it can await other asynchronous calls. When the agent serves `/swaig`, the SDK awaits the handler on the request's event loop. In serverless deployments and in `swaig-test`, it runs the handler to completion.
|
|
333
333
|
|
|
334
|
+
#### Handlers and Concurrency
|
|
335
|
+
|
|
336
|
+
The agent's web server handles every call on one event loop. A plain `def` handler, such as one that calls an API with `requests`, runs in a worker thread, so a slow handler on one call doesn't hold up the others. The same is true of the per-request configuration callback, routing callbacks, `on_summary`, the debug event handler and tools called through `/mcp`. The threads come from AnyIO's thread pool, the one FastAPI uses for `def` routes, which runs 40 at a time by default. An `async def` handler runs on the event loop, so it must not block it: await asynchronous calls instead.
|
|
337
|
+
|
|
338
|
+
Because handlers for different calls can run at the same time, treat anything they share as shared between threads:
|
|
339
|
+
|
|
340
|
+
- A handler that's a method of your agent, such as one defined with `@AgentBase.tool` or passed to `define_tool()` as `self.method`, runs with `self` as the agent, which every call shares. With a per-request configuration callback set, a tool call from SignalWire runs the method on that request's copy instead, so `self` sees what the callback configured, and an attribute it assigns stays on the copy. A function that captures the agent in a closure always sees the shared agent, and so does a tool called through `/mcp`, which doesn't use the callback. Don't change the shared agent's configuration from a handler; return a `FunctionResult` with actions, such as `update_global_data()`, to change the call instead.
|
|
341
|
+
- Protect module-level or instance state that handlers change, such as a dictionary of orders by call ID, with a `threading.Lock`, or keep it in a database.
|
|
342
|
+
- Open a database connection in the handler, or use a pool. A `sqlite3` connection opened in one thread can't be used from another.
|
|
343
|
+
- A plain `def` handler has no running event loop, so `asyncio.create_task()`, `asyncio.get_running_loop()` and similar calls raise `RuntimeError` there. Make a handler that needs the loop `async def`.
|
|
344
|
+
|
|
345
|
+
An `on_swml_request` override still runs on the event loop, because it can change the agent just before the agent's own document is rendered. So does `InfoGathererAgent`'s question callback, which its `on_swml_request` calls. Keep them fast, or do per-request work in the per-request configuration callback instead.
|
|
346
|
+
|
|
347
|
+
Set `SWML_SYNC_HANDLERS_INLINE=true` to run synchronous handlers and callbacks on the event loop instead, one at a time, as earlier releases did. The serverless entry points call handlers directly, as before.
|
|
348
|
+
|
|
334
349
|
### 2. External Webhook Functions
|
|
335
350
|
|
|
336
351
|
External webhook functions allow you to delegate function execution to external services instead of handling them locally. This is useful when you want to:
|
|
@@ -1389,7 +1404,9 @@ The callback function receives four parameters:
|
|
|
1389
1404
|
|
|
1390
1405
|
### Dynamic Configuration Methods
|
|
1391
1406
|
|
|
1392
|
-
The `agent` parameter in your callback is a copy of the agent made for this request, so you can use all the same configuration methods you would use during initialization, and the changes apply to this request only. The configuration the SDK manages, such as the prompt, tools, skills, languages, parameters, hints and
|
|
1407
|
+
The `agent` parameter in your callback is a copy of the agent made for this request, so you can use all the same configuration methods you would use during initialization, and the changes apply to this request only. The configuration the SDK manages, such as the prompt, tools, skills, languages, parameters, hints, global data and MCP servers, is copied. Other attributes, such as ones your own class adds, are shared with the agent and with other requests: assign a new value to one rather than changing the shared object in place, and keep per-caller state in global data or your own storage.
|
|
1408
|
+
|
|
1409
|
+
The callback, and the rendering of the copy it configured, run in a worker thread, so the callback can look up a tenant in a database without holding up other calls. Callbacks for different calls run at the same time, which is why changing a shared object in place is unsafe: two requests can change it at once. See [Handlers and Concurrency](#handlers-and-concurrency).
|
|
1393
1410
|
|
|
1394
1411
|
#### Language Configuration
|
|
1395
1412
|
|
|
@@ -1207,6 +1207,8 @@ Proxy / request-trust knobs (all default OFF, enable only behind a trusted proxy
|
|
|
1207
1207
|
- `SWML_PROXY_DEBUG`: verbose proxy-header resolution logging
|
|
1208
1208
|
|
|
1209
1209
|
Other knobs:
|
|
1210
|
+
- `SWML_SYNC_HANDLERS_INLINE`: run synchronous tool handlers and callbacks on the
|
|
1211
|
+
event loop, one at a time, instead of in worker threads (`1`/`true`/`yes`)
|
|
1210
1212
|
- `SWML_SKIP_SCHEMA_VALIDATION`: skip SWML schema validation (`1`), for debugging only
|
|
1211
1213
|
- `SIGNALWIRE_LOG_FORMAT`: log renderer, `console` (default) or `json`
|
|
1212
1214
|
- `SIGNALWIRE_SPACE_NAME`: default space name used by `sw-agent-init` scaffolding
|
|
@@ -294,7 +294,7 @@ Handlers typically receive full SWAIG data in `raw_data` and can access `raw_dat
|
|
|
294
294
|
|
|
295
295
|
`define_tool` supports explicit schemas and a handler receiving `(args, raw_data)`. Type-hinted decorators can infer schemas, but inspect the result instead of assuming the decorator knows your policy. Use narrow inputs, explicit required fields, and backend validation. The registered tool name and the Python handler name may differ. [S05]
|
|
296
296
|
|
|
297
|
-
A handler can be `async def`; the SDK awaits it on the request's event loop.
|
|
297
|
+
A handler can be `async def`; the SDK awaits it on the request's event loop, so it must not block. At this guide's baseline, a plain `def` handler runs on that loop too, so move slow blocking work, such as a database call that can wait on a lock, off the loop. Later code runs a plain `def` handler in a worker thread instead, so a slow one doesn't hold up other calls, but handlers for different calls can then run at the same time: protect state they share, and don't share one `sqlite3` connection between threads. `SWML_SYNC_HANDLERS_INLINE=true` restores the baseline's behavior. [S27]
|
|
298
298
|
|
|
299
299
|
**Verify:** malformed values, omitted required fields, unexpected fields, tenant mismatch, stale state, replay, and backend failures. Descriptions help the model use a tool; they do not validate its inputs. Avoid returning stack traces, credentials, full records, or untrusted instructions as a tool prompt.
|
|
300
300
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "signalwire-sdk"
|
|
7
|
-
version = "3.4.3.
|
|
7
|
+
version = "3.4.3.dev119"
|
|
8
8
|
description = "SignalWire SDK for AI voice agents, live call control (RELAY) and REST. Run sw-pydocs for its documentation."
|
|
9
9
|
authors = [
|
|
10
10
|
{name = "SignalWire Team", email = "info@signalwire.com"}
|
{signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/__init__.py
RENAMED
|
@@ -58,7 +58,7 @@ if TYPE_CHECKING:
|
|
|
58
58
|
from signalwire.utils.schema_utils import SchemaValidationError
|
|
59
59
|
from signalwire.web import WebService
|
|
60
60
|
|
|
61
|
-
__version__ = "3.4.3.
|
|
61
|
+
__version__ = "3.4.3.dev119"
|
|
62
62
|
|
|
63
63
|
# §6.2-python (owner decision: NO packaging split — one package, all deps required;
|
|
64
64
|
# IMPORT-TIME behavior only): the agent/web symbols are lazy-imported via module
|
|
@@ -133,7 +133,8 @@ existing FastAPI app.
|
|
|
133
133
|
|
|
134
134
|
Per-call configuration: `set_dynamic_config_callback()` configures a copy of
|
|
135
135
|
the agent for each request, from its query parameters, body and headers, for
|
|
136
|
-
per-tenant prompts, voices and tools.
|
|
136
|
+
per-tenant prompts, voices and tools. The callback runs in a worker thread,
|
|
137
|
+
at the same time as other calls' callbacks. Don't keep per-caller state on the
|
|
137
138
|
shared agent instance.
|
|
138
139
|
|
|
139
140
|
Configuration precedence: constructor arguments, then the config file, then
|
|
@@ -231,8 +232,10 @@ _TOOLS = Topic(
|
|
|
231
232
|
summary="Functions the model can call, and what they return",
|
|
232
233
|
body="""\
|
|
233
234
|
A tool is a function the model can ask to call. SignalWire sends the call to
|
|
234
|
-
the agent's `/swaig` endpoint, and the SDK runs your handler.
|
|
235
|
-
|
|
235
|
+
the agent's `/swaig` endpoint, and the SDK runs your handler. A plain `def`
|
|
236
|
+
handler runs in a worker thread, so handlers for different calls run at the
|
|
237
|
+
same time: guard state they share. An `async def` handler runs on the event
|
|
238
|
+
loop and must not block it.
|
|
236
239
|
|
|
237
240
|
Declare a tool with type hints, and the SDK builds its schema. The docstring's
|
|
238
241
|
summary is the tool's description, and its `Args:` describe the parameters:
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Copyright (c) 2025 SignalWire
|
|
3
|
+
|
|
4
|
+
This file is part of the SignalWire SDK.
|
|
5
|
+
|
|
6
|
+
Licensed under the MIT License.
|
|
7
|
+
See LICENSE file in the project root for full license information.
|
|
8
|
+
|
|
9
|
+
Run synchronous user code off the event loop.
|
|
10
|
+
|
|
11
|
+
The web server's endpoints are async and share one event loop. Synchronous
|
|
12
|
+
user code called directly on that loop, such as a tool handler that makes an
|
|
13
|
+
HTTP request, blocks every other request, on every call, until it returns.
|
|
14
|
+
The endpoints call that code through ``run_sync_handler``, which runs it in a
|
|
15
|
+
worker thread from AnyIO's thread pool, the pool FastAPI uses for ``def``
|
|
16
|
+
routes. That pool runs 40 threads at a time by default.
|
|
17
|
+
|
|
18
|
+
The code runs in the worker's copy of the request's context, as for a
|
|
19
|
+
``def`` route, and the context variables it sets are applied to the request's
|
|
20
|
+
context when it returns. So a variable one step sets reaches the request's
|
|
21
|
+
later steps, such as the per-request configuration callback's to the tool
|
|
22
|
+
handler, as it did when every step ran inline.
|
|
23
|
+
|
|
24
|
+
An ``async def`` handler runs on the event loop, awaited directly, and needs
|
|
25
|
+
no worker thread. When an endpoint can't tell a handler is async, calling it
|
|
26
|
+
in the thread only creates its coroutine, which the endpoint then awaits.
|
|
27
|
+
|
|
28
|
+
Setting ``SWML_SYNC_HANDLERS_INLINE`` to ``1``, ``true`` or ``yes`` calls the
|
|
29
|
+
code on the event loop instead, as earlier releases did.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
import contextvars
|
|
33
|
+
import functools
|
|
34
|
+
import inspect
|
|
35
|
+
import os
|
|
36
|
+
from collections.abc import Callable
|
|
37
|
+
from typing import Any, ParamSpec, TypeVar
|
|
38
|
+
|
|
39
|
+
from starlette.concurrency import run_in_threadpool
|
|
40
|
+
|
|
41
|
+
_P = ParamSpec("_P")
|
|
42
|
+
_T = TypeVar("_T")
|
|
43
|
+
_UNSET = object()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def sync_handlers_inline() -> bool:
|
|
47
|
+
"""True when ``SWML_SYNC_HANDLERS_INLINE`` asks for the event loop."""
|
|
48
|
+
return os.getenv("SWML_SYNC_HANDLERS_INLINE", "").lower() in ("1", "true", "yes")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def is_async_callable(obj: object) -> bool:
|
|
52
|
+
"""True for an ``async def`` function or method, a partial of one, or an
|
|
53
|
+
object whose ``__call__`` is ``async def``: calling it only creates a
|
|
54
|
+
coroutine."""
|
|
55
|
+
while isinstance(obj, functools.partial):
|
|
56
|
+
obj = obj.func
|
|
57
|
+
if inspect.iscoroutinefunction(obj):
|
|
58
|
+
return True
|
|
59
|
+
# An instance of a class whose __call__ is async def
|
|
60
|
+
return callable(obj) and inspect.iscoroutinefunction(type(obj).__call__)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def run_sync_handler(
|
|
64
|
+
func: Callable[_P, _T], *args: _P.args, **kwargs: _P.kwargs
|
|
65
|
+
) -> _T:
|
|
66
|
+
"""Call ``func`` in a worker thread, or inline when so configured.
|
|
67
|
+
|
|
68
|
+
``func`` sees the caller's context variables, such as the per-request
|
|
69
|
+
proxy URL and structlog's bound context. The ones it sets, even if it
|
|
70
|
+
then raises, are set in the caller's context once it finishes, as they
|
|
71
|
+
would have been had it run inline. If the caller is cancelled first, they
|
|
72
|
+
aren't.
|
|
73
|
+
"""
|
|
74
|
+
if sync_handlers_inline():
|
|
75
|
+
return func(*args, **kwargs)
|
|
76
|
+
changes = _Changes()
|
|
77
|
+
try:
|
|
78
|
+
return await run_in_threadpool(
|
|
79
|
+
functools.partial(_recording_changes, changes, func, *args, **kwargs)
|
|
80
|
+
)
|
|
81
|
+
finally:
|
|
82
|
+
if changes.complete:
|
|
83
|
+
for var, value in changes.values:
|
|
84
|
+
var.set(value)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class _Changes:
|
|
88
|
+
"""The context variables a function set in its worker thread."""
|
|
89
|
+
|
|
90
|
+
def __init__(self) -> None:
|
|
91
|
+
self.values: list[tuple[contextvars.ContextVar[Any], Any]] = []
|
|
92
|
+
# Set last, once values is final
|
|
93
|
+
self.complete = False
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _recording_changes(
|
|
97
|
+
changes: _Changes, func: Callable[_P, _T], *args: _P.args, **kwargs: _P.kwargs
|
|
98
|
+
) -> _T:
|
|
99
|
+
"""Call ``func``, and record in ``changes`` the context variables it sets.
|
|
100
|
+
|
|
101
|
+
It runs in the worker's context, where the thread pool has already made
|
|
102
|
+
its own settings, so only what ``func`` itself changes is recorded.
|
|
103
|
+
"""
|
|
104
|
+
before = contextvars.copy_context()
|
|
105
|
+
try:
|
|
106
|
+
return func(*args, **kwargs)
|
|
107
|
+
finally:
|
|
108
|
+
changes.values = [
|
|
109
|
+
(var, value)
|
|
110
|
+
for var, value in contextvars.copy_context().items()
|
|
111
|
+
if before.get(var, _UNSET) is not value
|
|
112
|
+
]
|
|
113
|
+
changes.complete = True
|
|
@@ -287,14 +287,33 @@ def create_typed_handler_wrapper(
|
|
|
287
287
|
A wrapper function with signature (args, raw_data).
|
|
288
288
|
"""
|
|
289
289
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
290
|
+
wrapper: Callable[..., Any]
|
|
291
|
+
if inspect.iscoroutinefunction(func):
|
|
292
|
+
# An async wrapper, so the dispatcher can tell the handler is async
|
|
293
|
+
# and await it on the event loop without a worker thread.
|
|
294
|
+
async def async_wrapper(
|
|
295
|
+
args: dict[str, Any], raw_data: dict[str, Any] | None
|
|
296
|
+
) -> Any:
|
|
297
|
+
if has_raw_data:
|
|
298
|
+
return await func(raw_data=raw_data, **args)
|
|
299
|
+
return await func(**args)
|
|
300
|
+
|
|
301
|
+
wrapper = async_wrapper
|
|
302
|
+
else:
|
|
303
|
+
|
|
304
|
+
def sync_wrapper(args: dict[str, Any], raw_data: dict[str, Any] | None) -> Any:
|
|
305
|
+
if has_raw_data:
|
|
306
|
+
return func(raw_data=raw_data, **args)
|
|
307
|
+
return func(**args)
|
|
308
|
+
|
|
309
|
+
wrapper = sync_wrapper
|
|
294
310
|
|
|
295
311
|
# Preserve original function metadata for debugging
|
|
296
312
|
wrapper.__name__ = getattr(func, "__name__", "typed_handler")
|
|
297
313
|
wrapper.__doc__ = getattr(func, "__doc__", None)
|
|
298
|
-
wrapper.__wrapped__ = func # type: ignore[attr
|
|
314
|
+
wrapper.__wrapped__ = func # type: ignore[union-attr] # standard functools __wrapped__ convention
|
|
315
|
+
# Marks the SDK's own wrapper, so a per-request copy of the agent can
|
|
316
|
+
# rebuild it around a method bound to the copy
|
|
317
|
+
wrapper._typed_has_raw_data = has_raw_data # type: ignore[union-attr] # marker attribute on a function
|
|
299
318
|
|
|
300
319
|
return wrapper
|
{signalwire_sdk-3.4.3.dev118 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent_base.py
RENAMED
|
@@ -13,6 +13,7 @@ The SDK's installed documentation covers this module: run ``sw-pydocs agents``,
|
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
import contextlib
|
|
16
|
+
import copy
|
|
16
17
|
import functools
|
|
17
18
|
import inspect
|
|
18
19
|
import logging
|
|
@@ -20,6 +21,7 @@ import os
|
|
|
20
21
|
import json
|
|
21
22
|
import uuid
|
|
22
23
|
import re
|
|
24
|
+
import types
|
|
23
25
|
from typing import (
|
|
24
26
|
Any,
|
|
25
27
|
ClassVar,
|
|
@@ -112,6 +114,56 @@ def _record_explicit_args(init: Callable[_P, None]) -> Callable[_P, None]:
|
|
|
112
114
|
return wrapper
|
|
113
115
|
|
|
114
116
|
|
|
117
|
+
def _bound_to(function: Any, original: object, ephemeral: object) -> Any:
|
|
118
|
+
"""``function``, with its handler bound to ``ephemeral`` if it's bound to ``original``."""
|
|
119
|
+
rebound = _rebound(getattr(function, "handler", None), original, ephemeral)
|
|
120
|
+
if rebound is None:
|
|
121
|
+
return function
|
|
122
|
+
function = copy.copy(function)
|
|
123
|
+
function.handler = rebound
|
|
124
|
+
return function
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _rebound(handler: Any, original: object, ephemeral: object) -> Any:
|
|
128
|
+
"""``handler`` bound to ``ephemeral``, or None if it isn't bound to ``original``.
|
|
129
|
+
|
|
130
|
+
Covers a method of ``original``, a partial of one, and the SDK's typed
|
|
131
|
+
wrapper around one. A function that captures ``original`` in a closure
|
|
132
|
+
can't be rebound.
|
|
133
|
+
"""
|
|
134
|
+
if isinstance(handler, types.MethodType) and handler.__self__ is original:
|
|
135
|
+
return types.MethodType(handler.__func__, ephemeral)
|
|
136
|
+
if isinstance(handler, functools.partial):
|
|
137
|
+
inner = _rebound(handler.func, original, ephemeral)
|
|
138
|
+
if inner is None:
|
|
139
|
+
return None
|
|
140
|
+
return functools.partial(inner, *handler.args, **handler.keywords)
|
|
141
|
+
has_raw_data = getattr(handler, "_typed_has_raw_data", None)
|
|
142
|
+
if has_raw_data is not None:
|
|
143
|
+
inner = _rebound(getattr(handler, "__wrapped__", None), original, ephemeral)
|
|
144
|
+
if inner is None:
|
|
145
|
+
return None
|
|
146
|
+
from signalwire.core.agent.tools.type_inference import (
|
|
147
|
+
create_typed_handler_wrapper,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return create_typed_handler_wrapper(inner, has_raw_data)
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _slot_names(klass: type) -> list[str]:
|
|
155
|
+
"""The attribute names ``klass``'s own ``__slots__`` declares, as stored."""
|
|
156
|
+
slots = klass.__dict__.get("__slots__", ())
|
|
157
|
+
names = []
|
|
158
|
+
for slot in (slots,) if isinstance(slots, str) else slots:
|
|
159
|
+
if slot in ("__dict__", "__weakref__"):
|
|
160
|
+
continue
|
|
161
|
+
if slot.startswith("__") and not slot.endswith("__"):
|
|
162
|
+
slot = f"_{klass.__name__.lstrip('_')}{slot}" # name mangling
|
|
163
|
+
names.append(slot)
|
|
164
|
+
return names
|
|
165
|
+
|
|
166
|
+
|
|
115
167
|
class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/_proxy_url_base override SWMLService/ServerlessMixin's by MRO order; mypy flags the base-vs-base shape diff but the resolution is deliberate
|
|
116
168
|
AuthMixin,
|
|
117
169
|
WebMixin,
|
|
@@ -1587,6 +1639,9 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
|
|
|
1587
1639
|
self.log.debug("swml_rendered", swml_size=len(swml))
|
|
1588
1640
|
return Response(content=swml, media_type="application/json")
|
|
1589
1641
|
|
|
1642
|
+
def _swaig_configures_per_call(self) -> bool:
|
|
1643
|
+
return self._dynamic_config_callback is not None
|
|
1644
|
+
|
|
1590
1645
|
def _swaig_pre_dispatch(
|
|
1591
1646
|
self,
|
|
1592
1647
|
request: Request,
|
|
@@ -1806,11 +1861,13 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
|
|
|
1806
1861
|
_internal_fillers, _swaig_query_params, _native_functions,
|
|
1807
1862
|
native_functions, pom, _contexts_builder, _contexts_defined,
|
|
1808
1863
|
skill_manager, _debug_events_enabled, _debug_events_level,
|
|
1809
|
-
_debug_event_handler,
|
|
1864
|
+
_debug_event_handler, _mcp_servers, _sip_usernames,
|
|
1865
|
+
_current_document (a new, empty document; the render rebuilds it),
|
|
1810
1866
|
_prompt_manager (fresh instance; its _sections, _prompt_text,
|
|
1811
1867
|
_post_prompt_text and _contexts are copied),
|
|
1812
1868
|
_tool_registry (fresh instance; its _swaig_functions and
|
|
1813
|
-
_tool_instances are copied
|
|
1869
|
+
_tool_instances are copied, and a tool whose handler is a
|
|
1870
|
+
method of this agent gets a handler bound to the copy)
|
|
1814
1871
|
|
|
1815
1872
|
Anything NOT in that list is the master's own object, shared with
|
|
1816
1873
|
every other request in flight. The distinction that matters is between
|
|
@@ -1824,7 +1881,9 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
|
|
|
1824
1881
|
Getting this wrong does not raise. It produces one visitor's data
|
|
1825
1882
|
appearing in another visitor's prompt, under concurrency, which is why
|
|
1826
1883
|
the safe set is enumerated here rather than left to be inferred from
|
|
1827
|
-
the code below.
|
|
1884
|
+
the code below. The concurrency is real: the web server runs the
|
|
1885
|
+
callback and the copy's render in a worker thread, so copies for
|
|
1886
|
+
different calls are configured at the same time.
|
|
1828
1887
|
|
|
1829
1888
|
Callers who need per-request state of their own should keep it in
|
|
1830
1889
|
`_global_data` (copied) or rebind a fresh object onto the ephemeral
|
|
@@ -1839,9 +1898,24 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
|
|
|
1839
1898
|
cls = self.__class__
|
|
1840
1899
|
ephemeral_agent = cls.__new__(cls)
|
|
1841
1900
|
|
|
1842
|
-
# Copy all attributes as shallow references first
|
|
1843
|
-
|
|
1901
|
+
# Copy all attributes as shallow references first. The items are
|
|
1902
|
+
# snapshotted, because this runs in a worker thread while other
|
|
1903
|
+
# requests use the agent.
|
|
1904
|
+
for key, value in list(self.__dict__.items()):
|
|
1844
1905
|
setattr(ephemeral_agent, key, value)
|
|
1906
|
+
# A subclass's __slots__ attributes aren't in __dict__
|
|
1907
|
+
for klass in cls.__mro__:
|
|
1908
|
+
for slot in _slot_names(klass):
|
|
1909
|
+
try:
|
|
1910
|
+
value = klass.__dict__[slot].__get__(self, klass)
|
|
1911
|
+
except AttributeError:
|
|
1912
|
+
continue # declared but not set
|
|
1913
|
+
klass.__dict__[slot].__set__(ephemeral_agent, value)
|
|
1914
|
+
|
|
1915
|
+
# The copy's own document. Sharing this agent's would let a verb
|
|
1916
|
+
# method called on the copy, such as play(), add to the document
|
|
1917
|
+
# another request is rendering.
|
|
1918
|
+
ephemeral_agent._current_document = ephemeral_agent._create_empty_document()
|
|
1845
1919
|
|
|
1846
1920
|
# Deep copy only the configuration that affects SWML generation
|
|
1847
1921
|
# These are the parts that dynamic config might modify
|
|
@@ -1852,6 +1926,9 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
|
|
|
1852
1926
|
ephemeral_agent._pronounce = copy.deepcopy(self._pronounce)
|
|
1853
1927
|
ephemeral_agent._global_data = copy.deepcopy(self._global_data)
|
|
1854
1928
|
ephemeral_agent._function_includes = copy.deepcopy(self._function_includes)
|
|
1929
|
+
ephemeral_agent._mcp_servers = copy.deepcopy(self._mcp_servers)
|
|
1930
|
+
if "_sip_usernames" in self.__dict__:
|
|
1931
|
+
ephemeral_agent._sip_usernames = set(self._sip_usernames)
|
|
1855
1932
|
|
|
1856
1933
|
# Deep copy routing callbacks to prevent cross-agent mutation
|
|
1857
1934
|
if hasattr(self, "_routing_callbacks"):
|
|
@@ -1923,12 +2000,15 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
|
|
|
1923
2000
|
|
|
1924
2001
|
# Create new tool registry for the ephemeral agent
|
|
1925
2002
|
ephemeral_agent._tool_registry = ToolRegistry(ephemeral_agent)
|
|
1926
|
-
# Copy the SWAIG functions
|
|
1927
|
-
#
|
|
2003
|
+
# Copy the SWAIG functions. Most can be shared; one whose handler is
|
|
2004
|
+
# a method of this agent is copied with the handler bound to the
|
|
2005
|
+
# copy, so the handler's self sees what the per-request callback
|
|
2006
|
+
# configured, as on_summary does.
|
|
1928
2007
|
if hasattr(self._tool_registry, "_swaig_functions"):
|
|
1929
|
-
ephemeral_agent._tool_registry._swaig_functions =
|
|
1930
|
-
self
|
|
1931
|
-
|
|
2008
|
+
ephemeral_agent._tool_registry._swaig_functions = {
|
|
2009
|
+
name: _bound_to(function, self, ephemeral_agent)
|
|
2010
|
+
for name, function in self._tool_registry._swaig_functions.items()
|
|
2011
|
+
}
|
|
1932
2012
|
if hasattr(self._tool_registry, "_tool_instances"):
|
|
1933
2013
|
ephemeral_agent._tool_registry._tool_instances = ( # type: ignore[attr-defined] # ToolRegistry internal state, guarded by hasattr above
|
|
1934
2014
|
self._tool_registry._tool_instances.copy()
|
|
@@ -1940,25 +2020,11 @@ class AgentBase( # type: ignore[misc] # intentional diamond: WebMixin's serve/
|
|
|
1940
2020
|
|
|
1941
2021
|
ephemeral_agent.skill_manager = SkillManager(ephemeral_agent)
|
|
1942
2022
|
|
|
1943
|
-
#
|
|
1944
|
-
#
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
# We need to get the skill name and params from the existing instance
|
|
1949
|
-
skill_name = skill_instance.SKILL_NAME
|
|
1950
|
-
skill_params = getattr(skill_instance, "params", {})
|
|
1951
|
-
try:
|
|
1952
|
-
if skill_name is not None:
|
|
1953
|
-
ephemeral_agent.skill_manager.load_skill(
|
|
1954
|
-
skill_name, type(skill_instance), skill_params
|
|
1955
|
-
)
|
|
1956
|
-
except Exception as e:
|
|
1957
|
-
self.log.warning(
|
|
1958
|
-
"failed_to_copy_skill_to_ephemeral",
|
|
1959
|
-
skill_name=skill_name,
|
|
1960
|
-
error=str(e),
|
|
1961
|
-
)
|
|
2023
|
+
# The copy starts with the skills this agent has loaded, sharing their
|
|
2024
|
+
# instances. Their tools, hints, prompt sections and global data are
|
|
2025
|
+
# already in the copied configuration. Skills the callback adds load
|
|
2026
|
+
# on the copy only.
|
|
2027
|
+
ephemeral_agent.skill_manager._inherit(self.skill_manager.loaded_skills)
|
|
1962
2028
|
|
|
1963
2029
|
# Re-bind the tool decorator method to the new instance
|
|
1964
2030
|
ephemeral_agent.tool = ephemeral_agent._tool_decorator # type: ignore[method-assign] # intentional per-instance decorator binding
|
|
@@ -13,6 +13,8 @@ import logging
|
|
|
13
13
|
from collections.abc import Awaitable
|
|
14
14
|
from typing import Any
|
|
15
15
|
|
|
16
|
+
from signalwire.core._sync_handlers import is_async_callable
|
|
17
|
+
|
|
16
18
|
logger = logging.getLogger(__name__)
|
|
17
19
|
|
|
18
20
|
|
|
@@ -56,6 +58,15 @@ class MCPServerMixin:
|
|
|
56
58
|
|
|
57
59
|
return tools
|
|
58
60
|
|
|
61
|
+
def _mcp_request_runs_sync_code(self, body: dict[str, Any]) -> bool:
|
|
62
|
+
"""True when ``body`` is a tools/call for a synchronous handler."""
|
|
63
|
+
if not isinstance(body, dict) or body.get("method") != "tools/call":
|
|
64
|
+
return False
|
|
65
|
+
params = body.get("params")
|
|
66
|
+
name = params.get("name", "") if isinstance(params, dict) else ""
|
|
67
|
+
tool = self._mcp_tools().get(name)
|
|
68
|
+
return tool is not None and not is_async_callable(tool.handler)
|
|
69
|
+
|
|
59
70
|
def _handle_mcp_request(
|
|
60
71
|
self, body: dict[str, Any]
|
|
61
72
|
) -> dict[str, Any] | Awaitable[dict[str, Any]]:
|