signalwire-agents 0.1.45__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.45/signalwire_agents.egg-info → signalwire_agents-0.1.47}/PKG-INFO +12 -7
  2. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/README.md +11 -6
  3. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/pyproject.toml +1 -1
  4. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/__init__.py +1 -1
  5. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/build_search.py +6 -1
  6. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/tools/registry.py +11 -1
  7. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent_base.py +43 -35
  8. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/ai_config_mixin.py +32 -87
  9. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/swaig_function.py +8 -2
  10. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/search/document_processor.py +102 -1
  11. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/search/index_builder.py +1 -1
  12. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/weather_api/skill.py +2 -2
  13. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47/signalwire_agents.egg-info}/PKG-INFO +12 -7
  14. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/LICENSE +0 -0
  15. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/setup.cfg +0 -0
  16. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/setup.py +0 -0
  17. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/agent_server.py +0 -0
  18. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/agents/bedrock.py +0 -0
  19. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/__init__.py +0 -0
  20. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/config.py +0 -0
  21. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/__init__.py +0 -0
  22. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/agent_loader.py +0 -0
  23. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/argparse_helpers.py +0 -0
  24. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/dynamic_config.py +0 -0
  25. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/core/service_loader.py +0 -0
  26. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/execution/__init__.py +0 -0
  27. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/execution/datamap_exec.py +0 -0
  28. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/execution/webhook_exec.py +0 -0
  29. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/output/__init__.py +0 -0
  30. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/output/output_formatter.py +0 -0
  31. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/output/swml_dump.py +0 -0
  32. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/__init__.py +0 -0
  33. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/data_generation.py +0 -0
  34. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/data_overrides.py +0 -0
  35. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/simulation/mock_env.py +0 -0
  36. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/swaig_test_wrapper.py +0 -0
  37. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/test_swaig.py +0 -0
  38. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/cli/types.py +0 -0
  39. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/__init__.py +0 -0
  40. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/__init__.py +0 -0
  41. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/config/__init__.py +0 -0
  42. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/deployment/__init__.py +0 -0
  43. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
  44. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/prompt/__init__.py +0 -0
  45. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/prompt/manager.py +0 -0
  46. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/routing/__init__.py +0 -0
  47. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/security/__init__.py +0 -0
  48. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/swml/__init__.py +0 -0
  49. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/tools/__init__.py +0 -0
  50. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/agent/tools/decorator.py +0 -0
  51. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/auth_handler.py +0 -0
  52. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/config_loader.py +0 -0
  53. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/contexts.py +0 -0
  54. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/data_map.py +0 -0
  55. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/function_result.py +0 -0
  56. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/logging_config.py +0 -0
  57. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/__init__.py +0 -0
  58. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/auth_mixin.py +0 -0
  59. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/prompt_mixin.py +0 -0
  60. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/serverless_mixin.py +0 -0
  61. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/skill_mixin.py +0 -0
  62. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/state_mixin.py +0 -0
  63. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/tool_mixin.py +0 -0
  64. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/mixins/web_mixin.py +0 -0
  65. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/pom_builder.py +0 -0
  66. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/security/__init__.py +0 -0
  67. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/security/session_manager.py +0 -0
  68. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/security_config.py +0 -0
  69. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/skill_base.py +0 -0
  70. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/skill_manager.py +0 -0
  71. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_builder.py +0 -0
  72. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_handler.py +0 -0
  73. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_renderer.py +0 -0
  74. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/core/swml_service.py +0 -0
  75. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/__init__.py +0 -0
  76. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/concierge.py +0 -0
  77. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/faq_bot.py +0 -0
  78. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/info_gatherer.py +0 -0
  79. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/receptionist.py +0 -0
  80. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/prefabs/survey.py +0 -0
  81. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/schema.json +0 -0
  82. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/search/__init__.py +0 -0
  83. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/search/pgvector_backend.py +0 -0
  84. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/search/query_processor.py +0 -0
  85. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/search/search_engine.py +0 -0
  86. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/search/search_service.py +0 -0
  87. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/README.md +0 -0
  88. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/__init__.py +0 -0
  89. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/api_ninjas_trivia/README.md +0 -0
  90. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/api_ninjas_trivia/__init__.py +0 -0
  91. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/api_ninjas_trivia/skill.py +0 -0
  92. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere/README.md +0 -0
  93. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere/__init__.py +0 -0
  94. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere/skill.py +0 -0
  95. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere_serverless/README.md +0 -0
  96. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
  97. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
  98. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datetime/README.md +0 -0
  99. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datetime/__init__.py +0 -0
  100. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/datetime/skill.py +0 -0
  101. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/joke/README.md +0 -0
  102. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/joke/__init__.py +0 -0
  103. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/joke/skill.py +0 -0
  104. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/math/README.md +0 -0
  105. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/math/__init__.py +0 -0
  106. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/math/skill.py +0 -0
  107. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/mcp_gateway/README.md +0 -0
  108. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/mcp_gateway/__init__.py +0 -0
  109. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/mcp_gateway/skill.py +0 -0
  110. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/native_vector_search/README.md +0 -0
  111. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
  112. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
  113. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/play_background_file/README.md +0 -0
  114. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/play_background_file/__init__.py +0 -0
  115. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/play_background_file/skill.py +0 -0
  116. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/registry.py +0 -0
  117. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/spider/README.md +0 -0
  118. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/spider/__init__.py +0 -0
  119. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/spider/skill.py +0 -0
  120. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/swml_transfer/README.md +0 -0
  121. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/swml_transfer/__init__.py +0 -0
  122. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/swml_transfer/skill.py +0 -0
  123. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/weather_api/README.md +0 -0
  124. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/weather_api/__init__.py +0 -0
  125. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/web_search/README.md +0 -0
  126. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/web_search/__init__.py +0 -0
  127. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/web_search/skill.py +0 -0
  128. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/wikipedia_search/README.md +0 -0
  129. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
  130. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
  131. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/utils/__init__.py +0 -0
  132. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/utils/pom_utils.py +0 -0
  133. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/utils/schema_utils.py +0 -0
  134. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/utils/token_generators.py +0 -0
  135. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/utils/validators.py +0 -0
  136. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/web/__init__.py +0 -0
  137. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents/web/web_service.py +0 -0
  138. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/SOURCES.txt +0 -0
  139. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/dependency_links.txt +0 -0
  140. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/entry_points.txt +0 -0
  141. {signalwire_agents-0.1.45 → signalwire_agents-0.1.47}/signalwire_agents.egg-info/requires.txt +0 -0
  142. {signalwire_agents-0.1.45 → 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.45
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.45"
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.45"
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
  )
@@ -40,6 +40,8 @@ class ToolRegistry:
40
40
  handler: Callable,
41
41
  secure: bool = True,
42
42
  fillers: Optional[Dict[str, List[str]]] = None,
43
+ wait_file: Optional[str] = None,
44
+ wait_file_loops: Optional[int] = None,
43
45
  webhook_url: Optional[str] = None,
44
46
  required: Optional[List[str]] = None,
45
47
  **swaig_fields
@@ -53,7 +55,9 @@ class ToolRegistry:
53
55
  parameters: JSON Schema of parameters
54
56
  handler: Function to call when invoked
55
57
  secure: Whether to require token validation
56
- fillers: Optional dict mapping language codes to arrays of filler phrases
58
+ fillers: Optional dict mapping language codes to arrays of filler phrases (deprecated)
59
+ wait_file: Optional URL to audio file to play while function executes
60
+ wait_file_loops: Optional number of times to loop the wait_file
57
61
  webhook_url: Optional external webhook URL to use instead of local handling
58
62
  required: Optional list of required parameter names
59
63
  **swaig_fields: Additional SWAIG fields to include in function definition
@@ -71,6 +75,8 @@ class ToolRegistry:
71
75
  handler=handler,
72
76
  secure=secure,
73
77
  fillers=fillers,
78
+ wait_file=wait_file,
79
+ wait_file_loops=wait_file_loops,
74
80
  webhook_url=webhook_url,
75
81
  required=required,
76
82
  **swaig_fields
@@ -132,6 +138,8 @@ class ToolRegistry:
132
138
  parameters = tool_params_copy.pop("parameters", {})
133
139
  secure = tool_params_copy.pop("secure", True)
134
140
  fillers = tool_params_copy.pop("fillers", None)
141
+ wait_file = tool_params_copy.pop("wait_file", None)
142
+ wait_file_loops = tool_params_copy.pop("wait_file_loops", None)
135
143
  webhook_url = tool_params_copy.pop("webhook_url", None)
136
144
  required = tool_params_copy.pop("required", None)
137
145
 
@@ -143,6 +151,8 @@ class ToolRegistry:
143
151
  handler=attr.__get__(self.agent, cls), # Bind the method to this instance
144
152
  secure=secure,
145
153
  fillers=fillers,
154
+ wait_file=wait_file,
155
+ wait_file_loops=wait_file_loops,
146
156
  webhook_url=webhook_url,
147
157
  required=required,
148
158
  **tool_params_copy # Pass through any additional swaig_fields
@@ -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,10 +681,27 @@ class AgentBase(
692
681
  "parameters": func._ensure_parameter_structure()
693
682
  }
694
683
 
695
- # Add fillers if present
696
- if func.fillers:
684
+ # Add wait_file if present (audio/video file URL)
685
+ if hasattr(func, 'wait_file') and func.wait_file:
686
+ wait_file_url = func.wait_file
687
+ # If wait_file is a relative URL, convert it to absolute using agent's base URL
688
+ if wait_file_url and not wait_file_url.startswith(('http://', 'https://', '//')):
689
+ # Build full URL using the agent's base URL
690
+ base_url = agent_to_use._get_base_url(include_auth=False)
691
+ # Handle relative paths appropriately
692
+ if not wait_file_url.startswith('/'):
693
+ wait_file_url = '/' + wait_file_url
694
+ wait_file_url = f"{base_url}{wait_file_url}"
695
+ function_entry["wait_file"] = wait_file_url
696
+
697
+ # Add fillers if present (text phrases to say while processing)
698
+ if hasattr(func, 'fillers') and func.fillers:
697
699
  function_entry["fillers"] = func.fillers
698
700
 
701
+ # Add wait_file_loops if present
702
+ if hasattr(func, 'wait_file_loops') and func.wait_file_loops is not None:
703
+ function_entry["wait_file_loops"] = func.wait_file_loops
704
+
699
705
  # Handle webhook URL
700
706
  if hasattr(func, 'webhook_url') and func.webhook_url:
701
707
  # External webhook function - use the provided URL directly
@@ -817,27 +823,29 @@ class AgentBase(
817
823
 
818
824
  # Always add LLM parameters to prompt
819
825
  if "prompt" in ai_config:
820
- # Update existing prompt with LLM params
821
- if isinstance(ai_config["prompt"], dict):
822
- ai_config["prompt"].update(agent_to_use._prompt_llm_params)
823
- elif isinstance(ai_config["prompt"], str):
824
- # Convert string prompt to dict format
825
- ai_config["prompt"] = {
826
- "text": ai_config["prompt"],
827
- **agent_to_use._prompt_llm_params
828
- }
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
+ }
829
836
 
830
- # Always add LLM parameters to post_prompt if post_prompt exists
837
+ # Only add LLM parameters to post_prompt if explicitly set
831
838
  if post_prompt and "post_prompt" in ai_config:
832
- # Update existing post_prompt with LLM params
833
- if isinstance(ai_config["post_prompt"], dict):
834
- ai_config["post_prompt"].update(agent_to_use._post_prompt_llm_params)
835
- elif isinstance(ai_config["post_prompt"], str):
836
- # Convert string post_prompt to dict format
837
- ai_config["post_prompt"] = {
838
- "text": ai_config["post_prompt"],
839
- **agent_to_use._post_prompt_llm_params
840
- }
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
+ }
841
849
 
842
850
  except ValueError as e:
843
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
@@ -30,6 +30,8 @@ class SWAIGFunction:
30
30
  parameters: Dict[str, Dict] = None,
31
31
  secure: bool = False,
32
32
  fillers: Optional[Dict[str, List[str]]] = None,
33
+ wait_file: Optional[str] = None,
34
+ wait_file_loops: Optional[int] = None,
33
35
  webhook_url: Optional[str] = None,
34
36
  required: Optional[List[str]] = None,
35
37
  **extra_swaig_fields
@@ -43,7 +45,9 @@ class SWAIGFunction:
43
45
  description: Human-readable description of the function
44
46
  parameters: Dictionary of parameters, keys are parameter names, values are param definitions
45
47
  secure: Whether this function requires token validation
46
- fillers: Optional dictionary of filler phrases by language code
48
+ fillers: Optional dictionary of filler phrases by language code (deprecated, use wait_file)
49
+ wait_file: Optional URL to audio file to play while function executes
50
+ wait_file_loops: Optional number of times to loop the wait_file
47
51
  webhook_url: Optional external webhook URL to use instead of local handling
48
52
  required: Optional list of required parameter names
49
53
  **extra_swaig_fields: Additional SWAIG fields to include in function definition
@@ -53,7 +57,9 @@ class SWAIGFunction:
53
57
  self.description = description
54
58
  self.parameters = parameters or {}
55
59
  self.secure = secure
56
- self.fillers = 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
+ self.wait_file_loops = wait_file_loops
57
63
  self.webhook_url = webhook_url
58
64
  self.required = required or []
59
65
  self.extra_swaig_fields = extra_swaig_fields
@@ -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.45
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