signalwire-agents 1.0.9__py3-none-any.whl → 1.0.10__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 +1 -1
- signalwire_agents/core/mixins/serverless_mixin.py +67 -39
- {signalwire_agents-1.0.9.dist-info → signalwire_agents-1.0.10.dist-info}/METADATA +1 -1
- {signalwire_agents-1.0.9.dist-info → signalwire_agents-1.0.10.dist-info}/RECORD +11 -11
- {signalwire_agents-1.0.9.data → signalwire_agents-1.0.10.data}/data/share/man/man1/sw-agent-init.1 +0 -0
- {signalwire_agents-1.0.9.data → signalwire_agents-1.0.10.data}/data/share/man/man1/sw-search.1 +0 -0
- {signalwire_agents-1.0.9.data → signalwire_agents-1.0.10.data}/data/share/man/man1/swaig-test.1 +0 -0
- {signalwire_agents-1.0.9.dist-info → signalwire_agents-1.0.10.dist-info}/WHEEL +0 -0
- {signalwire_agents-1.0.9.dist-info → signalwire_agents-1.0.10.dist-info}/entry_points.txt +0 -0
- {signalwire_agents-1.0.9.dist-info → signalwire_agents-1.0.10.dist-info}/licenses/LICENSE +0 -0
- {signalwire_agents-1.0.9.dist-info → signalwire_agents-1.0.10.dist-info}/top_level.txt +0 -0
signalwire_agents/__init__.py
CHANGED
|
@@ -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__ = "1.0.
|
|
21
|
+
__version__ = "1.0.10"
|
|
22
22
|
|
|
23
23
|
# Import core classes for easier access
|
|
24
24
|
from .core.agent_base import AgentBase
|
|
@@ -258,63 +258,91 @@ class ServerlessMixin:
|
|
|
258
258
|
def _handle_google_cloud_function_request(self, request):
|
|
259
259
|
"""
|
|
260
260
|
Handle Google Cloud Functions specific requests
|
|
261
|
-
|
|
261
|
+
|
|
262
262
|
Args:
|
|
263
263
|
request: Flask request object from Google Cloud Functions
|
|
264
|
-
|
|
264
|
+
|
|
265
265
|
Returns:
|
|
266
266
|
Flask response object
|
|
267
267
|
"""
|
|
268
268
|
try:
|
|
269
|
+
from urllib.parse import urlparse
|
|
270
|
+
|
|
269
271
|
# Get the path from the request
|
|
270
272
|
path = request.path.strip('/')
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
273
|
+
|
|
274
|
+
# Try to detect and set the base URL from the request for webhook URLs
|
|
275
|
+
base_url = None
|
|
276
|
+
if hasattr(request, 'url') and request.url:
|
|
277
|
+
parsed = urlparse(request.url)
|
|
278
|
+
# Get the base URL without the path
|
|
279
|
+
base_url = f"{parsed.scheme}://{parsed.netloc}"
|
|
280
|
+
|
|
281
|
+
# Set the proxy URL base so SWML renders correct webhook URLs
|
|
282
|
+
if base_url and not getattr(self, '_proxy_url_base_from_env', False):
|
|
283
|
+
self._proxy_url_base = base_url
|
|
284
|
+
|
|
285
|
+
# Parse request body if present
|
|
286
|
+
args = {}
|
|
287
|
+
call_id = None
|
|
288
|
+
raw_data = None
|
|
289
|
+
function_name = None
|
|
290
|
+
|
|
291
|
+
if request.method == 'POST':
|
|
292
|
+
try:
|
|
293
|
+
if request.is_json:
|
|
294
|
+
raw_data = request.get_json()
|
|
295
|
+
else:
|
|
296
|
+
raw_data = json.loads(request.get_data(as_text=True))
|
|
297
|
+
|
|
298
|
+
call_id = raw_data.get("call_id")
|
|
299
|
+
function_name = raw_data.get("function")
|
|
300
|
+
|
|
301
|
+
# Extract arguments like the FastAPI handler does
|
|
302
|
+
if "argument" in raw_data and isinstance(raw_data["argument"], dict):
|
|
303
|
+
if "parsed" in raw_data["argument"] and isinstance(raw_data["argument"]["parsed"], list) and raw_data["argument"]["parsed"]:
|
|
304
|
+
args = raw_data["argument"]["parsed"][0]
|
|
305
|
+
elif "raw" in raw_data["argument"]:
|
|
306
|
+
try:
|
|
307
|
+
args = json.loads(raw_data["argument"]["raw"])
|
|
308
|
+
except Exception:
|
|
309
|
+
pass
|
|
310
|
+
except Exception:
|
|
311
|
+
# If parsing fails, continue with empty args
|
|
312
|
+
pass
|
|
313
|
+
|
|
314
|
+
# Determine if this is a SWAIG function call
|
|
315
|
+
# Case 1: /swaig endpoint with function name in body
|
|
316
|
+
# Case 2: /{function_name} path-based routing
|
|
317
|
+
# Case 3: Root path - return SWML
|
|
318
|
+
|
|
319
|
+
from flask import Response
|
|
320
|
+
|
|
321
|
+
if path in ('swaig', 'swaig/') and function_name:
|
|
322
|
+
# /swaig endpoint with function name in body
|
|
323
|
+
result = self._execute_swaig_function(function_name, args, call_id, raw_data)
|
|
276
324
|
return Response(
|
|
277
|
-
response=
|
|
325
|
+
response=json.dumps(result) if isinstance(result, dict) else str(result),
|
|
278
326
|
status=200,
|
|
279
327
|
headers={"Content-Type": "application/json"}
|
|
280
328
|
)
|
|
281
|
-
|
|
282
|
-
#
|
|
283
|
-
args = {}
|
|
284
|
-
call_id = None
|
|
285
|
-
raw_data = None
|
|
286
|
-
|
|
287
|
-
# Parse request data
|
|
288
|
-
if request.method == 'POST':
|
|
289
|
-
try:
|
|
290
|
-
if request.is_json:
|
|
291
|
-
raw_data = request.get_json()
|
|
292
|
-
else:
|
|
293
|
-
raw_data = json.loads(request.get_data(as_text=True))
|
|
294
|
-
|
|
295
|
-
call_id = raw_data.get("call_id")
|
|
296
|
-
|
|
297
|
-
# Extract arguments like the FastAPI handler does
|
|
298
|
-
if "argument" in raw_data and isinstance(raw_data["argument"], dict):
|
|
299
|
-
if "parsed" in raw_data["argument"] and isinstance(raw_data["argument"]["parsed"], list) and raw_data["argument"]["parsed"]:
|
|
300
|
-
args = raw_data["argument"]["parsed"][0]
|
|
301
|
-
elif "raw" in raw_data["argument"]:
|
|
302
|
-
try:
|
|
303
|
-
args = json.loads(raw_data["argument"]["raw"])
|
|
304
|
-
except Exception:
|
|
305
|
-
pass
|
|
306
|
-
except Exception:
|
|
307
|
-
# If parsing fails, continue with empty args
|
|
308
|
-
pass
|
|
309
|
-
|
|
329
|
+
elif path and path not in ('', 'swaig', 'swaig/'):
|
|
330
|
+
# Path-based function routing (e.g., /say_hello)
|
|
310
331
|
result = self._execute_swaig_function(path, args, call_id, raw_data)
|
|
311
|
-
from flask import Response
|
|
312
332
|
return Response(
|
|
313
333
|
response=json.dumps(result) if isinstance(result, dict) else str(result),
|
|
314
334
|
status=200,
|
|
315
335
|
headers={"Content-Type": "application/json"}
|
|
316
336
|
)
|
|
317
|
-
|
|
337
|
+
else:
|
|
338
|
+
# Root path or /swaig without function - return SWML
|
|
339
|
+
swml_response = self._render_swml()
|
|
340
|
+
return Response(
|
|
341
|
+
response=swml_response,
|
|
342
|
+
status=200,
|
|
343
|
+
headers={"Content-Type": "application/json"}
|
|
344
|
+
)
|
|
345
|
+
|
|
318
346
|
except Exception as e:
|
|
319
347
|
import logging
|
|
320
348
|
logging.error(f"Error in Google Cloud Function request handler: {e}")
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
signalwire_agents/__init__.py,sha256=
|
|
1
|
+
signalwire_agents/__init__.py,sha256=ayt9AO0brsom1nxCluBItWnJC9Qv_kwaTknpL6YPsQE,5031
|
|
2
2
|
signalwire_agents/agent_server.py,sha256=5GPt6XekVxep9esZY9s4MG6sOR-VF_m53U25r3WoML4,30964
|
|
3
3
|
signalwire_agents/schema.json,sha256=YQv4-KiegE00XvxoLMKAml6aCGitnt3kBq31ECxTHK8,385886
|
|
4
4
|
signalwire_agents/agents/bedrock.py,sha256=J582gooNtxtep4xdVOfyDzRtHp_XrurPMS93xf2Xod0,10836
|
|
@@ -57,7 +57,7 @@ signalwire_agents/core/mixins/__init__.py,sha256=NsFpfF7TDP_lNR0Riw4Nbvt4fDbv_A3
|
|
|
57
57
|
signalwire_agents/core/mixins/ai_config_mixin.py,sha256=In7SrVlKoRaGsDIXEDNGsrEqCjotmcQr_XA563VWABQ,16265
|
|
58
58
|
signalwire_agents/core/mixins/auth_mixin.py,sha256=FIzQjLOkEgQhy6uIKjnevsM3ubdMnY5gDDksslEUtF8,9729
|
|
59
59
|
signalwire_agents/core/mixins/prompt_mixin.py,sha256=bEsuw9J2F_upFYI02KyC7o2eGZjwOKQ352rmJBZirAM,13729
|
|
60
|
-
signalwire_agents/core/mixins/serverless_mixin.py,sha256=
|
|
60
|
+
signalwire_agents/core/mixins/serverless_mixin.py,sha256=XP_dFGO1aa4_Ouq9YLRhQ_MmjNTv-qsAXKHyf90ETMQ,20599
|
|
61
61
|
signalwire_agents/core/mixins/skill_mixin.py,sha256=Qz3RKPmq_iMY4NecyxOHk3dW3W-O4iEm2ahhMjAcqRs,1861
|
|
62
62
|
signalwire_agents/core/mixins/state_mixin.py,sha256=q3achpyUYZKuJaqKf12O22FXpSsNNsMEonSvlpSHCkA,6594
|
|
63
63
|
signalwire_agents/core/mixins/tool_mixin.py,sha256=6CaNdaspHcfte0qSB_bSN8PTsqxRZzL_AXYk8QoWyXE,8660
|
|
@@ -131,12 +131,12 @@ signalwire_agents/utils/token_generators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663
|
|
|
131
131
|
signalwire_agents/utils/validators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
|
132
132
|
signalwire_agents/web/__init__.py,sha256=XE_pSTY9Aalzr7J7wqFth1Zr3cccQHPPcF5HWNrOpz8,383
|
|
133
133
|
signalwire_agents/web/web_service.py,sha256=a2PSHJgX1tlZr0Iz1A1UouZjXEePJAZL632evvLVM38,21071
|
|
134
|
-
signalwire_agents-1.0.
|
|
135
|
-
signalwire_agents-1.0.
|
|
136
|
-
signalwire_agents-1.0.
|
|
137
|
-
signalwire_agents-1.0.
|
|
138
|
-
signalwire_agents-1.0.
|
|
139
|
-
signalwire_agents-1.0.
|
|
140
|
-
signalwire_agents-1.0.
|
|
141
|
-
signalwire_agents-1.0.
|
|
142
|
-
signalwire_agents-1.0.
|
|
134
|
+
signalwire_agents-1.0.10.data/data/share/man/man1/sw-agent-init.1,sha256=EFE8iOj2aGrZRwSXRoZdrZTZXOROuQmuIrZuzp9yI2s,6880
|
|
135
|
+
signalwire_agents-1.0.10.data/data/share/man/man1/sw-search.1,sha256=9jJ6V6t6DgmXByz8Lw9exjf683Cw3sJGro8-eB0M9EY,10413
|
|
136
|
+
signalwire_agents-1.0.10.data/data/share/man/man1/swaig-test.1,sha256=Ri0EITo8YMFowkcYltwPSwU4VJdRzo7XTWloi5WddCg,7815
|
|
137
|
+
signalwire_agents-1.0.10.dist-info/licenses/LICENSE,sha256=NYvAsB-rTcSvG9cqHt9EUHAWLiA9YzM4Qfz-mPdvDR0,1067
|
|
138
|
+
signalwire_agents-1.0.10.dist-info/METADATA,sha256=WetB2a73mHJZC_2t_qiZIqgVxyp8v8CC2adEl25TRzw,41600
|
|
139
|
+
signalwire_agents-1.0.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
140
|
+
signalwire_agents-1.0.10.dist-info/entry_points.txt,sha256=GDaOxm8I9Bf3Sd2jDSGRXDG2ezDMgmX6ockjpDfK_IY,200
|
|
141
|
+
signalwire_agents-1.0.10.dist-info/top_level.txt,sha256=kDGS6ZYv84K9P5Kyg9_S8P_pbUXoHkso0On_DB5bbWc,18
|
|
142
|
+
signalwire_agents-1.0.10.dist-info/RECORD,,
|
{signalwire_agents-1.0.9.data → signalwire_agents-1.0.10.data}/data/share/man/man1/sw-agent-init.1
RENAMED
|
File without changes
|
{signalwire_agents-1.0.9.data → signalwire_agents-1.0.10.data}/data/share/man/man1/sw-search.1
RENAMED
|
File without changes
|
{signalwire_agents-1.0.9.data → signalwire_agents-1.0.10.data}/data/share/man/man1/swaig-test.1
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|