xpander-sdk 2.0.168__py3-none-any.whl → 2.0.170__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.
@@ -1,4 +1,4 @@
1
- from typing import List
1
+ from typing import List, Literal, Union
2
2
 
3
3
  from pydantic import Field
4
4
  from xpander_sdk.models.deep_planning import DeepPlanningItem
@@ -34,6 +34,9 @@ class TaskCompactizationInput(XPanderSharedModel):
34
34
  )
35
35
  )
36
36
 
37
+ class TaskCompactizationRetryEvent(XPanderSharedModel):
38
+ is_retry: bool
39
+
37
40
  class TaskCompactizationOutput(XPanderSharedModel):
38
41
  new_task_prompt: str = Field(
39
42
  ...,
@@ -99,3 +102,11 @@ class TaskCompactizationOutput(XPanderSharedModel):
99
102
  "- Focus on actionable, specific continuation steps.\n"
100
103
  ),
101
104
  )
105
+
106
+
107
+ class TaskCompactizationEvent(XPanderSharedModel):
108
+ type: Literal["retry", "summarization"]
109
+ data: Union[
110
+ TaskCompactizationOutput,
111
+ TaskCompactizationRetryEvent
112
+ ]
@@ -71,3 +71,6 @@ class TaskUpdateEventType(str, Enum):
71
71
 
72
72
  # deep planning
73
73
  PlanUpdated = "plan_updated"
74
+
75
+ # task compactization
76
+ TaskCompactization = "task_compactization"
@@ -10,7 +10,7 @@ from xpander_sdk.modules.tools_repository.models.mcp import MCPOAuthGetTokenGene
10
10
  POLLING_INTERVAL = 1 # every 1s
11
11
  MAX_WAIT_FOR_LOGIN = 600 # 10 mintutes
12
12
 
13
- async def push_event(task: Task, event: TaskUpdateEvent):
13
+ async def push_event(task: Task, event: TaskUpdateEvent, event_type: TaskUpdateEventType):
14
14
  client = APIClient(configuration=task.configuration)
15
15
  await client.make_request(
16
16
  path=APIRoute.PushExecutionEventToQueue.format(task_id=task.id),
@@ -20,7 +20,7 @@ async def push_event(task: Task, event: TaskUpdateEvent):
20
20
  task_id=task.id,
21
21
  organization_id=task.organization_id,
22
22
  time=datetime.now(timezone.utc).isoformat(),
23
- type=TaskUpdateEventType.AuthEvent,
23
+ type=event_type,
24
24
  data=event
25
25
  ).model_dump_safe()
26
26
  ]
@@ -59,7 +59,7 @@ async def authenticate_mcp_server(mcp_server: MCPServerDetails, task: Task, user
59
59
  if result.type == MCPOAuthResponseType.LOGIN_REQUIRED:
60
60
  logger.info(f"Initiating login for MCP Server {mcp_server.url}")
61
61
  # Notify user about login requirement
62
- await push_event(task=task, event=result)
62
+ await push_event(task=task, event=result, event_type=TaskUpdateEventType.AuthEvent)
63
63
 
64
64
  # Poll for token with timeout
65
65
  elapsed_time = 0
@@ -73,7 +73,7 @@ async def authenticate_mcp_server(mcp_server: MCPServerDetails, task: Task, user
73
73
  logger.info(f"Successful login for MCP Server {mcp_server.url}")
74
74
  redacted_token_result = MCPOAuthGetTokenResponse(**token_result.model_dump_safe())
75
75
  redacted_token_result.data.access_token = "REDACTED"
76
- await push_event(task=task, event=redacted_token_result)
76
+ await push_event(task=task, event=redacted_token_result, event_type=TaskUpdateEventType.AuthEvent)
77
77
  return token_result
78
78
 
79
79
  # Timeout reached
@@ -83,7 +83,7 @@ async def authenticate_mcp_server(mcp_server: MCPServerDetails, task: Task, user
83
83
  logger.info(f"Token ready for MCP Server {mcp_server.url}")
84
84
  redacted_token_result = MCPOAuthGetTokenResponse(**result.model_dump_safe())
85
85
  redacted_token_result.data.access_token = "REDACTED"
86
- await push_event(task=task, event=redacted_token_result)
86
+ await push_event(task=task, event=redacted_token_result, event_type=TaskUpdateEventType.AuthEvent)
87
87
 
88
88
  return result
89
89
  except Exception as e:
@@ -82,12 +82,13 @@ from xpander_sdk.modules.tools_repository.models.mcp import (
82
82
  MCPServerDetails,
83
83
  )
84
84
  from xpander_sdk.utils.event_loop import run_sync
85
+ from xpander_sdk.models.compactization import TaskCompactizationEvent
85
86
 
86
87
  # Type variable for Task class methods
87
88
  T = TypeVar("T", bound="Task")
88
89
 
89
90
  TaskUpdateEventData = Union[
90
- T, ToolCallRequest, ToolCallResult, MCPOAuthGetTokenResponse, DeepPlanning
91
+ TaskCompactizationEvent, T, ToolCallRequest, ToolCallResult, MCPOAuthGetTokenResponse, DeepPlanning
91
92
  ]
92
93
 
93
94
 
@@ -552,7 +553,14 @@ class Task(XPanderSharedModel):
552
553
  message += f"\n{json.dumps(f)}"
553
554
 
554
555
  if self.deep_planning and self.deep_planning.enabled == True and self.deep_planning.started:
556
+ task_backup = self.model_copy() # backup result and status
557
+
555
558
  self.reload()
559
+
560
+ # restore result and status
561
+ self.result = task_backup.result
562
+ self.status = task_backup.status
563
+
556
564
  if not self.deep_planning.question_raised:
557
565
  uncompleted_tasks = [task for task in self.deep_planning.tasks if not task.completed]
558
566
  if len(uncompleted_tasks) != 0: # make a retry with compactization
@@ -800,7 +808,13 @@ class Task(XPanderSharedModel):
800
808
  ... print(f"Remaining tasks: {len(status.uncompleted_tasks)}")
801
809
  """
802
810
  try:
803
- await self.areload()
811
+ task_backup = self.model_copy() # backup result and status
812
+ await self.areload() # reload
813
+
814
+ # restore result and status
815
+ self.result = task_backup.result
816
+ self.status = task_backup.status
817
+
804
818
  if self.deep_planning and self.deep_planning.enabled and self.deep_planning.started and self.deep_planning.enforce:
805
819
 
806
820
  # allow early exit to ask question
@@ -2,18 +2,36 @@ from typing import TYPE_CHECKING, List, Union
2
2
  from agno.agent import Agent as AgnoAgent
3
3
  from loguru import logger
4
4
  import json
5
- from xpander_sdk.models.compactization import TaskCompactizationOutput, TaskCompactizationInput
5
+ from xpander_sdk.models.compactization import TaskCompactizationEvent, TaskCompactizationOutput, TaskCompactizationInput, TaskCompactizationRetryEvent
6
6
  from xpander_sdk.models.deep_planning import DeepPlanningItem
7
+ from xpander_sdk.models.events import TaskUpdateEventType
7
8
  from xpander_sdk.models.frameworks import Framework
8
9
  from xpander_sdk.models.shared import Tokens
9
10
  from xpander_sdk.modules.agents.agents_module import Agents
10
11
  from xpander_sdk.modules.backend.backend_module import Backend
12
+ from xpander_sdk.modules.backend.utils.mcp_oauth import push_event
13
+ from xpander_sdk.modules.tasks.sub_modules.task import TaskUpdateEvent
14
+ from xpander_sdk.utils.event_loop import run_sync
15
+ from xpander_sdk.utils.generic import get_current_timestamp
11
16
 
12
17
  if TYPE_CHECKING:
13
18
  from xpander_sdk.modules.tasks.sub_modules.task import Task
14
19
 
15
20
  def run_task_compactization(message: str, task: "Task", uncompleted_tasks: List[DeepPlanningItem]) -> Union[str, TaskCompactizationOutput]:
16
21
  try:
22
+
23
+ # report retry event
24
+ try:
25
+ run_sync(
26
+ push_event(
27
+ task=task,
28
+ event=TaskCompactizationEvent(type="retry", data=TaskCompactizationRetryEvent(is_retry=True)),
29
+ event_type=TaskUpdateEventType.TaskCompactization
30
+ )
31
+ )
32
+ except Exception as e:
33
+ pass
34
+
17
35
  # get agent to identify framework
18
36
  agent = Agents(configuration=task.configuration).get(agent_id=task.agent_id,version=task.agent_version)
19
37
 
@@ -183,6 +201,18 @@ def run_task_compactization(message: str, task: "Task", uncompleted_tasks: List[
183
201
 
184
202
  task.report_metrics(configuration=task.configuration)
185
203
 
204
+ # report compactization event
205
+ try:
206
+ run_sync(
207
+ push_event(
208
+ task=task,
209
+ event=TaskCompactizationEvent(type="summarization", data=run_result.content),
210
+ event_type=TaskUpdateEventType.TaskCompactization
211
+ )
212
+ )
213
+ except Exception as e:
214
+ pass
215
+
186
216
  return run_result.content
187
217
  except Exception as e:
188
218
  logger.warning(f"Failed to run task compactization - {str(e)}")
@@ -0,0 +1,5 @@
1
+ from datetime import datetime, timezone
2
+
3
+
4
+ def get_current_timestamp() -> str:
5
+ return datetime.now(timezone.utc).isoformat()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xpander-sdk
3
- Version: 2.0.168
3
+ Version: 2.0.170
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
@@ -9,10 +9,10 @@ xpander_sdk/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
9
9
  xpander_sdk/exceptions/module_exception.py,sha256=2Urni1QEdzOrCdYSRc5eLpuz8aDlvRcn8KNejo_2nGc,1687
10
10
  xpander_sdk/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  xpander_sdk/models/activity.py,sha256=I3CxOzUNbrKwHqynCbm7FJja6vanVkCzwwBwET7qvzA,2085
12
- xpander_sdk/models/compactization.py,sha256=sKq8Lm43ij-wN_G8jK4pppaM8oMJ3NLxS4TlT2SYmUE,5314
12
+ xpander_sdk/models/compactization.py,sha256=I0tfDQZKaaKvWHIg1O07oJUPUrbwvr4Q0azDsx5OfAE,5596
13
13
  xpander_sdk/models/configuration.py,sha256=Un8p3C3p3eMiqKK5VsHaZdWhZTRYHbrw2aPUMV8lJSc,3370
14
14
  xpander_sdk/models/deep_planning.py,sha256=pCFV5iNSfT99ap1-09k7oO_DIwXx2vPJ3aVM472xL4w,554
15
- xpander_sdk/models/events.py,sha256=2vIkuPGAbntN_7xggJRw5sMJ1_EzcXyljxPH0ekISlw,2235
15
+ xpander_sdk/models/events.py,sha256=HnootQSUIIRM4BIdaTbuPUEJ55hLVtA7KDCSsnHeBKw,2313
16
16
  xpander_sdk/models/frameworks.py,sha256=-7W_m5cvgS1qLp0gGAFP4noNWT82IT1ZqtQv5WuOC2k,2939
17
17
  xpander_sdk/models/shared.py,sha256=gW88kA_UslNinUjtQKpLVF0sHDZnckwLWexRapxPivU,3125
18
18
  xpander_sdk/models/user.py,sha256=_FTG0JO6iTrbcvJp-BBJ6nuj281zhyQB5ldQkBCyYDU,749
@@ -33,7 +33,7 @@ xpander_sdk/modules/backend/frameworks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
33
33
  xpander_sdk/modules/backend/frameworks/agno.py,sha256=z8olkGD4QPMPX-g6Z-4E5n5Gxs8i1L8vbaKXKry7wjU,37881
34
34
  xpander_sdk/modules/backend/frameworks/dispatch.py,sha256=5dP4c37C42U53VjM2kkwIRwEw1i0IN3G0YESHH7J3OE,1557
35
35
  xpander_sdk/modules/backend/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- xpander_sdk/modules/backend/utils/mcp_oauth.py,sha256=a4xQGQwRGf2T9h38Vc9VNUwpIeY9y7Mn6B4D2G3tMQM,4387
36
+ xpander_sdk/modules/backend/utils/mcp_oauth.py,sha256=slmrtpjGM__g7mkhvnY9yNRtGHS-fDcLH82rIkBKxkA,4527
37
37
  xpander_sdk/modules/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  xpander_sdk/modules/events/events_module.py,sha256=DVlho7JxT6Jy8GeyuSakswmYwR18xqO2JcCJ-8Zc3s8,25317
39
39
  xpander_sdk/modules/events/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -60,7 +60,7 @@ xpander_sdk/modules/tasks/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
60
60
  xpander_sdk/modules/tasks/models/task.py,sha256=B0_fwzQEkRE_pZMSLnWuXsUBMdy8HEIxm1FfRpCQma0,5000
61
61
  xpander_sdk/modules/tasks/models/tasks_list.py,sha256=8V1T0vCtGN79qLMPwe37pOA7Wvuf8pbJNOhWL0BPo-8,5126
62
62
  xpander_sdk/modules/tasks/sub_modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- xpander_sdk/modules/tasks/sub_modules/task.py,sha256=dbvM-wdH9IHIRfJxuSE6ZBIvRuXH1g15ssO9lUZEu8U,37121
63
+ xpander_sdk/modules/tasks/sub_modules/task.py,sha256=mQD3_fe4j0HnskahOmxVIsAbVh1czsn3W7nXF91_Zd0,37692
64
64
  xpander_sdk/modules/tasks/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
65
  xpander_sdk/modules/tasks/utils/files.py,sha256=KqqwSQSrwim2-H3XP5wOadDDfngAyEI034tA7Oon-vc,3631
66
66
  xpander_sdk/modules/tools_repository/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -79,11 +79,12 @@ xpander_sdk/modules/tools_repository/utils/schemas.py,sha256=EUi35h7CRrOVXV-TH-l
79
79
  xpander_sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  xpander_sdk/utils/env.py,sha256=U_zIhqWgKs5fk2-HXjAaODj4oWMc5dRQ0fvw6fqVcFk,1522
81
81
  xpander_sdk/utils/event_loop.py,sha256=kJrN0upgBhyI86tkTdfHeajznrIZl44Rl6WDiDG3GHE,2516
82
+ xpander_sdk/utils/generic.py,sha256=XrRj2-L8c0YWpfPdDyXE-pVL-6lKF9VpyZzKHQ4wuCc,127
82
83
  xpander_sdk/utils/tools.py,sha256=lyFkq2yP7DxBkyXYVlnFRwDhQCvf0fZZMDm5fBycze4,1244
83
84
  xpander_sdk/utils/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- xpander_sdk/utils/agents/compactization_agent.py,sha256=iRd18bBOYYyC95wdc1Xq6T1r3RyNivvP_fD3EkSbK4A,11659
85
- xpander_sdk-2.0.168.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
86
- xpander_sdk-2.0.168.dist-info/METADATA,sha256=_x5aw3qeUPMwboas-n4J1b-v5yBo909AwRtMlqRTKzI,15312
87
- xpander_sdk-2.0.168.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
88
- xpander_sdk-2.0.168.dist-info/top_level.txt,sha256=UCjnxQpsMy5Zoe7lmRuVDO6DI2V_6PgRFfm4oizRbVs,12
89
- xpander_sdk-2.0.168.dist-info/RECORD,,
85
+ xpander_sdk/utils/agents/compactization_agent.py,sha256=iMViaUnpuZFMyo-pQCen9bAIADmFWV2yx3JuNaG5bx0,12815
86
+ xpander_sdk-2.0.170.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
87
+ xpander_sdk-2.0.170.dist-info/METADATA,sha256=F97VFAV0KLgZgilAO42QBdAm_GOG1cKvRCRZoO5_NAo,15312
88
+ xpander_sdk-2.0.170.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
89
+ xpander_sdk-2.0.170.dist-info/top_level.txt,sha256=UCjnxQpsMy5Zoe7lmRuVDO6DI2V_6PgRFfm4oizRbVs,12
90
+ xpander_sdk-2.0.170.dist-info/RECORD,,