xpander-sdk 2.0.366__tar.gz → 2.0.368__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 (152) hide show
  1. {xpander_sdk-2.0.366/src/xpander_sdk.egg-info → xpander_sdk-2.0.368}/PKG-INFO +1 -1
  2. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/setup.py +1 -1
  3. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/__init__.py +1 -1
  4. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/constants.py +4 -0
  5. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/context_optimizer.py +17 -0
  6. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/events.py +5 -0
  7. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/agno.py +14 -6
  8. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368/src/xpander_sdk.egg-info}/PKG-INFO +1 -1
  9. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_window_detection.py +12 -6
  10. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/LICENSE +0 -0
  11. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/README.md +0 -0
  12. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/pyproject.toml +0 -0
  13. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/setup.cfg +0 -0
  14. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/consts/__init__.py +0 -0
  15. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/consts/api_routes.py +0 -0
  16. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/__init__.py +0 -0
  17. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/__init__.py +0 -0
  18. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/action_ledger.py +0 -0
  19. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/compact_retry_result.py +0 -0
  20. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/completion_evidence.py +0 -0
  21. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/encryption.py +0 -0
  22. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/error_patterns.py +0 -0
  23. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/finalize_mode.py +0 -0
  24. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/__init__.py +0 -0
  25. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/chunking.py +0 -0
  26. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/recent_actions.py +0 -0
  27. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/secrets.py +0 -0
  28. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/tool_result.py +0 -0
  29. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/xml_safety.py +0 -0
  30. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/mixins/__init__.py +0 -0
  31. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/mixins/map_reduce.py +0 -0
  32. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/prompts.py +0 -0
  33. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/search.py +0 -0
  34. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/workspace_cache.py +0 -0
  35. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/module_base.py +0 -0
  36. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/state.py +0 -0
  37. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/xpander_api_client.py +0 -0
  38. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/exceptions/__init__.py +0 -0
  39. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/exceptions/module_exception.py +0 -0
  40. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/__init__.py +0 -0
  41. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/action_ledger.py +0 -0
  42. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/activity.py +0 -0
  43. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/compactization.py +0 -0
  44. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/configuration.py +0 -0
  45. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/context_status.py +0 -0
  46. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/deep_planning.py +0 -0
  47. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/frameworks.py +0 -0
  48. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/generic.py +0 -0
  49. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/notifications.py +0 -0
  50. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/orchestrations.py +0 -0
  51. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/shared.py +0 -0
  52. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/user.py +0 -0
  53. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/__init__.py +0 -0
  54. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/__init__.py +0 -0
  55. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/agents_module.py +0 -0
  56. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/__init__.py +0 -0
  57. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/agent.py +0 -0
  58. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/agent_list.py +0 -0
  59. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/knowledge_bases.py +0 -0
  60. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/sub_modules/__init__.py +0 -0
  61. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/sub_modules/agent.py +0 -0
  62. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/utils/__init__.py +0 -0
  63. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/utils/generic.py +0 -0
  64. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/__init__.py +0 -0
  65. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/backend_module.py +0 -0
  66. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/decorators/__init__.py +0 -0
  67. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/decorators/on_auth_event.py +0 -0
  68. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/events_registry.py +0 -0
  69. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/__init__.py +0 -0
  70. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/_bedrock_cache.py +0 -0
  71. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/dispatch.py +0 -0
  72. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/__init__.py +0 -0
  73. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/extra_headers.py +0 -0
  74. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/mcp_oauth.py +0 -0
  75. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/tool_call_events.py +0 -0
  76. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/__init__.py +0 -0
  77. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/__init__.py +0 -0
  78. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_boot.py +0 -0
  79. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_shutdown.py +0 -0
  80. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_task.py +0 -0
  81. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_tool.py +0 -0
  82. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/events_module.py +0 -0
  83. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/__init__.py +0 -0
  84. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/deployments.py +0 -0
  85. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/events.py +0 -0
  86. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/streaming_server.py +0 -0
  87. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/__init__.py +0 -0
  88. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/generic.py +0 -0
  89. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/git_init.py +0 -0
  90. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/__init__.py +0 -0
  91. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/knowledge_bases_module.py +0 -0
  92. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/models/__init__.py +0 -0
  93. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/models/knowledge_bases.py +0 -0
  94. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/sub_modules/__init__.py +0 -0
  95. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/sub_modules/knowledge_base.py +0 -0
  96. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/sub_modules/knowledge_base_document_item.py +0 -0
  97. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/utils/__init__.py +0 -0
  98. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/__init__.py +0 -0
  99. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/__init__.py +0 -0
  100. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/task.py +0 -0
  101. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/tasks_list.py +0 -0
  102. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/sub_modules/__init__.py +0 -0
  103. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/sub_modules/task.py +0 -0
  104. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/tasks_module.py +0 -0
  105. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/utils/__init__.py +0 -0
  106. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/utils/files.py +0 -0
  107. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/__init__.py +0 -0
  108. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/decorators/__init__.py +0 -0
  109. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/decorators/register_tool.py +0 -0
  110. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/models/__init__.py +0 -0
  111. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/models/mcp.py +0 -0
  112. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/models/tool_invocation_result.py +0 -0
  113. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/sub_modules/__init__.py +0 -0
  114. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/sub_modules/dynamic_tools.py +0 -0
  115. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/sub_modules/tool.py +0 -0
  116. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/tools_repository_module.py +0 -0
  117. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/__init__.py +0 -0
  118. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/generic.py +0 -0
  119. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/local_tools.py +0 -0
  120. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/schemas.py +0 -0
  121. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/workspace_payload.py +0 -0
  122. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/__init__.py +0 -0
  123. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/agents/__init__.py +0 -0
  124. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/cache.py +0 -0
  125. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/env.py +0 -0
  126. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/event_loop.py +0 -0
  127. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/generic.py +0 -0
  128. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/tools.py +0 -0
  129. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/SOURCES.txt +0 -0
  130. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/dependency_links.txt +0 -0
  131. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/requires.txt +0 -0
  132. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/top_level.txt +0 -0
  133. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_action_ledger_dedup.py +0 -0
  134. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_auto_context_management_toggle.py +0 -0
  135. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_bedrock_prompt_cache.py +0 -0
  136. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_boot_shutdown_handlers.py +0 -0
  137. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_chunked.py +0 -0
  138. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_perf.py +0 -0
  139. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_recent_actions.py +0 -0
  140. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_status_events.py +0 -0
  141. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_unwrap.py +0 -0
  142. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_window.py +0 -0
  143. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_search.py +0 -0
  144. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_headroom_l0.py +0 -0
  145. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_layer_1_cache_integration.py +0 -0
  146. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_parent_update_deep_planning.py +0 -0
  147. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_planning_tools_visibility.py +0 -0
  148. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_reasoning_plan_task_id.py +0 -0
  149. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_skills_instructions.py +0 -0
  150. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_tool_call_events.py +0 -0
  151. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_workspace_cache.py +0 -0
  152. {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_workspace_tools_toggle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xpander-sdk
3
- Version: 2.0.366
3
+ Version: 2.0.368
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
@@ -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.366",
8
+ version="2.0.368",
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,7 +15,7 @@ Main Components:
15
15
  For more information, visit: https://xpander.ai
16
16
  """
17
17
 
18
- __version__ = "2.0.366"
18
+ __version__ = "2.0.368"
19
19
 
20
20
  # Backend-related imports
21
21
  from .modules.backend.backend_module import Backend
@@ -119,6 +119,10 @@ SESSION_COMPACT_TIMEOUT = 120
119
119
  # wedging the agent loop forever while still tolerating long
120
120
  # provider stalls.
121
121
  PRE_RETRY_COMPACT_MAX_ATTEMPTS = 10
122
+ # Non-timeout failures (deterministic provider errors) won't self-heal across
123
+ # retries, so they get a much smaller budget than transient timeouts — the full
124
+ # 10x60s backoff on a deterministic error is what wedged the agent for hours.
125
+ PRE_RETRY_COMPACT_MAX_NONTIMEOUT_ATTEMPTS = 2
122
126
  PRE_RETRY_COMPACT_RETRY_BASE_DELAY = 2.0 # seconds
123
127
  PRE_RETRY_COMPACT_RETRY_MAX_DELAY = 60.0 # seconds — cap on backoff
124
128
  PRE_RETRY_COMPACT_RETRY_JITTER = 0.2 # ± fraction of computed delay
@@ -70,6 +70,7 @@ from xpander_sdk.core.context_optimizer.constants import (
70
70
  MAX_STAGNANT_COMPACTIONS,
71
71
  MIN_TOKENS_FOR_PRE_RETRY_COMPACT,
72
72
  PRE_RETRY_COMPACT_MAX_ATTEMPTS,
73
+ PRE_RETRY_COMPACT_MAX_NONTIMEOUT_ATTEMPTS,
73
74
  PRE_RETRY_COMPACT_RETRY_BASE_DELAY,
74
75
  PRE_RETRY_COMPACT_RETRY_JITTER,
75
76
  PRE_RETRY_COMPACT_RETRY_MAX_DELAY,
@@ -2133,7 +2134,23 @@ class XPanderContextOptimizer(MapReduceMixin, CompressionManager):
2133
2134
  raise
2134
2135
  except (asyncio.TimeoutError, Exception) as exc:
2135
2136
  is_timeout = isinstance(exc, asyncio.TimeoutError)
2137
+ # Context-overflow can't be cleared by re-sending the same
2138
+ # oversized payload — layer_2 already exhausted its chunked
2139
+ # fallback before raising. Bail to plan-retry at once.
2140
+ if not is_timeout and _is_context_overflow_error(exc):
2141
+ logger.error(
2142
+ f"[context-optimizer] pre-retry: compaction hit a "
2143
+ f"context-overflow ({exc}) — not retryable, giving up"
2144
+ )
2145
+ return result
2136
2146
  last_attempt = attempt == PRE_RETRY_COMPACT_MAX_ATTEMPTS - 1
2147
+ # Deterministic provider errors won't self-heal, so cap them
2148
+ # well below the timeout budget instead of burning all 10x.
2149
+ if (
2150
+ not is_timeout
2151
+ and attempt >= PRE_RETRY_COMPACT_MAX_NONTIMEOUT_ATTEMPTS - 1
2152
+ ):
2153
+ last_attempt = True
2137
2154
  reason = (
2138
2155
  f"timed out after {SESSION_COMPACT_TIMEOUT}s"
2139
2156
  if is_timeout
@@ -111,3 +111,8 @@ class TaskUpdateEventType(str, Enum):
111
111
  InviteMember = "invite_member"
112
112
  # a member invite was sent, rendered as a confirmation chip
113
113
  MemberInvited = "member_invited"
114
+ # omni gateway asks the user to provide one or more secrets a downstream
115
+ # skill / custom code needs, rendered as an interactive card
116
+ AskForSecret = "ask_for_secret"
117
+ # secrets were saved, rendered as a confirmation chip (names only, no values)
118
+ SecretSaved = "secret_saved"
@@ -3454,12 +3454,18 @@ _MODEL_CONTEXT_WINDOWS_SUBSTRING: List[Tuple[str, int]] = [
3454
3454
  _LOGGED_UNKNOWN_MODEL_IDS: set = set()
3455
3455
  _EMPTY_MODEL_ID_LOGGED = False
3456
3456
 
3457
+ # Conservative window for unmapped models: over-budgeting a small-window model
3458
+ # pushes the real request past its hard limit (fatal overflow + retry spin),
3459
+ # whereas under-budgeting only triggers extra compaction. 128K is a safe floor
3460
+ # for modern models; all frontier IDs are in the tables above and bypass this.
3461
+ _DEFAULT_UNKNOWN_CONTEXT_WINDOW = 128_000
3462
+
3457
3463
 
3458
3464
  def _detect_context_window(model: Model) -> int:
3459
3465
  """Return the model's max input context in tokens.
3460
3466
 
3461
3467
  Resolution order: exact match → case-insensitive exact → ordered
3462
- substring fallback → 200K default with a once-per-process warning
3468
+ substring fallback → conservative default with a once-per-process warning
3463
3469
  log so the miss is triagable without flooding output.
3464
3470
  """
3465
3471
  global _EMPTY_MODEL_ID_LOGGED
@@ -3467,10 +3473,11 @@ def _detect_context_window(model: Model) -> int:
3467
3473
  if not raw_id:
3468
3474
  if not _EMPTY_MODEL_ID_LOGGED:
3469
3475
  logger.warning(
3470
- "[context-optimizer] model.id is empty; defaulting to 200K window"
3476
+ f"[context-optimizer] model.id is empty; defaulting to "
3477
+ f"{_DEFAULT_UNKNOWN_CONTEXT_WINDOW:,} window"
3471
3478
  )
3472
3479
  _EMPTY_MODEL_ID_LOGGED = True
3473
- return 200_000
3480
+ return _DEFAULT_UNKNOWN_CONTEXT_WINDOW
3474
3481
  if raw_id in _MODEL_CONTEXT_WINDOWS_EXACT:
3475
3482
  return _MODEL_CONTEXT_WINDOWS_EXACT[raw_id]
3476
3483
  lower_id = raw_id.lower()
@@ -3485,11 +3492,12 @@ def _detect_context_window(model: Model) -> int:
3485
3492
  return window
3486
3493
  if raw_id not in _LOGGED_UNKNOWN_MODEL_IDS:
3487
3494
  logger.warning(
3488
- f"[context-optimizer] unknown model.id='{raw_id}'; "
3489
- f"defaulting to 200K window. Add to _MODEL_CONTEXT_WINDOWS_EXACT."
3495
+ f"[context-optimizer] unknown model.id='{raw_id}'; defaulting to "
3496
+ f"{_DEFAULT_UNKNOWN_CONTEXT_WINDOW:,} window. "
3497
+ f"Add to _MODEL_CONTEXT_WINDOWS_EXACT."
3490
3498
  )
3491
3499
  _LOGGED_UNKNOWN_MODEL_IDS.add(raw_id)
3492
- return 200_000
3500
+ return _DEFAULT_UNKNOWN_CONTEXT_WINDOW
3493
3501
 
3494
3502
 
3495
3503
  def _configure_context_optimizer(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xpander-sdk
3
- Version: 2.0.366
3
+ Version: 2.0.368
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,6 +11,7 @@ from __future__ import annotations
11
11
  import pytest
12
12
 
13
13
  from xpander_sdk.modules.backend.frameworks.agno import (
14
+ _DEFAULT_UNKNOWN_CONTEXT_WINDOW,
14
15
  _MODEL_CONTEXT_WINDOWS_EXACT,
15
16
  _detect_context_window,
16
17
  )
@@ -96,14 +97,19 @@ def test_known_model_resolves_to_documented_window(
96
97
  assert _detect_context_window(_M(model_id)) == expected
97
98
 
98
99
 
99
- def test_unknown_model_defaults_to_200k() -> None:
100
- # An entirely unknown model id falls back to 200K (the safe Claude
101
- # default) and the warning log is the only side-effect.
102
- assert _detect_context_window(_M("totally-made-up-2099-model")) == 200_000
100
+ def test_unknown_model_defaults_to_conservative_window() -> None:
101
+ # An unmapped model id falls back to a conservative window so it can't
102
+ # be told it has more context than it does (over-budgeting an unmapped
103
+ # small-window model is what caused the non-frontier overflow + spin).
104
+ assert (
105
+ _detect_context_window(_M("totally-made-up-2099-model"))
106
+ == _DEFAULT_UNKNOWN_CONTEXT_WINDOW
107
+ )
108
+ assert _DEFAULT_UNKNOWN_CONTEXT_WINDOW < 200_000
103
109
 
104
110
 
105
- def test_empty_model_id_defaults_to_200k() -> None:
106
- assert _detect_context_window(_M("")) == 200_000
111
+ def test_empty_model_id_defaults_to_conservative_window() -> None:
112
+ assert _detect_context_window(_M("")) == _DEFAULT_UNKNOWN_CONTEXT_WINDOW
107
113
 
108
114
 
109
115
  def test_substring_fallback_for_unmapped_1m_variant() -> None:
File without changes
File without changes
File without changes