openhands-sdk 1.7.1__tar.gz → 1.7.3__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.
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/PKG-INFO +1 -1
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/agent.py +22 -9
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/base.py +4 -1
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/agent_context.py +26 -2
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +12 -2
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/skill.py +6 -1
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/local_conversation.py +16 -1
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/remote_conversation.py +37 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/model_features.py +1 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/verified_models.py +0 -1
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/registry.py +23 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/PKG-INFO +1 -1
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/pyproject.toml +1 -1
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/in_context_learning_example.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/in_context_learning_example_suffix.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/anthropic_claude.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/google_gemini.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/openai_gpt/gpt-5-codex.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/openai_gpt/gpt-5.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/security_policy.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/security_risk_assessment.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/self_documentation.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_interactive.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_long_horizon.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_planning.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_tech_philosophy.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/prompts/summarizing_prompt.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/prompt.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/templates/system_message_suffix.j2 +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/exceptions.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/trigger.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/types.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/view.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/conversation.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/conversation_stats.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/event_store.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/events_list_base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/exceptions.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/fifo_lock.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/persistence_const.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/response_utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/secret_registry.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/serialization_diff.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/state.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/stuck_detector.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/title_utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/types.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/default.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/critic/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/critic/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/agent_finished.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/empty_patch.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/pass_critic.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/condenser.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/conversation_error.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/conversation_state.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_completion_log.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/action.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/message.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/observation.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/system.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/token.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/types.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/user_action.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/git/exceptions.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/git/git_changes.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/git/git_diff.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/git/models.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/git/utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/hooks/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/hooks/config.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/hooks/conversation_hooks.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/hooks/executor.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/hooks/manager.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/hooks/types.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/io/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/io/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/io/cache.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/io/local.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/io/memory.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/classifier.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/mapping.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/types.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/llm.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/llm_registry.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/llm_response.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/message.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/chat_options.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/common.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/responses_options.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/impl/random.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/streaming.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/metrics.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/model_info.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/model_prompt_spec.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/telemetry.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/unverified_models.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/logger/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/logger/logger.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/logger/rolling.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/mcp/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/mcp/client.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/mcp/definition.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/mcp/exceptions.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/mcp/tool.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/mcp/utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/observability/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/observability/laminar.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/observability/utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/py.typed +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/secret/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/secret/secrets.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/security/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/security/analyzer.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/security/confirmation_policy.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/security/llm_analyzer.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/security/risk.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/builtins/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/builtins/finish.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/builtins/think.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/schema.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/spec.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/tool/tool.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/async_executor.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/async_utils.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/cipher.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/command.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/deprecation.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/github.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/json.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/models.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/paging.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/pydantic_diff.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/pydantic_secrets.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/truncate.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/utils/visualize.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/local.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/models.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/__init__.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/base.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/workspace.py +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/SOURCES.txt +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/dependency_links.txt +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/requires.txt +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/top_level.txt +0 -0
- {openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/setup.cfg +0 -0
|
@@ -502,16 +502,29 @@ class Agent(AgentBase):
|
|
|
502
502
|
)
|
|
503
503
|
|
|
504
504
|
# Execute actions!
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
505
|
+
try:
|
|
506
|
+
if should_enable_observability():
|
|
507
|
+
tool_name = extract_action_name(action_event)
|
|
508
|
+
observation: Observation = observe(name=tool_name, span_type="TOOL")(
|
|
509
|
+
tool
|
|
510
|
+
)(action_event.action, conversation)
|
|
511
|
+
else:
|
|
512
|
+
observation = tool(action_event.action, conversation)
|
|
513
|
+
assert isinstance(observation, Observation), (
|
|
514
|
+
f"Tool '{tool.name}' executor must return an Observation"
|
|
509
515
|
)
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
f"
|
|
514
|
-
|
|
516
|
+
except ValueError as e:
|
|
517
|
+
# Tool execution raised a ValueError (e.g., invalid argument combination)
|
|
518
|
+
# Convert to AgentErrorEvent so the agent can correct itself
|
|
519
|
+
err = f"Error executing tool '{tool.name}': {e}"
|
|
520
|
+
logger.warning(err)
|
|
521
|
+
error_event = AgentErrorEvent(
|
|
522
|
+
error=err,
|
|
523
|
+
tool_name=tool.name,
|
|
524
|
+
tool_call_id=action_event.tool_call.id,
|
|
525
|
+
)
|
|
526
|
+
on_event(error_event)
|
|
527
|
+
return error_event
|
|
515
528
|
|
|
516
529
|
obs_event = ObservationEvent(
|
|
517
530
|
observation=observation,
|
|
@@ -194,7 +194,10 @@ class AgentBase(DiscriminatedUnionMixin, ABC):
|
|
|
194
194
|
**template_kwargs,
|
|
195
195
|
)
|
|
196
196
|
if self.agent_context:
|
|
197
|
-
_system_message_suffix = self.agent_context.get_system_message_suffix(
|
|
197
|
+
_system_message_suffix = self.agent_context.get_system_message_suffix(
|
|
198
|
+
llm_model=self.llm.model,
|
|
199
|
+
llm_model_canonical=self.llm.model_canonical_name,
|
|
200
|
+
)
|
|
198
201
|
if _system_message_suffix:
|
|
199
202
|
system_message += "\n\n" + _system_message_suffix
|
|
200
203
|
return system_message
|
|
@@ -13,6 +13,7 @@ from openhands.sdk.context.skills import (
|
|
|
13
13
|
load_user_skills,
|
|
14
14
|
)
|
|
15
15
|
from openhands.sdk.llm import Message, TextContent
|
|
16
|
+
from openhands.sdk.llm.utils.model_prompt_spec import get_model_prompt_spec
|
|
16
17
|
from openhands.sdk.logger import get_logger
|
|
17
18
|
from openhands.sdk.secret import SecretSource, SecretValue
|
|
18
19
|
|
|
@@ -154,7 +155,11 @@ class AgentContext(BaseModel):
|
|
|
154
155
|
secret_infos.append({"name": name, "description": description})
|
|
155
156
|
return secret_infos
|
|
156
157
|
|
|
157
|
-
def get_system_message_suffix(
|
|
158
|
+
def get_system_message_suffix(
|
|
159
|
+
self,
|
|
160
|
+
llm_model: str | None = None,
|
|
161
|
+
llm_model_canonical: str | None = None,
|
|
162
|
+
) -> str | None:
|
|
158
163
|
"""Get the system message with repo skill content and custom suffix.
|
|
159
164
|
|
|
160
165
|
Custom suffix can typically includes:
|
|
@@ -164,11 +169,30 @@ class AgentContext(BaseModel):
|
|
|
164
169
|
- Repository-specific instructions (collected from repo skills)
|
|
165
170
|
"""
|
|
166
171
|
repo_skills = [s for s in self.skills if s.trigger is None]
|
|
172
|
+
|
|
173
|
+
# Gate vendor-specific repo skills based on model family.
|
|
174
|
+
if llm_model or llm_model_canonical:
|
|
175
|
+
spec = get_model_prompt_spec(llm_model or "", llm_model_canonical)
|
|
176
|
+
family = (spec.family or "").lower()
|
|
177
|
+
if family:
|
|
178
|
+
filtered: list[Skill] = []
|
|
179
|
+
for s in repo_skills:
|
|
180
|
+
n = (s.name or "").lower()
|
|
181
|
+
if n == "claude" and not (
|
|
182
|
+
"anthropic" in family or "claude" in family
|
|
183
|
+
):
|
|
184
|
+
continue
|
|
185
|
+
if n == "gemini" and not (
|
|
186
|
+
"gemini" in family or "google_gemini" in family
|
|
187
|
+
):
|
|
188
|
+
continue
|
|
189
|
+
filtered.append(s)
|
|
190
|
+
repo_skills = filtered
|
|
191
|
+
|
|
167
192
|
logger.debug(f"Triggered {len(repo_skills)} repository skills: {repo_skills}")
|
|
168
193
|
# Build the workspace context information
|
|
169
194
|
secret_infos = self.get_secret_infos()
|
|
170
195
|
if repo_skills or self.system_message_suffix or secret_infos:
|
|
171
|
-
# TODO(test): add a test for this rendering to make sure they work
|
|
172
196
|
formatted_text = render_template(
|
|
173
197
|
prompt_dir=str(PROMPT_DIR),
|
|
174
198
|
template_name="system_message_suffix.j2",
|
|
@@ -36,9 +36,9 @@ class LLMSummarizingCondenser(RollingCondenser):
|
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
38
|
llm: LLM
|
|
39
|
-
max_size: int = Field(default=
|
|
39
|
+
max_size: int = Field(default=240, gt=0)
|
|
40
40
|
max_tokens: int | None = None
|
|
41
|
-
keep_first: int = Field(default=
|
|
41
|
+
keep_first: int = Field(default=2, ge=0)
|
|
42
42
|
|
|
43
43
|
@model_validator(mode="after")
|
|
44
44
|
def validate_keep_first_vs_max_size(self):
|
|
@@ -120,7 +120,17 @@ class LLMSummarizingCondenser(RollingCondenser):
|
|
|
120
120
|
|
|
121
121
|
Returns:
|
|
122
122
|
Condensation: The generated condensation object.
|
|
123
|
+
|
|
124
|
+
Raises:
|
|
125
|
+
ValueError: If forgotten_events is empty (0 events to condense).
|
|
123
126
|
"""
|
|
127
|
+
if len(forgotten_events) == 0:
|
|
128
|
+
raise ValueError(
|
|
129
|
+
"Cannot condense 0 events. This typically occurs when a tool loop "
|
|
130
|
+
"spans almost the entire view, leaving no valid range for forgetting "
|
|
131
|
+
"events. Consider adjusting keep_first or max_size parameters."
|
|
132
|
+
)
|
|
133
|
+
|
|
124
134
|
# Convert events to strings for the template
|
|
125
135
|
event_strings = [str(forgotten_event) for forgotten_event in forgotten_events]
|
|
126
136
|
|
|
@@ -411,7 +411,10 @@ def load_skills_from_dir(
|
|
|
411
411
|
# Process all files in one loop
|
|
412
412
|
for file in chain(special_files, md_files):
|
|
413
413
|
try:
|
|
414
|
-
skill = Skill.load(
|
|
414
|
+
skill = Skill.load(
|
|
415
|
+
file,
|
|
416
|
+
skill_dir,
|
|
417
|
+
)
|
|
415
418
|
if skill.trigger is None:
|
|
416
419
|
repo_skills[skill.name] = skill
|
|
417
420
|
else:
|
|
@@ -700,6 +703,8 @@ def load_public_skills(
|
|
|
700
703
|
path=skill_file,
|
|
701
704
|
skill_dir=repo_path,
|
|
702
705
|
)
|
|
706
|
+
if skill is None:
|
|
707
|
+
continue
|
|
703
708
|
all_skills.append(skill)
|
|
704
709
|
logger.debug(f"Loaded public skill: {skill.name}")
|
|
705
710
|
except Exception as e:
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/local_conversation.py
RENAMED
|
@@ -377,9 +377,24 @@ class LocalConversation(BaseConversation):
|
|
|
377
377
|
if (
|
|
378
378
|
self.state.execution_status
|
|
379
379
|
== ConversationExecutionStatus.WAITING_FOR_CONFIRMATION
|
|
380
|
-
or iteration >= self.max_iteration_per_run
|
|
381
380
|
):
|
|
382
381
|
break
|
|
382
|
+
|
|
383
|
+
if iteration >= self.max_iteration_per_run:
|
|
384
|
+
error_msg = (
|
|
385
|
+
f"Agent reached maximum iterations limit "
|
|
386
|
+
f"({self.max_iteration_per_run})."
|
|
387
|
+
)
|
|
388
|
+
logger.error(error_msg)
|
|
389
|
+
self._state.execution_status = ConversationExecutionStatus.ERROR
|
|
390
|
+
self._on_event(
|
|
391
|
+
ConversationErrorEvent(
|
|
392
|
+
source="environment",
|
|
393
|
+
code="MaxIterationsReached",
|
|
394
|
+
detail=error_msg,
|
|
395
|
+
)
|
|
396
|
+
)
|
|
397
|
+
break
|
|
383
398
|
except Exception as e:
|
|
384
399
|
self._state.execution_status = ConversationExecutionStatus.ERROR
|
|
385
400
|
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/remote_conversation.py
RENAMED
|
@@ -28,6 +28,7 @@ from openhands.sdk.conversation.visualizer import (
|
|
|
28
28
|
DefaultConversationVisualizer,
|
|
29
29
|
)
|
|
30
30
|
from openhands.sdk.event.base import Event
|
|
31
|
+
from openhands.sdk.event.conversation_error import ConversationErrorEvent
|
|
31
32
|
from openhands.sdk.event.conversation_state import (
|
|
32
33
|
FULL_STATE_KEY,
|
|
33
34
|
ConversationStateUpdateEvent,
|
|
@@ -489,6 +490,11 @@ class RemoteConversation(BaseConversation):
|
|
|
489
490
|
self._cleanup_initiated = False
|
|
490
491
|
|
|
491
492
|
if conversation_id is None:
|
|
493
|
+
# Import here to avoid circular imports
|
|
494
|
+
from openhands.sdk.tool.registry import get_tool_module_qualnames
|
|
495
|
+
|
|
496
|
+
tool_qualnames = get_tool_module_qualnames()
|
|
497
|
+
logger.debug(f"Sending tool_module_qualnames to server: {tool_qualnames}")
|
|
492
498
|
payload = {
|
|
493
499
|
"agent": agent.model_dump(
|
|
494
500
|
mode="json", context={"expose_secrets": True}
|
|
@@ -500,6 +506,8 @@ class RemoteConversation(BaseConversation):
|
|
|
500
506
|
"workspace": LocalWorkspace(
|
|
501
507
|
working_dir=self.workspace.working_dir
|
|
502
508
|
).model_dump(),
|
|
509
|
+
# Include tool module qualnames for dynamic registration on server
|
|
510
|
+
"tool_module_qualnames": tool_qualnames,
|
|
503
511
|
}
|
|
504
512
|
if stuck_detection_thresholds is not None:
|
|
505
513
|
# Convert to StuckDetectionThresholds if dict, then serialize
|
|
@@ -759,6 +767,19 @@ class RemoteConversation(BaseConversation):
|
|
|
759
767
|
status = info.get("execution_status")
|
|
760
768
|
|
|
761
769
|
if status != ConversationExecutionStatus.RUNNING.value:
|
|
770
|
+
if status == ConversationExecutionStatus.ERROR.value:
|
|
771
|
+
detail = self._get_last_error_detail()
|
|
772
|
+
raise ConversationRunError(
|
|
773
|
+
self._id,
|
|
774
|
+
RuntimeError(
|
|
775
|
+
detail or "Remote conversation ended with error"
|
|
776
|
+
),
|
|
777
|
+
)
|
|
778
|
+
if status == ConversationExecutionStatus.STUCK.value:
|
|
779
|
+
raise ConversationRunError(
|
|
780
|
+
self._id,
|
|
781
|
+
RuntimeError("Remote conversation got stuck"),
|
|
782
|
+
)
|
|
762
783
|
logger.info(
|
|
763
784
|
f"Run completed with status: {status} (elapsed: {elapsed:.1f}s)"
|
|
764
785
|
)
|
|
@@ -771,6 +792,22 @@ class RemoteConversation(BaseConversation):
|
|
|
771
792
|
|
|
772
793
|
time.sleep(poll_interval)
|
|
773
794
|
|
|
795
|
+
def _get_last_error_detail(self) -> str | None:
|
|
796
|
+
"""Return the most recent ConversationErrorEvent detail, if available."""
|
|
797
|
+
try:
|
|
798
|
+
events = self._state.events
|
|
799
|
+
for idx in range(len(events) - 1, -1, -1):
|
|
800
|
+
event = events[idx]
|
|
801
|
+
if isinstance(event, ConversationErrorEvent):
|
|
802
|
+
detail = event.detail.strip()
|
|
803
|
+
code = event.code.strip()
|
|
804
|
+
if detail and code:
|
|
805
|
+
return f"{code}: {detail}"
|
|
806
|
+
return detail or code or None
|
|
807
|
+
except Exception as exc:
|
|
808
|
+
logger.debug("Failed to read conversation error detail: %s", exc)
|
|
809
|
+
return None
|
|
810
|
+
|
|
774
811
|
def set_confirmation_policy(self, policy: ConfirmationPolicyBase) -> None:
|
|
775
812
|
payload = {"policy": policy.model_dump()}
|
|
776
813
|
_send_request(
|
|
@@ -152,6 +152,7 @@ FORCE_STRING_SERIALIZER_MODELS: list[str] = [
|
|
|
152
152
|
# in the message input
|
|
153
153
|
SEND_REASONING_CONTENT_MODELS: list[str] = [
|
|
154
154
|
"kimi-k2-thinking",
|
|
155
|
+
"openrouter/minimax-m2", # MiniMax-M2 via OpenRouter (interleaved thinking)
|
|
155
156
|
"deepseek/deepseek-reasoner",
|
|
156
157
|
]
|
|
157
158
|
|
|
@@ -29,6 +29,7 @@ Returns: A sequence of ToolDefinition instances. Most of the time this will be a
|
|
|
29
29
|
|
|
30
30
|
_LOCK = RLock()
|
|
31
31
|
_REG: dict[str, Resolver] = {}
|
|
32
|
+
_MODULE_QUALNAMES: dict[str, str] = {} # Maps tool name to module qualname
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
def _resolver_from_instance(name: str, tool: ToolDefinition) -> Resolver:
|
|
@@ -137,11 +138,22 @@ def register_tool(
|
|
|
137
138
|
"(3) a callable factory returning a Sequence[ToolDefinition]"
|
|
138
139
|
)
|
|
139
140
|
|
|
141
|
+
# Track the module qualname for this tool
|
|
142
|
+
module_qualname = None
|
|
143
|
+
if isinstance(factory, type):
|
|
144
|
+
module_qualname = factory.__module__
|
|
145
|
+
elif callable(factory):
|
|
146
|
+
module_qualname = getattr(factory, "__module__", None)
|
|
147
|
+
elif isinstance(factory, ToolDefinition):
|
|
148
|
+
module_qualname = factory.__class__.__module__
|
|
149
|
+
|
|
140
150
|
with _LOCK:
|
|
141
151
|
# TODO: throw exception when registering duplicate name tools
|
|
142
152
|
if name in _REG:
|
|
143
153
|
logger.warning(f"Duplicate tool name registerd {name}")
|
|
144
154
|
_REG[name] = resolver
|
|
155
|
+
if module_qualname:
|
|
156
|
+
_MODULE_QUALNAMES[name] = module_qualname
|
|
145
157
|
|
|
146
158
|
|
|
147
159
|
def resolve_tool(
|
|
@@ -159,3 +171,14 @@ def resolve_tool(
|
|
|
159
171
|
def list_registered_tools() -> list[str]:
|
|
160
172
|
with _LOCK:
|
|
161
173
|
return list(_REG.keys())
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def get_tool_module_qualnames() -> dict[str, str]:
|
|
177
|
+
"""Get a mapping of tool names to their module qualnames.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
A dictionary mapping tool names to module qualnames (e.g.,
|
|
181
|
+
{"glob": "openhands.tools.glob.definition"}).
|
|
182
|
+
"""
|
|
183
|
+
with _LOCK:
|
|
184
|
+
return dict(_MODULE_QUALNAMES)
|
|
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
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/security_risk_assessment.j2
RENAMED
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/self_documentation.j2
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_interactive.j2
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_planning.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/no_op_condenser.py
RENAMED
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/pipeline_condenser.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
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/conversation_stats.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
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/serialization_diff.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/default.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
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/observation.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
|
|
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
|
|
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
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/async_remote_workspace.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.7.1 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/remote_workspace_mixin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|