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.
- {xpander_sdk-2.0.169/src/xpander_sdk.egg-info → xpander_sdk-2.0.219}/PKG-INFO +97 -13
- xpander_sdk-2.0.169/PKG-INFO → xpander_sdk-2.0.219/README.md +85 -51
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/setup.py +12 -11
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/__init__.py +6 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/consts/api_routes.py +13 -0
- xpander_sdk-2.0.219/src/xpander_sdk/models/generic.py +27 -0
- xpander_sdk-2.0.219/src/xpander_sdk/models/notifications.py +111 -0
- xpander_sdk-2.0.219/src/xpander_sdk/models/orchestrations.py +368 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/agent.py +37 -4
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/sub_modules/agent.py +15 -1
- xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/__init__.py +8 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/backend_module.py +47 -2
- xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/decorators/__init__.py +7 -0
- xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/decorators/on_auth_event.py +131 -0
- xpander_sdk-2.0.219/src/xpander_sdk/modules/backend/events_registry.py +172 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/frameworks/agno.py +121 -40
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/frameworks/dispatch.py +3 -1
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/backend/utils/mcp_oauth.py +36 -24
- xpander_sdk-2.0.219/src/xpander_sdk/modules/events/decorators/__init__.py +3 -0
- xpander_sdk-2.0.219/src/xpander_sdk/modules/events/decorators/on_tool.py +384 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/events_module.py +68 -5
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/models/events.py +6 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/models/task.py +3 -14
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/sub_modules/task.py +24 -5
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/tasks_module.py +3 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/models/mcp.py +1 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/sub_modules/tool.py +46 -15
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/tools_repository_module.py +65 -3
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/utils/generic.py +3 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/utils/schemas.py +20 -7
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/agents/compactization_agent.py +78 -40
- xpander_sdk-2.0.169/README.md → xpander_sdk-2.0.219/src/xpander_sdk.egg-info/PKG-INFO +135 -2
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk.egg-info/SOURCES.txt +9 -0
- xpander_sdk-2.0.219/src/xpander_sdk.egg-info/requires.txt +27 -0
- xpander_sdk-2.0.219/tests/test_final_validation.py +74 -0
- xpander_sdk-2.0.219/tests/test_tool_schema_enhancements.py +105 -0
- xpander_sdk-2.0.169/src/xpander_sdk/utils/__init__.py +0 -0
- xpander_sdk-2.0.169/src/xpander_sdk/utils/agents/__init__.py +0 -0
- xpander_sdk-2.0.169/src/xpander_sdk.egg-info/requires.txt +0 -26
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/LICENSE +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/pyproject.toml +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/setup.cfg +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/consts/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/module_base.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/state.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/core/xpander_api_client.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/exceptions/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/exceptions/module_exception.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/activity.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/compactization.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/configuration.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/deep_planning.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/events.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/frameworks.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/shared.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/models/user.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/agents_module.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/agent_list.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/models/knowledge_bases.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/sub_modules/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/utils/__init__.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/agents/utils/generic.py +0 -0
- {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
- {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
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/decorators/on_boot.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/decorators/on_shutdown.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/decorators/on_task.py +0 -0
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/models/deployments.py +0 -0
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/utils/generic.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/events/utils/git_init.py +0 -0
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/knowledge_bases/knowledge_bases_module.py +0 -0
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/knowledge_bases/models/knowledge_bases.py +0 -0
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/knowledge_bases/sub_modules/knowledge_base.py +0 -0
- {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
- {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
- {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
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/models/tasks_list.py +0 -0
- {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
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tasks/utils/files.py +0 -0
- {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
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/decorators/register_tool.py +0 -0
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/models/tool_invocation_result.py +0 -0
- {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
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/modules/tools_repository/utils/local_tools.py +0 -0
- {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
- {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
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/env.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/event_loop.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/generic.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk/utils/tools.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk.egg-info/dependency_links.txt +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/src/xpander_sdk.egg-info/top_level.txt +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_agents_module.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_api_client.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_backend_module.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_boot_shutdown_handlers.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_configuration.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_knowledge_bases_module.py +0 -0
- {xpander_sdk-2.0.169 → xpander_sdk-2.0.219}/tests/test_tasks_module.py +0 -0
- {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.
|
|
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
|
[](https://www.python.org/downloads/) [](https://opensource.org/licenses/MIT) [](https://docs.xpander.ai) [](https://pypi.org/project/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.
|
|
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]]] = {}
|