signalwire-agents 1.0.18.dev7__tar.gz → 1.0.18.dev9__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.
Files changed (154) hide show
  1. {signalwire_agents-1.0.18.dev7/signalwire_agents.egg-info → signalwire_agents-1.0.18.dev9}/PKG-INFO +2 -1
  2. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/pyproject.toml +2 -1
  3. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/__init__.py +1 -1
  4. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/agent_server.py +1 -1
  5. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/function_result.py +155 -1
  6. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/utils/schema_utils.py +69 -16
  7. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9/signalwire_agents.egg-info}/PKG-INFO +2 -1
  8. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents.egg-info/requires.txt +1 -0
  9. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/LICENSE +0 -0
  10. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/README.md +0 -0
  11. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/man/sw-agent-init.1 +0 -0
  12. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/man/sw-search.1 +0 -0
  13. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/man/swaig-test.1 +0 -0
  14. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/setup.cfg +0 -0
  15. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/setup.py +0 -0
  16. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/agents/bedrock.py +0 -0
  17. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/__init__.py +0 -0
  18. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/build_search.py +0 -0
  19. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/config.py +0 -0
  20. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/core/__init__.py +0 -0
  21. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/core/agent_loader.py +0 -0
  22. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/core/argparse_helpers.py +0 -0
  23. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/core/dynamic_config.py +0 -0
  24. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/core/service_loader.py +0 -0
  25. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/dokku.py +0 -0
  26. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/execution/__init__.py +0 -0
  27. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/execution/datamap_exec.py +0 -0
  28. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/execution/webhook_exec.py +0 -0
  29. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/init_project.py +0 -0
  30. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/output/__init__.py +0 -0
  31. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/output/output_formatter.py +0 -0
  32. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/output/swml_dump.py +0 -0
  33. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/simulation/__init__.py +0 -0
  34. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/simulation/data_generation.py +0 -0
  35. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/simulation/data_overrides.py +0 -0
  36. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/simulation/mock_env.py +0 -0
  37. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/swaig_test_wrapper.py +0 -0
  38. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/test_swaig.py +0 -0
  39. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/cli/types.py +0 -0
  40. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/__init__.py +0 -0
  41. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/__init__.py +0 -0
  42. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/config/__init__.py +0 -0
  43. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/deployment/__init__.py +0 -0
  44. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
  45. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/prompt/__init__.py +0 -0
  46. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/prompt/manager.py +0 -0
  47. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/routing/__init__.py +0 -0
  48. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/security/__init__.py +0 -0
  49. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/swml/__init__.py +0 -0
  50. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/tools/__init__.py +0 -0
  51. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/tools/decorator.py +0 -0
  52. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent/tools/registry.py +0 -0
  53. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/agent_base.py +0 -0
  54. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/auth_handler.py +0 -0
  55. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/config_loader.py +0 -0
  56. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/contexts.py +0 -0
  57. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/data_map.py +0 -0
  58. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/logging_config.py +0 -0
  59. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/__init__.py +0 -0
  60. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/ai_config_mixin.py +0 -0
  61. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/auth_mixin.py +0 -0
  62. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/prompt_mixin.py +0 -0
  63. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/serverless_mixin.py +0 -0
  64. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/skill_mixin.py +0 -0
  65. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/state_mixin.py +0 -0
  66. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/tool_mixin.py +0 -0
  67. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/mixins/web_mixin.py +0 -0
  68. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/pom_builder.py +0 -0
  69. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/security/__init__.py +0 -0
  70. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/security/session_manager.py +0 -0
  71. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/security_config.py +0 -0
  72. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/skill_base.py +0 -0
  73. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/skill_manager.py +0 -0
  74. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/swaig_function.py +0 -0
  75. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/swml_builder.py +0 -0
  76. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/swml_handler.py +0 -0
  77. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/swml_renderer.py +0 -0
  78. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/core/swml_service.py +0 -0
  79. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/mcp_gateway/__init__.py +0 -0
  80. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/mcp_gateway/gateway_service.py +0 -0
  81. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/mcp_gateway/mcp_manager.py +0 -0
  82. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/mcp_gateway/session_manager.py +0 -0
  83. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/prefabs/__init__.py +0 -0
  84. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/prefabs/concierge.py +0 -0
  85. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/prefabs/faq_bot.py +0 -0
  86. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/prefabs/info_gatherer.py +0 -0
  87. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/prefabs/receptionist.py +0 -0
  88. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/prefabs/survey.py +0 -0
  89. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/schema.json +0 -0
  90. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/__init__.py +0 -0
  91. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/document_processor.py +0 -0
  92. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/index_builder.py +0 -0
  93. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/migration.py +0 -0
  94. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/models.py +0 -0
  95. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/pgvector_backend.py +0 -0
  96. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/query_processor.py +0 -0
  97. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/search_engine.py +0 -0
  98. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/search/search_service.py +0 -0
  99. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/README.md +0 -0
  100. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/__init__.py +0 -0
  101. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/api_ninjas_trivia/README.md +0 -0
  102. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/api_ninjas_trivia/__init__.py +0 -0
  103. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/api_ninjas_trivia/skill.py +0 -0
  104. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datasphere/README.md +0 -0
  105. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datasphere/__init__.py +0 -0
  106. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datasphere/skill.py +0 -0
  107. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datasphere_serverless/README.md +0 -0
  108. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
  109. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
  110. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datetime/README.md +0 -0
  111. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datetime/__init__.py +0 -0
  112. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/datetime/skill.py +0 -0
  113. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/joke/README.md +0 -0
  114. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/joke/__init__.py +0 -0
  115. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/joke/skill.py +0 -0
  116. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/math/README.md +0 -0
  117. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/math/__init__.py +0 -0
  118. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/math/skill.py +0 -0
  119. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/mcp_gateway/README.md +0 -0
  120. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/mcp_gateway/__init__.py +0 -0
  121. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/mcp_gateway/skill.py +0 -0
  122. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/native_vector_search/README.md +0 -0
  123. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
  124. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
  125. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/play_background_file/README.md +0 -0
  126. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/play_background_file/__init__.py +0 -0
  127. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/play_background_file/skill.py +0 -0
  128. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/registry.py +0 -0
  129. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/spider/README.md +0 -0
  130. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/spider/__init__.py +0 -0
  131. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/spider/skill.py +0 -0
  132. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/swml_transfer/README.md +0 -0
  133. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/swml_transfer/__init__.py +0 -0
  134. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/swml_transfer/skill.py +0 -0
  135. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/weather_api/README.md +0 -0
  136. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/weather_api/__init__.py +0 -0
  137. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/weather_api/skill.py +0 -0
  138. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/web_search/README.md +0 -0
  139. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/web_search/__init__.py +0 -0
  140. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/web_search/skill.py +0 -0
  141. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/wikipedia_search/README.md +0 -0
  142. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
  143. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
  144. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/utils/__init__.py +0 -0
  145. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/utils/pom_utils.py +0 -0
  146. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/utils/token_generators.py +0 -0
  147. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/utils/validators.py +0 -0
  148. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/web/__init__.py +0 -0
  149. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents/web/web_service.py +0 -0
  150. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents.egg-info/SOURCES.txt +0 -0
  151. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents.egg-info/dependency_links.txt +0 -0
  152. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents.egg-info/entry_points.txt +0 -0
  153. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/signalwire_agents.egg-info/top_level.txt +0 -0
  154. {signalwire_agents-1.0.18.dev7 → signalwire_agents-1.0.18.dev9}/tests/test_examples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 1.0.18.dev7
3
+ Version: 1.0.18.dev9
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -29,6 +29,7 @@ Requires-Dist: uvicorn>=0.34.2
29
29
  Requires-Dist: beautifulsoup4>=4.12.3
30
30
  Requires-Dist: pytz>=2023.3
31
31
  Requires-Dist: lxml>=4.9.0
32
+ Requires-Dist: jsonschema>=4.26.0
32
33
  Provides-Extra: search-queryonly
33
34
  Requires-Dist: numpy>=1.24.0; extra == "search-queryonly"
34
35
  Requires-Dist: scikit-learn>=1.3.0; extra == "search-queryonly"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire_agents"
7
- version = "1.0.18.dev7"
7
+ version = "1.0.18.dev9"
8
8
  description = "SignalWire AI Agents SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -36,6 +36,7 @@ dependencies = [
36
36
  "beautifulsoup4>=4.12.3",
37
37
  "pytz>=2023.3",
38
38
  "lxml>=4.9.0",
39
+ "jsonschema>=4.26.0",
39
40
  ]
40
41
 
41
42
  # Optional dependencies for search functionality
@@ -18,7 +18,7 @@ A package for building AI agents using SignalWire's AI and SWML capabilities.
18
18
  from .core.logging_config import configure_logging
19
19
  configure_logging()
20
20
 
21
- __version__ = "1.0.18.dev7"
21
+ __version__ = "1.0.18.dev9"
22
22
 
23
23
  # Import core classes for easier access
24
24
  from .core.agent_base import AgentBase
@@ -61,7 +61,7 @@ class AgentServer:
61
61
  self.app = FastAPI(
62
62
  title="SignalWire AI Agents",
63
63
  description="Hosted SignalWire AI Agents",
64
- version="1.0.18.dev7",
64
+ version="1.0.18.dev9",
65
65
  redirect_slashes=False
66
66
  )
67
67
 
@@ -1170,10 +1170,164 @@ class SwaigFunctionResult:
1170
1170
  ]
1171
1171
  }
1172
1172
  }
1173
-
1173
+
1174
1174
  # Use execute_swml to add the action
1175
1175
  return self.execute_swml(swml_doc)
1176
1176
 
1177
+ def execute_rpc(self, method: str, params: Optional[Dict[str, Any]] = None,
1178
+ call_id: Optional[str] = None, node_id: Optional[str] = None) -> 'SwaigFunctionResult':
1179
+ """
1180
+ Execute an RPC method on a call using SWML.
1181
+
1182
+ This is a generic helper for executing RPC commands. For common operations,
1183
+ consider using the specific helpers: rpc_dial(), rpc_ai_message(), rpc_ai_unhold().
1184
+
1185
+ Args:
1186
+ method: The RPC method to execute (e.g., "dial", "ai_message", "ai_unhold")
1187
+ params: Parameters for the RPC method (optional)
1188
+ call_id: Target call ID for the RPC (optional)
1189
+ node_id: Target node ID for the RPC (optional)
1190
+
1191
+ Returns:
1192
+ self for method chaining
1193
+
1194
+ Example:
1195
+ result = (
1196
+ SwaigFunctionResult("Executing RPC")
1197
+ .execute_rpc(
1198
+ method="ai_message",
1199
+ call_id="some-call-id",
1200
+ params={"role": "system", "message_text": "Hello"}
1201
+ )
1202
+ )
1203
+ """
1204
+ # Build the execute_rpc parameters
1205
+ rpc_params: Dict[str, Any] = {"method": method}
1206
+
1207
+ if call_id:
1208
+ rpc_params["call_id"] = call_id
1209
+ if node_id:
1210
+ rpc_params["node_id"] = node_id
1211
+ if params:
1212
+ rpc_params["params"] = params
1213
+
1214
+ # Generate SWML document
1215
+ swml_doc = {
1216
+ "version": "1.0.0",
1217
+ "sections": {
1218
+ "main": [
1219
+ {"execute_rpc": rpc_params}
1220
+ ]
1221
+ }
1222
+ }
1223
+
1224
+ # Use execute_swml to add the action
1225
+ return self.execute_swml(swml_doc)
1226
+
1227
+ def rpc_dial(self, to_number: str, from_number: str, dest_swml: str,
1228
+ device_type: str = "phone") -> 'SwaigFunctionResult':
1229
+ """
1230
+ Dial out to a number with a destination SWML URL using execute_rpc.
1231
+
1232
+ This is commonly used in call screening scenarios where you place a caller
1233
+ on hold and dial out to a human, with the dest_swml specifying what agent
1234
+ handles the outbound leg.
1235
+
1236
+ Args:
1237
+ to_number: Phone number to dial (E.164 format)
1238
+ from_number: Caller ID to use (E.164 format)
1239
+ dest_swml: URL to the SWML that handles the outbound call
1240
+ device_type: Device type, typically "phone" (default: "phone")
1241
+
1242
+ Returns:
1243
+ self for method chaining
1244
+
1245
+ Example:
1246
+ result = (
1247
+ SwaigFunctionResult("Please hold while I connect you.")
1248
+ .hold(timeout=120)
1249
+ .rpc_dial(
1250
+ to_number="+15551234567",
1251
+ from_number="+15559876543",
1252
+ dest_swml="https://example.com/call-agent?caller=John"
1253
+ )
1254
+ )
1255
+ """
1256
+ return self.execute_rpc(
1257
+ method="dial",
1258
+ params={
1259
+ "devices": {
1260
+ "type": device_type,
1261
+ "params": {
1262
+ "to_number": to_number,
1263
+ "from_number": from_number
1264
+ }
1265
+ },
1266
+ "dest_swml": dest_swml
1267
+ }
1268
+ )
1269
+
1270
+ def rpc_ai_message(self, call_id: str, message_text: str,
1271
+ role: str = "system") -> 'SwaigFunctionResult':
1272
+ """
1273
+ Inject a message into an AI agent on another call using execute_rpc.
1274
+
1275
+ This is useful for cross-call communication, such as notifying a held
1276
+ caller's AI agent about a status change or instructing it to relay
1277
+ a message.
1278
+
1279
+ Args:
1280
+ call_id: The call ID of the target call
1281
+ message_text: The message text to inject into the AI conversation
1282
+ role: The role for the message, typically "system" (default: "system")
1283
+
1284
+ Returns:
1285
+ self for method chaining
1286
+
1287
+ Example:
1288
+ result = (
1289
+ SwaigFunctionResult("I'll let them know.")
1290
+ .rpc_ai_message(
1291
+ call_id=original_call_id,
1292
+ message_text="The person you were trying to reach is unavailable. Please take a message."
1293
+ )
1294
+ )
1295
+ """
1296
+ return self.execute_rpc(
1297
+ method="ai_message",
1298
+ call_id=call_id,
1299
+ params={
1300
+ "role": role,
1301
+ "message_text": message_text
1302
+ }
1303
+ )
1304
+
1305
+ def rpc_ai_unhold(self, call_id: str) -> 'SwaigFunctionResult':
1306
+ """
1307
+ Unhold another call using execute_rpc.
1308
+
1309
+ This releases a call from hold state, typically used after injecting
1310
+ a message to the held caller's AI agent.
1311
+
1312
+ Args:
1313
+ call_id: The call ID of the call to unhold
1314
+
1315
+ Returns:
1316
+ self for method chaining
1317
+
1318
+ Example:
1319
+ result = (
1320
+ SwaigFunctionResult("Understood, I'll let them know.")
1321
+ .rpc_ai_message(call_id, "No one is available. Please take a message.")
1322
+ .rpc_ai_unhold(call_id)
1323
+ )
1324
+ """
1325
+ return self.execute_rpc(
1326
+ method="ai_unhold",
1327
+ call_id=call_id,
1328
+ params={}
1329
+ )
1330
+
1177
1331
  @staticmethod
1178
1332
  def create_payment_prompt(for_situation: str, actions: List[Dict[str, str]],
1179
1333
  card_type: Optional[str] = None,
@@ -18,6 +18,10 @@ import json
18
18
  import logging
19
19
  from typing import Dict, Any, List, Optional, Tuple
20
20
 
21
+ # jsonschema is required for full JSON Schema Draft 2020-12 validation
22
+ from jsonschema import Draft202012Validator, ValidationError
23
+ from jsonschema.exceptions import best_match
24
+
21
25
  try:
22
26
  import structlog
23
27
  # Ensure structlog is configured
@@ -241,35 +245,84 @@ class SchemaUtils:
241
245
  return verb_props.get("required", [])
242
246
  return []
243
247
 
248
+ def _get_verb_schema(self, verb_name: str) -> Optional[Dict[str, Any]]:
249
+ """
250
+ Get the JSON Schema for validating a verb config.
251
+
252
+ This constructs a schema that can be used with jsonschema.validate() by:
253
+ 1. Getting the verb's property schema
254
+ 2. Including all $defs from the main schema so $ref references resolve
255
+
256
+ Args:
257
+ verb_name: The name of the verb
258
+
259
+ Returns:
260
+ A schema dict suitable for jsonschema validation, or None if not found
261
+ """
262
+ verb_props = self.get_verb_properties(verb_name)
263
+ if not verb_props:
264
+ return None
265
+
266
+ # Create a schema with the $defs from the main schema so refs work
267
+ schema = verb_props.copy()
268
+ if "$defs" in self.schema:
269
+ schema["$defs"] = self.schema["$defs"]
270
+
271
+ return schema
272
+
244
273
  def validate_verb(self, verb_name: str, verb_config: Dict[str, Any]) -> Tuple[bool, List[str]]:
245
274
  """
246
- Validate a verb configuration against the schema
247
-
275
+ Validate a verb configuration against the JSON Schema.
276
+
277
+ Uses the jsonschema library for full JSON Schema Draft 2020-12 validation,
278
+ which checks all constraints including:
279
+ - Required properties
280
+ - Type checking (string, number, boolean, array, object)
281
+ - Pattern matching (regex constraints)
282
+ - Enum values
283
+ - Minimum/maximum values
284
+ - MinLength/maxLength for strings
285
+ - MinItems/maxItems for arrays
286
+ - anyOf/oneOf/allOf composition
287
+ - And all other JSON Schema keywords
288
+
248
289
  Args:
249
290
  verb_name: The name of the verb (e.g., "ai", "answer", etc.)
250
291
  verb_config: The configuration for the verb
251
-
292
+
252
293
  Returns:
253
294
  (is_valid, error_messages) tuple
254
295
  """
255
- # Simple validation for now - can be enhanced with more complete JSON Schema validation
256
296
  errors = []
257
-
297
+
258
298
  # Check if the verb exists in the schema
259
299
  if verb_name not in self.verbs:
260
300
  errors.append(f"Unknown verb: {verb_name}")
261
301
  return False, errors
262
-
263
- # Get the required properties for this verb
264
- required_props = self.get_verb_required_properties(verb_name)
265
-
266
- # Check if all required properties are present
267
- for prop in required_props:
268
- if prop not in verb_config:
269
- errors.append(f"Missing required property '{prop}' for verb '{verb_name}'")
270
-
271
- # Return validation result
272
- return len(errors) == 0, errors
302
+
303
+ # Get the verb schema for validation
304
+ verb_schema = self._get_verb_schema(verb_name)
305
+ if not verb_schema:
306
+ self.log.debug("verb_schema_not_found", verb=verb_name,
307
+ message="Could not extract verb schema, allowing config")
308
+ return True, []
309
+
310
+ # Use jsonschema for full validation
311
+ validator = Draft202012Validator(verb_schema)
312
+ validation_errors = list(validator.iter_errors(verb_config))
313
+
314
+ if not validation_errors:
315
+ return True, []
316
+
317
+ # Collect all error messages with their paths
318
+ for error in validation_errors:
319
+ if error.path:
320
+ path_str = ".".join(str(p) for p in error.path)
321
+ errors.append(f"{path_str}: {error.message}")
322
+ else:
323
+ errors.append(error.message)
324
+
325
+ return False, errors
273
326
 
274
327
  def get_all_verb_names(self) -> List[str]:
275
328
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 1.0.18.dev7
3
+ Version: 1.0.18.dev9
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -29,6 +29,7 @@ Requires-Dist: uvicorn>=0.34.2
29
29
  Requires-Dist: beautifulsoup4>=4.12.3
30
30
  Requires-Dist: pytz>=2023.3
31
31
  Requires-Dist: lxml>=4.9.0
32
+ Requires-Dist: jsonschema>=4.26.0
32
33
  Provides-Extra: search-queryonly
33
34
  Requires-Dist: numpy>=1.24.0; extra == "search-queryonly"
34
35
  Requires-Dist: scikit-learn>=1.3.0; extra == "search-queryonly"
@@ -9,6 +9,7 @@ uvicorn>=0.34.2
9
9
  beautifulsoup4>=4.12.3
10
10
  pytz>=2023.3
11
11
  lxml>=4.9.0
12
+ jsonschema>=4.26.0
12
13
 
13
14
  [all]
14
15
  sentence-transformers>=2.2.0