signalwire-sdk 3.4.3.dev117__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.dev119/CHANGELOG.md +619 -0
- signalwire_sdk-3.4.3.dev119/MANIFEST.in +207 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/PKG-INFO +89 -60
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/README.md +87 -58
- signalwire_sdk-3.4.3.dev119/docs/agent_guide.md +3228 -0
- signalwire_sdk-3.4.3.dev119/docs/ai_chat_gateway.md +315 -0
- signalwire_sdk-3.4.3.dev119/docs/api_reference.md +3438 -0
- signalwire_sdk-3.4.3.dev119/docs/architecture.md +1274 -0
- signalwire_sdk-3.4.3.dev119/docs/bedrock_agent.md +415 -0
- signalwire_sdk-3.4.3.dev119/docs/cli_guide.md +2376 -0
- signalwire_sdk-3.4.3.dev119/docs/cloud_functions_guide.md +491 -0
- signalwire_sdk-3.4.3.dev119/docs/configuration.md +377 -0
- signalwire_sdk-3.4.3.dev119/docs/contexts_guide.md +1534 -0
- signalwire_sdk-3.4.3.dev119/docs/datamap_guide.md +1488 -0
- signalwire_sdk-3.4.3.dev119/docs/developer_pain_points.md +548 -0
- signalwire_sdk-3.4.3.dev119/docs/llm_parameters.md +253 -0
- signalwire_sdk-3.4.3.dev119/docs/mcp_gateway_reference.md +686 -0
- signalwire_sdk-3.4.3.dev119/docs/mcp_integration.md +160 -0
- signalwire_sdk-3.4.3.dev119/docs/pgi_agent_guide.md +1563 -0
- signalwire_sdk-3.4.3.dev119/docs/programmatically_governed_inference.md +269 -0
- signalwire_sdk-3.4.3.dev119/docs/sdk_features.md +499 -0
- signalwire_sdk-3.4.3.dev119/docs/search_deployment.md +1980 -0
- signalwire_sdk-3.4.3.dev119/docs/search_indexing.md +1806 -0
- signalwire_sdk-3.4.3.dev119/docs/search_integration.md +1481 -0
- signalwire_sdk-3.4.3.dev119/docs/search_overview.md +605 -0
- signalwire_sdk-3.4.3.dev119/docs/search_troubleshooting.md +885 -0
- signalwire_sdk-3.4.3.dev119/docs/security.md +474 -0
- signalwire_sdk-3.4.3.dev119/docs/skills_parameter_schema.md +400 -0
- signalwire_sdk-3.4.3.dev119/docs/skills_system.md +533 -0
- signalwire_sdk-3.4.3.dev119/docs/swaig_reference.md +913 -0
- signalwire_sdk-3.4.3.dev119/docs/swml_service_guide.md +627 -0
- signalwire_sdk-3.4.3.dev119/docs/third_party_skills.md +556 -0
- signalwire_sdk-3.4.3.dev119/docs/web_service.md +743 -0
- signalwire_sdk-3.4.3.dev119/examples/Dockerfile.flexible +41 -0
- signalwire_sdk-3.4.3.dev119/examples/Dockerfile.k8s +39 -0
- signalwire_sdk-3.4.3.dev119/examples/README.md +213 -0
- signalwire_sdk-3.4.3.dev119/examples/advanced_datamap_demo.py +235 -0
- signalwire_sdk-3.4.3.dev119/examples/auto_vivified_example.py +422 -0
- signalwire_sdk-3.4.3.dev119/examples/basic_swml_service.py +438 -0
- signalwire_sdk-3.4.3.dev119/examples/bedrock_agent_run.py +29 -0
- signalwire_sdk-3.4.3.dev119/examples/bedrock_agent_test.py +44 -0
- signalwire_sdk-3.4.3.dev119/examples/bedrock_server_test.py +33 -0
- signalwire_sdk-3.4.3.dev119/examples/bedrock_with_skills.py +69 -0
- signalwire_sdk-3.4.3.dev119/examples/call_flow_and_actions_demo.py +246 -0
- signalwire_sdk-3.4.3.dev119/examples/comprehensive_dynamic_agent.py +371 -0
- signalwire_sdk-3.4.3.dev119/examples/concierge_agent_example.py +162 -0
- signalwire_sdk-3.4.3.dev119/examples/contexts_demo.py +346 -0
- signalwire_sdk-3.4.3.dev119/examples/custom_path_agent.py +106 -0
- signalwire_sdk-3.4.3.dev119/examples/data_map_demo.py +321 -0
- signalwire_sdk-3.4.3.dev119/examples/datasphere_multi_instance_demo.py +204 -0
- signalwire_sdk-3.4.3.dev119/examples/datasphere_serverless_demo.py +230 -0
- signalwire_sdk-3.4.3.dev119/examples/datasphere_serverless_env_demo.py +206 -0
- signalwire_sdk-3.4.3.dev119/examples/datasphere_webhook_env_demo.py +226 -0
- signalwire_sdk-3.4.3.dev119/examples/declarative_agent.py +293 -0
- signalwire_sdk-3.4.3.dev119/examples/dynamic_info_gatherer_example.py +151 -0
- signalwire_sdk-3.4.3.dev119/examples/dynamic_swml_service.py +490 -0
- signalwire_sdk-3.4.3.dev119/examples/faq_bot_agent.py +219 -0
- signalwire_sdk-3.4.3.dev119/examples/gather_info_demo.py +84 -0
- signalwire_sdk-3.4.3.dev119/examples/gather_per_question_functions_demo.py +143 -0
- signalwire_sdk-3.4.3.dev119/examples/info_gatherer_example.py +85 -0
- signalwire_sdk-3.4.3.dev119/examples/joke_agent.py +126 -0
- signalwire_sdk-3.4.3.dev119/examples/joke_skill_demo.py +111 -0
- signalwire_sdk-3.4.3.dev119/examples/k8s-deployment.yaml +95 -0
- signalwire_sdk-3.4.3.dev119/examples/kubernetes_ready_agent.py +119 -0
- signalwire_sdk-3.4.3.dev119/examples/lambda_agent.py +136 -0
- signalwire_sdk-3.4.3.dev119/examples/llm_params_demo.py +225 -0
- signalwire_sdk-3.4.3.dev119/examples/mcp_agent.py +122 -0
- signalwire_sdk-3.4.3.dev119/examples/mcp_gateway_demo.py +53 -0
- signalwire_sdk-3.4.3.dev119/examples/multi_agent_server.py +545 -0
- signalwire_sdk-3.4.3.dev119/examples/multi_endpoint_agent.py +276 -0
- signalwire_sdk-3.4.3.dev119/examples/pgvector_search_agent.py +127 -0
- signalwire_sdk-3.4.3.dev119/examples/quickstart_agent.py +40 -0
- signalwire_sdk-3.4.3.dev119/examples/quickstart_relay.py +33 -0
- signalwire_sdk-3.4.3.dev119/examples/quickstart_rest.py +27 -0
- signalwire_sdk-3.4.3.dev119/examples/receptionist_agent_example.py +138 -0
- signalwire_sdk-3.4.3.dev119/examples/record_call_example.py +182 -0
- signalwire_sdk-3.4.3.dev119/examples/relay_answer_and_welcome.py +37 -0
- signalwire_sdk-3.4.3.dev119/examples/room_and_sip_example.py +311 -0
- signalwire_sdk-3.4.3.dev119/examples/search_server_standalone.py +258 -0
- signalwire_sdk-3.4.3.dev119/examples/search_with_custom_formatter.py +195 -0
- signalwire_sdk-3.4.3.dev119/examples/session_and_state_demo.py +180 -0
- signalwire_sdk-3.4.3.dev119/examples/sigmond_native_search.py +353 -0
- signalwire_sdk-3.4.3.dev119/examples/sigmond_remote_search.py +296 -0
- signalwire_sdk-3.4.3.dev119/examples/sigmond_simple.py +452 -0
- signalwire_sdk-3.4.3.dev119/examples/simple_agent.py +469 -0
- signalwire_sdk-3.4.3.dev119/examples/simple_dynamic_agent.py +150 -0
- signalwire_sdk-3.4.3.dev119/examples/simple_dynamic_enhanced.py +280 -0
- signalwire_sdk-3.4.3.dev119/examples/simple_static_agent.py +120 -0
- signalwire_sdk-3.4.3.dev119/examples/skills_demo.py +183 -0
- signalwire_sdk-3.4.3.dev119/examples/static_files/file.txt +1 -0
- signalwire_sdk-3.4.3.dev119/examples/static_files/static_files/file.txt +1 -0
- signalwire_sdk-3.4.3.dev119/examples/step_function_inheritance_demo.py +121 -0
- signalwire_sdk-3.4.3.dev119/examples/survey_agent_example.py +362 -0
- signalwire_sdk-3.4.3.dev119/examples/swaig_features_agent.py +233 -0
- signalwire_sdk-3.4.3.dev119/examples/swml_service_example.py +240 -0
- signalwire_sdk-3.4.3.dev119/examples/swml_service_routing_example.py +194 -0
- signalwire_sdk-3.4.3.dev119/examples/swmlservice_ai_sidecar.py +107 -0
- signalwire_sdk-3.4.3.dev119/examples/swmlservice_swaig_standalone.py +73 -0
- signalwire_sdk-3.4.3.dev119/examples/tap_example.py +342 -0
- signalwire_sdk-3.4.3.dev119/examples/web_search_agent.py +133 -0
- signalwire_sdk-3.4.3.dev119/examples/web_search_multi_instance_demo.py +244 -0
- signalwire_sdk-3.4.3.dev119/examples/wikipedia_demo.py +98 -0
- signalwire_sdk-3.4.3.dev119/livewire/README.md +71 -0
- signalwire_sdk-3.4.3.dev119/livewire/docs/migration-guide.md +117 -0
- signalwire_sdk-3.4.3.dev119/livewire/examples/livewire_basic_agent.py +58 -0
- signalwire_sdk-3.4.3.dev119/livewire/examples/livewire_handoff.py +87 -0
- signalwire_sdk-3.4.3.dev119/livewire/examples/livewire_multi_tool.py +70 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/man/sw-agent-init.1 +6 -0
- signalwire_sdk-3.4.3.dev119/man/sw-pydocs.1 +82 -0
- signalwire_sdk-3.4.3.dev119/mcp/swml-schema-search/README.md +183 -0
- signalwire_sdk-3.4.3.dev119/mcp/swml-schema-search/swml_schema_mcp.py +440 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/.env.example +36 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/.gitignore +37 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/Dockerfile +26 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/README.md +343 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/certs/.gitignore +9 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/docker-compose.yml +47 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/examples/generate_cert.sh +28 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/mcp-docker.sh +211 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/sample_config.json +71 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/test/test_agent.py +112 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/test/test_gateway.sh +71 -0
- signalwire_sdk-3.4.3.dev119/mcp_gateway/test/todo_mcp.py +340 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/pyproject.toml +8 -4
- signalwire_sdk-3.4.3.dev119/relay/README.md +83 -0
- signalwire_sdk-3.4.3.dev119/relay/docs/call-methods.md +545 -0
- signalwire_sdk-3.4.3.dev119/relay/docs/client-reference.md +157 -0
- signalwire_sdk-3.4.3.dev119/relay/docs/events.md +140 -0
- signalwire_sdk-3.4.3.dev119/relay/docs/getting-started.md +147 -0
- signalwire_sdk-3.4.3.dev119/relay/docs/messaging.md +202 -0
- signalwire_sdk-3.4.3.dev119/relay/examples/relay_answer_and_welcome.py +37 -0
- signalwire_sdk-3.4.3.dev119/relay/examples/relay_dial_and_play.py +69 -0
- signalwire_sdk-3.4.3.dev119/relay/examples/relay_ivr_connect.py +123 -0
- signalwire_sdk-3.4.3.dev119/rest/README.md +92 -0
- signalwire_sdk-3.4.3.dev119/rest/docs/calling.md +299 -0
- signalwire_sdk-3.4.3.dev119/rest/docs/client-reference.md +154 -0
- signalwire_sdk-3.4.3.dev119/rest/docs/fabric.md +183 -0
- signalwire_sdk-3.4.3.dev119/rest/docs/getting-started.md +120 -0
- signalwire_sdk-3.4.3.dev119/rest/docs/namespaces.md +317 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_10dlc_registration.py +148 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_bind_phone_to_swml_webhook.py +59 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_calling_ivr_and_ai.py +181 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_calling_play_and_record.py +136 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_datasphere_search.py +72 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_fabric_conferences_and_routing.py +138 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_fabric_subscribers_and_sip.py +99 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_fabric_swml_and_callflows.py +92 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_manage_resources.py +58 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_phone_number_management.py +164 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_queues_mfa_and_recordings.py +124 -0
- signalwire_sdk-3.4.3.dev119/rest/examples/rest_video_rooms.py +158 -0
- signalwire_sdk-3.4.3.dev119/setup.py +57 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/AGENTS.md +11 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/__init__.py +9 -3
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/__main__.py +15 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agent_server.py +89 -198
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/bedrock.py +40 -45
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/__init__.py +29 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/build_search.py +86 -153
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/config.py +2 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/argparse_helpers.py +54 -14
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/dokku.py +2 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/datamap_exec.py +87 -91
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/init_project.py +13 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/swml_dump.py +12 -5
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/__init__.py +319 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_agents_note.py +97 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_api.py +269 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_bundle.py +155 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_files.py +163 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_render.py +477 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/cli/pydocs/_topics.py +1070 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/test_swaig.py +61 -7
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/_sync_handlers.py +113 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/type_inference.py +24 -5
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent_base.py +257 -84
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/contexts.py +2 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/data_map.py +16 -9
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/function_result.py +17 -12
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/logging_config.py +84 -47
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/auth_mixin.py +3 -15
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/mixins/mcp_server_mixin.py +198 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/core/mixins/serverless_mixin.py +703 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/tool_mixin.py +24 -4
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/web_mixin.py +341 -160
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/security_utils.py +1 -1
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/session_manager.py +5 -3
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_middleware.py +46 -13
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security_config.py +6 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_manager.py +21 -1
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_function.py +30 -2
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_service.py +136 -44
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/__init__.py +3 -3
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/llms.txt +70 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/gateway_service.py +61 -1
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/client.py +2 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/client.py +2 -0
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/search/__init__.py +143 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/document_processor.py +31 -19
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/index_builder.py +12 -1
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/migration.py +12 -153
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/models.py +13 -2
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/pgvector_backend.py +20 -5
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_engine.py +11 -2
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/search_service.py +37 -9
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/README.md +47 -40
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/README.md +38 -12
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/README.md +28 -14
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/README.md +42 -2
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/skill.py +6 -6
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/README.md +65 -17
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/skill.py +6 -6
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/README.md +33 -4
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/README.md +7 -2
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/README.md +22 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/README.md +46 -17
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/README.md +32 -11
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/README.md +83 -6
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/skill.py +133 -65
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/README.md +26 -5
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/README.md +65 -35
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/skill.py +192 -49
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/README.md +52 -9
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/README.md +54 -17
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/skills/web_search/README.md +220 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill.py +16 -9
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/README.md +57 -16
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/skill.py +16 -4
- signalwire_sdk-3.4.3.dev119/signalwire/signalwire/utils/url_validator.py +243 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/PKG-INFO +89 -60
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/SOURCES.txt +213 -1
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/entry_points.txt +1 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/tests/test_mcp_integration.py +100 -18
- signalwire_sdk-3.4.3.dev119/tutorial/fred/.env.example +20 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/Dockerfile +40 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/Dockerfile.multi +50 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/docker-compose.yml +60 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/fred.py +206 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/fred.sh +175 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/requirements.txt +1 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/01-introduction.md +138 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/02-setup.md +331 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/03-basic-agent.md +358 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/04-wikipedia-skill.md +313 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/05-custom-functions.md +378 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/06-running-testing.md +638 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/README.md +56 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/appendix-complete-code.md +568 -0
- signalwire_sdk-3.4.3.dev119/tutorial/fred/tutorial/appendix-docker-deployment.md +492 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/.env.example +28 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/.gitignore +8 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/Dockerfile +17 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/check_docs.py +163 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/handlers.py +361 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/penny.py +205 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/penny.sh +61 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/requirements.txt +5 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/reservations.py +764 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/test_penny.py +588 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/01-why-guardrails.md +136 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/02-design-first.md +139 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/03-rules-first.md +322 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/04-the-shell.md +193 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/05-steps-and-scoping.md +203 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/06-tools-that-decide.md +340 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/07-gather-and-projection.md +145 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/08-the-verification-gate.md +273 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/09-people-and-endings.md +262 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/10-testing-and-running.md +263 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/README.md +102 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/appendix-complete-code.md +1557 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/appendix-deployment.md +184 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/tutorial/appendix-technique-map.md +116 -0
- signalwire_sdk-3.4.3.dev119/tutorial/full-guardrails-agent/workflow.py +181 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/README.md +266 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson1_first_agent.md +472 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson2_knowledge_bases.md +523 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson3_multi_agent_systems.md +486 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson4_advanced_features.md +802 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/lesson5_extending_agents.md +955 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/pc_builder.py +588 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_agent.py +99 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_agent_with_search.py +132 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_knowledge.md +139 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/sales_knowledge.swsearch +0 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/support_knowledge.md +256 -0
- signalwire_sdk-3.4.3.dev119/tutorial/multi_agents/support_knowledge.swsearch +0 -0
- signalwire_sdk-3.4.3.dev117/setup.py +0 -12
- signalwire_sdk-3.4.3.dev117/signalwire/signalwire/cli/__init__.py +0 -16
- signalwire_sdk-3.4.3.dev117/signalwire/signalwire/core/mixins/mcp_server_mixin.py +0 -145
- signalwire_sdk-3.4.3.dev117/signalwire/signalwire/core/mixins/serverless_mixin.py +0 -543
- signalwire_sdk-3.4.3.dev117/signalwire/signalwire/search/__init__.py +0 -146
- signalwire_sdk-3.4.3.dev117/signalwire/signalwire/skills/web_search/README.md +0 -163
- signalwire_sdk-3.4.3.dev117/signalwire/signalwire/utils/url_validator.py +0 -94
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/LICENSE +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/man/sw-search.1 +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/man/swaig-test.1 +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/setup.cfg +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/agents/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/client.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/gateway.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/ai_chat/handoff.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/agent_loader.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/dynamic_config.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/core/service_loader.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/execution/webhook_exec.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/output/output_formatter.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_generation.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/data_overrides.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/simulation/mock_env.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/swaig_test_wrapper.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/cli/types.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/_agent_host.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/config/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/deployment/handlers/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/prompt/manager.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/routing/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/security/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/swml/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/decorator.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/agent/tools/registry.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/auth_handler.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/capabilities.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/config_loader.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/_mixin_host.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/ai_config_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/prompt_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/skill_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/mixins/state_mixin.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/pom_builder.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/post_prompt_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/security/webhook_validator.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/skill_base.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_actions_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swaig_request_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_builder.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_handler.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_renderer.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/swml_verbs_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/core/web.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/livewire/plugins.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/mcp_manager.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/mcp_gateway/session_manager.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/pom/pom_tool.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/concierge.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/faq_bot.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/info_gatherer.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/receptionist.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/prefabs/survey.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/py.typed +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/call.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/constants.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/event.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/message.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/relay/protocol_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_base.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_pagination.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/_request_options.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/call_handler.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/_client_tree_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/addresses.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/calling_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/chat_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/datasphere_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fabric_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/fax_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/imported_numbers.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/logs_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/lookup.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/message_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/messages_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/mfa.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/number_groups.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/phone_numbers.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/project_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/projects_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/pubsub_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/queues.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/recordings.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/registry.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/relay_rest_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/short_codes.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/sip_profile.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/swml_webhooks_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/verified_callers.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/video_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_resources_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/rest/namespaces/voice_types_generated.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/schema.json +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/search/query_processor.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/api_ninjas_trivia/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/claude_skills/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/datetime/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/google_maps/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/info_gatherer/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/joke/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/math/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/mcp_gateway/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/native_vector_search/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/play_background_file/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/registry.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/spider/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/swml_transfer/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/weather_api/skill.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_improved.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/web_search/skill_original.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/pom_utils.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/schema_utils.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/token_generators.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/utils/validators.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/__init__.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire/web/web_service.py +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/dependency_links.txt +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/requires.txt +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/signalwire/signalwire_sdk.egg-info/top_level.txt +0 -0
- {signalwire_sdk-3.4.3.dev117 → signalwire_sdk-3.4.3.dev119}/tests/test_examples.py +0 -0
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
Webhook signatures and SWAIG tokens are now enforced on every path, including
|
|
6
|
+
serverless. Skills that fetch URLs no longer reach internal addresses through
|
|
7
|
+
redirects, the agent's `/mcp` endpoint requires basic auth, and `async def`
|
|
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.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- `sw-pydocs`: the SDK's documentation for the installed version, for people
|
|
14
|
+
and coding agents. With no arguments it prints an index; `sw-pydocs <topic>`
|
|
15
|
+
covers an area, with the installed docs to read, examples and API names;
|
|
16
|
+
`sw-pydocs api <name>` prints a signature, docstring and members from the
|
|
17
|
+
installed code; and `examples`, `grep`, `show` and `path` find the installed
|
|
18
|
+
files. `python -m signalwire` runs it too.
|
|
19
|
+
- The wheel installs the docs, examples and tutorials, under
|
|
20
|
+
`signalwire/_docs/`, so it's about twice as large (1.7 MB).
|
|
21
|
+
- `sw-pydocs init` adds a section to a project's `AGENTS.md` that tells coding
|
|
22
|
+
agents to use `sw-pydocs`, and `sw-agent-init` writes it into new projects.
|
|
23
|
+
- The package's `llms.txt` lists the installed docs.
|
|
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.
|
|
51
|
+
- Importing `signalwire.cli` no longer imports `swaig-test`, so the SDK's other
|
|
52
|
+
commands start about 0.8 seconds sooner.
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
- Security: `serve()` (and so `run()`) registered its catch-all route before the
|
|
56
|
+
agent's router, so every request reached the handlers without the webhook
|
|
57
|
+
signature check. With a `signing_key` set, an unsigned `POST` to the SWML,
|
|
58
|
+
SWAIG or post-prompt endpoint was accepted. The router now comes first, and
|
|
59
|
+
the catch-alls in `serve()`, `mount()` and `AgentServer` run the same check
|
|
60
|
+
before dispatching, so the agent's bare route and slash variants such as
|
|
61
|
+
`/agent//swaig` are covered too.
|
|
62
|
+
- Security: a `secure=True` SWAIG function ran when the request carried no
|
|
63
|
+
token at all, or a token but no `call_id`; only a wrong token was refused.
|
|
64
|
+
Now a secure function runs only with a valid token for that function and
|
|
65
|
+
call. The token is checked against the agent that runs the function, so a
|
|
66
|
+
secure tool registered by per-call configuration needs its token too.
|
|
67
|
+
- Security: routing-callback paths (`register_routing_callback`) render SWML
|
|
68
|
+
like the root, and now need a signature like the root when a `signing_key`
|
|
69
|
+
is set.
|
|
70
|
+
- Tokens for a call whose id contains a dot (composed conversation ids such as
|
|
71
|
+
`root.2`) never validated, so that call's secure functions were refused.
|
|
72
|
+
- Security: a `POST` to the post-prompt endpoint now needs the token minted
|
|
73
|
+
into the post-prompt URL. It was validated only when present, and processed
|
|
74
|
+
either way. A request whose URL and body name different calls is refused,
|
|
75
|
+
so one call's token can't deliver another call's summary.
|
|
76
|
+
- Security: serverless requests (Lambda, CGI, Cloud Functions, Azure Functions,
|
|
77
|
+
and `AgentServer`'s CGI and Lambda modes) never checked signatures or SWAIG
|
|
78
|
+
tokens, and `AgentServer`'s serverless modes didn't check basic auth. They now
|
|
79
|
+
share one request path with the web server's rules: running a function or
|
|
80
|
+
delivering a summary takes a POST, and every POST needs a valid signature
|
|
81
|
+
when a `signing_key` is set, whatever its path.
|
|
82
|
+
- Serverless: post-prompt summaries reach `on_summary`, with the same token
|
|
83
|
+
check as on the web server; before, the post-prompt URL was treated as a
|
|
84
|
+
function name and the summary was lost.
|
|
85
|
+
- Serverless: SWML is rendered for the call the request names, with per-call
|
|
86
|
+
configuration applied (it sees the request's query and headers), so its
|
|
87
|
+
tokens validate when the call's functions run. Function calls get the same
|
|
88
|
+
per-call configuration, so a tool it registers can run.
|
|
89
|
+
Tool calls on a route other than `/` now reach the function (they failed with
|
|
90
|
+
"Function 'agent/swaig' not found"), as do CGI calls to `/swaig` and Azure
|
|
91
|
+
calls whose URL has a query string. CGI responses now carry a status and
|
|
92
|
+
headers, `AgentServer` passes a function its arguments rather than the whole
|
|
93
|
+
request body, and `AgentServer` serves an agent registered at `/`.
|
|
94
|
+
- Serverless signature checks rebuild the public URL the way the web server
|
|
95
|
+
does. Behind trusted forwarded headers the platform's path prefix (a CGI
|
|
96
|
+
script, an Azure function app) is kept, and for API Gateway REST events,
|
|
97
|
+
which lose the query's original encoding, both encodings are tried.
|
|
98
|
+
- `get_app()` serves the agent's route without a trailing slash (it answered
|
|
99
|
+
204), and `/agentswaig` is no longer treated as `/agent/swaig`.
|
|
100
|
+
- Logging: until something configures logging, SDK loggers printed every
|
|
101
|
+
level, debug included, to stdout. They now write through stdlib logging and
|
|
102
|
+
are silent until `configure_logging()` runs (as `serve()` and `run()` do) or
|
|
103
|
+
the host app configures logging. `swaig-test --verbose` turns them on, and
|
|
104
|
+
`swaig-test --dump-swml --raw` prints clean JSON. Every SDK logger now lives
|
|
105
|
+
under the `signalwire` namespace (`agent_base` is `signalwire.agent_base`),
|
|
106
|
+
so the SDK no longer shares, or reconfigures, a host app's logger that
|
|
107
|
+
happens to have the same name.
|
|
108
|
+
- `wikipedia_search` sends a User-Agent; Wikipedia answered 403 without one.
|
|
109
|
+
- Security: the spider and web_search skills checked a URL before fetching it,
|
|
110
|
+
then followed redirects, so a public page that redirected to an internal
|
|
111
|
+
address, such as a cloud metadata service, was fetched and returned. A
|
|
112
|
+
hostname whose DNS answer changed between the check and the connection had
|
|
113
|
+
the same effect. They now check every request, redirects included, and
|
|
114
|
+
refuse a connection to a private or internal address. `validate_url()` also
|
|
115
|
+
blocks IPv4-mapped IPv6 addresses such as `::ffff:169.254.169.254`, and the
|
|
116
|
+
unspecified address.
|
|
117
|
+
- Security: the agent's `/mcp` endpoint (`enable_mcp_server()`) had no
|
|
118
|
+
authentication, and found none of the agent's tools: `tools/list` was empty
|
|
119
|
+
and `tools/call` answered "Unknown tool". It now requires the agent's basic
|
|
120
|
+
auth credentials, lists and calls the tools the agent runs itself (not
|
|
121
|
+
DataMap or external webhook tools), and awaits `async def` handlers.
|
|
122
|
+
- Security: the MCP gateway's sample and generated configurations listen on
|
|
123
|
+
`0.0.0.0` with the published password `changeme`. While that password is in
|
|
124
|
+
use, the gateway now listens on `127.0.0.1` only, and logs a warning.
|
|
125
|
+
- Tool handlers defined with `async def` never ran. The SDK returned their
|
|
126
|
+
coroutine, and `/swaig` answered with its repr. `/swaig` now awaits them on
|
|
127
|
+
the request's event loop, and serverless, `swaig-test` and
|
|
128
|
+
`SWAIGFunction.execute()` run them to completion.
|
|
129
|
+
- Constructor arguments take precedence over an agent's config file, as
|
|
130
|
+
documented. The file's `service.name` always replaced the `name` passed to
|
|
131
|
+
`AgentBase`, and its route and host replaced a `route="/"` or
|
|
132
|
+
`host="0.0.0.0"` passed on purpose.
|
|
133
|
+
- `get_basic_auth_credentials(include_source=True)` reports where the
|
|
134
|
+
credentials came from, recorded when they were resolved. It guessed from
|
|
135
|
+
their values, and credentials passed to the constructor could show as
|
|
136
|
+
generated.
|
|
137
|
+
- native_vector_search: logs no longer include the password in `remote_url`,
|
|
138
|
+
and log the caller's query, the tool arguments, and error details that can
|
|
139
|
+
echo the query at DEBUG only. The SWAIG request isn't logged.
|
|
140
|
+
- native_vector_search: the pgvector auto-build appended another full copy of
|
|
141
|
+
every chunk on each start, and ignored `overwrite`. It now builds a
|
|
142
|
+
collection only when it doesn't exist, or rebuilds it when `overwrite` is
|
|
143
|
+
set. If it can't tell whether the collection exists, it logs an error and
|
|
144
|
+
doesn't build. `IndexBuilder.build_index()` accepts `overwrite`.
|
|
145
|
+
- pgvector: `overwrite` failed on a database with no collections yet.
|
|
146
|
+
- A context step that lists a tool the agent doesn't have made rendering fail
|
|
147
|
+
with "Missing required field 'prompt'", and the reason was only logged,
|
|
148
|
+
which `swaig-test` suppresses by default. Rendering now raises the reason:
|
|
149
|
+
the step, the missing tool and the tools that exist.
|
|
150
|
+
- Search service: the query cache ignored `similarity_threshold` and
|
|
151
|
+
`language`, so a repeated query with a stricter threshold got the earlier
|
|
152
|
+
results, and it cached the empty results of a failed search. It no longer
|
|
153
|
+
logs the caller's query at INFO on a cache hit.
|
|
154
|
+
- Search: both markdown chunkers recorded sibling headings as parent and
|
|
155
|
+
child in a document that starts at `##` or skips a level. Section paths now
|
|
156
|
+
follow each heading's real level. This changes the `section`, `h1`/`h2`,
|
|
157
|
+
`depth:N` tags and `metadata_text` of affected chunks in indexes built from
|
|
158
|
+
now on.
|
|
159
|
+
- Search: `SearchIndexMigrator.migrate_pgvector_to_sqlite()` deleted the
|
|
160
|
+
output index, wrote one with no chunks, and reported success. Chunk export
|
|
161
|
+
was never implemented, so it now raises `NotImplementedError` before it
|
|
162
|
+
connects or touches the output path.
|
|
163
|
+
- Search: importing `signalwire.search` no longer imports the model stack, so
|
|
164
|
+
`sw-search` starts in about a second instead of 15. `openpyxl` is imported
|
|
165
|
+
only to read an Excel file.
|
|
166
|
+
- `sw-search --help` lists every option; it omitted `--backend`,
|
|
167
|
+
`--connection-string`, `--overwrite`, `--output-dir` and `--output-format`.
|
|
168
|
+
- `sw-search remote` accepts `--user` and `--password`, and no longer prints
|
|
169
|
+
the endpoint's password in verbose output or errors. Its threshold option is
|
|
170
|
+
`--similarity-threshold`, since higher is stricter; `--distance-threshold`
|
|
171
|
+
still works.
|
|
172
|
+
- `swaig-test`: the DataMap simulator accepts a webhook that returns a JSON
|
|
173
|
+
array, arguments the function doesn't declare get a warning, and
|
|
174
|
+
`--aws-api-gateway-id` and `--aws-stage` now simulate an API Gateway URL.
|
|
175
|
+
The DataMap simulator read a webhook's object response under `response.`,
|
|
176
|
+
where the platform reads it from the root, and it didn't expand the `lc`
|
|
177
|
+
and `enc` helpers or nested templates; it now does, and it points out a
|
|
178
|
+
`${response.…}` that doesn't resolve.
|
|
179
|
+
`--dump-swml` showed whatever a per-call configuration callback adds twice;
|
|
180
|
+
it shows it once, as the server sends it. It can also dump a plain
|
|
181
|
+
`SWMLService`, and `--help` lists `--call-id`.
|
|
182
|
+
- `BedrockAgent` renders `max_tokens`, `presence_penalty` and
|
|
183
|
+
`frequency_penalty`, and `set_prompt_llm_params()` accepts the settings the
|
|
184
|
+
Bedrock prompt defines. The examples use voices Bedrock offers.
|
|
185
|
+
- spider: `follow_robots_txt` is enforced, redirects included. The parameter
|
|
186
|
+
schema's defaults and `extract_type` values now match what the skill does.
|
|
187
|
+
- Five skills declared parameter ranges as `minimum`/`maximum`; every built-in
|
|
188
|
+
skill now uses `min`/`max`.
|
|
189
|
+
- The SWML schema search MCP server in `mcp/swml-schema-search/` finds
|
|
190
|
+
`schema.json` without `SWML_SCHEMA_PATH`.
|
|
191
|
+
- The MCP gateway's Docker image builds and runs, and Compose passes its
|
|
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.
|
|
202
|
+
|
|
203
|
+
### Deprecated
|
|
204
|
+
- `keyword_weight` (`SearchEngine.search()`, the pgvector backend,
|
|
205
|
+
native_vector_search and `sw-search --keyword-weight`). It never changed
|
|
206
|
+
ranking, and passing it now warns.
|
|
207
|
+
- The `large` model alias, which loads the same model as `base`. Use `base`.
|
|
208
|
+
- spider's `concurrent_requests`, which was never used, and the `extract_type`
|
|
209
|
+
values `clean_text`, `full_text`, `html` and `custom`, which work as
|
|
210
|
+
`fast_text` with a warning.
|
|
211
|
+
|
|
212
|
+
### Removed
|
|
213
|
+
- The standalone copies of the MCP gateway service in `mcp_gateway/`
|
|
214
|
+
(`gateway_service.py`, `mcp_manager.py`, `session_manager.py` and
|
|
215
|
+
`requirements.txt`). The Docker image runs the packaged `mcp-gateway`
|
|
216
|
+
command.
|
|
217
|
+
|
|
218
|
+
### Notes for upgraders
|
|
219
|
+
- Calling a secure function directly, for example with `curl`, now needs the
|
|
220
|
+
token from the function's `web_hook_url` in the SWML, fetched with
|
|
221
|
+
`?call_id=<id>`. `swaig-test` is unaffected. SignalWire's own requests
|
|
222
|
+
already carry the token.
|
|
223
|
+
- A serverless agent with a `signing_key` now validates signatures. If its
|
|
224
|
+
requests start failing with 403, the platform sees a different URL than the
|
|
225
|
+
one SignalWire called; set `SWML_PROXY_URL_BASE` to the public URL.
|
|
226
|
+
- An app that embeds an agent (`get_app()`, `as_router()`) no longer gets SDK
|
|
227
|
+
log output on stdout by default. Configure `logging`, or call
|
|
228
|
+
`signalwire.configure_logging()`.
|
|
229
|
+
- SDK logger names gained a `signalwire.` prefix. Code that configured a short
|
|
230
|
+
name such as `logging.getLogger("agent_base")` should use
|
|
231
|
+
`signalwire.agent_base`, or the `signalwire` namespace.
|
|
232
|
+
- A serverless function call must be a POST; other methods get 405.
|
|
233
|
+
- An MCP client that calls an agent's `/mcp` endpoint must send the agent's
|
|
234
|
+
basic auth credentials.
|
|
235
|
+
- The MCP gateway, with the published password, listens on `127.0.0.1` only.
|
|
236
|
+
Set `auth_password` (or `MCP_AUTH_PASSWORD`) to accept other connections.
|
|
237
|
+
Compose now requires `MCP_AUTH_PASSWORD`, and the sample configuration,
|
|
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.
|
|
254
|
+
- The MCP gateway's Docker image installs `signalwire-sdk` from PyPI (pin one
|
|
255
|
+
with `--build-arg SDK_VERSION=x.y.z`), so it gets these fixes only from a
|
|
256
|
+
release that includes them.
|
|
257
|
+
- The spider and web_search skills fetch pages directly, ignoring
|
|
258
|
+
`HTTP_PROXY` and `HTTPS_PROXY`, because through a proxy the address check
|
|
259
|
+
can't apply. To fetch through a proxy that blocks private destinations
|
|
260
|
+
itself, set `SWML_URL_FETCH_USE_PROXY=true`. web_search's Google API request
|
|
261
|
+
still uses the proxy.
|
|
262
|
+
- With `follow_robots_txt` on, the spider skips pages the site's robots.txt
|
|
263
|
+
disallows. It was ignored before.
|
|
264
|
+
- A pgvector collection that the auto-build appended to on each start holds
|
|
265
|
+
duplicate chunks. Rebuild it once with `overwrite` set.
|
|
266
|
+
- Rebuild markdown indexes to get the corrected section paths; existing
|
|
267
|
+
indexes don't change.
|
|
268
|
+
- `migrate_pgvector_to_sqlite()` raises `NotImplementedError`. Rebuild the
|
|
269
|
+
SQLite index from the source documents instead.
|
|
270
|
+
- A subclass that passes its own `route="/"` default to `AgentBase` now
|
|
271
|
+
overrides a route set in the config file, even when its caller didn't pass a
|
|
272
|
+
route. Forward only the arguments the caller gave.
|
|
273
|
+
- The docs showed DataMap templates reading a webhook's response as
|
|
274
|
+
`${response.field}`, which the platform doesn't resolve: it reads the JSON
|
|
275
|
+
response from the root, as `${field}`, and arguments as `${args.name}`.
|
|
276
|
+
Check DataMap tools written from the old docs.
|
|
277
|
+
- Code that reads `minimum`/`maximum` from a skill's parameter schema should
|
|
278
|
+
read `min`/`max`.
|
|
279
|
+
- The credential source is `provided`, `environment`, `config file` or
|
|
280
|
+
`generated`. `SWMLService` returned `auto-generated`, and `config file` is
|
|
281
|
+
new.
|
|
282
|
+
|
|
283
|
+
## [3.4.3] - 2026-09-17
|
|
284
|
+
|
|
285
|
+
AI Chat gateway: browser-volunteered page context.
|
|
286
|
+
|
|
287
|
+
### Added
|
|
288
|
+
- `ChatGateway` forwards an optional `user_meta_data` object from the browser
|
|
289
|
+
to the chat service, reaching your agent's config endpoint at
|
|
290
|
+
`params.user_meta_data`. It exists so a chat agent can tailor its greeting
|
|
291
|
+
from page context the way a voice agent already does from dial-time
|
|
292
|
+
`userVariables` — send the same structure on both and one parse serves both
|
|
293
|
+
transports. The service reads it only on the call that *creates* the
|
|
294
|
+
conversation, so it is a snapshot taken at the greeting rather than a live
|
|
295
|
+
feed; see `docs/ai_chat_gateway.md`. It is the single field the gateway
|
|
296
|
+
forwards rather than overwrites, so it is bounded (8 KiB serialized, `413`
|
|
297
|
+
past that; `400` if not an object) and stays nested under its own key where
|
|
298
|
+
it cannot displace the conversation id or `config_url`. Browser-authored:
|
|
299
|
+
treat it as a visitor's claim, never as authority.
|
|
300
|
+
|
|
301
|
+
## [3.4.2] - 2026-09-17
|
|
302
|
+
|
|
303
|
+
Search-index and webhook-signature fixes.
|
|
304
|
+
|
|
305
|
+
### Fixed
|
|
306
|
+
- Search: the FTS5 keyword index is now populated at build time. `chunks_fts` is
|
|
307
|
+
an external-content table, so nothing filled it and `MATCH` returned nothing on
|
|
308
|
+
a freshly built `.swsearch` — keyword search silently degraded to a LIKE scan.
|
|
309
|
+
Rebuild existing indexes to gain working keyword search.
|
|
310
|
+
- Search: the zero-embedding fallback for a chunk that fails to embed now matches
|
|
311
|
+
the loaded model's dimension instead of a hardcoded 768, which corrupted
|
|
312
|
+
indexes built with a 384-dim model (the mini/all-MiniLM default).
|
|
313
|
+
|
|
314
|
+
### Added
|
|
315
|
+
- Webhook signature validation now accepts the stronger
|
|
316
|
+
`X-SignalWire-Sha256-Signature` header (HMAC-SHA256), preferred over the SHA-1
|
|
317
|
+
`X-SignalWire-Signature` when present and falling back to it so existing
|
|
318
|
+
deployments keep working. New `validate_webhook_signature_sha256()` and
|
|
319
|
+
`SIGNALWIRE_SHA256_SIGNATURE_HEADER` are exported from `core/security`.
|
|
320
|
+
|
|
321
|
+
## [3.4.1] - 2026-09-06
|
|
322
|
+
|
|
323
|
+
Search correctness and retrieval-quality fixes.
|
|
324
|
+
|
|
325
|
+
### Fixed
|
|
326
|
+
- pgvector: `SET LOCAL ivfflat.probes` was discarded before the query ran, so
|
|
327
|
+
every search scanned a single list — roughly 1% of the table — and silently
|
|
328
|
+
returned whatever happened to live there. Recall looked like a model problem
|
|
329
|
+
and was a transaction-scope bug.
|
|
330
|
+
- Search results are no longer served from a stale cache after an index is
|
|
331
|
+
reloaded.
|
|
332
|
+
- Non-semantic signals (keyword agreement) now REORDER results rather than
|
|
333
|
+
choosing them: a chunk vector search never found cannot be promoted into the
|
|
334
|
+
answer on keyword agreement alone, and agreement earns a bounded tiebreak
|
|
335
|
+
rather than an unbounded boost.
|
|
336
|
+
- `_get_model_name` falls back to the default model when no connection string
|
|
337
|
+
is available, instead of constructing a backend with `None`.
|
|
338
|
+
- Optional-dependency shims are tested with `is None` rather than truthiness,
|
|
339
|
+
and `_blend` is annotated — clearing the findings CI reports when the search
|
|
340
|
+
extras are installed.
|
|
341
|
+
|
|
342
|
+
### Changed
|
|
343
|
+
- pgvector indexes build as **HNSW** instead of IVFFlat: better recall at lower
|
|
344
|
+
latency, and reproducible — IVFFlat's list assignment depends on the data
|
|
345
|
+
present at build time, so the same corpus indexed twice could answer
|
|
346
|
+
differently. Existing indexes keep working; rebuild to get the new type.
|
|
347
|
+
|
|
348
|
+
## [3.4.0] - 2026-08-24
|
|
349
|
+
|
|
350
|
+
Covers everything landed since 3.2.0. 3.3.0 was never tagged or documented, so
|
|
351
|
+
its contents are folded in here.
|
|
352
|
+
|
|
353
|
+
### New Features
|
|
354
|
+
- AI Chat: added `signalwire.ai_chat` — `AIChatClient`, an async client for the
|
|
355
|
+
AI Chat service (`POST https://{space}.signalwire.com/api/ai/chat`). HTTP
|
|
356
|
+
Basic `project:api_token` with the space in the hostname and a JSON-RPC body
|
|
357
|
+
carrying pure payload; identity never rides in the body. Methods:
|
|
358
|
+
`create_conversation`, `chat`, `end`, `delete`, `log`, `summarize`, with
|
|
359
|
+
JSON-RPC error codes mapped to typed exceptions.
|
|
360
|
+
- AI Chat: added `ChatGateway`, a back-for-frontend so browser widgets never
|
|
361
|
+
hold a chat-service token. The page talks to your host, your host holds the
|
|
362
|
+
credential, and the conversation id the page carries is an HMAC-signed handle
|
|
363
|
+
it cannot forge or repoint at someone else's conversation. Four methods:
|
|
364
|
+
`start` (creates, and can post the opening turn so the agent greets first),
|
|
365
|
+
`chat`, `log` (tab-scoped resume replays the transcript), `end`.
|
|
366
|
+
- AI Chat: `ChatGateway` now reports `conversation_timeout` on create, `start`
|
|
367
|
+
and `log`. A conversation idle past its timeout is ended server-side and the
|
|
368
|
+
next message quietly opens a different one, with the transcript above it
|
|
369
|
+
still reading as continuous; the browser cannot see that coming from the
|
|
370
|
+
JSON-RPC result alone, and the gateway is the only component that knows.
|
|
371
|
+
- AI Chat: added `HandoffRouter` (`ai_chat/handoff.py`) for the `/handoff`,
|
|
372
|
+
`/escalate` and `/say` routes the SignalWire address widget already targets
|
|
373
|
+
against a `ChatGateway` URL. Owns the wire contract only — routes, nonce,
|
|
374
|
+
ordering guarantee, spend guards.
|
|
375
|
+
- Agent: capability declaration and post-prompt normalization.
|
|
376
|
+
- SWML schema: typed `ai_sidecar` verb and `RingbackConfig`, merged to 169
|
|
377
|
+
`$defs` while preserving the SDK-side `x-sdk-*` annotations.
|
|
378
|
+
|
|
379
|
+
### FunctionResult
|
|
380
|
+
- `response` may now be an object separating outcome from instruction:
|
|
381
|
+
`{"tool_result": ..., "tool_prompt": ...}`, via `set_tool_response()` or the
|
|
382
|
+
new `tool_result=` / `tool_prompt=` constructor arguments. `tool_result` is
|
|
383
|
+
what the tool DID, for the model to reason from; `tool_prompt` is what the
|
|
384
|
+
model should SAY. Splitting them stops a status line being read aloud and
|
|
385
|
+
stops an instruction being mistaken for data. The plain string form is
|
|
386
|
+
unchanged.
|
|
387
|
+
- `hold()` takes an optional prompt as its first argument and sets `response`
|
|
388
|
+
and `post_process` itself. The hold action carries no prompt of its own, and
|
|
389
|
+
during hold speech detection is paused and the agent will not respond, so
|
|
390
|
+
anything the caller needs to hear has to be said before the action lands.
|
|
391
|
+
An int in that position is still treated as the timeout, so `hold(120)` and
|
|
392
|
+
`hold(timeout=120)` are unchanged.
|
|
393
|
+
- `hold()` gained `step` and `timeout_step`, which route the call to a chosen
|
|
394
|
+
step when the hold ends — `step` when it is released early, `timeout_step`
|
|
395
|
+
when it expires. These are deferred: they fire when the hold actually ends,
|
|
396
|
+
unlike `swml_change_step()`, which applies immediately and would move the
|
|
397
|
+
caller before the hold begins. Omitting both emits the bare integer form.
|
|
398
|
+
- `rpc_ai_message()` accepts `global_data`, merged into the target call's
|
|
399
|
+
`global_data`, and `message_text` is now optional. Added
|
|
400
|
+
`rpc_ai_global_data()` for the data-only case. A message competes for
|
|
401
|
+
attention with everything else arriving on that turn; data is silent until a
|
|
402
|
+
prompt expands it with `${global_data.key}`, which makes it the better
|
|
403
|
+
channel for content a later step needs to speak.
|
|
404
|
+
- Docs: corrected the class docstring's description of `response`. It said
|
|
405
|
+
"Text the AI should say back to the user", which reads as a script; the SWML
|
|
406
|
+
schema defines it as "a static response text or message returned to the AI
|
|
407
|
+
agent's context". It is an instruction the model reads and interprets, not
|
|
408
|
+
speech played to the caller. Documented the second-person form and when
|
|
409
|
+
`post_process` is required.
|
|
410
|
+
|
|
411
|
+
### Fixes
|
|
412
|
+
- Search: `count` truncates results instead of reordering them. The candidate
|
|
413
|
+
pool was `count * 3` and every stage of `_process_candidates` reads the whole
|
|
414
|
+
pool, so a smaller pool could drop a document's keyword hit, cost it the
|
|
415
|
+
agreement boost, and sink it — retrieval quality depended on how many results
|
|
416
|
+
you asked for.
|
|
417
|
+
- Search: subsection chunks are retrievable.
|
|
418
|
+
- REST/docs: corrected the documented `live_transcribe` call shape. The docs
|
|
419
|
+
showed `live_transcribe(call_id, action="start", lang="en")`, but the
|
|
420
|
+
generated signature takes `action` as a keyword-only TypedDict union and has
|
|
421
|
+
no `lang`/`from_lang`/`to_lang` parameters, so copying the documented call
|
|
422
|
+
raised `TypeError`.
|
|
423
|
+
|
|
424
|
+
### Notes for upgraders
|
|
425
|
+
- `rpc_ai_message()` raises `ValueError` when given neither `message_text` nor
|
|
426
|
+
`global_data`. Positional callers are unaffected; a caller previously passing
|
|
427
|
+
`message_text=None` produced a malformed RPC and now gets an exception.
|
|
428
|
+
|
|
429
|
+
## [3.2.0] - 2026-07-14
|
|
430
|
+
|
|
431
|
+
### New Features
|
|
432
|
+
- REST: added the `client.messages` resource for the native messaging API
|
|
433
|
+
(`/api/messaging`): `create` sends an SMS/MMS message
|
|
434
|
+
(`POST /api/messaging/messages`) and `update` redacts a previously sent
|
|
435
|
+
message's body (`PATCH /api/messaging/messages/{message_id}`). This is the
|
|
436
|
+
plural send/redact resource, distinct from the singular message *logs*
|
|
437
|
+
reachable via `client.logs.messages`.
|
|
438
|
+
|
|
439
|
+
## [3.1.0] - 2026-07-14
|
|
440
|
+
|
|
441
|
+
### New Features
|
|
442
|
+
- REST: added the `client.projects` CRUD resource for the project-management
|
|
443
|
+
API (`/api/projects`), including `rotate_signing_key`.
|
|
444
|
+
|
|
445
|
+
## [3.0.2] - 2026-07-11
|
|
446
|
+
|
|
447
|
+
- REST: `ReadResource.paginate()` wires the `PaginatedIterator` into every list
|
|
448
|
+
resource so callers can page through all results (follows `links.next`).
|
|
449
|
+
- Docs: corrected env-var names and documented previously-undocumented knobs
|
|
450
|
+
(including the proxy/SSRF trust toggles);
|
|
451
|
+
fixed stale skill/namespace counts and phantom method references.
|
|
452
|
+
|
|
453
|
+
## [3.0.1] - 2026-04-12
|
|
454
|
+
|
|
455
|
+
- Update install instructions and PyPI URLs to use `signalwire-sdk`
|
|
456
|
+
|
|
457
|
+
## [3.0.0] - 2026-04-12
|
|
458
|
+
|
|
459
|
+
- Version bump
|
|
460
|
+
|
|
461
|
+
## [1.1.0] - 2026-03-17
|
|
462
|
+
|
|
463
|
+
- Version bump
|
|
464
|
+
|
|
465
|
+
## [1.0.22] - 2026-03-17
|
|
466
|
+
|
|
467
|
+
- Version bump
|
|
468
|
+
|
|
469
|
+
## [1.0.19] - 2026-02-19
|
|
470
|
+
|
|
471
|
+
### New Features
|
|
472
|
+
- Add full JSON Schema validation with `jsonschema-rs`
|
|
473
|
+
- `SchemaValidationError` exception on validation failures
|
|
474
|
+
- Option to disable schema validation
|
|
475
|
+
- Add RPC action methods for cross-call communication
|
|
476
|
+
- Add gather steps for structured data collection in contexts
|
|
477
|
+
- Add `replace` action for step history manipulation
|
|
478
|
+
- Add `add_dynamic_hints()` and `clear_dynamic_hints()` to `SwaigFunctionResult`
|
|
479
|
+
- Add `Context.get_step()` and `ContextBuilder.get_context()`, deep-copy contexts per call
|
|
480
|
+
- Add `remove_step()`, `move_step()`, and `clear_sections()` to Context/Step
|
|
481
|
+
- Add inline content kwargs to `Context.add_step()`
|
|
482
|
+
- Add `skip_prompt` flag to `SkillBase` for suppressing default POM injection
|
|
483
|
+
- Add namespaced `global_data` helpers to `SkillBase`
|
|
484
|
+
- Auto-hide SWAIG functions once gather questions are completed
|
|
485
|
+
|
|
486
|
+
### New Skills
|
|
487
|
+
- Add `google_maps` skill for address validation and route computation
|
|
488
|
+
- Add `info_gatherer` skill for structured information collection
|
|
489
|
+
- Add `claude_skills` skill for loading Claude Code SKILL.md files
|
|
490
|
+
|
|
491
|
+
### Bug Fixes
|
|
492
|
+
- Fix ~60 bugs found in comprehensive security and code audit
|
|
493
|
+
- Fix bug with invalid token handling
|
|
494
|
+
- Fix spurious error log when SWAIG function is called with empty raw arguments
|
|
495
|
+
- Fix `set_global_data` to merge without clobbering existing keys
|
|
496
|
+
- Remove deprecated `pkg_resources` usage
|
|
497
|
+
|
|
498
|
+
### Testing
|
|
499
|
+
- Expand test coverage from 52% to 78% with 1,820 new tests
|
|
500
|
+
- Fix all 145 pre-existing test failures
|
|
501
|
+
|
|
502
|
+
## [1.0.18] - 2026-01-26
|
|
503
|
+
|
|
504
|
+
- Fix `record_call()` default timeouts causing silent recording failures
|
|
505
|
+
- Change `initial_timeout` and `end_silence_timeout` defaults from `0.0` to `None`
|
|
506
|
+
- Timeout parameters now only included in SWML when explicitly set
|
|
507
|
+
- Add SWML schema search MCP server (`mcp/swml-schema-search/`)
|
|
508
|
+
- Fix bug in vector search scoring for pgvector backend
|
|
509
|
+
- Fix `fetch_conversation` response handling in post_prompt endpoint
|
|
510
|
+
|
|
511
|
+
## [1.0.17] - 2025-12-21
|
|
512
|
+
|
|
513
|
+
- Add GitHub Actions for automated PyPI publishing
|
|
514
|
+
- `publish-dev.yml`: Publishes dev versions (X.Y.Z.devN) on push to main
|
|
515
|
+
- `publish-release.yml`: Publishes stable releases on version tags (v*)
|
|
516
|
+
|
|
517
|
+
## [1.0.16] - 2025-12-11
|
|
518
|
+
|
|
519
|
+
- Support PORT environment variable for server port configuration
|
|
520
|
+
- Add Slack notification support to `sw-agent-dokku` deploy workflow template
|
|
521
|
+
|
|
522
|
+
## [1.0.15] - 2025-12-09
|
|
523
|
+
|
|
524
|
+
- Fix catch-all handler overshadowing custom routes in `sw-agent-dokku` generated apps
|
|
525
|
+
- Fix static files and routes without trailing slash for gunicorn compatibility
|
|
526
|
+
- Add tests for AgentServer custom route handling
|
|
527
|
+
|
|
528
|
+
## [1.0.14] - 2025-12-09
|
|
529
|
+
|
|
530
|
+
- Add WebRTC calling support to `sw-agent-dokku` generated apps
|
|
531
|
+
- Dynamic token generation via `/get_token` endpoint (24-hour expiration)
|
|
532
|
+
- `/get_credentials` endpoint for curl examples in web UI
|
|
533
|
+
- `/get_resource_info` endpoint for SignalWire dashboard integration
|
|
534
|
+
- Auto-create/update SWML handlers on startup
|
|
535
|
+
- Enhanced web UI with WebRTC calling controls and audio settings
|
|
536
|
+
- Add SignalWire credentials to generated `app.json` and `.env.example` templates
|
|
537
|
+
- Add `requests` dependency to generated requirements.txt
|
|
538
|
+
|
|
539
|
+
## [1.0.13] - 2025-12-09
|
|
540
|
+
|
|
541
|
+
- Add `sw-agent-dokku` CLI for scaffolding Dokku deployments
|
|
542
|
+
- Simple mode: generates Procfile, runtime.txt, requirements.txt, CHECKS
|
|
543
|
+
- CI/CD mode: adds GitHub Actions workflows for auto-deployment
|
|
544
|
+
- Web interface option: `--web` flag for static file serving
|
|
545
|
+
- Register `/health` and `/ready` endpoints in `AgentServer.__init__()` for gunicorn compatibility
|
|
546
|
+
- Fix static files auth by using `AgentServer.serve_static_files()` in templates
|
|
547
|
+
|
|
548
|
+
## [1.0.12] - 2025-12-08
|
|
549
|
+
|
|
550
|
+
- Export `SkillBase` from `signalwire_agents.skills` for convenience imports
|
|
551
|
+
|
|
552
|
+
## [1.0.11] - 2025-12-06
|
|
553
|
+
|
|
554
|
+
- Add `mcp-gateway` as installed CLI command (`pip install "signalwire-agents[mcp-gateway]"`)
|
|
555
|
+
- Move MCP Gateway core files into `signalwire_agents/mcp_gateway/` package
|
|
556
|
+
- Add flask and flask-limiter as optional `[mcp-gateway]` dependencies
|
|
557
|
+
- Add cloud function support to `sw-agent-init` CLI tool
|
|
558
|
+
- Fix `sw-agent-init` to generate swaig-test compatible app.py
|
|
559
|
+
- Add comprehensive test script for `sw-agent-init`
|
|
560
|
+
|
|
561
|
+
## [1.0.10] - 2025-11-30
|
|
562
|
+
|
|
563
|
+
- Fix Google Cloud Functions /swaig endpoint to support function name in request body
|
|
564
|
+
- Add URL detection for Google Cloud Functions to generate correct webhook URLs in SWML
|
|
565
|
+
|
|
566
|
+
## [1.0.9] - 2025-11-30
|
|
567
|
+
|
|
568
|
+
- Add Azure Functions serverless support with proper URL detection for webhook URLs
|
|
569
|
+
- Add Google Cloud Functions serverless support
|
|
570
|
+
- Fix Flask header iteration bug in Google Cloud Functions auth check (use .get() instead of iteration)
|
|
571
|
+
- Fix Azure Functions auth check to use .get() method for headers
|
|
572
|
+
- Improve serverless mixin to properly detect base URL from request for correct SWML webhook URLs
|
|
573
|
+
|
|
574
|
+
## [1.0.8] - 2025-11-29
|
|
575
|
+
|
|
576
|
+
- Fix tool definitions in docs to include parameters
|
|
577
|
+
- Add sw-agent-init CLI tool and man pages for all CLI tools
|
|
578
|
+
|
|
579
|
+
## [1.0.7] - 2025-11-27
|
|
580
|
+
|
|
581
|
+
- Version bump
|
|
582
|
+
|
|
583
|
+
## [1.0.6] - 2025-11-27
|
|
584
|
+
|
|
585
|
+
- Update documentation for contexts, datamap, API reference, SWAIG actions, and function results
|
|
586
|
+
- Add comprehensive example testing suite (tests/test_examples.py)
|
|
587
|
+
- Add static file serving example
|
|
588
|
+
|
|
589
|
+
## [1.0.5] - 2025-11-26
|
|
590
|
+
|
|
591
|
+
- Add setuptools version upper bound (<81) to fix compatibility issues
|
|
592
|
+
|
|
593
|
+
## [1.0.4] - 2025-11-26
|
|
594
|
+
|
|
595
|
+
- Add call flow verb insertion API for customizing SWML call flow
|
|
596
|
+
- `add_pre_answer_verb()` - Add verbs before answering (ringback, screening, routing)
|
|
597
|
+
- `add_post_answer_verb()` - Add verbs after answer, before AI (welcome messages, disclaimers)
|
|
598
|
+
- `add_post_ai_verb()` - Add verbs after AI ends (cleanup, transfers, logging)
|
|
599
|
+
- `add_answer_verb()` - Configure the answer verb (max_duration, etc.)
|
|
600
|
+
- `clear_pre_answer_verbs()`, `clear_post_answer_verbs()`, `clear_post_ai_verbs()`
|
|
601
|
+
- Fix `auto_answer=False` constructor parameter to actually skip the answer verb
|
|
602
|
+
- Add validation for pre-answer safe verbs with helpful warnings
|
|
603
|
+
|
|
604
|
+
## [1.0.3] - 2025-11-24
|
|
605
|
+
|
|
606
|
+
- Version bump
|
|
607
|
+
|
|
608
|
+
## [1.0.2] - 2025-11-24
|
|
609
|
+
|
|
610
|
+
- Version bump
|
|
611
|
+
|
|
612
|
+
## [1.0.1] - 2025-11-23
|
|
613
|
+
|
|
614
|
+
- Version bump
|
|
615
|
+
|
|
616
|
+
## [1.0.0] - 2025-11-22
|
|
617
|
+
|
|
618
|
+
- Version bump
|
|
619
|
+
|