signalwire-agents 0.1.20__tar.gz → 0.1.23__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 (94) hide show
  1. {signalwire_agents-0.1.20/signalwire_agents.egg-info → signalwire_agents-0.1.23}/PKG-INFO +5 -8
  2. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/README.md +2 -5
  3. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/pyproject.toml +4 -4
  4. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/__init__.py +1 -1
  5. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/agent_server.py +50 -11
  6. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/__init__.py +2 -2
  7. signalwire_agents-0.1.23/signalwire_agents/core/agent/__init__.py +14 -0
  8. signalwire_agents-0.1.23/signalwire_agents/core/agent/config/__init__.py +14 -0
  9. signalwire_agents-0.1.23/signalwire_agents/core/agent/config/ephemeral.py +176 -0
  10. signalwire_agents-0.1.23/signalwire_agents/core/agent/deployment/__init__.py +0 -0
  11. signalwire_agents-0.1.23/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
  12. signalwire_agents-0.1.23/signalwire_agents/core/agent/prompt/__init__.py +14 -0
  13. signalwire_agents-0.1.23/signalwire_agents/core/agent/prompt/manager.py +288 -0
  14. signalwire_agents-0.1.23/signalwire_agents/core/agent/routing/__init__.py +0 -0
  15. signalwire_agents-0.1.23/signalwire_agents/core/agent/security/__init__.py +0 -0
  16. signalwire_agents-0.1.23/signalwire_agents/core/agent/swml/__init__.py +0 -0
  17. signalwire_agents-0.1.23/signalwire_agents/core/agent/tools/__init__.py +15 -0
  18. signalwire_agents-0.1.23/signalwire_agents/core/agent/tools/decorator.py +95 -0
  19. signalwire_agents-0.1.23/signalwire_agents/core/agent/tools/registry.py +192 -0
  20. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/agent_base.py +131 -413
  21. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/data_map.py +3 -15
  22. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/skill_manager.py +0 -17
  23. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/swaig_function.py +0 -2
  24. signalwire_agents-0.1.23/signalwire_agents/core/swml_builder.py +414 -0
  25. signalwire_agents-0.1.23/signalwire_agents/core/swml_renderer.py +194 -0
  26. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/swml_service.py +25 -94
  27. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/index_builder.py +1 -1
  28. signalwire_agents-0.1.23/signalwire_agents/skills/api_ninjas_trivia/__init__.py +3 -0
  29. signalwire_agents-0.1.23/signalwire_agents/skills/api_ninjas_trivia/skill.py +192 -0
  30. signalwire_agents-0.1.23/signalwire_agents/skills/play_background_file/__init__.py +3 -0
  31. signalwire_agents-0.1.23/signalwire_agents/skills/play_background_file/skill.py +197 -0
  32. signalwire_agents-0.1.23/signalwire_agents/skills/weather_api/__init__.py +3 -0
  33. signalwire_agents-0.1.23/signalwire_agents/skills/weather_api/skill.py +154 -0
  34. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23/signalwire_agents.egg-info}/PKG-INFO +5 -8
  35. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/SOURCES.txt +19 -0
  36. signalwire_agents-0.1.20/signalwire_agents/core/swml_builder.py +0 -218
  37. signalwire_agents-0.1.20/signalwire_agents/core/swml_renderer.py +0 -383
  38. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/LICENSE +0 -0
  39. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/schema.json +0 -0
  40. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/setup.cfg +0 -0
  41. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/setup.py +0 -0
  42. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/cli/__init__.py +0 -0
  43. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/cli/build_search.py +0 -0
  44. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/cli/test_swaig.py +0 -0
  45. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/contexts.py +0 -0
  46. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/function_result.py +0 -0
  47. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/logging_config.py +0 -0
  48. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/pom_builder.py +0 -0
  49. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/security/__init__.py +0 -0
  50. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/security/session_manager.py +0 -0
  51. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/skill_base.py +0 -0
  52. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/state/__init__.py +0 -0
  53. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/state/file_state_manager.py +0 -0
  54. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/state/state_manager.py +0 -0
  55. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/swml_handler.py +0 -0
  56. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/__init__.py +0 -0
  57. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/concierge.py +0 -0
  58. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/faq_bot.py +0 -0
  59. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/info_gatherer.py +0 -0
  60. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/receptionist.py +0 -0
  61. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/survey.py +0 -0
  62. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/schema.json +0 -0
  63. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/__init__.py +0 -0
  64. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/document_processor.py +0 -0
  65. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/query_processor.py +0 -0
  66. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/search_engine.py +0 -0
  67. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/search_service.py +0 -0
  68. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/__init__.py +0 -0
  69. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere/__init__.py +0 -0
  70. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere/skill.py +0 -0
  71. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
  72. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
  73. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datetime/__init__.py +0 -0
  74. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datetime/skill.py +0 -0
  75. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/joke/__init__.py +0 -0
  76. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/joke/skill.py +0 -0
  77. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/math/__init__.py +0 -0
  78. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/math/skill.py +0 -0
  79. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
  80. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
  81. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/registry.py +0 -0
  82. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/web_search/__init__.py +0 -0
  83. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/web_search/skill.py +0 -0
  84. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
  85. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
  86. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/__init__.py +0 -0
  87. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/pom_utils.py +0 -0
  88. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/schema_utils.py +0 -0
  89. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/token_generators.py +0 -0
  90. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/validators.py +0 -0
  91. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/dependency_links.txt +0 -0
  92. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/entry_points.txt +0 -0
  93. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/requires.txt +0 -0
  94. {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/top_level.txt +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 0.1.20
3
+ Version: 0.1.23
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
- Project-URL: Homepage, https://github.com/signalwire/signalwire-ai-agents
7
- Classifier: Development Status :: 3 - Alpha
6
+ Project-URL: Homepage, https://github.com/signalwire/signalwire-agents
7
+ Classifier: Development Status :: 4 - Beta
8
8
  Classifier: Intended Audience :: Developers
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Programming Language :: Python :: 3
@@ -176,7 +176,7 @@ agent.serve()
176
176
  - **Dependency validation**: Clear error messages for missing requirements
177
177
  - **Modular architecture**: Skills are self-contained and reusable
178
178
 
179
- For detailed documentation, see [Skills System README](docs/SKILLS_SYSTEM_README.md).
179
+ For detailed documentation, see [Skills System README](docs/skills_system.md).
180
180
 
181
181
  ## DataMap Tools
182
182
 
@@ -572,10 +572,7 @@ class SimpleAgent(AgentBase):
572
572
  self.prompt_add_section("Goal", body="Help users with basic questions.")
573
573
  self.prompt_add_section("Instructions", bullets=["Be concise and clear."])
574
574
 
575
- # Alternative using convenience methods:
576
- # self.setPersonality("You are a helpful assistant.")
577
- # self.setGoal("Help users with basic questions.")
578
- # self.setInstructions(["Be concise and clear."])
575
+ # Note: Use prompt_add_section() for all prompt configuration
579
576
 
580
577
  @AgentBase.tool(
581
578
  name="get_time",
@@ -105,7 +105,7 @@ agent.serve()
105
105
  - **Dependency validation**: Clear error messages for missing requirements
106
106
  - **Modular architecture**: Skills are self-contained and reusable
107
107
 
108
- For detailed documentation, see [Skills System README](docs/SKILLS_SYSTEM_README.md).
108
+ For detailed documentation, see [Skills System README](docs/skills_system.md).
109
109
 
110
110
  ## DataMap Tools
111
111
 
@@ -501,10 +501,7 @@ class SimpleAgent(AgentBase):
501
501
  self.prompt_add_section("Goal", body="Help users with basic questions.")
502
502
  self.prompt_add_section("Instructions", bullets=["Be concise and clear."])
503
503
 
504
- # Alternative using convenience methods:
505
- # self.setPersonality("You are a helpful assistant.")
506
- # self.setGoal("Help users with basic questions.")
507
- # self.setInstructions(["Be concise and clear."])
504
+ # Note: Use prompt_add_section() for all prompt configuration
508
505
 
509
506
  @AgentBase.tool(
510
507
  name="get_time",
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "signalwire_agents"
7
- version = "0.1.20"
7
+ version = "0.1.23"
8
8
  description = "SignalWire AI Agents SDK"
9
9
  authors = [
10
10
  {name = "SignalWire Team", email = "info@signalwire.com"}
@@ -12,7 +12,7 @@ authors = [
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.7"
14
14
  classifiers = [
15
- "Development Status :: 3 - Alpha",
15
+ "Development Status :: 4 - Beta",
16
16
  "Intended Audience :: Developers",
17
17
  "License :: OSI Approved :: MIT License",
18
18
  "Programming Language :: Python :: 3",
@@ -95,14 +95,14 @@ search-all = [
95
95
  ]
96
96
 
97
97
  [project.urls]
98
- Homepage = "https://github.com/signalwire/signalwire-ai-agents"
98
+ Homepage = "https://github.com/signalwire/signalwire-agents"
99
99
 
100
100
  [project.scripts]
101
101
  swaig-test = "signalwire_agents.cli.test_swaig:console_entry_point"
102
102
  sw-search = "signalwire_agents.cli.build_search:console_entry_point"
103
103
 
104
104
  [tool.setuptools]
105
- packages = ["signalwire_agents", "signalwire_agents.prefabs", "signalwire_agents.utils", "signalwire_agents.core", "signalwire_agents.core.state", "signalwire_agents.core.security", "signalwire_agents.skills", "signalwire_agents.skills.web_search", "signalwire_agents.skills.datetime", "signalwire_agents.skills.math", "signalwire_agents.skills.joke", "signalwire_agents.skills.datasphere", "signalwire_agents.skills.datasphere_serverless", "signalwire_agents.skills.wikipedia_search", "signalwire_agents.skills.native_vector_search", "signalwire_agents.cli", "signalwire_agents.search"]
105
+ packages = {find = {where = ["."], include = ["signalwire_agents*"]}}
106
106
  include-package-data = true
107
107
 
108
108
  [tool.setuptools.package-data]
@@ -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.20"
21
+ __version__ = "0.1.23"
22
22
 
23
23
  # Import core classes for easier access
24
24
  from .core.agent_base import AgentBase
@@ -11,6 +11,7 @@ See LICENSE file in the project root for full license information.
11
11
  AgentServer - Class for hosting multiple SignalWire AI Agents in a single server
12
12
  """
13
13
 
14
+ import os
14
15
  import re
15
16
  from typing import Dict, Any, Optional, List, Tuple, Callable
16
17
 
@@ -575,24 +576,62 @@ class AgentServer:
575
576
  # No matching agent found
576
577
  return {"error": "Not Found"}
577
578
 
578
- # Print server info
579
+ # Set host and port
579
580
  host = host or self.host
580
581
  port = port or self.port
581
582
 
582
- self.logger.info(f"Starting server on {host}:{port}")
583
+ # Check for SSL configuration from environment variables
584
+ ssl_enabled_env = os.environ.get('SWML_SSL_ENABLED', '').lower()
585
+ ssl_enabled = ssl_enabled_env in ('true', '1', 'yes')
586
+ ssl_cert_path = os.environ.get('SWML_SSL_CERT_PATH')
587
+ ssl_key_path = os.environ.get('SWML_SSL_KEY_PATH')
588
+ domain = os.environ.get('SWML_DOMAIN')
589
+
590
+ # Validate SSL configuration if enabled
591
+ if ssl_enabled:
592
+ if not ssl_cert_path or not os.path.exists(ssl_cert_path):
593
+ self.logger.warning(f"SSL cert not found: {ssl_cert_path}")
594
+ ssl_enabled = False
595
+ elif not ssl_key_path or not os.path.exists(ssl_key_path):
596
+ self.logger.warning(f"SSL key not found: {ssl_key_path}")
597
+ ssl_enabled = False
598
+
599
+ # Update server info display with correct protocol
600
+ protocol = "https" if ssl_enabled else "http"
601
+
602
+ # Determine display host - include port unless it's the standard port for the protocol
603
+ if ssl_enabled and domain:
604
+ # Use domain, but include port if it's not the standard HTTPS port (443)
605
+ display_host = f"{domain}:{port}" if port != 443 else domain
606
+ else:
607
+ # Use host:port for HTTP or when no domain is specified
608
+ display_host = f"{host}:{port}"
609
+
610
+ self.logger.info(f"Starting server on {protocol}://{display_host}")
583
611
  for route, agent in self.agents.items():
584
612
  username, password = agent.get_basic_auth_credentials()
585
613
  self.logger.info(f"Agent '{agent.get_name()}' available at:")
586
- self.logger.info(f"URL: http://{host}:{port}{route}")
614
+ self.logger.info(f"URL: {protocol}://{display_host}{route}")
587
615
  self.logger.info(f"Basic Auth: {username}:{password}")
588
-
589
- # Start the server
590
- uvicorn.run(
591
- self.app,
592
- host=host,
593
- port=port,
594
- log_level=self.log_level
595
- )
616
+
617
+ # Start the server with or without SSL
618
+ if ssl_enabled and ssl_cert_path and ssl_key_path:
619
+ self.logger.info(f"Starting with SSL - cert: {ssl_cert_path}, key: {ssl_key_path}")
620
+ uvicorn.run(
621
+ self.app,
622
+ host=host,
623
+ port=port,
624
+ log_level=self.log_level,
625
+ ssl_certfile=ssl_cert_path,
626
+ ssl_keyfile=ssl_key_path
627
+ )
628
+ else:
629
+ uvicorn.run(
630
+ self.app,
631
+ host=host,
632
+ port=port,
633
+ log_level=self.log_level
634
+ )
596
635
 
597
636
  def register_global_routing_callback(self, callback_fn: Callable[[Request, Dict[str, Any]], Optional[str]],
598
637
  path: str) -> None:
@@ -13,7 +13,7 @@ Core components for SignalWire AI Agents
13
13
 
14
14
  from signalwire_agents.core.agent_base import AgentBase
15
15
  from signalwire_agents.core.function_result import SwaigFunctionResult
16
- from signalwire_agents.core.swaig_function import SwaigFunction
16
+ from signalwire_agents.core.swaig_function import SWAIGFunction
17
17
  from signalwire_agents.core.swml_service import SWMLService
18
18
  from signalwire_agents.core.swml_handler import SWMLVerbHandler, VerbHandlerRegistry
19
19
  from signalwire_agents.core.swml_builder import SWMLBuilder
@@ -21,7 +21,7 @@ from signalwire_agents.core.swml_builder import SWMLBuilder
21
21
  __all__ = [
22
22
  'AgentBase',
23
23
  'SwaigFunctionResult',
24
- 'SwaigFunction',
24
+ 'SWAIGFunction',
25
25
  'SWMLService',
26
26
  'SWMLVerbHandler',
27
27
  'VerbHandlerRegistry',
@@ -0,0 +1,14 @@
1
+ """
2
+ Copyright (c) 2025 SignalWire
3
+
4
+ This file is part of the SignalWire AI Agents SDK.
5
+
6
+ Licensed under the MIT License.
7
+ See LICENSE file in the project root for full license information.
8
+ """
9
+
10
+ """Agent refactored components."""
11
+
12
+ from .config.ephemeral import EphemeralAgentConfig
13
+
14
+ __all__ = ['EphemeralAgentConfig']
@@ -0,0 +1,14 @@
1
+ """
2
+ Copyright (c) 2025 SignalWire
3
+
4
+ This file is part of the SignalWire AI Agents SDK.
5
+
6
+ Licensed under the MIT License.
7
+ See LICENSE file in the project root for full license information.
8
+ """
9
+
10
+ """Configuration management modules."""
11
+
12
+ from .ephemeral import EphemeralAgentConfig
13
+
14
+ __all__ = ['EphemeralAgentConfig']
@@ -0,0 +1,176 @@
1
+ """
2
+ Copyright (c) 2025 SignalWire
3
+
4
+ This file is part of the SignalWire AI Agents SDK.
5
+
6
+ Licensed under the MIT License.
7
+ See LICENSE file in the project root for full license information.
8
+ """
9
+
10
+ """Ephemeral agent configuration for dynamic per-request settings."""
11
+
12
+ from typing import Dict, Any, Optional, List
13
+
14
+
15
+ class EphemeralAgentConfig:
16
+ """
17
+ An ephemeral configurator object that mimics AgentBase's configuration interface.
18
+
19
+ This allows dynamic configuration callbacks to use the same familiar methods
20
+ they would use during agent initialization, but for per-request configuration.
21
+ """
22
+
23
+ def __init__(self):
24
+ # Initialize all configuration containers
25
+ self._hints = []
26
+ self._languages = []
27
+ self._pronounce = []
28
+ self._params = {}
29
+ self._global_data = {}
30
+ self._prompt_sections = []
31
+ self._raw_prompt = None
32
+ self._post_prompt = None
33
+ self._function_includes = []
34
+ self._native_functions = []
35
+
36
+ # Mirror all the AgentBase configuration methods
37
+
38
+ def add_hint(self, hint: str) -> 'EphemeralAgentConfig':
39
+ """Add a simple string hint"""
40
+ if isinstance(hint, str) and hint:
41
+ self._hints.append(hint)
42
+ return self
43
+
44
+ def add_hints(self, hints: List[str]) -> 'EphemeralAgentConfig':
45
+ """Add multiple string hints"""
46
+ if hints and isinstance(hints, list):
47
+ for hint in hints:
48
+ if isinstance(hint, str) and hint:
49
+ self._hints.append(hint)
50
+ return self
51
+
52
+ def add_language(self, name: str, code: str, voice: str, **kwargs) -> 'EphemeralAgentConfig':
53
+ """Add a language configuration"""
54
+ language = {
55
+ "name": name,
56
+ "code": code,
57
+ "voice": voice
58
+ }
59
+
60
+ # Handle additional parameters
61
+ for key, value in kwargs.items():
62
+ if key in ["engine", "model", "speech_fillers", "function_fillers", "fillers"]:
63
+ language[key] = value
64
+
65
+ self._languages.append(language)
66
+ return self
67
+
68
+ def add_pronunciation(self, replace: str, with_text: str, ignore_case: bool = False) -> 'EphemeralAgentConfig':
69
+ """Add a pronunciation rule"""
70
+ if replace and with_text:
71
+ rule = {"replace": replace, "with": with_text}
72
+ if ignore_case:
73
+ rule["ignore_case"] = True
74
+ self._pronounce.append(rule)
75
+ return self
76
+
77
+ def set_param(self, key: str, value: Any) -> 'EphemeralAgentConfig':
78
+ """Set a single AI parameter"""
79
+ if key:
80
+ self._params[key] = value
81
+ return self
82
+
83
+ def set_params(self, params: Dict[str, Any]) -> 'EphemeralAgentConfig':
84
+ """Set multiple AI parameters"""
85
+ if params and isinstance(params, dict):
86
+ self._params.update(params)
87
+ return self
88
+
89
+ def set_global_data(self, data: Dict[str, Any]) -> 'EphemeralAgentConfig':
90
+ """Set global data"""
91
+ if data and isinstance(data, dict):
92
+ self._global_data = data
93
+ return self
94
+
95
+ def update_global_data(self, data: Dict[str, Any]) -> 'EphemeralAgentConfig':
96
+ """Update global data"""
97
+ if data and isinstance(data, dict):
98
+ self._global_data.update(data)
99
+ return self
100
+
101
+ def set_prompt_text(self, text: str) -> 'EphemeralAgentConfig':
102
+ """Set raw prompt text"""
103
+ self._raw_prompt = text
104
+ return self
105
+
106
+ def set_post_prompt(self, text: str) -> 'EphemeralAgentConfig':
107
+ """Set post-prompt text"""
108
+ self._post_prompt = text
109
+ return self
110
+
111
+ def prompt_add_section(self, title: str, body: str = "", bullets: Optional[List[str]] = None, **kwargs) -> 'EphemeralAgentConfig':
112
+ """Add a prompt section"""
113
+ section = {
114
+ "title": title,
115
+ "body": body
116
+ }
117
+ if bullets:
118
+ section["bullets"] = bullets
119
+
120
+ # Handle additional parameters
121
+ for key, value in kwargs.items():
122
+ if key in ["numbered", "numbered_bullets", "subsections"]:
123
+ section[key] = value
124
+
125
+ self._prompt_sections.append(section)
126
+ return self
127
+
128
+ def set_native_functions(self, function_names: List[str]) -> 'EphemeralAgentConfig':
129
+ """Set native functions"""
130
+ if function_names and isinstance(function_names, list):
131
+ self._native_functions = [name for name in function_names if isinstance(name, str)]
132
+ return self
133
+
134
+ def add_function_include(self, url: str, functions: List[str], meta_data: Optional[Dict[str, Any]] = None) -> 'EphemeralAgentConfig':
135
+ """Add a function include"""
136
+ if url and functions and isinstance(functions, list):
137
+ include = {"url": url, "functions": functions}
138
+ if meta_data and isinstance(meta_data, dict):
139
+ include["meta_data"] = meta_data
140
+ self._function_includes.append(include)
141
+ return self
142
+
143
+ def extract_config(self) -> Dict[str, Any]:
144
+ """
145
+ Extract the configuration as a dictionary for applying to the real agent.
146
+
147
+ Returns:
148
+ Dictionary containing all the configuration changes
149
+ """
150
+ config = {}
151
+
152
+ if self._hints:
153
+ config["hints"] = self._hints
154
+ if self._languages:
155
+ config["languages"] = self._languages
156
+ if self._pronounce:
157
+ config["pronounce"] = self._pronounce
158
+ if self._params:
159
+ config["params"] = self._params
160
+ if self._global_data:
161
+ config["global_data"] = self._global_data
162
+ if self._function_includes:
163
+ config["function_includes"] = self._function_includes
164
+ if self._native_functions:
165
+ config["native_functions"] = self._native_functions
166
+
167
+ # Handle prompt sections - these should be applied to the agent's POM, not as raw config
168
+ # The calling code should use these to build the prompt properly
169
+ if self._prompt_sections:
170
+ config["_ephemeral_prompt_sections"] = self._prompt_sections
171
+ if self._raw_prompt:
172
+ config["_ephemeral_raw_prompt"] = self._raw_prompt
173
+ if self._post_prompt:
174
+ config["_ephemeral_post_prompt"] = self._post_prompt
175
+
176
+ return config
@@ -0,0 +1,14 @@
1
+ """
2
+ Copyright (c) 2025 SignalWire
3
+
4
+ This file is part of the SignalWire AI Agents SDK.
5
+
6
+ Licensed under the MIT License.
7
+ See LICENSE file in the project root for full license information.
8
+ """
9
+
10
+ """Prompt management modules."""
11
+
12
+ from .manager import PromptManager
13
+
14
+ __all__ = ['PromptManager']