xpander-sdk 2.0.169__tar.gz → 2.0.219__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 (116) hide show
  1. {xpander_sdk-2.0.169/src/xpander_sdk.egg-info → xpander_sdk-2.0.219}/PKG-INFO +97 -13
  2. xpander_sdk-2.0.169/PKG-INFO → xpander_sdk-2.0.219/README.md +85 -51
  3. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/setup.py +12 -11
  4. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/__init__.py +6 -0
  5. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/consts/api_routes.py +13 -0
  6. xpander_sdk-2.0.219/src/xpander_sdk/models/generic.py +27 -0
  7. xpander_sdk-2.0.219/src/xpander_sdk/models/notifications.py +111 -0
  8. xpander_sdk-2.0.219/src/xpander_sdk/models/orchestrations.py +368 -0
  9. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/agent.py +37 -4
  10. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/sub_modules/agent.py +15 -1
  11. xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/__init__.py +8 -0
  12. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/backend_module.py +47 -2
  13. xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/decorators/__init__.py +7 -0
  14. xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/decorators/on_auth_event.py +131 -0
  15. xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/events_registry.py +172 -0
  16. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/frameworks/agno.py +121 -40
  17. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/frameworks/dispatch.py +3 -1
  18. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/utils/mcp_oauth.py +36 -24
  19. xpander_sdk-2.0.219/src/xpander_sdk/modules/events/decorators/__init__.py +3 -0
  20. xpander_sdk-2.0.219/src/xpander_sdk/modules/events/decorators/on_tool.py +384 -0
  21. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/events_module.py +68 -5
  22. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/models/events.py +6 -0
  23. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/models/task.py +3 -14
  24. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/sub_modules/task.py +24 -5
  25. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/tasks_module.py +3 -0
  26. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/models/mcp.py +1 -0
  27. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/sub_modules/tool.py +46 -15
  28. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/tools_repository_module.py +65 -3
  29. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/utils/generic.py +3 -0
  30. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/utils/schemas.py +20 -7
  31. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/agents/compactization_agent.py +78 -40
  32. xpander_sdk-2.0.169/README.md → xpander_sdk-2.0.219/src/xpander_sdk.egg-info/PKG-INFO +135 -2
  33. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk.egg-info/SOURCES.txt +9 -0
  34. xpander_sdk-2.0.219/src/xpander_sdk.egg-info/requires.txt +27 -0
  35. xpander_sdk-2.0.219/tests/test_final_validation.py +74 -0
  36. xpander_sdk-2.0.219/tests/test_tool_schema_enhancements.py +105 -0
  37. xpander_sdk-2.0.169/src/xpander_sdk/utils/__init__.py +0 -0
  38. xpander_sdk-2.0.169/src/xpander_sdk/utils/agents/__init__.py +0 -0
  39. xpander_sdk-2.0.169/src/xpander_sdk.egg-info/requires.txt +0 -26
  40. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/LICENSE +0 -0
  41. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/pyproject.toml +0 -0
  42. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/setup.cfg +0 -0
  43. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/consts/__init__.py +0 -0
  44. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/__init__.py +0 -0
  45. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/module_base.py +0 -0
  46. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/state.py +0 -0
  47. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/xpander_api_client.py +0 -0
  48. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/exceptions/__init__.py +0 -0
  49. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/exceptions/module_exception.py +0 -0
  50. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/__init__.py +0 -0
  51. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/activity.py +0 -0
  52. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/compactization.py +0 -0
  53. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/configuration.py +0 -0
  54. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/deep_planning.py +0 -0
  55. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/events.py +0 -0
  56. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/frameworks.py +0 -0
  57. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/shared.py +0 -0
  58. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/user.py +0 -0
  59. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/__init__.py +0 -0
  60. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/__init__.py +0 -0
  61. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/agents_module.py +0 -0
  62. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/__init__.py +0 -0
  63. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/agent_list.py +0 -0
  64. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/knowledge_bases.py +0 -0
  65. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/sub_modules/__init__.py +0 -0
  66. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/utils/__init__.py +0 -0
  67. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/utils/generic.py +0 -0
  68. {xpander_sdk-2.0.169/src/xpander_sdk/modules/backend → xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/frameworks}/__init__.py +0 -0
  69. {xpander_sdk-2.0.169/src/xpander_sdk/modules/backend/frameworks → xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/utils}/__init__.py +0 -0
  70. {xpander_sdk-2.0.169/src/xpander_sdk/modules/backend/utils → xpander_sdk-2.0.219/src/xpander_sdk/modules/events}/__init__.py +0 -0
  71. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/decorators/on_boot.py +0 -0
  72. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/decorators/on_shutdown.py +0 -0
  73. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/decorators/on_task.py +0 -0
  74. {xpander_sdk-2.0.169/src/xpander_sdk/modules/events → xpander_sdk-2.0.219/src/xpander_sdk/modules/events/models}/__init__.py +0 -0
  75. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/models/deployments.py +0 -0
  76. {xpander_sdk-2.0.169/src/xpander_sdk/modules/events/decorators → xpander_sdk-2.0.219/src/xpander_sdk/modules/events/utils}/__init__.py +0 -0
  77. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/utils/generic.py +0 -0
  78. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/utils/git_init.py +0 -0
  79. {xpander_sdk-2.0.169/src/xpander_sdk/modules/events/models → xpander_sdk-2.0.219/src/xpander_sdk/modules/knowledge_bases}/__init__.py +0 -0
  80. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/knowledge_bases/knowledge_bases_module.py +0 -0
  81. {xpander_sdk-2.0.169/src/xpander_sdk/modules/events/utils → xpander_sdk-2.0.219/src/xpander_sdk/modules/knowledge_bases/models}/__init__.py +0 -0
  82. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/knowledge_bases/models/knowledge_bases.py +0 -0
  83. {xpander_sdk-2.0.169/src/xpander_sdk/modules/knowledge_bases → xpander_sdk-2.0.219/src/xpander_sdk/modules/knowledge_bases/sub_modules}/__init__.py +0 -0
  84. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/knowledge_bases/sub_modules/knowledge_base.py +0 -0
  85. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/knowledge_bases/sub_modules/knowledge_base_document_item.py +0 -0
  86. {xpander_sdk-2.0.169/src/xpander_sdk/modules/knowledge_bases/models → xpander_sdk-2.0.219/src/xpander_sdk/modules/knowledge_bases/utils}/__init__.py +0 -0
  87. {xpander_sdk-2.0.169/src/xpander_sdk/modules/knowledge_bases/sub_modules → xpander_sdk-2.0.219/src/xpander_sdk/modules/tasks}/__init__.py +0 -0
  88. {xpander_sdk-2.0.169/src/xpander_sdk/modules/knowledge_bases/utils → xpander_sdk-2.0.219/src/xpander_sdk/modules/tasks/models}/__init__.py +0 -0
  89. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/models/tasks_list.py +0 -0
  90. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tasks → xpander_sdk-2.0.219/src/xpander_sdk/modules/tasks/sub_modules}/__init__.py +0 -0
  91. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tasks/models → xpander_sdk-2.0.219/src/xpander_sdk/modules/tasks/utils}/__init__.py +0 -0
  92. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/utils/files.py +0 -0
  93. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tasks/sub_modules → xpander_sdk-2.0.219/src/xpander_sdk/modules/tools_repository}/__init__.py +0 -0
  94. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tasks/utils → xpander_sdk-2.0.219/src/xpander_sdk/modules/tools_repository/decorators}/__init__.py +0 -0
  95. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/decorators/register_tool.py +0 -0
  96. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tools_repository → xpander_sdk-2.0.219/src/xpander_sdk/modules/tools_repository/models}/__init__.py +0 -0
  97. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/models/tool_invocation_result.py +0 -0
  98. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tools_repository/decorators → xpander_sdk-2.0.219/src/xpander_sdk/modules/tools_repository/sub_modules}/__init__.py +0 -0
  99. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tools_repository/models → xpander_sdk-2.0.219/src/xpander_sdk/modules/tools_repository/utils}/__init__.py +0 -0
  100. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/utils/local_tools.py +0 -0
  101. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tools_repository/sub_modules → xpander_sdk-2.0.219/src/xpander_sdk/utils}/__init__.py +0 -0
  102. {xpander_sdk-2.0.169/src/xpander_sdk/modules/tools_repository/utils → xpander_sdk-2.0.219/src/xpander_sdk/utils/agents}/__init__.py +0 -0
  103. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/env.py +0 -0
  104. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/event_loop.py +0 -0
  105. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/generic.py +0 -0
  106. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/tools.py +0 -0
  107. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk.egg-info/dependency_links.txt +0 -0
  108. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk.egg-info/top_level.txt +0 -0
  109. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_agents_module.py +0 -0
  110. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_api_client.py +0 -0
  111. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_backend_module.py +0 -0
  112. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_boot_shutdown_handlers.py +0 -0
  113. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_configuration.py +0 -0
  114. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_knowledge_bases_module.py +0 -0
  115. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_tasks_module.py +0 -0
  116. {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_tools_repository.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xpander-sdk
3
- Version: 2.0.169
3
+ Version: 2.0.219
4
4
  Summary: xpander.ai Backend-as-a-service for AI Agents - SDK
5
5
  Home-page: https://www.xpander.ai
6
6
  Author: xpanderAI
@@ -11,17 +11,18 @@ Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.9
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: python-dotenv
15
- Requires-Dist: packaging
16
- Requires-Dist: pydantic
17
- Requires-Dist: loguru
18
- Requires-Dist: httpx
19
- Requires-Dist: httpx_sse
20
- Requires-Dist: nest-asyncio
21
- Requires-Dist: strands-agents
22
- Requires-Dist: openai-agents
14
+ Requires-Dist: python-dotenv>=1.2.1
15
+ Requires-Dist: packaging>=25.0
16
+ Requires-Dist: pydantic>=2.12.5
17
+ Requires-Dist: loguru>=0.7.3
18
+ Requires-Dist: httpx>=0.28.1
19
+ Requires-Dist: httpx_sse>=0.4.3
20
+ Requires-Dist: nest-asyncio>=1.6.0
21
+ Requires-Dist: strands-agents>=1.20.0
22
+ Requires-Dist: openai-agents>=0.6.4
23
+ Requires-Dist: python-toon>=0.1.3
23
24
  Provides-Extra: agno
24
- Requires-Dist: agno; extra == "agno"
25
+ Requires-Dist: agno==2.3.26; extra == "agno"
25
26
  Requires-Dist: sqlalchemy; extra == "agno"
26
27
  Requires-Dist: psycopg[binary,pool]; extra == "agno"
27
28
  Requires-Dist: greenlet; extra == "agno"
@@ -292,6 +293,89 @@ async for event in task.aevents():
292
293
  print(f"Event Data: {event.data}")
293
294
  ```
294
295
 
296
+ ### Authentication Events Callback
297
+
298
+ Handle authentication events in real-time. This callback is triggered only for authentication flows (e.g., MCP OAuth requiring user login).
299
+
300
+ **You can use both approaches simultaneously** - decorated handlers will always be invoked, and you can also pass an explicit callback for additional handling.
301
+
302
+ You can provide the callback in two ways:
303
+
304
+ #### Option 1: Direct Function
305
+
306
+ ```python
307
+ from xpander_sdk import Backend
308
+ from xpander_sdk.modules.agents.sub_modules.agent import Agent
309
+ from xpander_sdk.modules.tasks.sub_modules.task import Task, TaskUpdateEvent
310
+ from agno.agent import Agent as AgnoAgent
311
+
312
+ # Define event callback (async or sync)
313
+ async def my_event_callback(agent: Agent, task: Task, event: TaskUpdateEvent):
314
+ """Called for authentication events only"""
315
+ # event.type will always be "auth_event"
316
+ print(f"Authentication required: {event.data}")
317
+ # Display login URL or handle OAuth flow
318
+
319
+ # Get args with callback
320
+ backend = Backend(configuration=config)
321
+ args = await backend.aget_args(
322
+ agent_id="agent-123",
323
+ task=my_task,
324
+ auth_events_callback=my_event_callback
325
+ )
326
+ ```
327
+
328
+ #### Option 2: Decorator (Auto-registered)
329
+
330
+ ```python
331
+ from xpander_sdk import Backend, on_auth_event
332
+ from xpander_sdk.modules.agents.sub_modules.agent import Agent
333
+ from xpander_sdk.modules.tasks.sub_modules.task import Task, TaskUpdateEvent
334
+ from agno.agent import Agent as AgnoAgent
335
+
336
+ # Use decorator - auto-registers globally
337
+ @on_auth_event
338
+ async def handle_auth(agent: Agent, task: Task, event: TaskUpdateEvent):
339
+ # event.type will always be "auth_event"
340
+ print(f"Authentication required for {agent.name}")
341
+ print(f"Auth data: {event.data}")
342
+
343
+ # Decorated handler is automatically invoked - no need to pass it
344
+ backend = Backend(configuration=config)
345
+ args = await backend.aget_args(
346
+ agent_id="agent-123",
347
+ task=my_task
348
+ )
349
+ ```
350
+
351
+ #### Option 3: Combine Both
352
+
353
+ ```python
354
+ from xpander_sdk import Backend, on_auth_event
355
+
356
+ # Global handler for all auth events
357
+ @on_auth_event
358
+ async def log_auth(agent, task, event):
359
+ print(f"[GLOBAL] Auth event for {agent.name}")
360
+
361
+ # Additional one-time handler
362
+ async def custom_handler(agent, task, event):
363
+ print(f"[CUSTOM] Specific handling for this call")
364
+
365
+ # Both handlers will be invoked
366
+ args = await backend.aget_args(
367
+ agent_id="agent-123",
368
+ auth_events_callback=custom_handler # Optional additional callback
369
+ )
370
+
371
+ # Use with Agno
372
+ agno_agent = AgnoAgent(**args)
373
+ result = await agno_agent.arun(
374
+ input="Process this data",
375
+ stream=True
376
+ )
377
+ ```
378
+
295
379
  ### Task Activity Monitoring
296
380
 
297
381
  ```python
@@ -483,11 +567,11 @@ async def main():
483
567
  organization_id="your-org-id",
484
568
  base_url="https://agent-controller.my-company.com"
485
569
  )
486
-
570
+
487
571
  # Load agent from self-hosted deployment
488
572
  agent = await Agent.aload("agent-123", configuration=config)
489
573
  print(f"Agent: {agent.name}")
490
-
574
+
491
575
  # Create and execute task
492
576
  task = await agent.acreate_task(
493
577
  prompt="Analyze Q4 sales data",
@@ -1,52 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: xpander-sdk
3
- Version: 2.0.169
4
- Summary: xpander.ai Backend-as-a-service for AI Agents - SDK
5
- Home-page: https://www.xpander.ai
6
- Author: xpanderAI
7
- Author-email: dev@xpander.ai
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: License :: OSI Approved :: MIT License
10
- Classifier: Operating System :: OS Independent
11
- Requires-Python: >=3.9
12
- Description-Content-Type: text/markdown
13
- License-File: LICENSE
14
- Requires-Dist: python-dotenv
15
- Requires-Dist: packaging
16
- Requires-Dist: pydantic
17
- Requires-Dist: loguru
18
- Requires-Dist: httpx
19
- Requires-Dist: httpx_sse
20
- Requires-Dist: nest-asyncio
21
- Requires-Dist: strands-agents
22
- Requires-Dist: openai-agents
23
- Provides-Extra: agno
24
- Requires-Dist: agno; extra == "agno"
25
- Requires-Dist: sqlalchemy; extra == "agno"
26
- Requires-Dist: psycopg[binary,pool]; extra == "agno"
27
- Requires-Dist: greenlet; extra == "agno"
28
- Provides-Extra: dev
29
- Requires-Dist: black; extra == "dev"
30
- Requires-Dist: pre-commit; extra == "dev"
31
- Requires-Dist: pytest; extra == "dev"
32
- Requires-Dist: anthropic; extra == "dev"
33
- Requires-Dist: mcp; extra == "dev"
34
- Requires-Dist: openai; extra == "dev"
35
- Requires-Dist: fireworks-ai; extra == "dev"
36
- Requires-Dist: aioboto3; extra == "dev"
37
- Requires-Dist: google-genai; extra == "dev"
38
- Dynamic: author
39
- Dynamic: author-email
40
- Dynamic: classifier
41
- Dynamic: description
42
- Dynamic: description-content-type
43
- Dynamic: home-page
44
- Dynamic: license-file
45
- Dynamic: provides-extra
46
- Dynamic: requires-dist
47
- Dynamic: requires-python
48
- Dynamic: summary
49
-
50
1
  # xpander.ai SDK
51
2
 
52
3
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Documentation](https://img.shields.io/badge/docs-available-brightgreen.svg)](https://docs.xpander.ai) [![PyPI Version](https://img.shields.io/pypi/v/xpander-sdk?label=PyPI)](https://pypi.org/project/xpander-sdk/) [![Downloads](https://pepy.tech/badge/xpander-sdk)](https://pepy.tech/project/xpander-sdk)
@@ -292,6 +243,89 @@ async for event in task.aevents():
292
243
  print(f"Event Data: {event.data}")
293
244
  ```
294
245
 
246
+ ### Authentication Events Callback
247
+
248
+ Handle authentication events in real-time. This callback is triggered only for authentication flows (e.g., MCP OAuth requiring user login).
249
+
250
+ **You can use both approaches simultaneously** - decorated handlers will always be invoked, and you can also pass an explicit callback for additional handling.
251
+
252
+ You can provide the callback in two ways:
253
+
254
+ #### Option 1: Direct Function
255
+
256
+ ```python
257
+ from xpander_sdk import Backend
258
+ from xpander_sdk.modules.agents.sub_modules.agent import Agent
259
+ from xpander_sdk.modules.tasks.sub_modules.task import Task, TaskUpdateEvent
260
+ from agno.agent import Agent as AgnoAgent
261
+
262
+ # Define event callback (async or sync)
263
+ async def my_event_callback(agent: Agent, task: Task, event: TaskUpdateEvent):
264
+ """Called for authentication events only"""
265
+ # event.type will always be "auth_event"
266
+ print(f"Authentication required: {event.data}")
267
+ # Display login URL or handle OAuth flow
268
+
269
+ # Get args with callback
270
+ backend = Backend(configuration=config)
271
+ args = await backend.aget_args(
272
+ agent_id="agent-123",
273
+ task=my_task,
274
+ auth_events_callback=my_event_callback
275
+ )
276
+ ```
277
+
278
+ #### Option 2: Decorator (Auto-registered)
279
+
280
+ ```python
281
+ from xpander_sdk import Backend, on_auth_event
282
+ from xpander_sdk.modules.agents.sub_modules.agent import Agent
283
+ from xpander_sdk.modules.tasks.sub_modules.task import Task, TaskUpdateEvent
284
+ from agno.agent import Agent as AgnoAgent
285
+
286
+ # Use decorator - auto-registers globally
287
+ @on_auth_event
288
+ async def handle_auth(agent: Agent, task: Task, event: TaskUpdateEvent):
289
+ # event.type will always be "auth_event"
290
+ print(f"Authentication required for {agent.name}")
291
+ print(f"Auth data: {event.data}")
292
+
293
+ # Decorated handler is automatically invoked - no need to pass it
294
+ backend = Backend(configuration=config)
295
+ args = await backend.aget_args(
296
+ agent_id="agent-123",
297
+ task=my_task
298
+ )
299
+ ```
300
+
301
+ #### Option 3: Combine Both
302
+
303
+ ```python
304
+ from xpander_sdk import Backend, on_auth_event
305
+
306
+ # Global handler for all auth events
307
+ @on_auth_event
308
+ async def log_auth(agent, task, event):
309
+ print(f"[GLOBAL] Auth event for {agent.name}")
310
+
311
+ # Additional one-time handler
312
+ async def custom_handler(agent, task, event):
313
+ print(f"[CUSTOM] Specific handling for this call")
314
+
315
+ # Both handlers will be invoked
316
+ args = await backend.aget_args(
317
+ agent_id="agent-123",
318
+ auth_events_callback=custom_handler # Optional additional callback
319
+ )
320
+
321
+ # Use with Agno
322
+ agno_agent = AgnoAgent(**args)
323
+ result = await agno_agent.arun(
324
+ input="Process this data",
325
+ stream=True
326
+ )
327
+ ```
328
+
295
329
  ### Task Activity Monitoring
296
330
 
297
331
  ```python
@@ -483,11 +517,11 @@ async def main():
483
517
  organization_id="your-org-id",
484
518
  base_url="https://agent-controller.my-company.com"
485
519
  )
486
-
520
+
487
521
  # Load agent from self-hosted deployment
488
522
  agent = await Agent.aload("agent-123", configuration=config)
489
523
  print(f"Agent: {agent.name}")
490
-
524
+
491
525
  # Create and execute task
492
526
  task = await agent.acreate_task(
493
527
  prompt="Analyze Q4 sales data",
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
5
5
 
6
6
  setup(
7
7
  name="xpander-sdk",
8
- version="2.0.169",
8
+ version="2.0.219",
9
9
  author="xpanderAI",
10
10
  author_email="dev@xpander.ai",
11
11
  description="xpander.ai Backend-as-a-service for AI Agents - SDK",
@@ -15,18 +15,19 @@ setup(
15
15
  packages=find_packages(where="src"),
16
16
  package_dir={"": "src"},
17
17
  install_requires=[
18
- "python-dotenv",
19
- "packaging",
20
- "pydantic",
21
- "loguru",
22
- "httpx",
23
- "httpx_sse",
24
- "nest-asyncio",
25
- "strands-agents",
26
- "openai-agents",
18
+ "python-dotenv>=1.2.1",
19
+ "packaging>=25.0",
20
+ "pydantic>=2.12.5",
21
+ "loguru>=0.7.3",
22
+ "httpx>=0.28.1",
23
+ "httpx_sse>=0.4.3",
24
+ "nest-asyncio>=1.6.0",
25
+ "strands-agents>=1.20.0",
26
+ "openai-agents>=0.6.4",
27
+ "python-toon>=0.1.3",
27
28
  ],
28
29
  extras_require={
29
- "agno": ["agno", "sqlalchemy" ,"psycopg[binary,pool]", "greenlet"],
30
+ "agno": ["agno==2.3.26", "sqlalchemy" ,"psycopg[binary,pool]", "greenlet"],
30
31
  "dev": ["black", "pre-commit", "pytest", "anthropic", "mcp", "openai", "fireworks-ai", "aioboto3", "google-genai"],
31
32
  },
32
33
  classifiers=[
@@ -17,6 +17,7 @@ For more information, visit: https://xpander.ai
17
17
 
18
18
  # Backend-related imports
19
19
  from .modules.backend.backend_module import Backend
20
+ from .modules.backend.decorators.on_auth_event import on_auth_event
20
21
 
21
22
  # Agent-related imports
22
23
  from .modules.agents.agents_module import Agents, Agent, AgentsListItem
@@ -27,6 +28,7 @@ from .modules.tasks.tasks_module import Tasks, Task, TasksListItem, AgentExecuti
27
28
  from xpander_sdk.modules.events.decorators.on_task import on_task
28
29
  from xpander_sdk.modules.events.decorators.on_boot import on_boot
29
30
  from xpander_sdk.modules.events.decorators.on_shutdown import on_shutdown
31
+ from xpander_sdk.modules.events.decorators.on_tool import on_tool_before, on_tool_after, on_tool_error
30
32
 
31
33
  # Tools and repository imports
32
34
  from .modules.tools_repository.tools_repository_module import ToolsRepository, Tool
@@ -53,6 +55,7 @@ from .models.shared import OutputFormat, Tokens
53
55
  __all__ = [
54
56
  # xpander.ai Backend
55
57
  "Backend",
58
+ "on_auth_event",
56
59
  # Agent management
57
60
  "Agents",
58
61
  "Agent",
@@ -75,6 +78,9 @@ __all__ = [
75
78
  "MCPServerAuthType",
76
79
  "register_tool",
77
80
  "build_model_from_schema",
81
+ "on_tool_before",
82
+ "on_tool_after",
83
+ "on_tool_error",
78
84
  # Knowledge bases
79
85
  "KnowledgeBases",
80
86
  "KnowledgeBase",
@@ -55,6 +55,19 @@ and deleting resources.
55
55
 
56
56
  # Tools
57
57
  GetOrInvokeToolById = "/tools/{tool_id}"
58
+ GetOrInvokeToolByUUID = "/tools/{connector_id}_{tool_id}"
59
+ ExecuteCodeInSandbox = "/tools/{task_id}/xp-code-executor"
60
+
61
+ # HITL (Human-in-the-Loop)
62
+ HITLRequest = "/hitl/request"
63
+ HITLApprove = "/hitl/{task_id}/approve"
64
+ HITLReject = "/hitl/{task_id}/reject"
65
+
66
+ # Metadata
67
+ GetOrgDefaultLLMExtraHeaders = "/metadata/default_llm_extra_headers"
68
+
69
+ # Agentic context
70
+ GetOrSetAgenticContext = "/agentic_context/{agent_id}"
58
71
 
59
72
  def __str__(self) -> str:
60
73
  return str(self.value)
@@ -0,0 +1,27 @@
1
+ from enum import Enum
2
+ from typing import Optional
3
+
4
+ from xpander_sdk.models.shared import XPanderSharedModel
5
+
6
+ class LLMCredentialsKeyType(str, Enum):
7
+ XPander = "xpander"
8
+ Custom = "custom"
9
+
10
+ class LLMCredentials(XPanderSharedModel):
11
+ name: str
12
+ description: Optional[str] = None
13
+ value: str
14
+
15
+ class LLMModelProvider(Enum):
16
+ OpenAI = "openai"
17
+ NvidiaNIM = "nim"
18
+ AmazonBedrock = "amazon_bedrock"
19
+ HuggingFace = "huggingFace"
20
+ FriendliAI = "friendlyAI"
21
+ Anthropic = "anthropic"
22
+ GoogleGemini = "gemini"
23
+ Fireworks = "fireworks"
24
+ GoogleAIStudio = "google_ai_studio"
25
+ Helicone = "helicone"
26
+ OpenRouter = "open_router"
27
+ Nebius = "nebius"
@@ -0,0 +1,111 @@
1
+ """Models for notification configurations and credentials.
2
+
3
+ This module provides data models for configuring various notification channels
4
+ including email, Slack, and webhooks, along with their authentication details.
5
+ """
6
+
7
+ from typing import Dict, List, Literal, Optional, Union
8
+
9
+ from xpander_sdk.models.shared import XPanderSharedModel
10
+
11
+ class SlackCredentials(XPanderSharedModel):
12
+ """Slack API authentication credentials.
13
+
14
+ Attributes:
15
+ authed_user_id: Authenticated user's Slack ID.
16
+ access_token: OAuth access token for API calls.
17
+ client_id: Slack app client ID.
18
+ client_secret: Slack app client secret.
19
+ verification_token: Token for verifying requests from Slack.
20
+ signing_secret: Secret for validating webhook signatures.
21
+ app_configuration_token: Token for app configuration.
22
+ app_configuration_refresh_token: Refresh token for app configuration.
23
+ """
24
+
25
+ authed_user_id: Optional[str] = None
26
+ access_token: Optional[str] = None
27
+ client_id: Optional[str] = None
28
+ client_secret: Optional[str] = None
29
+ verification_token: Optional[str] = None
30
+ signing_secret: Optional[str] = None
31
+ app_configuration_token: Optional[str] = None
32
+ app_configuration_refresh_token: Optional[str] = None
33
+
34
+ # Default values for HITL notifications
35
+ DEFAULT_HITL_BODY = "Hello, workflow {title} is waiting for your approval and will not continue until approved. The workflow request is: {content}. By clicking approve, the workflow will auto-execute."
36
+ DEFAULT_LOGO_URL = "https://assets.xpanderai.io/xpander-logo-512.png"
37
+ DEFAULT_APPROVE_BUTTON_TEXT = "Approve"
38
+ DEFAULT_DENY_BUTTON_TEXT = "Deny"
39
+
40
+
41
+ class NotificationSettingsBase(XPanderSharedModel):
42
+ """Base class for notification settings with common customization fields.
43
+
44
+ Attributes:
45
+ subject: Optional custom subject line for notifications.
46
+ body: Optional custom body content for notifications.
47
+ approve_button_text: Text for approval button (HITL only). Defaults to "Approve".
48
+ deny_button_text: Text for denial button (HITL only). Defaults to "Deny".
49
+ logo_url: URL for logo image. Defaults to xpander logo.
50
+ """
51
+
52
+ subject: Optional[str] = None
53
+ body: Optional[str] = None
54
+ approve_button_text: Optional[str] = DEFAULT_APPROVE_BUTTON_TEXT
55
+ deny_button_text: Optional[str] = DEFAULT_DENY_BUTTON_TEXT
56
+ logo_url: Optional[str] = DEFAULT_LOGO_URL
57
+
58
+ class EmailNotificationSettings(NotificationSettingsBase):
59
+ """Configuration for email notifications.
60
+
61
+ Attributes:
62
+ to: List of recipient email addresses.
63
+ """
64
+
65
+ to: List[str]
66
+
67
+ class SlackNotificationSettings(NotificationSettingsBase):
68
+ """Configuration for Slack notifications.
69
+
70
+ Attributes:
71
+ channels: List of Slack channel IDs or names to post to.
72
+ credentials: Slack API authentication credentials.
73
+ """
74
+
75
+ channels: List[str]
76
+ credentials: SlackCredentials
77
+
78
+ class WebhookNotificationSettings(NotificationSettingsBase):
79
+ """Configuration for webhook notifications.
80
+
81
+ Attributes:
82
+ url: Target webhook URL to POST notification data.
83
+ headers: Optional HTTP headers to include in the webhook request.
84
+ """
85
+
86
+ url: str
87
+ headers: Optional[Dict[str, str]] = {}
88
+
89
+ NotificationType = Literal["email", "slack", "webhook"]
90
+ """Supported notification channel types."""
91
+
92
+ NotificationDetails = Union[
93
+ EmailNotificationSettings,
94
+ SlackNotificationSettings,
95
+ WebhookNotificationSettings,
96
+ ]
97
+ """Union type for all notification detail configurations."""
98
+
99
+
100
+ class NotificationSettings(XPanderSharedModel):
101
+ """Configuration for event-based notifications.
102
+
103
+ Attributes:
104
+ on_success: Notifications to send when an operation succeeds.
105
+ Maps notification types to a list of notification configurations.
106
+ on_error: Notifications to send when an operation fails.
107
+ Maps notification types to a list of notification configurations.
108
+ """
109
+
110
+ on_success: Optional[Dict[NotificationType, List[NotificationDetails]]] = {}
111
+ on_error: Optional[Dict[NotificationType, List[NotificationDetails]]] = {}