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.
- {xpander_sdk-2.0.366/src/xpander_sdk.egg-info → xpander_sdk-2.0.368}/PKG-INFO +1 -1
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/setup.py +1 -1
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/__init__.py +1 -1
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/constants.py +4 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/context_optimizer.py +17 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/events.py +5 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/agno.py +14 -6
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368/src/xpander_sdk.egg-info}/PKG-INFO +1 -1
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_window_detection.py +12 -6
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/LICENSE +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/README.md +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/pyproject.toml +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/setup.cfg +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/consts/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/consts/api_routes.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/action_ledger.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/compact_retry_result.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/completion_evidence.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/encryption.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/error_patterns.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/finalize_mode.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/chunking.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/recent_actions.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/secrets.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/tool_result.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/helpers/xml_safety.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/mixins/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/mixins/map_reduce.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/prompts.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/search.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/workspace_cache.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/module_base.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/state.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/xpander_api_client.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/exceptions/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/exceptions/module_exception.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/action_ledger.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/activity.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/compactization.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/configuration.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/context_status.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/deep_planning.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/frameworks.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/generic.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/notifications.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/orchestrations.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/shared.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/models/user.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/agents_module.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/agent.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/agent_list.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/knowledge_bases.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/sub_modules/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/sub_modules/agent.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/utils/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/utils/generic.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/backend_module.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/decorators/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/decorators/on_auth_event.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/events_registry.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/_bedrock_cache.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/dispatch.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/extra_headers.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/mcp_oauth.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/tool_call_events.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_boot.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_shutdown.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_task.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_tool.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/events_module.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/deployments.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/events.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/streaming_server.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/generic.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/git_init.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/knowledge_bases_module.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/models/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/models/knowledge_bases.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/sub_modules/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/sub_modules/knowledge_base.py +0 -0
- {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
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/utils/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/task.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/tasks_list.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/sub_modules/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/sub_modules/task.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/tasks_module.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/utils/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/utils/files.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/decorators/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/decorators/register_tool.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/models/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/models/mcp.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/models/tool_invocation_result.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/sub_modules/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/sub_modules/dynamic_tools.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/sub_modules/tool.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/tools_repository_module.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/generic.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/local_tools.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/schemas.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/utils/workspace_payload.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/agents/__init__.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/cache.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/env.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/event_loop.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/generic.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/utils/tools.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/SOURCES.txt +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/dependency_links.txt +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/requires.txt +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk.egg-info/top_level.txt +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_action_ledger_dedup.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_auto_context_management_toggle.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_bedrock_prompt_cache.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_boot_shutdown_handlers.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_chunked.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_perf.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_recent_actions.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_status_events.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_unwrap.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_optimizer_window.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_context_search.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_headroom_l0.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_layer_1_cache_integration.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_parent_update_deep_planning.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_planning_tools_visibility.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_reasoning_plan_task_id.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_skills_instructions.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_tool_call_events.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_workspace_cache.py +0 -0
- {xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/tests/test_workspace_tools_toggle.py +0 -0
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/constants.py
RENAMED
|
@@ -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"
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/agno.py
RENAMED
|
@@ -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 →
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
3500
|
+
return _DEFAULT_UNKNOWN_CONTEXT_WINDOW
|
|
3493
3501
|
|
|
3494
3502
|
|
|
3495
3503
|
def _configure_context_optimizer(
|
|
@@ -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
|
|
100
|
-
# An
|
|
101
|
-
#
|
|
102
|
-
|
|
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
|
|
106
|
-
assert _detect_context_window(_M("")) ==
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/__init__.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/action_ledger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/encryption.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/error_patterns.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/finalize_mode.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/prompts.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/core/context_optimizer/search.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/agent_list.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/models/knowledge_bases.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/sub_modules/__init__.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/sub_modules/agent.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/agents/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/backend_module.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/decorators/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/events_registry.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/frameworks/dispatch.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/__init__.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/extra_headers.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/backend/utils/mcp_oauth.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/__init__.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_boot.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_shutdown.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_task.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/decorators/on_tool.py
RENAMED
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/__init__.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/models/deployments.py
RENAMED
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/streaming_server.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/events/utils/git_init.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/knowledge_bases/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/models/tasks_list.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/sub_modules/__init__.py
RENAMED
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tasks/sub_modules/task.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xpander_sdk-2.0.366 → xpander_sdk-2.0.368}/src/xpander_sdk/modules/tools_repository/models/mcp.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|