signalwire-sdk 3.7.2.dev132__tar.gz → 3.7.2.dev134__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.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/CHANGELOG.md +31 -0
- {signalwire_sdk-3.7.2.dev132/signalwire/signalwire_sdk.egg-info → signalwire_sdk-3.7.2.dev134}/PKG-INFO +1 -1
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/cli_guide.md +1 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/search_indexing.md +3 -1
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/search_overview.md +12 -10
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/pyproject.toml +1 -1
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/__init__.py +1 -1
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/agent_server.py +1 -1
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/build_search.py +20 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/document_processor.py +2 -5
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/index_builder.py +10 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/models.py +26 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/query_processor.py +91 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/search_engine.py +71 -8
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/search_service.py +10 -3
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/native_vector_search/skill.py +8 -2
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134/signalwire/signalwire_sdk.egg-info}/PKG-INFO +1 -1
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/LICENSE +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/MANIFEST.in +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/agent_guide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/ai_chat_gateway.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/api_reference.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/architecture.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/bedrock_agent.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/cloud_functions_guide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/configuration.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/contexts_guide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/datamap_guide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/developer_pain_points.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/llm_parameters.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/mcp_gateway_reference.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/mcp_integration.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/pgi_agent_guide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/programmatically_governed_inference.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/sdk_features.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/search_deployment.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/search_integration.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/search_troubleshooting.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/security.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/skills_parameter_schema.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/skills_system.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/swaig_reference.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/swml_service_guide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/third_party_skills.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/docs/web_service.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/Dockerfile.flexible +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/Dockerfile.k8s +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/advanced_datamap_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/auto_vivified_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/basic_swml_service.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/bedrock_agent_run.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/bedrock_agent_test.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/bedrock_server_test.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/bedrock_with_skills.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/call_flow_and_actions_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/comprehensive_dynamic_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/concierge_agent_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/contexts_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/custom_path_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/data_map_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/datasphere_multi_instance_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/datasphere_serverless_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/datasphere_serverless_env_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/datasphere_webhook_env_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/declarative_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/dynamic_info_gatherer_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/dynamic_swml_service.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/faq_bot_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/gather_info_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/gather_per_question_functions_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/info_gatherer_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/joke_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/joke_skill_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/k8s-deployment.yaml +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/kubernetes_ready_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/lambda_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/llm_params_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/mcp_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/mcp_gateway_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/multi_agent_server.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/multi_endpoint_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/pgvector_search_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/quickstart_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/quickstart_relay.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/quickstart_rest.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/receptionist_agent_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/record_call_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/relay_answer_and_welcome.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/room_and_sip_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/search_server_standalone.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/search_with_custom_formatter.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/session_and_state_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/sigmond_native_search.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/sigmond_remote_search.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/sigmond_simple.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/simple_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/simple_dynamic_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/simple_dynamic_enhanced.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/simple_static_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/skills_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/static_files/file.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/static_files/static_files/file.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/step_function_inheritance_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/survey_agent_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/swaig_features_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/swml_service_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/swml_service_routing_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/swmlservice_ai_sidecar.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/swmlservice_swaig_standalone.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/tap_example.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/web_search_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/web_search_multi_instance_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/examples/wikipedia_demo.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/livewire/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/livewire/docs/migration-guide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/livewire/examples/livewire_basic_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/livewire/examples/livewire_handoff.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/livewire/examples/livewire_multi_tool.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/man/sw-agent-init.1 +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/man/sw-pydocs.1 +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp/swml-schema-search/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp/swml-schema-search/swml_schema_mcp.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/.env.example +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/.gitignore +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/Dockerfile +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/certs/.gitignore +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/docker-compose.yml +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/examples/generate_cert.sh +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/mcp-docker.sh +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/sample_config.json +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/test/test_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/test/test_gateway.sh +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/mcp_gateway/test/todo_mcp.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/docs/call-methods.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/docs/client-reference.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/docs/events.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/docs/getting-started.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/docs/messaging.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/examples/relay_answer_and_welcome.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/examples/relay_dial_and_play.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/relay/examples/relay_ivr_connect.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/docs/calling.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/docs/client-reference.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/docs/fabric.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/docs/getting-started.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/docs/namespaces.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_10dlc_registration.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_bind_phone_to_swml_webhook.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_calling_ivr_and_ai.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_calling_play_and_record.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_datasphere_search.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_fabric_conferences_and_routing.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_fabric_subscribers_and_sip.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_fabric_swml_and_callflows.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_manage_resources.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_phone_number_management.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_queues_mfa_and_recordings.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/rest/examples/rest_video_rooms.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/setup.cfg +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/setup.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/AGENTS.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/__main__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/agents/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/agents/bedrock.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/ai_chat/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/ai_chat/client.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/ai_chat/gateway.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/ai_chat/handoff.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/config.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/core/argparse_helpers.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/core/service_loader.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/dokku.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/execution/datamap_exec.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/init_project.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/output/swml_dump.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/pydocs/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/pydocs/_agents_note.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/pydocs/_api.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/pydocs/_bundle.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/pydocs/_files.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/pydocs/_render.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/pydocs/_topics.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/test_swaig.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/_agent_host.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/_sync_handlers.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent/tools/type_inference.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/agent_base.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/auth_handler.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/capabilities.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/config_loader.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/contexts.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/data_map.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/function_result.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/logging_config.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/auth_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/tool_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/mixins/web_mixin.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/post_prompt.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/security/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/security/security_utils.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/security/session_manager.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/security/webhook_middleware.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/security_config.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/semantic_gate.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/skill_base.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/skill_manager.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swaig_function.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swml_builder.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swml_handler.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swml_renderer.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swml_service.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/core/web.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/livewire/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/llms.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/mcp_gateway/gateway_service.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/pom/pom.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/pom/pom_tool.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/prefabs/concierge.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/prefabs/receptionist.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/prefabs/survey.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/py.typed +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/relay/call.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/relay/client.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/relay/message.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/_request_options.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/client.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/migration.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/pgvector_backend.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/claude_skills/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datasphere/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datasphere/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datasphere_serverless/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datetime/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/datetime/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/info_gatherer/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/joke/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/joke/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/math/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/math/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/mcp_gateway/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/native_vector_search/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/play_background_file/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/registry.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/spider/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/spider/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/swml_transfer/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/weather_api/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/web_search/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/web_search/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/wikipedia_search/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/skills/wikipedia_search/skill.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/utils/schema_utils.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/utils/url_validator.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/web/web_service.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire_sdk.egg-info/entry_points.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tests/test_examples.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tests/test_mcp_integration.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/.env.example +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/Dockerfile +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/Dockerfile.multi +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/docker-compose.yml +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/fred.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/fred.sh +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/requirements.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/01-introduction.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/02-setup.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/03-basic-agent.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/04-wikipedia-skill.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/05-custom-functions.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/06-running-testing.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/appendix-complete-code.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/fred/tutorial/appendix-docker-deployment.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/.env.example +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/.gitignore +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/Dockerfile +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/check_docs.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/handlers.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/penny.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/penny.sh +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/requirements.txt +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/reservations.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/test_penny.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/01-why-guardrails.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/02-design-first.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/03-rules-first.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/04-the-shell.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/05-steps-and-scoping.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/06-tools-that-decide.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/07-gather-and-projection.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/08-the-verification-gate.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/09-people-and-endings.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/10-testing-and-running.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/appendix-complete-code.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/appendix-deployment.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/tutorial/appendix-technique-map.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/full-guardrails-agent/workflow.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/README.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/lesson1_first_agent.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/lesson2_knowledge_bases.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/lesson3_multi_agent_systems.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/lesson4_advanced_features.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/lesson5_extending_agents.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/pc_builder.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/sales_agent.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/sales_agent_with_search.py +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/sales_knowledge.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/sales_knowledge.swsearch +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/support_knowledge.md +0 -0
- {signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/tutorial/multi_agents/support_knowledge.swsearch +0 -0
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- `sw-search --query-stopwords` (and `IndexBuilder(query_stopwords=...)`)
|
|
7
|
+
records terms every document in the index is about, such as the product's
|
|
8
|
+
name. The search service and the native_vector_search skill drop them from
|
|
9
|
+
queries before embedding and keyword search, unless fewer than two content
|
|
10
|
+
words would remain, so "what is SignalWire" still searches for SignalWire.
|
|
11
|
+
In a corpus about one product, the name only favours the chunks that spell
|
|
12
|
+
it out: "SignalWire call pricing" ranked phone-number fees above call rates.
|
|
13
|
+
On SignalWire's corpus (58 labelled questions) hit@5 went from 0.88 to 0.95
|
|
14
|
+
and MRR@10 from 0.678 to 0.745; without the guard, a bare "SignalWire" fell
|
|
15
|
+
out of the top 10.
|
|
16
|
+
- Chunks can carry a `rank_weight` between 0 and 1 in their metadata. Search
|
|
17
|
+
multiplies it into the chunk's score, so an index can mark secondary sources,
|
|
18
|
+
such as commentary indexed next to reference material, and the reference
|
|
19
|
+
ranks first when both match. It only demotes: values outside that range are
|
|
20
|
+
ignored.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- Search's same-file penalty now applies per document. It used to key on the
|
|
24
|
+
file a chunk was read from, so in a JSON file holding many documents every
|
|
25
|
+
chunk counted as one document and pushed the others down: in a pricing
|
|
26
|
+
collection, 50 rate cards shared one file, and the per-minute card for
|
|
27
|
+
"outbound call pricing" fell from 9th by relevance to below the top 20. A
|
|
28
|
+
chunk's document is its `document` metadata, else `url`, else `source`, else
|
|
29
|
+
its file, the same key the JSON loader already uses to tell documents apart.
|
|
30
|
+
Indexes with one document per file rank as before.
|
|
31
|
+
- The penalty's diversity pass no longer raises `KeyError` on a result
|
|
32
|
+
without `filename` metadata.
|
|
33
|
+
|
|
3
34
|
## [3.7.2] - 2026-10-14
|
|
4
35
|
|
|
5
36
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: signalwire-sdk
|
|
3
|
-
Version: 3.7.2.
|
|
3
|
+
Version: 3.7.2.dev134
|
|
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
|
|
@@ -2325,6 +2325,7 @@ sw-search <source> [<source> ...] [options]
|
|
|
2325
2325
|
- `--topic-threshold FLOAT` - Threshold for topic-based chunking (default: 0.3)
|
|
2326
2326
|
- `--index-nlp-backend BACKEND` - NLP backend for processing: `nltk` (default) or `spacy`
|
|
2327
2327
|
- `--embed-text {content,processed}` - What the embedding model sees: the chunk as written (`content`, default), or the keyword-search text with tags appended (`processed`), as indexes were built before this option existed
|
|
2328
|
+
- `--query-stopwords TERMS` - Comma-separated terms every document is about, such as your product's name. Recorded in the index; search drops them from queries, unless fewer than two content words would remain (so "what is Acme" still searches for Acme)
|
|
2328
2329
|
- `--split-newlines N` - Split on N or more consecutive newlines, in addition to sentence boundaries
|
|
2329
2330
|
- `--languages LANGS` - Comma-separated language codes (default: en)
|
|
2330
2331
|
|
|
@@ -523,7 +523,9 @@ Common edits during review:
|
|
|
523
523
|
|
|
524
524
|
- Add descriptive chunk IDs (replace auto-generated `chunk_0`, `chunk_1`)
|
|
525
525
|
- Add relevant tags for hybrid search boosting
|
|
526
|
-
- Add URLs to source documentation
|
|
526
|
+
- Add URLs to source documentation. In a JSON file that holds several documents, the URL (or a `document` value in the chunk's metadata) also tells search which chunks belong to the same document. Without one, every chunk in the file counts as one document and they push each other down the results. Make the value identify one document: a `source` shared by the whole collection (for example `"source": "docs-site"` on every chunk) makes every file that uses it count as a single document.
|
|
527
|
+
- If every document is about the same product, build with `--query-stopwords "<product name>"`. A name that every document is about carries no information in a query, and only favours the chunks that happen to spell it out. In one product corpus, "<product> call pricing" ranked the phone-number price cards (which mention porting numbers "into <product>") above the per-minute call rates.
|
|
528
|
+
- Set `rank_weight` (between 0 and 1) on secondary chunks, such as commentary next to reference material, so the reference ranks first when both match
|
|
527
529
|
- Add priority levels (`high`, `normal`, `low`)
|
|
528
530
|
- Link related chunks via `related_chunks`
|
|
529
531
|
- Remove low-value chunks (e.g., header-only content)
|
|
@@ -327,9 +327,10 @@ The algorithm proceeds in these steps:
|
|
|
327
327
|
2. Keyword matching, weighted metadata field matching (category, product, tags, source, section, and description each carry a different weight), and filename matching run against that same pool.
|
|
328
328
|
3. Each candidate is scored. If it has a vector similarity score, that score is the base, and every additional agreeing signal adds a small boost, capped at a fixed maximum. Agreement can reorder near-ties; it cannot let a weak vector match outrank a stronger one.
|
|
329
329
|
4. A candidate found only through keyword or metadata matching, with no vector score, is scaled below the pool's strongest vector match. A non-semantic match can never outrank a genuine semantic one.
|
|
330
|
-
5.
|
|
331
|
-
6.
|
|
332
|
-
7. The
|
|
330
|
+
5. A chunk with a `rank_weight` in its metadata has its score multiplied by it. Only values between 0 and 1 count, so a weight can demote a chunk but never promote it. Use it to mark secondary sources, such as commentary indexed next to reference material, so the reference wins when both match.
|
|
331
|
+
6. Near-duplicate chunks are removed, keeping the highest-scoring copy of each.
|
|
332
|
+
7. Results are penalized when several chunks come from the same document, so one document cannot dominate the result list. The second chunk of a document keeps 85% of its computed score, the third 70%, the fourth 50%, and the fifth or later 40%. A chunk's document is its `document` metadata if set, otherwise its `url`, then its `source`, then the file it was read from. Set `document` or `url` on chunks in a JSON file that holds many documents, or the whole file is treated as one.
|
|
333
|
+
8. The top N results are returned.
|
|
333
334
|
|
|
334
335
|
**Concrete example:**
|
|
335
336
|
|
|
@@ -460,13 +461,14 @@ if __name__ == "__main__":
|
|
|
460
461
|
|
|
461
462
|
When a user asks a question, the following occurs:
|
|
462
463
|
|
|
463
|
-
1.
|
|
464
|
-
2. The
|
|
465
|
-
3.
|
|
466
|
-
4.
|
|
467
|
-
5.
|
|
468
|
-
6.
|
|
469
|
-
7.
|
|
464
|
+
1. If the index was built with `--query-stopwords`, those terms are removed from the query, unless fewer than two content words would remain.
|
|
465
|
+
2. The query is converted to a vector embedding.
|
|
466
|
+
3. The search engine compares the query vector to all chunk vectors in the index.
|
|
467
|
+
4. Chunks are scored by cosine similarity.
|
|
468
|
+
5. Keyword and metadata matches boost scores (hybrid scoring).
|
|
469
|
+
6. Top results (above the distance threshold) are returned.
|
|
470
|
+
7. Results are formatted and provided to the LLM.
|
|
471
|
+
8. The LLM generates an answer grounded in the retrieved content.
|
|
470
472
|
|
|
471
473
|
### Testing Your Search
|
|
472
474
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "signalwire-sdk"
|
|
7
|
-
version = "3.7.2.
|
|
7
|
+
version = "3.7.2.dev134"
|
|
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.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/__init__.py
RENAMED
|
@@ -59,7 +59,7 @@ if TYPE_CHECKING:
|
|
|
59
59
|
from signalwire.utils.schema_utils import SchemaValidationError
|
|
60
60
|
from signalwire.web import WebService
|
|
61
61
|
|
|
62
|
-
__version__ = "3.7.2.
|
|
62
|
+
__version__ = "3.7.2.dev134"
|
|
63
63
|
|
|
64
64
|
# §6.2-python (owner decision: NO packaging split — one package, all deps required;
|
|
65
65
|
# IMPORT-TIME behavior only): the agent/web symbols are lazy-imported via module
|
|
@@ -330,6 +330,17 @@ Documentation: sw-pydocs prints the SDK's installed docs, examples and API.
|
|
|
330
330
|
),
|
|
331
331
|
)
|
|
332
332
|
|
|
333
|
+
parser.add_argument(
|
|
334
|
+
"--query-stopwords",
|
|
335
|
+
default=None,
|
|
336
|
+
help=(
|
|
337
|
+
"Comma-separated terms every document is about, such as your "
|
|
338
|
+
"product's name. Recorded in the index; search drops them from "
|
|
339
|
+
"queries unless the query would be left with fewer than two "
|
|
340
|
+
"content words."
|
|
341
|
+
),
|
|
342
|
+
)
|
|
343
|
+
|
|
333
344
|
parser.add_argument("--verbose", action="store_true", help="Enable verbose output")
|
|
334
345
|
|
|
335
346
|
parser.add_argument(
|
|
@@ -355,6 +366,13 @@ Documentation: sw-pydocs prints the SDK's installed docs, examples and API.
|
|
|
355
366
|
return parser
|
|
356
367
|
|
|
357
368
|
|
|
369
|
+
def _split_terms(value: str | None) -> list[str] | None:
|
|
370
|
+
"""Split a comma-separated --query-stopwords value; None when not given."""
|
|
371
|
+
if not value:
|
|
372
|
+
return None
|
|
373
|
+
return [t.strip() for t in value.split(",") if t.strip()]
|
|
374
|
+
|
|
375
|
+
|
|
358
376
|
def main() -> None:
|
|
359
377
|
"""Main entry point for the build-search command"""
|
|
360
378
|
args = _build_parser().parse_args()
|
|
@@ -531,6 +549,7 @@ def main() -> None:
|
|
|
531
549
|
split_newlines=args.split_newlines,
|
|
532
550
|
index_nlp_backend=args.index_nlp_backend,
|
|
533
551
|
embed_text=args.embed_text,
|
|
552
|
+
query_stopwords=_split_terms(args.query_stopwords),
|
|
534
553
|
verbose=args.verbose,
|
|
535
554
|
semantic_threshold=args.semantic_threshold,
|
|
536
555
|
topic_threshold=args.topic_threshold,
|
|
@@ -642,6 +661,7 @@ def main() -> None:
|
|
|
642
661
|
split_newlines=args.split_newlines,
|
|
643
662
|
index_nlp_backend=args.index_nlp_backend,
|
|
644
663
|
embed_text=args.embed_text,
|
|
664
|
+
query_stopwords=_split_terms(args.query_stopwords),
|
|
645
665
|
verbose=args.verbose,
|
|
646
666
|
semantic_threshold=args.semantic_threshold,
|
|
647
667
|
topic_threshold=args.topic_threshold,
|
|
@@ -95,6 +95,7 @@ else:
|
|
|
95
95
|
magic = None
|
|
96
96
|
|
|
97
97
|
from signalwire.core.logging_config import get_logger
|
|
98
|
+
from signalwire.search.models import document_key
|
|
98
99
|
|
|
99
100
|
logger = get_logger(__name__)
|
|
100
101
|
|
|
@@ -1796,11 +1797,7 @@ class DocumentProcessor:
|
|
|
1796
1797
|
# the heading is reset each time, and a scan of 16,894 chunks
|
|
1797
1798
|
# found no instance -- but that is a property of those inputs,
|
|
1798
1799
|
# not of this loop. Reset when the document changes.
|
|
1799
|
-
doc_key = (
|
|
1800
|
-
json_metadata.get("url")
|
|
1801
|
-
or json_metadata.get("source")
|
|
1802
|
-
or json_metadata.get("filename")
|
|
1803
|
-
)
|
|
1800
|
+
doc_key = document_key(json_metadata)
|
|
1804
1801
|
if doc_key != current_doc:
|
|
1805
1802
|
current_doc = doc_key
|
|
1806
1803
|
current_heading = ""
|
|
@@ -57,6 +57,7 @@ class IndexBuilder:
|
|
|
57
57
|
backend: str = "sqlite",
|
|
58
58
|
connection_string: str | None = None,
|
|
59
59
|
embed_text: str = "content",
|
|
60
|
+
query_stopwords: list[str] | None = None,
|
|
60
61
|
):
|
|
61
62
|
"""
|
|
62
63
|
Initialize the index builder
|
|
@@ -96,6 +97,10 @@ class IndexBuilder:
|
|
|
96
97
|
'content', and 0.562 with content plus tags appended. Your
|
|
97
98
|
corpus may differ; the option exists so you can measure both.
|
|
98
99
|
Keyword search uses processed_content either way.
|
|
100
|
+
query_stopwords: Terms every document in the index is about, such
|
|
101
|
+
as the product's own name. They are recorded in the index, and
|
|
102
|
+
search drops them from queries; see
|
|
103
|
+
query_processor.drop_corpus_terms.
|
|
99
104
|
"""
|
|
100
105
|
self.model_name = model_name
|
|
101
106
|
self.chunking_strategy = chunking_strategy
|
|
@@ -111,6 +116,9 @@ class IndexBuilder:
|
|
|
111
116
|
self.backend = backend
|
|
112
117
|
self.connection_string = connection_string
|
|
113
118
|
self.embed_text = embed_text
|
|
119
|
+
self.query_stopwords = [
|
|
120
|
+
t.strip() for t in (query_stopwords or []) if t and t.strip()
|
|
121
|
+
]
|
|
114
122
|
# SentenceTransformer instance, loaded lazily in _load_model(); the lib
|
|
115
123
|
# ships no stubs, so this is effectively Any once populated.
|
|
116
124
|
self.model: Any = None
|
|
@@ -738,6 +746,7 @@ class IndexBuilder:
|
|
|
738
746
|
"chunk_overlap": str(self.chunk_overlap),
|
|
739
747
|
"preprocessing_version": "1.0",
|
|
740
748
|
"embed_text": self.embed_text,
|
|
749
|
+
"query_stopwords": json.dumps(self.query_stopwords),
|
|
741
750
|
"languages": json.dumps(languages),
|
|
742
751
|
"created_at": datetime.now().isoformat(),
|
|
743
752
|
"sources": json.dumps(
|
|
@@ -962,6 +971,7 @@ class IndexBuilder:
|
|
|
962
971
|
"chunk_overlap": self.chunk_overlap,
|
|
963
972
|
"index_nlp_backend": self.index_nlp_backend,
|
|
964
973
|
"embed_text": self.embed_text,
|
|
974
|
+
"query_stopwords": self.query_stopwords,
|
|
965
975
|
},
|
|
966
976
|
}
|
|
967
977
|
|
{signalwire_sdk-3.7.2.dev132 → signalwire_sdk-3.7.2.dev134}/signalwire/signalwire/search/models.py
RENAMED
|
@@ -8,6 +8,8 @@ See LICENSE file in the project root for full license information.
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import warnings
|
|
11
|
+
from collections.abc import Mapping
|
|
12
|
+
from typing import Any
|
|
11
13
|
|
|
12
14
|
# Embedding model configuration
|
|
13
15
|
MODEL_ALIASES = {
|
|
@@ -40,3 +42,27 @@ def resolve_model_alias(model_name: str) -> str:
|
|
|
40
42
|
if model_name == "large":
|
|
41
43
|
warnings.warn(LARGE_ALIAS_DEPRECATION, DeprecationWarning, stacklevel=2)
|
|
42
44
|
return MODEL_ALIASES.get(model_name, model_name)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# Metadata keys naming the document a chunk came from, most specific first.
|
|
48
|
+
# `document` lets an index state it outright. Without it, a page URL or a
|
|
49
|
+
# repo:path source is the next-best identity, and the file the chunk was read
|
|
50
|
+
# from is the last resort -- which is right for one-document-per-file indexes
|
|
51
|
+
# and wrong for JSON collections, where one file holds many documents.
|
|
52
|
+
DOCUMENT_KEYS = ("document", "url", "source", "filename")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def document_key(metadata: Mapping[str, Any] | None) -> str | None:
|
|
56
|
+
"""Identify the document a chunk belongs to, or None if nothing says.
|
|
57
|
+
|
|
58
|
+
Used wherever "the same document" matters: resetting heading context
|
|
59
|
+
between documents in a JSON file, and penalising several chunks of one
|
|
60
|
+
document in a result list. One definition, so the two cannot disagree.
|
|
61
|
+
"""
|
|
62
|
+
if not metadata:
|
|
63
|
+
return None
|
|
64
|
+
for key in DOCUMENT_KEYS:
|
|
65
|
+
value = metadata.get(key)
|
|
66
|
+
if value:
|
|
67
|
+
return str(value)
|
|
68
|
+
return None
|
|
@@ -370,6 +370,97 @@ stopwords_language_map = {
|
|
|
370
370
|
"tr": "turkish",
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
+
# Used when NLTK's stopword corpus is unavailable, so the guard in
|
|
374
|
+
# drop_corpus_terms still recognises a question with nothing left to say.
|
|
375
|
+
_FALLBACK_STOPWORDS = frozenset(
|
|
376
|
+
{
|
|
377
|
+
"a",
|
|
378
|
+
"an",
|
|
379
|
+
"and",
|
|
380
|
+
"are",
|
|
381
|
+
"as",
|
|
382
|
+
"at",
|
|
383
|
+
"be",
|
|
384
|
+
"by",
|
|
385
|
+
"can",
|
|
386
|
+
"do",
|
|
387
|
+
"does",
|
|
388
|
+
"for",
|
|
389
|
+
"from",
|
|
390
|
+
"how",
|
|
391
|
+
"i",
|
|
392
|
+
"in",
|
|
393
|
+
"is",
|
|
394
|
+
"it",
|
|
395
|
+
"its",
|
|
396
|
+
"me",
|
|
397
|
+
"my",
|
|
398
|
+
"of",
|
|
399
|
+
"on",
|
|
400
|
+
"or",
|
|
401
|
+
"the",
|
|
402
|
+
"this",
|
|
403
|
+
"that",
|
|
404
|
+
"to",
|
|
405
|
+
"vs",
|
|
406
|
+
"versus",
|
|
407
|
+
"what",
|
|
408
|
+
"when",
|
|
409
|
+
"where",
|
|
410
|
+
"which",
|
|
411
|
+
"who",
|
|
412
|
+
"why",
|
|
413
|
+
"with",
|
|
414
|
+
"you",
|
|
415
|
+
"your",
|
|
416
|
+
}
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def drop_corpus_terms(
|
|
421
|
+
query: str, terms: list[str] | tuple[str, ...], language: str = "en"
|
|
422
|
+
) -> str:
|
|
423
|
+
"""Remove terms that every document in an index is about from a query.
|
|
424
|
+
|
|
425
|
+
In a corpus about one product, the product's name carries no information:
|
|
426
|
+
everything is about it. In the query it only rewards the few chunks that
|
|
427
|
+
happen to spell the name out. In SignalWire's own corpus, "SignalWire call
|
|
428
|
+
pricing" ranked the phone-number rate cards first, because each says
|
|
429
|
+
numbers "can be ported into SignalWire", over the per-minute rates the
|
|
430
|
+
question was about. An index declares such terms when it is built
|
|
431
|
+
(`--query-stopwords`), and search drops them here, before embedding and
|
|
432
|
+
keyword matching.
|
|
433
|
+
|
|
434
|
+
A term is kept when dropping it would leave fewer than two content words.
|
|
435
|
+
"What is SignalWire" and a bare "SignalWire" are ABOUT the name, and
|
|
436
|
+
stripping it leaves nothing to search for: measured, a bare "SignalWire"
|
|
437
|
+
fell out of the top 10 without this guard.
|
|
438
|
+
|
|
439
|
+
Matching is case-insensitive, on word boundaries, and takes a possessive
|
|
440
|
+
with it. Terms may be phrases.
|
|
441
|
+
"""
|
|
442
|
+
if not isinstance(terms, (list, tuple)):
|
|
443
|
+
return query
|
|
444
|
+
clean = [t.strip() for t in terms if isinstance(t, str) and t.strip()]
|
|
445
|
+
if not query or not clean:
|
|
446
|
+
return query
|
|
447
|
+
pattern = re.compile(
|
|
448
|
+
r"(?i)\b(?:"
|
|
449
|
+
+ "|".join(r"\s+".join(map(re.escape, t.split())) for t in clean)
|
|
450
|
+
+ r")(?:'s)?\b"
|
|
451
|
+
)
|
|
452
|
+
if not pattern.search(query):
|
|
453
|
+
return query
|
|
454
|
+
stripped = re.sub(r"\s+", " ", pattern.sub(" ", query)).strip()
|
|
455
|
+
try:
|
|
456
|
+
stop = set(
|
|
457
|
+
nltk.corpus.stopwords.words(stopwords_language_map.get(language, "english"))
|
|
458
|
+
)
|
|
459
|
+
except Exception: # corpus not downloaded: fall back to a small fixed list
|
|
460
|
+
stop = set(_FALLBACK_STOPWORDS)
|
|
461
|
+
content = [w for w in re.findall(r"[^\W_]+", stripped.lower()) if w not in stop]
|
|
462
|
+
return stripped if len(content) >= 2 else query
|
|
463
|
+
|
|
373
464
|
|
|
374
465
|
# Function to ensure NLTK resources are downloaded
|
|
375
466
|
def ensure_nltk_resources() -> None:
|
|
@@ -13,6 +13,7 @@ import warnings
|
|
|
13
13
|
from typing import Any, TYPE_CHECKING
|
|
14
14
|
|
|
15
15
|
from signalwire.core.logging_config import get_logger
|
|
16
|
+
from signalwire.search.models import document_key
|
|
16
17
|
|
|
17
18
|
# NDArray is the runtime numpy array type when available, else Any; typed Any
|
|
18
19
|
# because the fallback makes the two branches incompatible to mypy.
|
|
@@ -94,6 +95,27 @@ class SearchEngine:
|
|
|
94
95
|
f"Invalid backend '{backend}'. Must be 'sqlite' or 'pgvector'"
|
|
95
96
|
)
|
|
96
97
|
|
|
98
|
+
@property
|
|
99
|
+
def query_stopwords(self) -> list[str]:
|
|
100
|
+
"""Terms the index was built to drop from queries; see drop_corpus_terms.
|
|
101
|
+
|
|
102
|
+
SQLite indexes keep them in the config table as a JSON list, pgvector
|
|
103
|
+
collections in collection_config.metadata. A missing or malformed value
|
|
104
|
+
means none, never an error: older indexes simply have no such key.
|
|
105
|
+
"""
|
|
106
|
+
config: dict[str, Any] = getattr(self, "config", None) or {}
|
|
107
|
+
raw: Any = config.get("query_stopwords")
|
|
108
|
+
if raw is None and isinstance(config.get("metadata"), dict):
|
|
109
|
+
raw = config["metadata"].get("query_stopwords")
|
|
110
|
+
if isinstance(raw, str):
|
|
111
|
+
try:
|
|
112
|
+
raw = json.loads(raw)
|
|
113
|
+
except ValueError:
|
|
114
|
+
return []
|
|
115
|
+
if not isinstance(raw, list):
|
|
116
|
+
return []
|
|
117
|
+
return [t for t in raw if isinstance(t, str) and t.strip()]
|
|
118
|
+
|
|
97
119
|
def _load_config(self) -> dict[str, str]:
|
|
98
120
|
"""Load index configuration"""
|
|
99
121
|
conn = None
|
|
@@ -312,8 +334,9 @@ class SearchEngine:
|
|
|
312
334
|
2. tag filter (optional)
|
|
313
335
|
3. threshold filter on final score (redundant but safe)
|
|
314
336
|
4. exact-match boost (when original_query provided)
|
|
337
|
+
4b. rank weight — the chunk's own `rank_weight` metadata, if any
|
|
315
338
|
5. content dedup — collapse near-identical chunks, keep highest scorer
|
|
316
|
-
6.
|
|
339
|
+
6. document diversity — decay 2nd/3rd/4th+ chunks of one document
|
|
317
340
|
7. match-type diversity — 40/40/20 hybrid/vector-only/keyword-only
|
|
318
341
|
8. truncate to `count`
|
|
319
342
|
"""
|
|
@@ -377,6 +400,16 @@ class SearchEngine:
|
|
|
377
400
|
r["final_score"] = min(r["final_score"], vector_ceiling * 0.99)
|
|
378
401
|
final_results.sort(key=lambda x: x["final_score"], reverse=True)
|
|
379
402
|
|
|
403
|
+
# 4b. rank weight -- see _rank_weight
|
|
404
|
+
weighted = False
|
|
405
|
+
for r in final_results:
|
|
406
|
+
w = self._rank_weight(r.get("metadata"))
|
|
407
|
+
if w != 1.0:
|
|
408
|
+
r["final_score"] *= w
|
|
409
|
+
weighted = True
|
|
410
|
+
if weighted:
|
|
411
|
+
final_results.sort(key=lambda x: x["final_score"], reverse=True)
|
|
412
|
+
|
|
380
413
|
# 5. content dedup (sorted best-first, so the kept copy is the winner)
|
|
381
414
|
final_results = self._dedupe_by_content(final_results)
|
|
382
415
|
|
|
@@ -1550,10 +1583,36 @@ class SearchEngine:
|
|
|
1550
1583
|
deduped.append(result)
|
|
1551
1584
|
return deduped
|
|
1552
1585
|
|
|
1586
|
+
@staticmethod
|
|
1587
|
+
def _rank_weight(metadata: dict[str, Any] | None) -> float:
|
|
1588
|
+
"""A chunk's declared rank weight: a number in (0, 1], else 1.0.
|
|
1589
|
+
|
|
1590
|
+
Lets an index say some chunks are secondary sources -- commentary next
|
|
1591
|
+
to reference, say -- so that when both match, the reference wins,
|
|
1592
|
+
without the query having to say which kind it wants. It multiplies the
|
|
1593
|
+
final score, so it only ever demotes: nothing can be weighted above
|
|
1594
|
+
what its relevance earned, which keeps the rule that non-semantic
|
|
1595
|
+
signals may reorder results but not choose them. Values outside
|
|
1596
|
+
(0, 1], booleans and non-numbers are ignored rather than trusted.
|
|
1597
|
+
"""
|
|
1598
|
+
w = (metadata or {}).get("rank_weight")
|
|
1599
|
+
if isinstance(w, bool) or not isinstance(w, (int, float)):
|
|
1600
|
+
return 1.0
|
|
1601
|
+
return float(w) if 0.0 < w <= 1.0 else 1.0
|
|
1602
|
+
|
|
1553
1603
|
def _apply_diversity_penalties(
|
|
1554
1604
|
self, results: list[dict[str, Any]], target_count: int
|
|
1555
1605
|
) -> list[dict[str, Any]]:
|
|
1556
|
-
"""Apply penalties to prevent single-
|
|
1606
|
+
"""Apply penalties to prevent single-document dominance while maintaining quality.
|
|
1607
|
+
|
|
1608
|
+
"Document" is document_key(): the chunk's `document`, `url` or `source`
|
|
1609
|
+
metadata before its `filename`. Keying on the file alone treated every
|
|
1610
|
+
chunk of a JSON collection as one document -- 50 separate rate cards in
|
|
1611
|
+
one pricing file decayed each other out of the results, and the
|
|
1612
|
+
per-minute card for "outbound call pricing" fell from 9th by relevance
|
|
1613
|
+
to below the top 20. For one-document-per-file indexes the key is the
|
|
1614
|
+
filename, as before.
|
|
1615
|
+
"""
|
|
1557
1616
|
if not results:
|
|
1558
1617
|
return results
|
|
1559
1618
|
|
|
@@ -1570,7 +1629,7 @@ class SearchEngine:
|
|
|
1570
1629
|
}
|
|
1571
1630
|
|
|
1572
1631
|
for result in results:
|
|
1573
|
-
filename = (result.get("metadata")
|
|
1632
|
+
filename = document_key(result.get("metadata"))
|
|
1574
1633
|
if filename is None:
|
|
1575
1634
|
# No filename signal - skip penalty logic for this result
|
|
1576
1635
|
penalized_result = result.copy()
|
|
@@ -1605,28 +1664,32 @@ class SearchEngine:
|
|
|
1605
1664
|
# Ensure minimum diversity if we have enough results
|
|
1606
1665
|
if len(penalized_results) > target_count:
|
|
1607
1666
|
unique_files = len(
|
|
1608
|
-
{
|
|
1667
|
+
{
|
|
1668
|
+
document_key(r.get("metadata"))
|
|
1669
|
+
for r in penalized_results[:target_count]
|
|
1670
|
+
}
|
|
1609
1671
|
)
|
|
1610
1672
|
|
|
1611
1673
|
# If top results are too homogeneous (e.g., all from 1-2 files)
|
|
1612
1674
|
if unique_files < min(3, target_count):
|
|
1613
1675
|
# Try to inject some diversity
|
|
1614
1676
|
selected = penalized_results[:target_count]
|
|
1615
|
-
seen_files = {r
|
|
1677
|
+
seen_files = {document_key(r.get("metadata")) for r in selected}
|
|
1616
1678
|
|
|
1617
1679
|
# Look for high-quality results from other files
|
|
1618
1680
|
for result in penalized_results[target_count:]:
|
|
1619
1681
|
# Only inject a result from a new file that's reasonably good
|
|
1620
1682
|
# (within 50% of top score)
|
|
1621
1683
|
if (
|
|
1622
|
-
result
|
|
1684
|
+
document_key(result.get("metadata")) not in seen_files
|
|
1623
1685
|
and result["final_score"] > 0.5 * selected[0]["final_score"]
|
|
1624
1686
|
):
|
|
1625
1687
|
# Replace the lowest scoring result from an over-represented file
|
|
1626
1688
|
for i in range(len(selected) - 1, -1, -1):
|
|
1627
|
-
|
|
1689
|
+
key = document_key(selected[i].get("metadata"))
|
|
1690
|
+
if key is not None and file_counts.get(key, 0) > 2:
|
|
1628
1691
|
selected[i] = result
|
|
1629
|
-
seen_files.add(result
|
|
1692
|
+
seen_files.add(document_key(result.get("metadata")))
|
|
1630
1693
|
break
|
|
1631
1694
|
|
|
1632
1695
|
penalized_results[:target_count] = selected
|
|
@@ -39,7 +39,7 @@ else:
|
|
|
39
39
|
except ImportError:
|
|
40
40
|
SentenceTransformer = None
|
|
41
41
|
|
|
42
|
-
from .query_processor import preprocess_query, set_global_model
|
|
42
|
+
from .query_processor import drop_corpus_terms, preprocess_query, set_global_model
|
|
43
43
|
from .search_engine import SearchEngine
|
|
44
44
|
from signalwire.core.security_config import SecurityConfig
|
|
45
45
|
from signalwire.core.config_loader import ConfigLoader
|
|
@@ -564,17 +564,24 @@ class SearchService:
|
|
|
564
564
|
# results for this query until the entry is evicted.
|
|
565
565
|
degraded = False
|
|
566
566
|
|
|
567
|
+
# Terms the index declares every document is about (its product name,
|
|
568
|
+
# usually) carry no information and only reward the chunks that spell
|
|
569
|
+
# them out. See drop_corpus_terms.
|
|
570
|
+
query_text = drop_corpus_terms(
|
|
571
|
+
request.query, getattr(search_engine, "query_stopwords", None) or []
|
|
572
|
+
)
|
|
573
|
+
|
|
567
574
|
# Enhance query
|
|
568
575
|
try:
|
|
569
576
|
enhanced = preprocess_query(
|
|
570
|
-
|
|
577
|
+
query_text,
|
|
571
578
|
language=request.language or "auto",
|
|
572
579
|
vector=True,
|
|
573
580
|
model_name=model_name, # Pass the correct model!
|
|
574
581
|
)
|
|
575
582
|
except Exception as e:
|
|
576
583
|
logger.error(f"Error preprocessing query: {e}")
|
|
577
|
-
enhanced = {"enhanced_text":
|
|
584
|
+
enhanced = {"enhanced_text": query_text, "vector": [], "language": "en"}
|
|
578
585
|
degraded = True
|
|
579
586
|
|
|
580
587
|
# Perform search
|
|
@@ -691,7 +691,10 @@ class NativeVectorSearchSkill(SkillBase):
|
|
|
691
691
|
self.logger.debug("Remote search returned %d results", len(results))
|
|
692
692
|
else:
|
|
693
693
|
# For local searches, preprocess the query locally
|
|
694
|
-
from signalwire.search.query_processor import
|
|
694
|
+
from signalwire.search.query_processor import (
|
|
695
|
+
drop_corpus_terms,
|
|
696
|
+
preprocess_query,
|
|
697
|
+
)
|
|
695
698
|
|
|
696
699
|
# Guaranteed non-None here: the guard above returns early when
|
|
697
700
|
# not use_remote and search_engine is falsy.
|
|
@@ -709,7 +712,10 @@ class NativeVectorSearchSkill(SkillBase):
|
|
|
709
712
|
extra_kwargs["model_name"] = model_for_query # Use model from index
|
|
710
713
|
|
|
711
714
|
enhanced = preprocess_query(
|
|
712
|
-
|
|
715
|
+
drop_corpus_terms(
|
|
716
|
+
query,
|
|
717
|
+
getattr(self.search_engine, "query_stopwords", None) or [],
|
|
718
|
+
),
|
|
713
719
|
language="en",
|
|
714
720
|
vector=True,
|
|
715
721
|
query_nlp_backend=self.query_nlp_backend,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: signalwire-sdk
|
|
3
|
-
Version: 3.7.2.
|
|
3
|
+
Version: 3.7.2.dev134
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|