signalwire-agents 0.1.10__py3-none-any.whl → 0.1.12__py3-none-any.whl
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/__init__.py +43 -4
- signalwire_agents/agent_server.py +268 -15
- signalwire_agents/cli/__init__.py +9 -0
- signalwire_agents/cli/build_search.py +457 -0
- signalwire_agents/cli/test_swaig.py +2609 -0
- signalwire_agents/core/agent_base.py +691 -82
- signalwire_agents/core/contexts.py +289 -0
- signalwire_agents/core/data_map.py +499 -0
- signalwire_agents/core/function_result.py +57 -10
- signalwire_agents/core/logging_config.py +232 -0
- signalwire_agents/core/skill_base.py +27 -37
- signalwire_agents/core/skill_manager.py +89 -23
- signalwire_agents/core/swaig_function.py +13 -1
- signalwire_agents/core/swml_handler.py +37 -13
- signalwire_agents/core/swml_service.py +37 -28
- signalwire_agents/search/__init__.py +131 -0
- signalwire_agents/search/document_processor.py +764 -0
- signalwire_agents/search/index_builder.py +534 -0
- signalwire_agents/search/query_processor.py +371 -0
- signalwire_agents/search/search_engine.py +383 -0
- signalwire_agents/search/search_service.py +251 -0
- signalwire_agents/skills/datasphere/__init__.py +12 -0
- signalwire_agents/skills/datasphere/skill.py +229 -0
- signalwire_agents/skills/datasphere_serverless/__init__.py +1 -0
- signalwire_agents/skills/datasphere_serverless/skill.py +156 -0
- signalwire_agents/skills/datetime/skill.py +9 -5
- signalwire_agents/skills/joke/__init__.py +1 -0
- signalwire_agents/skills/joke/skill.py +88 -0
- signalwire_agents/skills/math/skill.py +9 -6
- signalwire_agents/skills/native_vector_search/__init__.py +1 -0
- signalwire_agents/skills/native_vector_search/skill.py +352 -0
- signalwire_agents/skills/registry.py +10 -4
- signalwire_agents/skills/web_search/skill.py +57 -21
- signalwire_agents/skills/wikipedia/__init__.py +9 -0
- signalwire_agents/skills/wikipedia/skill.py +180 -0
- signalwire_agents/utils/__init__.py +14 -0
- signalwire_agents/utils/schema_utils.py +111 -44
- signalwire_agents-0.1.12.dist-info/METADATA +863 -0
- signalwire_agents-0.1.12.dist-info/RECORD +67 -0
- {signalwire_agents-0.1.10.dist-info → signalwire_agents-0.1.12.dist-info}/WHEEL +1 -1
- signalwire_agents-0.1.12.dist-info/entry_points.txt +3 -0
- signalwire_agents-0.1.10.dist-info/METADATA +0 -319
- signalwire_agents-0.1.10.dist-info/RECORD +0 -44
- {signalwire_agents-0.1.10.data → signalwire_agents-0.1.12.data}/data/schema.json +0 -0
- {signalwire_agents-0.1.10.dist-info → signalwire_agents-0.1.12.dist-info}/licenses/LICENSE +0 -0
- {signalwire_agents-0.1.10.dist-info → signalwire_agents-0.1.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
signalwire_agents/__init__.py,sha256=5iXBCyEKoudhgH9zYcR3L7Je4n5NpUd4q1qgQ7F94uo,2093
|
2
|
+
signalwire_agents/agent_server.py,sha256=3Or8rIMAqW750V-XitBUMgOpW9BAIXmKXoGq7LkejAA,24988
|
3
|
+
signalwire_agents/schema.json,sha256=M8Mn6pQda2P9jhbmkALrLr1wt-fRuhYRqdmEi9Rbhqk,178075
|
4
|
+
signalwire_agents/cli/__init__.py,sha256=Iy2BfWDWBEZoA1cyHTDsooBSVMx4vH5Ddhr3sEuFe8c,197
|
5
|
+
signalwire_agents/cli/build_search.py,sha256=FXEgZEDn_2-7sJGQ07LYUxT9MGySUN-kpUbCCPBYxWk,15966
|
6
|
+
signalwire_agents/cli/test_swaig.py,sha256=tBl2r-MqxKDiAVMfaDOntR9OMFE3I0ff51oGMlRQsl8,100237
|
7
|
+
signalwire_agents/core/__init__.py,sha256=mVDLbpq1pg_WwiqsQR28NNZwJ6-VUXFIfg-vN7pk0ew,806
|
8
|
+
signalwire_agents/core/agent_base.py,sha256=XTDlVsmgvtaO8696Dtsw5s9pk2TJz2TyySrurJpndJs,141704
|
9
|
+
signalwire_agents/core/contexts.py,sha256=h7hra4xoiKAUdVyJhcKggl8X9EoqwTVWBmNMp-sEsuc,9598
|
10
|
+
signalwire_agents/core/data_map.py,sha256=U-HLEZQomWf-UI0-nLAE8g1oyRdE5bU_WxQpboI2YI4,17695
|
11
|
+
signalwire_agents/core/function_result.py,sha256=SP46vPAliEzwh3JeeSxmLD_f7_ixRxMBtpSl3t7jieU,45370
|
12
|
+
signalwire_agents/core/logging_config.py,sha256=ATO_Zo8Kc6Ts1wU39ewliF_dKAy6M91I9q-KiilsLyk,7507
|
13
|
+
signalwire_agents/core/pom_builder.py,sha256=ywuiIfP8BeLBPo_G4X1teZlG6zTCMkW71CZnmyoDTAQ,6636
|
14
|
+
signalwire_agents/core/skill_base.py,sha256=lOpVTLhD9NjStF7Lxh6bAQUGa3DpNYV4agXJRakRuX0,4258
|
15
|
+
signalwire_agents/core/skill_manager.py,sha256=6vAzkWYeycilX-5T1B039sf8s11BfRh6ASstt70wWsw,8074
|
16
|
+
signalwire_agents/core/swaig_function.py,sha256=OG76Hrtbc8H1mPR5opTmNUEOo0yOMbpbMfZMZjG69Ek,6874
|
17
|
+
signalwire_agents/core/swml_builder.py,sha256=Q1ikU9pedgjW888mjbqDFv-jMDvDZ-tZgfyMfu4qQN0,6719
|
18
|
+
signalwire_agents/core/swml_handler.py,sha256=C8NvMpNdFg9UiEzPwMmMXMn8X6w10IShKjBJ8VSITBk,8189
|
19
|
+
signalwire_agents/core/swml_renderer.py,sha256=iobMWWoBR7dkHndI3Qlwf4C0fg2p7DmAU2Rb7ZmmLhA,13891
|
20
|
+
signalwire_agents/core/swml_service.py,sha256=3yhYfowgdKphjf2OLJYuaPsE6Paewe6rAO3e7F7NPic,49797
|
21
|
+
signalwire_agents/core/security/__init__.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
22
|
+
signalwire_agents/core/security/session_manager.py,sha256=s5hXYcFnrsYFoyo-zcN7EJy-wInZQI_cWTBHX9MxHR4,9164
|
23
|
+
signalwire_agents/core/state/__init__.py,sha256=qpYIfQBApet6VQsy6diS3yu0lMxCBC6REOUk5l1McUw,379
|
24
|
+
signalwire_agents/core/state/file_state_manager.py,sha256=52I_KVlmhHCbKIaHj74Q-ksP_-AF6ewYmOXCf4n5DTQ,7307
|
25
|
+
signalwire_agents/core/state/state_manager.py,sha256=76B4mDutMb826dK4c_IJhOXH09BW1bJu6EZa6Mh_LB4,2511
|
26
|
+
signalwire_agents/prefabs/__init__.py,sha256=MW11J63XH7KxF2MWguRsMFM9iqMWexaEO9ynDPL_PDM,715
|
27
|
+
signalwire_agents/prefabs/concierge.py,sha256=FQxSUBAVH2ECtNs4GGa3f0EPiOrAKaz14h7byNFy5K8,10106
|
28
|
+
signalwire_agents/prefabs/faq_bot.py,sha256=NrUn5AGmtdzYTyxTHPt8BZ14ZN1sh4xKA2SVQUlfPPQ,10834
|
29
|
+
signalwire_agents/prefabs/info_gatherer.py,sha256=dr9UUgNGX7MIKdCMth3jDVLf6OrHov5G6_zIuNvnrOY,15468
|
30
|
+
signalwire_agents/prefabs/receptionist.py,sha256=8EyQ6M0Egs3g7KKWukHFiO9UPoVUxT4MLkvyT3V8o64,10585
|
31
|
+
signalwire_agents/prefabs/survey.py,sha256=IIIQfgvMlfVNjEEEdWUn4lAJqVsCDlBsIAkOJ1ckyAE,14796
|
32
|
+
signalwire_agents/search/__init__.py,sha256=x7saU_MDbhoOIzcvCT1-gnqyH2rrMpzB4ZUqk-av-lI,3958
|
33
|
+
signalwire_agents/search/document_processor.py,sha256=uqBvL8EGCou81ack7T49H0MNC7NkIRbciPtQecb1Jjo,31204
|
34
|
+
signalwire_agents/search/index_builder.py,sha256=wAfDtK4YgnbHiG-syvEzbNGUHN92PMy1gMnhG_rXAUM,21143
|
35
|
+
signalwire_agents/search/query_processor.py,sha256=1o8dEHVG52ci1e1PQxm5a0_1FV4zdqYBex_qcyJabRs,13926
|
36
|
+
signalwire_agents/search/search_engine.py,sha256=KFF33aPsBdwb2N1aTJmAA0xo3KPANoXjwV53uSxih9o,14798
|
37
|
+
signalwire_agents/search/search_service.py,sha256=Src_REgjkcddHBDCaLv2BMJnDSxcE4XV_1U8YStJOh8,8719
|
38
|
+
signalwire_agents/skills/__init__.py,sha256=xfxrQ0i-aTRomHiCsqelU4RlNlHPJFPgPu-UBDaBOqA,340
|
39
|
+
signalwire_agents/skills/registry.py,sha256=UrFhZJdc_8Y9k9KCSRZtt7QemafDNtuvyuheAXShjuU,3821
|
40
|
+
signalwire_agents/skills/datasphere/__init__.py,sha256=SJJlmeMSeezjINPgkuWN1XzDPN_Z3GzZ_StzO1BtxQs,257
|
41
|
+
signalwire_agents/skills/datasphere/skill.py,sha256=L6GrGwej3sKPcHljKBNf4it5g4DaGzR18KlQx65_XKg,9598
|
42
|
+
signalwire_agents/skills/datasphere_serverless/__init__.py,sha256=65hu8_0eqiczLSZ-aJgASpMQqTUjzTQUI1fC8GI7qTI,70
|
43
|
+
signalwire_agents/skills/datasphere_serverless/skill.py,sha256=C3wynBZT2qCezPwb1_F8d37die98bMTNWX8mz5ugiE4,6826
|
44
|
+
signalwire_agents/skills/datetime/__init__.py,sha256=coPaY-k2EyZWuYckGunhSJ65Y1Jwz66h-iOo0QWb5WY,43
|
45
|
+
signalwire_agents/skills/datetime/skill.py,sha256=aBBdcPV5xWX6uWi9W0VqZ0kKOqC3JHrAhG1bZn58ro8,3900
|
46
|
+
signalwire_agents/skills/joke/__init__.py,sha256=R-iS9UMMvOdpkxL9aooVik16eCddJw14Rz4PmFqCdsM,53
|
47
|
+
signalwire_agents/skills/joke/skill.py,sha256=AFaf6fMy0sxUPJHvcnf3CWMuPqpJP4ODscUexMadEcU,3381
|
48
|
+
signalwire_agents/skills/math/__init__.py,sha256=lGAFWEmJH2fuwkuZUdDTY5dmucrIwtjfNT8bE2hOSP8,39
|
49
|
+
signalwire_agents/skills/math/skill.py,sha256=5sErd5x1rFHJg2GlmdJB3LvrmvTNOrZsA2jRnG67Zw8,3342
|
50
|
+
signalwire_agents/skills/native_vector_search/__init__.py,sha256=buvncVoH5u8MJA0SLlz1JQgIuyBTQW5aql-ydnc7Wh8,29
|
51
|
+
signalwire_agents/skills/native_vector_search/skill.py,sha256=jpXah7teIljgTfl2mW73VMlBwEKXS-s4Cws6XCS2JxU,14846
|
52
|
+
signalwire_agents/skills/web_search/__init__.py,sha256=wJlptYDExYw-nxZJVzlTLOgkKkDOLUUt1ZdoLt44ixs,45
|
53
|
+
signalwire_agents/skills/web_search/skill.py,sha256=GkfhG3Vz2HxOv91TvVuA4e_4b5cuswUpnJDLdaZW37k,10304
|
54
|
+
signalwire_agents/skills/wikipedia/__init__.py,sha256=8Db_aE0ly7QoXg7n2RDvCqKupkyR-UYlK9uFUnGNCE8,184
|
55
|
+
signalwire_agents/skills/wikipedia/skill.py,sha256=Q_HWJoG2RkQuZMgWxD9czuzEor79Gy1tjo6ywVzec84,6877
|
56
|
+
signalwire_agents/utils/__init__.py,sha256=1KVsHzwgfktSXHe3vqSRGImjtIE58szwD2FHHoFBtvY,601
|
57
|
+
signalwire_agents/utils/pom_utils.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
58
|
+
signalwire_agents/utils/schema_utils.py,sha256=i4okv_O9bUApwT_jJf4Yoij3bLCrGrW3DC-vzSy2RuY,16392
|
59
|
+
signalwire_agents/utils/token_generators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
60
|
+
signalwire_agents/utils/validators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
61
|
+
signalwire_agents-0.1.12.data/data/schema.json,sha256=M8Mn6pQda2P9jhbmkALrLr1wt-fRuhYRqdmEi9Rbhqk,178075
|
62
|
+
signalwire_agents-0.1.12.dist-info/licenses/LICENSE,sha256=NYvAsB-rTcSvG9cqHt9EUHAWLiA9YzM4Qfz-mPdvDR0,1067
|
63
|
+
signalwire_agents-0.1.12.dist-info/METADATA,sha256=cKKKnqlvhw4V0CJwtl_6xQtCVS1kVKReuAVbfxK6VuA,34572
|
64
|
+
signalwire_agents-0.1.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
65
|
+
signalwire_agents-0.1.12.dist-info/entry_points.txt,sha256=7RBxC9wwFdsqP7g1F4JzsJ3AIHsjGtb3h0mxEGmANlI,151
|
66
|
+
signalwire_agents-0.1.12.dist-info/top_level.txt,sha256=kDGS6ZYv84K9P5Kyg9_S8P_pbUXoHkso0On_DB5bbWc,18
|
67
|
+
signalwire_agents-0.1.12.dist-info/RECORD,,
|
@@ -1,319 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: signalwire_agents
|
3
|
-
Version: 0.1.10
|
4
|
-
Summary: SignalWire AI Agents SDK
|
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
|
8
|
-
Classifier: Intended Audience :: Developers
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
10
|
-
Classifier: Programming Language :: Python :: 3
|
11
|
-
Classifier: Programming Language :: Python :: 3.7
|
12
|
-
Classifier: Programming Language :: Python :: 3.8
|
13
|
-
Classifier: Programming Language :: Python :: 3.9
|
14
|
-
Classifier: Programming Language :: Python :: 3.10
|
15
|
-
Classifier: Programming Language :: Python :: 3.11
|
16
|
-
Requires-Python: >=3.7
|
17
|
-
Description-Content-Type: text/markdown
|
18
|
-
License-File: LICENSE
|
19
|
-
Requires-Dist: fastapi==0.115.12
|
20
|
-
Requires-Dist: pydantic==2.11.4
|
21
|
-
Requires-Dist: PyYAML==6.0.2
|
22
|
-
Requires-Dist: Requests==2.32.3
|
23
|
-
Requires-Dist: setuptools==66.1.1
|
24
|
-
Requires-Dist: signalwire_pom==2.7.1
|
25
|
-
Requires-Dist: structlog==25.3.0
|
26
|
-
Requires-Dist: uvicorn==0.34.2
|
27
|
-
Requires-Dist: beautifulsoup4==4.12.3
|
28
|
-
Requires-Dist: pytz==2023.3
|
29
|
-
Dynamic: license-file
|
30
|
-
|
31
|
-
# SignalWire AI Agent SDK
|
32
|
-
|
33
|
-
A Python SDK for creating, hosting, and securing SignalWire AI agents as microservices with minimal boilerplate.
|
34
|
-
|
35
|
-
## Features
|
36
|
-
|
37
|
-
- **Self-Contained Agents**: Each agent is both a web app and an AI persona
|
38
|
-
- **Prompt Object Model**: Structured prompt composition using POM
|
39
|
-
- **SWAIG Integration**: Easily define and handle AI tools/functions
|
40
|
-
- **Dynamic Configuration**: Configure agents per-request for multi-tenant apps and personalization
|
41
|
-
- **Custom Routing**: Dynamic request handling for different paths and content
|
42
|
-
- **SIP Integration**: Route SIP calls to agents based on SIP usernames
|
43
|
-
- **Security Built-In**: Session management, function-specific security tokens, and basic auth
|
44
|
-
- **State Management**: Persistent conversation state with automatic tracking
|
45
|
-
- **Prefab Archetypes**: Ready-to-use agent types for common scenarios
|
46
|
-
- **Multi-Agent Support**: Host multiple agents on a single server
|
47
|
-
- **Modular Skills System**: Add capabilities to agents with simple one-liner calls
|
48
|
-
|
49
|
-
## Skills System
|
50
|
-
|
51
|
-
The SignalWire Agents SDK includes a powerful modular skills system that allows you to add complex capabilities to your agents with simple one-liner calls:
|
52
|
-
|
53
|
-
```python
|
54
|
-
from signalwire_agents import AgentBase
|
55
|
-
|
56
|
-
# Create an agent
|
57
|
-
agent = AgentBase("My Assistant", route="/assistant")
|
58
|
-
|
59
|
-
# Add skills with one-liners
|
60
|
-
agent.add_skill("web_search") # Web search capability
|
61
|
-
agent.add_skill("datetime") # Current date/time info
|
62
|
-
agent.add_skill("math") # Mathematical calculations
|
63
|
-
|
64
|
-
# Configure skills with parameters
|
65
|
-
agent.add_skill("web_search", {
|
66
|
-
"num_results": 3, # Get 3 search results
|
67
|
-
"delay": 0.5 # Small delay between requests
|
68
|
-
})
|
69
|
-
|
70
|
-
# Advanced: Customize SWAIG function properties
|
71
|
-
agent.add_skill("math", {
|
72
|
-
"swaig_fields": {
|
73
|
-
"secure": False, # Override security settings
|
74
|
-
"fillers": {"en-US": ["Calculating..."]} # Custom filler phrases
|
75
|
-
}
|
76
|
-
})
|
77
|
-
|
78
|
-
agent.serve()
|
79
|
-
```
|
80
|
-
|
81
|
-
### Available Built-in Skills
|
82
|
-
|
83
|
-
- **web_search**: Google Custom Search API integration with web scraping
|
84
|
-
- **datetime**: Current date and time with timezone support
|
85
|
-
- **math**: Safe mathematical expression evaluation
|
86
|
-
|
87
|
-
### Benefits
|
88
|
-
|
89
|
-
- **One-liner integration**: `agent.add_skill("skill_name")`
|
90
|
-
- **Configurable parameters**: `agent.add_skill("skill_name", {"param": "value"})`
|
91
|
-
- **Automatic discovery**: Skills are automatically found from the skills directory
|
92
|
-
- **Dependency validation**: Clear error messages for missing requirements
|
93
|
-
- **Modular architecture**: Skills are self-contained and reusable
|
94
|
-
|
95
|
-
For detailed documentation, see [Skills System README](docs/SKILLS_SYSTEM_README.md).
|
96
|
-
|
97
|
-
## Installation
|
98
|
-
|
99
|
-
```bash
|
100
|
-
pip install signalwire-agents
|
101
|
-
```
|
102
|
-
|
103
|
-
## Quick Start
|
104
|
-
|
105
|
-
```python
|
106
|
-
from signalwire_agents import AgentBase
|
107
|
-
from signalwire_agents.core.function_result import SwaigFunctionResult
|
108
|
-
|
109
|
-
class SimpleAgent(AgentBase):
|
110
|
-
def __init__(self):
|
111
|
-
super().__init__(name="simple", route="/simple")
|
112
|
-
|
113
|
-
# Configure the agent's personality
|
114
|
-
self.prompt_add_section("Personality", body="You are a helpful assistant.")
|
115
|
-
self.prompt_add_section("Goal", body="Help users with basic questions.")
|
116
|
-
self.prompt_add_section("Instructions", bullets=["Be concise and clear."])
|
117
|
-
|
118
|
-
# Alternative using convenience methods:
|
119
|
-
# self.setPersonality("You are a helpful assistant.")
|
120
|
-
# self.setGoal("Help users with basic questions.")
|
121
|
-
# self.setInstructions(["Be concise and clear."])
|
122
|
-
|
123
|
-
@AgentBase.tool(
|
124
|
-
name="get_time",
|
125
|
-
description="Get the current time",
|
126
|
-
parameters={}
|
127
|
-
)
|
128
|
-
def get_time(self, args, raw_data):
|
129
|
-
from datetime import datetime
|
130
|
-
now = datetime.now().strftime("%H:%M:%S")
|
131
|
-
return SwaigFunctionResult(f"The current time is {now}")
|
132
|
-
|
133
|
-
# Run the agent
|
134
|
-
if __name__ == "__main__":
|
135
|
-
agent = SimpleAgent()
|
136
|
-
agent.serve(host="0.0.0.0", port=8000)
|
137
|
-
```
|
138
|
-
|
139
|
-
## Using State Management
|
140
|
-
|
141
|
-
```python
|
142
|
-
from signalwire_agents import AgentBase
|
143
|
-
from signalwire_agents.core.function_result import SwaigFunctionResult
|
144
|
-
from signalwire_agents.core.state import FileStateManager
|
145
|
-
|
146
|
-
class StatefulAgent(AgentBase):
|
147
|
-
def __init__(self):
|
148
|
-
# Configure state management
|
149
|
-
state_manager = FileStateManager(storage_dir="./state_data")
|
150
|
-
|
151
|
-
super().__init__(
|
152
|
-
name="stateful",
|
153
|
-
route="/stateful",
|
154
|
-
enable_state_tracking=True, # Enable state tracking
|
155
|
-
state_manager=state_manager # Use custom state manager
|
156
|
-
)
|
157
|
-
|
158
|
-
# When enable_state_tracking=True, startup_hook and hangup_hook
|
159
|
-
# are automatically registered to track session lifecycle
|
160
|
-
|
161
|
-
# Custom tool for accessing and updating state
|
162
|
-
@AgentBase.tool(
|
163
|
-
name="save_preference",
|
164
|
-
description="Save a user preference",
|
165
|
-
parameters={
|
166
|
-
"preference_name": {
|
167
|
-
"type": "string",
|
168
|
-
"description": "Name of the preference to save"
|
169
|
-
},
|
170
|
-
"preference_value": {
|
171
|
-
"type": "string",
|
172
|
-
"description": "Value of the preference"
|
173
|
-
}
|
174
|
-
}
|
175
|
-
)
|
176
|
-
def save_preference(self, args, raw_data):
|
177
|
-
# Get the call ID from the raw data
|
178
|
-
call_id = raw_data.get("call_id")
|
179
|
-
|
180
|
-
if call_id:
|
181
|
-
# Get current state or empty dict if none exists
|
182
|
-
state = self.get_state(call_id) or {}
|
183
|
-
|
184
|
-
# Update the state
|
185
|
-
preferences = state.get("preferences", {})
|
186
|
-
preferences[args.get("preference_name")] = args.get("preference_value")
|
187
|
-
state["preferences"] = preferences
|
188
|
-
|
189
|
-
# Save the updated state
|
190
|
-
self.update_state(call_id, state)
|
191
|
-
|
192
|
-
return SwaigFunctionResult("Preference saved successfully")
|
193
|
-
else:
|
194
|
-
return SwaigFunctionResult("Could not save preference: No call ID")
|
195
|
-
```
|
196
|
-
|
197
|
-
## Using Prefab Agents
|
198
|
-
|
199
|
-
```python
|
200
|
-
from signalwire_agents.prefabs import InfoGathererAgent
|
201
|
-
|
202
|
-
agent = InfoGathererAgent(
|
203
|
-
fields=[
|
204
|
-
{"name": "full_name", "prompt": "What is your full name?"},
|
205
|
-
{"name": "reason", "prompt": "How can I help you today?"}
|
206
|
-
],
|
207
|
-
confirmation_template="Thanks {full_name}, I'll help you with {reason}.",
|
208
|
-
name="info-gatherer",
|
209
|
-
route="/info-gatherer"
|
210
|
-
)
|
211
|
-
|
212
|
-
agent.serve(host="0.0.0.0", port=8000)
|
213
|
-
```
|
214
|
-
|
215
|
-
Available prefabs include:
|
216
|
-
- `InfoGathererAgent`: Collects structured information from users
|
217
|
-
- `FAQBotAgent`: Answers questions based on a knowledge base
|
218
|
-
- `ConciergeAgent`: Routes users to specialized agents
|
219
|
-
- `SurveyAgent`: Conducts structured surveys with questions and rating scales
|
220
|
-
- `ReceptionistAgent`: Greets callers and transfers them to appropriate departments
|
221
|
-
|
222
|
-
## Dynamic Agent Configuration
|
223
|
-
|
224
|
-
Configure agents dynamically based on request parameters for multi-tenant applications, A/B testing, and personalization.
|
225
|
-
|
226
|
-
### Static vs Dynamic Configuration
|
227
|
-
|
228
|
-
- **Static**: Agent configured once at startup (traditional approach)
|
229
|
-
- **Dynamic**: Agent configured fresh for each request based on parameters
|
230
|
-
|
231
|
-
### Basic Example
|
232
|
-
|
233
|
-
```python
|
234
|
-
from signalwire_agents import AgentBase
|
235
|
-
|
236
|
-
class DynamicAgent(AgentBase):
|
237
|
-
def __init__(self):
|
238
|
-
super().__init__(name="dynamic-agent", route="/dynamic")
|
239
|
-
|
240
|
-
# Set up dynamic configuration callback
|
241
|
-
self.set_dynamic_config_callback(self.configure_per_request)
|
242
|
-
|
243
|
-
def configure_per_request(self, query_params, body_params, headers, agent):
|
244
|
-
"""Configure agent based on request parameters"""
|
245
|
-
|
246
|
-
# Extract parameters from request
|
247
|
-
tier = query_params.get('tier', 'standard')
|
248
|
-
language = query_params.get('language', 'en')
|
249
|
-
customer_id = query_params.get('customer_id')
|
250
|
-
|
251
|
-
# Configure voice and language
|
252
|
-
if language == 'es':
|
253
|
-
agent.add_language("Spanish", "es-ES", "rime.spore:mistv2")
|
254
|
-
else:
|
255
|
-
agent.add_language("English", "en-US", "rime.spore:mistv2")
|
256
|
-
|
257
|
-
# Configure based on service tier
|
258
|
-
if tier == 'premium':
|
259
|
-
agent.set_params({"end_of_speech_timeout": 300}) # Faster response
|
260
|
-
agent.prompt_add_section("Service Level", "You provide premium support.")
|
261
|
-
else:
|
262
|
-
agent.set_params({"end_of_speech_timeout": 500}) # Standard response
|
263
|
-
agent.prompt_add_section("Service Level", "You provide standard support.")
|
264
|
-
|
265
|
-
# Personalize with customer data
|
266
|
-
global_data = {"tier": tier, "language": language}
|
267
|
-
if customer_id:
|
268
|
-
global_data["customer_id"] = customer_id
|
269
|
-
agent.set_global_data(global_data)
|
270
|
-
|
271
|
-
# Usage examples:
|
272
|
-
# curl "http://localhost:3000/dynamic?tier=premium&language=es&customer_id=123"
|
273
|
-
# curl "http://localhost:3000/dynamic?tier=standard&language=en"
|
274
|
-
```
|
275
|
-
|
276
|
-
### Use Cases
|
277
|
-
|
278
|
-
- **Multi-tenant SaaS**: Different configurations per customer/organization
|
279
|
-
- **A/B Testing**: Test different agent behaviors with different user groups
|
280
|
-
- **Personalization**: Customize voice, prompts, and behavior per user
|
281
|
-
- **Localization**: Language and cultural adaptation based on user location
|
282
|
-
- **Dynamic Pricing**: Adjust features and capabilities based on subscription tiers
|
283
|
-
|
284
|
-
The `EphemeralAgentConfig` object provides all the same familiar methods as `AgentBase` (like `add_language()`, `prompt_add_section()`, `set_global_data()`) but applies them per-request instead of at startup.
|
285
|
-
|
286
|
-
For detailed documentation and advanced examples, see the [Agent Guide](docs/agent_guide.md#dynamic-agent-configuration).
|
287
|
-
|
288
|
-
## Configuration
|
289
|
-
|
290
|
-
### Environment Variables
|
291
|
-
|
292
|
-
The SDK supports the following environment variables:
|
293
|
-
|
294
|
-
- `SWML_BASIC_AUTH_USER`: Username for basic auth (default: auto-generated)
|
295
|
-
- `SWML_BASIC_AUTH_PASSWORD`: Password for basic auth (default: auto-generated)
|
296
|
-
- `SWML_PROXY_URL_BASE`: Base URL to use when behind a reverse proxy, used for constructing webhook URLs
|
297
|
-
- `SWML_SSL_ENABLED`: Enable HTTPS/SSL support (values: "true", "1", "yes")
|
298
|
-
- `SWML_SSL_CERT_PATH`: Path to SSL certificate file
|
299
|
-
- `SWML_SSL_KEY_PATH`: Path to SSL private key file
|
300
|
-
- `SWML_DOMAIN`: Domain name for SSL certificate and external URLs
|
301
|
-
- `SWML_SCHEMA_PATH`: Optional path to override the location of the schema.json file
|
302
|
-
|
303
|
-
When the auth environment variables are set, they will be used for all agents instead of generating random credentials. The proxy URL base is useful when your service is behind a reverse proxy or when you need external services to access your webhooks.
|
304
|
-
|
305
|
-
To enable HTTPS directly (without a reverse proxy), set `SWML_SSL_ENABLED` to "true", provide valid paths to your certificate and key files, and specify your domain name.
|
306
|
-
|
307
|
-
## Documentation
|
308
|
-
|
309
|
-
The package includes comprehensive documentation in the `docs/` directory:
|
310
|
-
|
311
|
-
- [Agent Guide](docs/agent_guide.md) - Detailed guide to creating and customizing agents, including dynamic configuration
|
312
|
-
- [Architecture](docs/architecture.md) - Overview of the SDK architecture and core concepts
|
313
|
-
- [SWML Service Guide](docs/swml_service_guide.md) - Guide to the underlying SWML service
|
314
|
-
|
315
|
-
These documents provide in-depth explanations of the features, APIs, and usage patterns.
|
316
|
-
|
317
|
-
## License
|
318
|
-
|
319
|
-
MIT
|
@@ -1,44 +0,0 @@
|
|
1
|
-
signalwire_agents/__init__.py,sha256=_r4Dn73_fAf-6vmjR6lL4HPcF6QVL4gDZMXeWQQAhgs,871
|
2
|
-
signalwire_agents/agent_server.py,sha256=se_YzOQE5UUoRUKCbTnOg9qr4G3qN7iVuQLutwXEwFU,12850
|
3
|
-
signalwire_agents/schema.json,sha256=M8Mn6pQda2P9jhbmkALrLr1wt-fRuhYRqdmEi9Rbhqk,178075
|
4
|
-
signalwire_agents/core/__init__.py,sha256=mVDLbpq1pg_WwiqsQR28NNZwJ6-VUXFIfg-vN7pk0ew,806
|
5
|
-
signalwire_agents/core/agent_base.py,sha256=sQHFKzOHtQrmMn9TGSda-BzfLsqNV9JgG9npUPUrovE,114016
|
6
|
-
signalwire_agents/core/function_result.py,sha256=OXzm4GOvA6TKbzZFsdz3iBU5vQs9LXxsmQue7zWVolE,43538
|
7
|
-
signalwire_agents/core/pom_builder.py,sha256=ywuiIfP8BeLBPo_G4X1teZlG6zTCMkW71CZnmyoDTAQ,6636
|
8
|
-
signalwire_agents/core/skill_base.py,sha256=ornJFNPl-H1-LHzAltYHgUjAMiWUXtg1uim5pbLAQ90,4426
|
9
|
-
signalwire_agents/core/skill_manager.py,sha256=kW17EOUR4u9mePo_90qKoCP6rusXDWzqZvJA0_FB-q4,5486
|
10
|
-
signalwire_agents/core/swaig_function.py,sha256=WoHGQuCmU9L9k39pttRunmfRtIa_PnNRn9W0Xq3MfIk,6316
|
11
|
-
signalwire_agents/core/swml_builder.py,sha256=Q1ikU9pedgjW888mjbqDFv-jMDvDZ-tZgfyMfu4qQN0,6719
|
12
|
-
signalwire_agents/core/swml_handler.py,sha256=KvphI_YY47VWGVXaix_N3SuQSyygHEUr9We6xESQK44,7002
|
13
|
-
signalwire_agents/core/swml_renderer.py,sha256=iobMWWoBR7dkHndI3Qlwf4C0fg2p7DmAU2Rb7ZmmLhA,13891
|
14
|
-
signalwire_agents/core/swml_service.py,sha256=4zTtpIKDtL59MzKgkBdpPmBCT6s1wVIikWEzZ1hqnyc,49309
|
15
|
-
signalwire_agents/core/security/__init__.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
16
|
-
signalwire_agents/core/security/session_manager.py,sha256=s5hXYcFnrsYFoyo-zcN7EJy-wInZQI_cWTBHX9MxHR4,9164
|
17
|
-
signalwire_agents/core/state/__init__.py,sha256=qpYIfQBApet6VQsy6diS3yu0lMxCBC6REOUk5l1McUw,379
|
18
|
-
signalwire_agents/core/state/file_state_manager.py,sha256=52I_KVlmhHCbKIaHj74Q-ksP_-AF6ewYmOXCf4n5DTQ,7307
|
19
|
-
signalwire_agents/core/state/state_manager.py,sha256=76B4mDutMb826dK4c_IJhOXH09BW1bJu6EZa6Mh_LB4,2511
|
20
|
-
signalwire_agents/prefabs/__init__.py,sha256=MW11J63XH7KxF2MWguRsMFM9iqMWexaEO9ynDPL_PDM,715
|
21
|
-
signalwire_agents/prefabs/concierge.py,sha256=FQxSUBAVH2ECtNs4GGa3f0EPiOrAKaz14h7byNFy5K8,10106
|
22
|
-
signalwire_agents/prefabs/faq_bot.py,sha256=NrUn5AGmtdzYTyxTHPt8BZ14ZN1sh4xKA2SVQUlfPPQ,10834
|
23
|
-
signalwire_agents/prefabs/info_gatherer.py,sha256=dr9UUgNGX7MIKdCMth3jDVLf6OrHov5G6_zIuNvnrOY,15468
|
24
|
-
signalwire_agents/prefabs/receptionist.py,sha256=8EyQ6M0Egs3g7KKWukHFiO9UPoVUxT4MLkvyT3V8o64,10585
|
25
|
-
signalwire_agents/prefabs/survey.py,sha256=IIIQfgvMlfVNjEEEdWUn4lAJqVsCDlBsIAkOJ1ckyAE,14796
|
26
|
-
signalwire_agents/skills/__init__.py,sha256=xfxrQ0i-aTRomHiCsqelU4RlNlHPJFPgPu-UBDaBOqA,340
|
27
|
-
signalwire_agents/skills/registry.py,sha256=XffqhZQ4ZbAMRssMW8vnK5-Qk8oJBmiEoPwFCMcz1Gc,3515
|
28
|
-
signalwire_agents/skills/datetime/__init__.py,sha256=coPaY-k2EyZWuYckGunhSJ65Y1Jwz66h-iOo0QWb5WY,43
|
29
|
-
signalwire_agents/skills/datetime/skill.py,sha256=t9VyRPqBFyk-DEeswiNMp54RA7xLiXVnqO4urLJTRXs,3770
|
30
|
-
signalwire_agents/skills/math/__init__.py,sha256=lGAFWEmJH2fuwkuZUdDTY5dmucrIwtjfNT8bE2hOSP8,39
|
31
|
-
signalwire_agents/skills/math/skill.py,sha256=KNQ2wk3tGakdMKyhh7GDQoYpY2gkagpDaK5oDMPG9y8,3227
|
32
|
-
signalwire_agents/skills/web_search/__init__.py,sha256=wJlptYDExYw-nxZJVzlTLOgkKkDOLUUt1ZdoLt44ixs,45
|
33
|
-
signalwire_agents/skills/web_search/skill.py,sha256=Dg6RaUbDhB_7jvCzMYZqd9fo5knMEDlnnVITBnjElGw,8545
|
34
|
-
signalwire_agents/utils/__init__.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
35
|
-
signalwire_agents/utils/pom_utils.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
36
|
-
signalwire_agents/utils/schema_utils.py,sha256=LvFCFvJTQk_xYK0B-NXbkXKEF7Zmv-LqpV_vfpPnOb4,13473
|
37
|
-
signalwire_agents/utils/token_generators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
38
|
-
signalwire_agents/utils/validators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
39
|
-
signalwire_agents-0.1.10.data/data/schema.json,sha256=M8Mn6pQda2P9jhbmkALrLr1wt-fRuhYRqdmEi9Rbhqk,178075
|
40
|
-
signalwire_agents-0.1.10.dist-info/licenses/LICENSE,sha256=NYvAsB-rTcSvG9cqHt9EUHAWLiA9YzM4Qfz-mPdvDR0,1067
|
41
|
-
signalwire_agents-0.1.10.dist-info/METADATA,sha256=zfl6Go2Ee_6BwMhs6RaixRzS64gYCAEq4DcSmFdX2oU,12276
|
42
|
-
signalwire_agents-0.1.10.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
|
43
|
-
signalwire_agents-0.1.10.dist-info/top_level.txt,sha256=kDGS6ZYv84K9P5Kyg9_S8P_pbUXoHkso0On_DB5bbWc,18
|
44
|
-
signalwire_agents-0.1.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|