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.
@@ -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.9"
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
- if not path:
273
- # Root request - return SWML
274
- swml_response = self._render_swml()
275
- from flask import Response
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=swml_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
- else:
282
- # SWAIG function call
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: signalwire_agents
3
- Version: 1.0.9
3
+ Version: 1.0.10
4
4
  Summary: SignalWire AI Agents SDK
5
5
  Author-email: SignalWire Team <info@signalwire.com>
6
6
  License: MIT
@@ -1,4 +1,4 @@
1
- signalwire_agents/__init__.py,sha256=_JScBMuBMSwv1yf2gqSJ2u4zN3AVyXW8oQTs-YiSe5I,5030
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=CnKoc4z5ZcVX2UjLAjhxx_rPwaTRqoLGHXWmxKnggqE,19402
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.9.data/data/share/man/man1/sw-agent-init.1,sha256=EFE8iOj2aGrZRwSXRoZdrZTZXOROuQmuIrZuzp9yI2s,6880
135
- signalwire_agents-1.0.9.data/data/share/man/man1/sw-search.1,sha256=9jJ6V6t6DgmXByz8Lw9exjf683Cw3sJGro8-eB0M9EY,10413
136
- signalwire_agents-1.0.9.data/data/share/man/man1/swaig-test.1,sha256=Ri0EITo8YMFowkcYltwPSwU4VJdRzo7XTWloi5WddCg,7815
137
- signalwire_agents-1.0.9.dist-info/licenses/LICENSE,sha256=NYvAsB-rTcSvG9cqHt9EUHAWLiA9YzM4Qfz-mPdvDR0,1067
138
- signalwire_agents-1.0.9.dist-info/METADATA,sha256=m5ZzBM9novTpM-LJZ5l6MM-Bo3sbhKlzP-XeWi2_MjY,41599
139
- signalwire_agents-1.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
140
- signalwire_agents-1.0.9.dist-info/entry_points.txt,sha256=GDaOxm8I9Bf3Sd2jDSGRXDG2ezDMgmX6ockjpDfK_IY,200
141
- signalwire_agents-1.0.9.dist-info/top_level.txt,sha256=kDGS6ZYv84K9P5Kyg9_S8P_pbUXoHkso0On_DB5bbWc,18
142
- signalwire_agents-1.0.9.dist-info/RECORD,,
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,,