signalwire-agents 0.1.46__tar.gz → 0.1.47__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 (142) hide show
  1. {signalwire_agents-0.1.46/signalwire_agents.egg-info → signalwire_agents-0.1.47}/PKG-INFO +12 -7
  2. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/README.md +11 -6
  3. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/pyproject.toml +1 -1
  4. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/__init__.py +1 -1
  5. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/build_search.py +6 -1
  6. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent_base.py +29 -37
  7. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/ai_config_mixin.py +32 -87
  8. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/swaig_function.py +2 -2
  9. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/search/document_processor.py +102 -1
  10. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/search/index_builder.py +1 -1
  11. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/weather_api/skill.py +2 -2
  12. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47/signalwire_agents.egg-info}/PKG-INFO +12 -7
  13. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/LICENSE +0 -0
  14. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/setup.cfg +0 -0
  15. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/setup.py +0 -0
  16. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/agent_server.py +0 -0
  17. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/agents/bedrock.py +0 -0
  18. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/__init__.py +0 -0
  19. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/config.py +0 -0
  20. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/__init__.py +0 -0
  21. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/agent_loader.py +0 -0
  22. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/argparse_helpers.py +0 -0
  23. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/dynamic_config.py +0 -0
  24. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/service_loader.py +0 -0
  25. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/execution/__init__.py +0 -0
  26. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/execution/datamap_exec.py +0 -0
  27. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/execution/webhook_exec.py +0 -0
  28. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/output/__init__.py +0 -0
  29. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/output/output_formatter.py +0 -0
  30. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/output/swml_dump.py +0 -0
  31. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/__init__.py +0 -0
  32. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/data_generation.py +0 -0
  33. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/data_overrides.py +0 -0
  34. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/mock_env.py +0 -0
  35. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/swaig_test_wrapper.py +0 -0
  36. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/test_swaig.py +0 -0
  37. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/cli/types.py +0 -0
  38. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/__init__.py +0 -0
  39. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/__init__.py +0 -0
  40. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/config/__init__.py +0 -0
  41. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/deployment/__init__.py +0 -0
  42. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
  43. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/prompt/__init__.py +0 -0
  44. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/prompt/manager.py +0 -0
  45. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/routing/__init__.py +0 -0
  46. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/security/__init__.py +0 -0
  47. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/swml/__init__.py +0 -0
  48. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/tools/__init__.py +0 -0
  49. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/tools/decorator.py +0 -0
  50. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/tools/registry.py +0 -0
  51. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/auth_handler.py +0 -0
  52. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/config_loader.py +0 -0
  53. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/contexts.py +0 -0
  54. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/data_map.py +0 -0
  55. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/function_result.py +0 -0
  56. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/logging_config.py +0 -0
  57. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/__init__.py +0 -0
  58. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/auth_mixin.py +0 -0
  59. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/prompt_mixin.py +0 -0
  60. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/serverless_mixin.py +0 -0
  61. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/skill_mixin.py +0 -0
  62. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/state_mixin.py +0 -0
  63. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/tool_mixin.py +0 -0
  64. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/web_mixin.py +0 -0
  65. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/pom_builder.py +0 -0
  66. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/security/__init__.py +0 -0
  67. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/security/session_manager.py +0 -0
  68. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/security_config.py +0 -0
  69. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/skill_base.py +0 -0
  70. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/skill_manager.py +0 -0
  71. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_builder.py +0 -0
  72. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_handler.py +0 -0
  73. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_renderer.py +0 -0
  74. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_service.py +0 -0
  75. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/__init__.py +0 -0
  76. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/concierge.py +0 -0
  77. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/faq_bot.py +0 -0
  78. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/info_gatherer.py +0 -0
  79. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/receptionist.py +0 -0
  80. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/survey.py +0 -0
  81. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/schema.json +0 -0
  82. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/search/__init__.py +0 -0
  83. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/search/pgvector_backend.py +0 -0
  84. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/search/query_processor.py +0 -0
  85. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/search/search_engine.py +0 -0
  86. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/search/search_service.py +0 -0
  87. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/README.md +0 -0
  88. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/__init__.py +0 -0
  89. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/api_ninjas_trivia/README.md +0 -0
  90. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/api_ninjas_trivia/__init__.py +0 -0
  91. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/api_ninjas_trivia/skill.py +0 -0
  92. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere/README.md +0 -0
  93. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere/__init__.py +0 -0
  94. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere/skill.py +0 -0
  95. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere_serverless/README.md +0 -0
  96. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
  97. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
  98. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datetime/README.md +0 -0
  99. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datetime/__init__.py +0 -0
  100. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/datetime/skill.py +0 -0
  101. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/joke/README.md +0 -0
  102. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/joke/__init__.py +0 -0
  103. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/joke/skill.py +0 -0
  104. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/math/README.md +0 -0
  105. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/math/__init__.py +0 -0
  106. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/math/skill.py +0 -0
  107. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/mcp_gateway/README.md +0 -0
  108. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/mcp_gateway/__init__.py +0 -0
  109. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/mcp_gateway/skill.py +0 -0
  110. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/native_vector_search/README.md +0 -0
  111. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
  112. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
  113. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/play_background_file/README.md +0 -0
  114. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/play_background_file/__init__.py +0 -0
  115. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/play_background_file/skill.py +0 -0
  116. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/registry.py +0 -0
  117. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/spider/README.md +0 -0
  118. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/spider/__init__.py +0 -0
  119. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/spider/skill.py +0 -0
  120. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/swml_transfer/README.md +0 -0
  121. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/swml_transfer/__init__.py +0 -0
  122. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/swml_transfer/skill.py +0 -0
  123. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/weather_api/README.md +0 -0
  124. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/weather_api/__init__.py +0 -0
  125. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/web_search/README.md +0 -0
  126. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/web_search/__init__.py +0 -0
  127. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/web_search/skill.py +0 -0
  128. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/wikipedia_search/README.md +0 -0
  129. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
  130. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
  131. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/utils/__init__.py +0 -0
  132. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/utils/pom_utils.py +0 -0
  133. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/utils/schema_utils.py +0 -0
  134. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/utils/token_generators.py +0 -0
  135. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/utils/validators.py +0 -0
  136. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/web/__init__.py +0 -0
  137. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents/web/web_service.py +0 -0
  138. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/SOURCES.txt +0 -0
  139. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/dependency_links.txt +0 -0
  140. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/entry_points.txt +0 -0
  141. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/requires.txt +0 -0
  142. {signalwire_agents-0.1.46 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 0.1.46
3
+ Version: 0.1.47
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -664,6 +664,7 @@ class PreciseAgent(AgentBase):
664
664
  self.prompt_add_section("Instructions", "Provide accurate, detailed information.")
665
665
 
666
666
  # Set custom LLM parameters for the main prompt
667
+ # These parameters are passed to the server which validates them based on the model
667
668
  self.set_prompt_llm_params(
668
669
  temperature=0.3, # Low temperature for more consistent responses
669
670
  top_p=0.9, # Slightly reduced for focused responses
@@ -685,13 +686,17 @@ agent = PreciseAgent()
685
686
  agent.serve()
686
687
  ```
687
688
 
688
- #### Available LLM Parameters
689
+ #### Common LLM Parameters
689
690
 
690
- - **temperature** (0.0-1.5): Controls randomness. Lower = more focused, higher = more creative
691
- - **top_p** (0.0-1.0): Nucleus sampling. Lower = more focused on likely tokens
692
- - **barge_confidence** (0.0-1.0): ASR confidence to interrupt. Higher = harder to interrupt
693
- - **presence_penalty** (-2.0-2.0): Topic diversity. Positive = new topics
694
- - **frequency_penalty** (-2.0-2.0): Repetition control. Positive = varied vocabulary
691
+ The SDK accepts any parameters which are passed to the server for validation based on the model. Common parameters include:
692
+
693
+ - **temperature**: Controls randomness. Lower = more focused, higher = more creative
694
+ - **top_p**: Nucleus sampling. Lower = more focused on likely tokens
695
+ - **barge_confidence**: ASR confidence to interrupt. Higher = harder to interrupt (main prompt only)
696
+ - **presence_penalty**: Topic diversity. Positive = new topics
697
+ - **frequency_penalty**: Repetition control. Positive = varied vocabulary
698
+
699
+ Note: No defaults are sent unless explicitly set. The server handles validation and applies appropriate defaults based on the model.
695
700
 
696
701
  For more details on LLM parameter tuning, see [LLM Parameters Guide](docs/llm_parameters.md).
697
702
 
@@ -572,6 +572,7 @@ class PreciseAgent(AgentBase):
572
572
  self.prompt_add_section("Instructions", "Provide accurate, detailed information.")
573
573
 
574
574
  # Set custom LLM parameters for the main prompt
575
+ # These parameters are passed to the server which validates them based on the model
575
576
  self.set_prompt_llm_params(
576
577
  temperature=0.3, # Low temperature for more consistent responses
577
578
  top_p=0.9, # Slightly reduced for focused responses
@@ -593,13 +594,17 @@ agent = PreciseAgent()
593
594
  agent.serve()
594
595
  ```
595
596
 
596
- #### Available LLM Parameters
597
+ #### Common LLM Parameters
597
598
 
598
- - **temperature** (0.0-1.5): Controls randomness. Lower = more focused, higher = more creative
599
- - **top_p** (0.0-1.0): Nucleus sampling. Lower = more focused on likely tokens
600
- - **barge_confidence** (0.0-1.0): ASR confidence to interrupt. Higher = harder to interrupt
601
- - **presence_penalty** (-2.0-2.0): Topic diversity. Positive = new topics
602
- - **frequency_penalty** (-2.0-2.0): Repetition control. Positive = varied vocabulary
599
+ The SDK accepts any parameters which are passed to the server for validation based on the model. Common parameters include:
600
+
601
+ - **temperature**: Controls randomness. Lower = more focused, higher = more creative
602
+ - **top_p**: Nucleus sampling. Lower = more focused on likely tokens
603
+ - **barge_confidence**: ASR confidence to interrupt. Higher = harder to interrupt (main prompt only)
604
+ - **presence_penalty**: Topic diversity. Positive = new topics
605
+ - **frequency_penalty**: Repetition control. Positive = varied vocabulary
606
+
607
+ Note: No defaults are sent unless explicitly set. The server handles validation and applies appropriate defaults based on the model.
603
608
 
604
609
  For more details on LLM parameter tuning, see [LLM Parameters Guide](docs/llm_parameters.md).
605
610
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire_agents"
7
- version = "0.1.46"
7
+ version = "0.1.47"
8
8
  description = "SignalWire AI Agents SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -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__ = "0.1.46"
21
+ __version__ = "0.1.47"
22
22
 
23
23
  # Import core classes for easier access
24
24
  from .core.agent_base import AgentBase
@@ -66,6 +66,11 @@ Examples:
66
66
  sw-search ./docs \\
67
67
  --chunking-strategy qa
68
68
 
69
+
70
+ # JSON-based chunking (pre-chunked content)
71
+ sw-search ./api_chunks.json \
72
+ --chunking-strategy json \
73
+ --file-types json
69
74
  # Full configuration example
70
75
  sw-search ./docs ./examples README.md \\
71
76
  --output ./knowledge.swsearch \\
@@ -141,7 +146,7 @@ Examples:
141
146
 
142
147
  parser.add_argument(
143
148
  '--chunking-strategy',
144
- choices=['sentence', 'sliding', 'paragraph', 'page', 'semantic', 'topic', 'qa'],
149
+ choices=['sentence', 'sliding', 'paragraph', 'page', 'semantic', 'topic', 'qa', 'json'],
145
150
  default='sentence',
146
151
  help='Chunking strategy to use (default: sentence)'
147
152
  )
@@ -250,20 +250,9 @@ class AgentBase(
250
250
  self._params = {}
251
251
  self._global_data = {}
252
252
  self._function_includes = []
253
- # Initialize with default LLM params
254
- self._prompt_llm_params = {
255
- 'temperature': 0.3,
256
- 'top_p': 1.0,
257
- 'barge_confidence': 0.0,
258
- 'presence_penalty': 0.1,
259
- 'frequency_penalty': 0.1
260
- }
261
- self._post_prompt_llm_params = {
262
- 'temperature': 0.0,
263
- 'top_p': 1.0,
264
- 'presence_penalty': 0.0,
265
- 'frequency_penalty': 0.0
266
- }
253
+ # Initialize LLM params as empty - only send if explicitly set
254
+ self._prompt_llm_params = {}
255
+ self._post_prompt_llm_params = {}
267
256
 
268
257
  # Dynamic configuration callback
269
258
  self._dynamic_config_callback = None
@@ -692,7 +681,7 @@ class AgentBase(
692
681
  "parameters": func._ensure_parameter_structure()
693
682
  }
694
683
 
695
- # Add wait_file if present (SignalWire SWML expects wait_file, not fillers)
684
+ # Add wait_file if present (audio/video file URL)
696
685
  if hasattr(func, 'wait_file') and func.wait_file:
697
686
  wait_file_url = func.wait_file
698
687
  # If wait_file is a relative URL, convert it to absolute using agent's base URL
@@ -704,9 +693,10 @@ class AgentBase(
704
693
  wait_file_url = '/' + wait_file_url
705
694
  wait_file_url = f"{base_url}{wait_file_url}"
706
695
  function_entry["wait_file"] = wait_file_url
707
- elif func.fillers:
708
- # Backward compatibility: use fillers as wait_file if wait_file not specified
709
- function_entry["wait_file"] = func.fillers
696
+
697
+ # Add fillers if present (text phrases to say while processing)
698
+ if hasattr(func, 'fillers') and func.fillers:
699
+ function_entry["fillers"] = func.fillers
710
700
 
711
701
  # Add wait_file_loops if present
712
702
  if hasattr(func, 'wait_file_loops') and func.wait_file_loops is not None:
@@ -833,27 +823,29 @@ class AgentBase(
833
823
 
834
824
  # Always add LLM parameters to prompt
835
825
  if "prompt" in ai_config:
836
- # Update existing prompt with LLM params
837
- if isinstance(ai_config["prompt"], dict):
838
- ai_config["prompt"].update(agent_to_use._prompt_llm_params)
839
- elif isinstance(ai_config["prompt"], str):
840
- # Convert string prompt to dict format
841
- ai_config["prompt"] = {
842
- "text": ai_config["prompt"],
843
- **agent_to_use._prompt_llm_params
844
- }
826
+ # Only add LLM params if explicitly set
827
+ if agent_to_use._prompt_llm_params:
828
+ if isinstance(ai_config["prompt"], dict):
829
+ ai_config["prompt"].update(agent_to_use._prompt_llm_params)
830
+ elif isinstance(ai_config["prompt"], str):
831
+ # Convert string prompt to dict format
832
+ ai_config["prompt"] = {
833
+ "text": ai_config["prompt"],
834
+ **agent_to_use._prompt_llm_params
835
+ }
845
836
 
846
- # Always add LLM parameters to post_prompt if post_prompt exists
837
+ # Only add LLM parameters to post_prompt if explicitly set
847
838
  if post_prompt and "post_prompt" in ai_config:
848
- # Update existing post_prompt with LLM params
849
- if isinstance(ai_config["post_prompt"], dict):
850
- ai_config["post_prompt"].update(agent_to_use._post_prompt_llm_params)
851
- elif isinstance(ai_config["post_prompt"], str):
852
- # Convert string post_prompt to dict format
853
- ai_config["post_prompt"] = {
854
- "text": ai_config["post_prompt"],
855
- **agent_to_use._post_prompt_llm_params
856
- }
839
+ # Only add LLM params if explicitly set
840
+ if agent_to_use._post_prompt_llm_params:
841
+ if isinstance(ai_config["post_prompt"], dict):
842
+ ai_config["post_prompt"].update(agent_to_use._post_prompt_llm_params)
843
+ elif isinstance(ai_config["post_prompt"], str):
844
+ # Convert string post_prompt to dict format
845
+ ai_config["post_prompt"] = {
846
+ "text": ai_config["post_prompt"],
847
+ **agent_to_use._post_prompt_llm_params
848
+ }
857
849
 
858
850
  except ValueError as e:
859
851
  if not agent_to_use._suppress_logs:
@@ -372,28 +372,22 @@ class AIConfigMixin:
372
372
  self._function_includes = valid_includes
373
373
  return self
374
374
 
375
- def set_prompt_llm_params(
376
- self,
377
- temperature: Optional[float] = None,
378
- top_p: Optional[float] = None,
379
- barge_confidence: Optional[float] = None,
380
- presence_penalty: Optional[float] = None,
381
- frequency_penalty: Optional[float] = None
382
- ) -> 'AgentBase':
375
+ def set_prompt_llm_params(self, **params) -> 'AgentBase':
383
376
  """
384
377
  Set LLM parameters for the main prompt.
385
378
 
386
- Args:
387
- temperature: Randomness setting (0.0-1.5). Lower values make output more deterministic.
388
- Default: 0.3
389
- top_p: Alternative to temperature (0.0-1.0). Controls nucleus sampling.
390
- Default: 1.0
391
- barge_confidence: ASR confidence to interrupt (0.0-1.0). Higher values make it harder to interrupt.
392
- Default: 0.0
393
- presence_penalty: Topic diversity (-2.0 to 2.0). Positive values encourage new topics.
394
- Default: 0.1
395
- frequency_penalty: Repetition control (-2.0 to 2.0). Positive values reduce repetition.
396
- Default: 0.1
379
+ Accepts any parameters which will be passed through to the SignalWire server.
380
+ The server will validate and apply parameters based on the target model's capabilities.
381
+
382
+ Common parameters include:
383
+ temperature: Randomness setting. Lower values make output more deterministic.
384
+ top_p: Alternative to temperature. Controls nucleus sampling.
385
+ barge_confidence: ASR confidence to interrupt. Higher values make it harder to interrupt.
386
+ presence_penalty: Topic diversity. Positive values encourage new topics.
387
+ frequency_penalty: Repetition control. Positive values reduce repetition.
388
+
389
+ Note: Parameters are model-specific and will be validated by the server.
390
+ Invalid parameters for the selected model will be handled/ignored by the server.
397
391
 
398
392
  Returns:
399
393
  Self for method chaining
@@ -405,57 +399,28 @@ class AIConfigMixin:
405
399
  barge_confidence=0.6
406
400
  )
407
401
  """
408
- # Validate and set temperature
409
- if temperature is not None:
410
- if not 0.0 <= temperature <= 1.5:
411
- raise ValueError("temperature must be between 0.0 and 1.5")
412
- self._prompt_llm_params['temperature'] = temperature
413
-
414
- # Validate and set top_p
415
- if top_p is not None:
416
- if not 0.0 <= top_p <= 1.0:
417
- raise ValueError("top_p must be between 0.0 and 1.0")
418
- self._prompt_llm_params['top_p'] = top_p
419
-
420
- # Validate and set barge_confidence
421
- if barge_confidence is not None:
422
- if not 0.0 <= barge_confidence <= 1.0:
423
- raise ValueError("barge_confidence must be between 0.0 and 1.0")
424
- self._prompt_llm_params['barge_confidence'] = barge_confidence
425
-
426
- # Validate and set presence_penalty
427
- if presence_penalty is not None:
428
- if not -2.0 <= presence_penalty <= 2.0:
429
- raise ValueError("presence_penalty must be between -2.0 and 2.0")
430
- self._prompt_llm_params['presence_penalty'] = presence_penalty
431
-
432
- # Validate and set frequency_penalty
433
- if frequency_penalty is not None:
434
- if not -2.0 <= frequency_penalty <= 2.0:
435
- raise ValueError("frequency_penalty must be between -2.0 and 2.0")
436
- self._prompt_llm_params['frequency_penalty'] = frequency_penalty
402
+ # Accept any parameters without validation
403
+ if params:
404
+ self._prompt_llm_params.update(params)
437
405
 
438
406
  return self
439
407
 
440
- def set_post_prompt_llm_params(
441
- self,
442
- temperature: Optional[float] = None,
443
- top_p: Optional[float] = None,
444
- presence_penalty: Optional[float] = None,
445
- frequency_penalty: Optional[float] = None
446
- ) -> 'AgentBase':
408
+ def set_post_prompt_llm_params(self, **params) -> 'AgentBase':
447
409
  """
448
410
  Set LLM parameters for the post-prompt.
449
411
 
450
- Args:
451
- temperature: Randomness setting (0.0-1.5). Lower values make output more deterministic.
452
- Default: 0.0
453
- top_p: Alternative to temperature (0.0-1.0). Controls nucleus sampling.
454
- Default: 1.0
455
- presence_penalty: Topic diversity (-2.0 to 2.0). Positive values encourage new topics.
456
- Default: 0.0
457
- frequency_penalty: Repetition control (-2.0 to 2.0). Positive values reduce repetition.
458
- Default: 0.0
412
+ Accepts any parameters which will be passed through to the SignalWire server.
413
+ The server will validate and apply parameters based on the target model's capabilities.
414
+
415
+ Common parameters include:
416
+ temperature: Randomness setting. Lower values make output more deterministic.
417
+ top_p: Alternative to temperature. Controls nucleus sampling.
418
+ presence_penalty: Topic diversity. Positive values encourage new topics.
419
+ frequency_penalty: Repetition control. Positive values reduce repetition.
420
+
421
+ Note: Parameters are model-specific and will be validated by the server.
422
+ Invalid parameters for the selected model will be handled/ignored by the server.
423
+ barge_confidence is not applicable to post-prompt.
459
424
 
460
425
  Returns:
461
426
  Self for method chaining
@@ -466,28 +431,8 @@ class AIConfigMixin:
466
431
  top_p=0.9
467
432
  )
468
433
  """
469
- # Validate and set temperature
470
- if temperature is not None:
471
- if not 0.0 <= temperature <= 1.5:
472
- raise ValueError("temperature must be between 0.0 and 1.5")
473
- self._post_prompt_llm_params['temperature'] = temperature
474
-
475
- # Validate and set top_p
476
- if top_p is not None:
477
- if not 0.0 <= top_p <= 1.0:
478
- raise ValueError("top_p must be between 0.0 and 1.0")
479
- self._post_prompt_llm_params['top_p'] = top_p
480
-
481
- # Validate and set presence_penalty
482
- if presence_penalty is not None:
483
- if not -2.0 <= presence_penalty <= 2.0:
484
- raise ValueError("presence_penalty must be between -2.0 and 2.0")
485
- self._post_prompt_llm_params['presence_penalty'] = presence_penalty
486
-
487
- # Validate and set frequency_penalty
488
- if frequency_penalty is not None:
489
- if not -2.0 <= frequency_penalty <= 2.0:
490
- raise ValueError("frequency_penalty must be between -2.0 and 2.0")
491
- self._post_prompt_llm_params['frequency_penalty'] = frequency_penalty
434
+ # Accept any parameters without validation
435
+ if params:
436
+ self._post_prompt_llm_params.update(params)
492
437
 
493
438
  return self
@@ -57,8 +57,8 @@ class SWAIGFunction:
57
57
  self.description = description
58
58
  self.parameters = parameters or {}
59
59
  self.secure = secure
60
- self.fillers = fillers # Keep for backward compatibility
61
- self.wait_file = wait_file or fillers # Use wait_file if provided, else fall back to fillers
60
+ self.fillers = fillers # Text phrases to say while processing
61
+ self.wait_file = wait_file # URL to audio/video file to play while waiting
62
62
  self.wait_file_loops = wait_file_loops
63
63
  self.webhook_url = webhook_url
64
64
  self.required = required or []
@@ -140,6 +140,8 @@ class DocumentProcessor:
140
140
  return self._chunk_by_topics(content, filename, file_type)
141
141
  elif self.chunking_strategy == 'qa':
142
142
  return self._chunk_by_qa_optimization(content, filename, file_type)
143
+ elif self.chunking_strategy == 'json':
144
+ return self._chunk_from_json(content, filename, file_type)
143
145
  else:
144
146
  # Fallback to sentence-based chunking
145
147
  return self._chunk_by_sentences(content, filename, file_type)
@@ -1022,4 +1024,103 @@ class DocumentProcessor:
1022
1024
  ))
1023
1025
 
1024
1026
  return chunks if chunks else [self._create_chunk(content, filename, "QA Section 1",
1025
- metadata={'chunk_method': 'qa_optimized', 'chunk_index': 0})]
1027
+ metadata={'chunk_method': 'qa_optimized', 'chunk_index': 0})]
1028
+
1029
+ def _chunk_from_json(self, content: str, filename: str, file_type: str) -> List[Dict[str, Any]]:
1030
+ """
1031
+ Create chunks from pre-processed JSON content
1032
+
1033
+ This strategy expects content to be a JSON string with the following structure:
1034
+ {
1035
+ "chunks": [
1036
+ {
1037
+ "chunk_id": "unique_id",
1038
+ "type": "content|toc",
1039
+ "content": "text content",
1040
+ "metadata": {
1041
+ "url": "https://...",
1042
+ "section_number": 1,
1043
+ "related_toc": "toc_id",
1044
+ ...
1045
+ }
1046
+ },
1047
+ ...
1048
+ ]
1049
+ }
1050
+
1051
+ Args:
1052
+ content: JSON string containing pre-chunked content
1053
+ filename: Name of the source file
1054
+ file_type: Should be 'json'
1055
+
1056
+ Returns:
1057
+ List of chunk dictionaries formatted for the search index
1058
+ """
1059
+ try:
1060
+ # Parse JSON content
1061
+ data = json.loads(content)
1062
+
1063
+ if not isinstance(data, dict) or 'chunks' not in data:
1064
+ logger.error(f"Invalid JSON structure in {filename}: expected 'chunks' key")
1065
+ # Fallback to treating it as plain text
1066
+ return self._chunk_by_sentences(content, filename, file_type)
1067
+
1068
+ chunks = []
1069
+ for idx, json_chunk in enumerate(data['chunks']):
1070
+ if not isinstance(json_chunk, dict) or 'content' not in json_chunk:
1071
+ logger.warning(f"Skipping invalid chunk {idx} in {filename}")
1072
+ continue
1073
+
1074
+ # Extract metadata from JSON chunk
1075
+ json_metadata = json_chunk.get('metadata', {})
1076
+ chunk_type = json_chunk.get('type', 'content')
1077
+
1078
+ # Build chunk metadata
1079
+ metadata = {
1080
+ 'chunk_method': 'json',
1081
+ 'chunk_index': idx,
1082
+ 'chunk_type': chunk_type,
1083
+ 'original_chunk_id': json_chunk.get('chunk_id', f'chunk_{idx}')
1084
+ }
1085
+
1086
+ # Merge JSON metadata
1087
+ metadata.update(json_metadata)
1088
+
1089
+ # Determine section name
1090
+ if chunk_type == 'toc':
1091
+ section = f"TOC: {json_chunk.get('content', '')[:50]}"
1092
+ else:
1093
+ section = json_metadata.get('section', f"Section {json_metadata.get('section_number', idx + 1)}")
1094
+
1095
+ # Create chunk with proper structure
1096
+ chunk = self._create_chunk(
1097
+ content=json_chunk['content'],
1098
+ filename=filename,
1099
+ section=section,
1100
+ metadata=metadata
1101
+ )
1102
+
1103
+ # Add any additional fields from JSON
1104
+ if 'tags' in json_chunk:
1105
+ chunk['tags'] = json_chunk['tags']
1106
+
1107
+ # For TOC entries, we might want to add special tags
1108
+ if chunk_type == 'toc' and 'tags' not in chunk:
1109
+ chunk['tags'] = ['toc', 'navigation']
1110
+
1111
+ chunks.append(chunk)
1112
+
1113
+ if not chunks:
1114
+ logger.warning(f"No valid chunks found in JSON file {filename}")
1115
+ return self._chunk_by_sentences(str(data), filename, file_type)
1116
+
1117
+ logger.info(f"Created {len(chunks)} chunks from JSON file {filename}")
1118
+ return chunks
1119
+
1120
+ except json.JSONDecodeError as e:
1121
+ logger.error(f"Failed to parse JSON in {filename}: {e}")
1122
+ # Fallback to sentence chunking
1123
+ return self._chunk_by_sentences(content, filename, file_type)
1124
+ except Exception as e:
1125
+ logger.error(f"Unexpected error processing JSON chunks in {filename}: {e}")
1126
+ return self._chunk_by_sentences(content, filename, file_type)
@@ -55,7 +55,7 @@ class IndexBuilder:
55
55
 
56
56
  Args:
57
57
  model_name: Name of the sentence transformer model to use
58
- chunking_strategy: Strategy for chunking documents ('sentence', 'sliding', 'paragraph', 'page', 'semantic', 'topic', 'qa')
58
+ chunking_strategy: Strategy for chunking documents ('sentence', 'sliding', 'paragraph', 'page', 'semantic', 'topic', 'qa', 'json')
59
59
  max_sentences_per_chunk: For sentence strategy (default: 5)
60
60
  chunk_size: For sliding strategy - words per chunk (default: 50)
61
61
  chunk_overlap: For sliding strategy - overlap in words (default: 10)
@@ -176,7 +176,7 @@ class WeatherApiSkill(SkillBase):
176
176
  "data_map": {
177
177
  "webhooks": [
178
178
  {
179
- "url": f"https://api.weatherapi.com/v1/current.json?key={self.api_key}&q=${{args.location}}&aqi=no",
179
+ "url": f"https://api.weatherapi.com/v1/current.json?key={self.api_key}&q=${{lc:enc:args.location}}&aqi=no",
180
180
  "method": "GET",
181
181
  "output": SwaigFunctionResult(weather_template).to_dict()
182
182
  }
@@ -188,4 +188,4 @@ class WeatherApiSkill(SkillBase):
188
188
  }
189
189
  }
190
190
 
191
- return [tool]
191
+ return [tool]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 0.1.46
3
+ Version: 0.1.47
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -664,6 +664,7 @@ class PreciseAgent(AgentBase):
664
664
  self.prompt_add_section("Instructions", "Provide accurate, detailed information.")
665
665
 
666
666
  # Set custom LLM parameters for the main prompt
667
+ # These parameters are passed to the server which validates them based on the model
667
668
  self.set_prompt_llm_params(
668
669
  temperature=0.3, # Low temperature for more consistent responses
669
670
  top_p=0.9, # Slightly reduced for focused responses
@@ -685,13 +686,17 @@ agent = PreciseAgent()
685
686
  agent.serve()
686
687
  ```
687
688
 
688
- #### Available LLM Parameters
689
+ #### Common LLM Parameters
689
690
 
690
- - **temperature** (0.0-1.5): Controls randomness. Lower = more focused, higher = more creative
691
- - **top_p** (0.0-1.0): Nucleus sampling. Lower = more focused on likely tokens
692
- - **barge_confidence** (0.0-1.0): ASR confidence to interrupt. Higher = harder to interrupt
693
- - **presence_penalty** (-2.0-2.0): Topic diversity. Positive = new topics
694
- - **frequency_penalty** (-2.0-2.0): Repetition control. Positive = varied vocabulary
691
+ The SDK accepts any parameters which are passed to the server for validation based on the model. Common parameters include:
692
+
693
+ - **temperature**: Controls randomness. Lower = more focused, higher = more creative
694
+ - **top_p**: Nucleus sampling. Lower = more focused on likely tokens
695
+ - **barge_confidence**: ASR confidence to interrupt. Higher = harder to interrupt (main prompt only)
696
+ - **presence_penalty**: Topic diversity. Positive = new topics
697
+ - **frequency_penalty**: Repetition control. Positive = varied vocabulary
698
+
699
+ Note: No defaults are sent unless explicitly set. The server handles validation and applies appropriate defaults based on the model.
695
700
 
696
701
  For more details on LLM parameter tuning, see [LLM Parameters Guide](docs/llm_parameters.md).
697
702