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.
- {signalwire_agents-0.1.20/signalwire_agents.egg-info → signalwire_agents-0.1.23}/PKG-INFO +5 -8
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/README.md +2 -5
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/pyproject.toml +4 -4
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/__init__.py +1 -1
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/agent_server.py +50 -11
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/__init__.py +2 -2
- signalwire_agents-0.1.23/signalwire_agents/core/agent/__init__.py +14 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/config/__init__.py +14 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/config/ephemeral.py +176 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/deployment/__init__.py +0 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/deployment/handlers/__init__.py +0 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/prompt/__init__.py +14 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/prompt/manager.py +288 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/routing/__init__.py +0 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/security/__init__.py +0 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/swml/__init__.py +0 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/tools/__init__.py +15 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/tools/decorator.py +95 -0
- signalwire_agents-0.1.23/signalwire_agents/core/agent/tools/registry.py +192 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/agent_base.py +131 -413
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/data_map.py +3 -15
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/skill_manager.py +0 -17
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/swaig_function.py +0 -2
- signalwire_agents-0.1.23/signalwire_agents/core/swml_builder.py +414 -0
- signalwire_agents-0.1.23/signalwire_agents/core/swml_renderer.py +194 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/swml_service.py +25 -94
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/index_builder.py +1 -1
- signalwire_agents-0.1.23/signalwire_agents/skills/api_ninjas_trivia/__init__.py +3 -0
- signalwire_agents-0.1.23/signalwire_agents/skills/api_ninjas_trivia/skill.py +192 -0
- signalwire_agents-0.1.23/signalwire_agents/skills/play_background_file/__init__.py +3 -0
- signalwire_agents-0.1.23/signalwire_agents/skills/play_background_file/skill.py +197 -0
- signalwire_agents-0.1.23/signalwire_agents/skills/weather_api/__init__.py +3 -0
- signalwire_agents-0.1.23/signalwire_agents/skills/weather_api/skill.py +154 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23/signalwire_agents.egg-info}/PKG-INFO +5 -8
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/SOURCES.txt +19 -0
- signalwire_agents-0.1.20/signalwire_agents/core/swml_builder.py +0 -218
- signalwire_agents-0.1.20/signalwire_agents/core/swml_renderer.py +0 -383
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/LICENSE +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/schema.json +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/setup.cfg +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/setup.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/cli/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/cli/build_search.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/cli/test_swaig.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/contexts.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/function_result.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/logging_config.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/pom_builder.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/security/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/security/session_manager.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/skill_base.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/state/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/state/file_state_manager.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/state/state_manager.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/core/swml_handler.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/concierge.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/faq_bot.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/info_gatherer.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/receptionist.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/prefabs/survey.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/schema.json +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/document_processor.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/query_processor.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/search_engine.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/search/search_service.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere_serverless/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datasphere_serverless/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datetime/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/datetime/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/joke/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/joke/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/math/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/math/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/native_vector_search/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/native_vector_search/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/registry.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/web_search/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/web_search/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/wikipedia_search/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/skills/wikipedia_search/skill.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/__init__.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/pom_utils.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/schema_utils.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/token_generators.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents/utils/validators.py +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/dependency_links.txt +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/entry_points.txt +0 -0
- {signalwire_agents-0.1.20 → signalwire_agents-0.1.23}/signalwire_agents.egg-info/requires.txt +0 -0
- {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.
|
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-
|
7
|
-
Classifier: Development Status ::
|
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/
|
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
|
-
#
|
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/
|
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
|
-
#
|
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.
|
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 ::
|
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-
|
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 =
|
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.
|
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
|
-
#
|
579
|
+
# Set host and port
|
579
580
|
host = host or self.host
|
580
581
|
port = port or self.port
|
581
582
|
|
582
|
-
|
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:
|
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
|
-
|
591
|
-
self.
|
592
|
-
|
593
|
-
|
594
|
-
|
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
|
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
|
-
'
|
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
|
File without changes
|
File without changes
|
@@ -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']
|