openhands-sdk 1.49.2__tar.gz → 1.49.4__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.49.2 → openhands_sdk-1.49.4}/PKG-INFO +3 -3
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_agent.py +62 -18
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/agent_context.py +8 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm.py +4 -1
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/model_features.py +1 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/verified_models.py +3 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/secret/__init__.py +6 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/secret/secrets.py +48 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/base.py +19 -4
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/PKG-INFO +3 -3
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/requires.txt +2 -2
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/pyproject.toml +3 -3
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_file_credentials.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_models.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_tracing.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/agent.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/critic_mixin.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/parallel_executor.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/response_dispatch.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/stream_context.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/banner.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/prompts/summarizing_prompt.j2 +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/memory.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/presets.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/prompt.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/registry.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/section.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/dynamic.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/planning.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/static.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/manipulation_indices.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/batch_atomicity.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/observation_uniqueness.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/tool_call_matching.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/tool_loop_atomicity.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/view.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/cancellation.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/conversation.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/conversation_stats.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/event_store.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/events_list_base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/exceptions.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/fifo_lock.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/controller.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/judge.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/prompts.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/runner.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/local_conversation.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/remote_conversation.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/persistence_const.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/request.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/resource_lock_manager.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/response_utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/secret_registry.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/state.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/stuck_detector.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/title_utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/types.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/visualizer/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/visualizer/default.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/credential.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/agent_finished.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/chat_template.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/client.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/critic.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/taxonomy.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/empty_patch.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/pass_critic.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/result.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/acp_tool_call.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/condenser.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/conversation_error.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/conversation_state.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/error_classification.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/hook_execution.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_completion_log.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/action.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/message.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/observation.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/reasoning_utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/system.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/resume_transcript.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/streaming_delta.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/token.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/types.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/user_action.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/fetch.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/info.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/interface.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/manager.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/metadata.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/cached_repo.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/exceptions.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/git_changes.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/git_commits.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/git_diff.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/models.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/config.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/conversation_hooks.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/executor.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/manager.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/types.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/cache.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/local.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/memory.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/auth/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/auth/credentials.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/auth/openai.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/cleanup_profile.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/classifier.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/mapping.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/types.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/fallback_strategy.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm_profile_store.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm_registry.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm_response.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/message.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/mixins/fn_call_examples.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/chat_options.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/common.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/responses_options.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/provider_connection_store.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/impl/random.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/streaming.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/image_inline.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/image_resize.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/litellm_provider.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/metrics.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/model_info.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/model_prompt_spec.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/openhands_provider.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/providers/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/providers/openrouter.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/responses_serialization.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/runtime_metadata.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/telemetry.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/unverified_models.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/vertex_preflight.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/logger/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/logger/logger.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/logger/rolling.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/registration.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/registry.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/types.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/client.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/config.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/definition.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/exceptions.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/tool.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/observability/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/observability/laminar.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/observability/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/discovery.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/fetch.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/agent_plugins.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/agent_plugins_mcp.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/claude_code.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/schemas/mcp-1.0.0.schema.json +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/schemas/plugin-1.0.0.schema.json +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/installed.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/loader.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/plugin.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/source.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/types.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/agent_profile.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/agent_profile_store.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/profile_refs.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/resolver.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/seed.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/py.typed +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/_shell_ast.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/analyzer.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/confirmation_policy.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/pattern.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/policy_rails.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/shell_semantics.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/ensemble.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/grayswan/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/grayswan/analyzer.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/grayswan/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/llm_analyzer.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/risk.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/shell_parser.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/toolshield_helpers.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/toolshield_llm_analyzer.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/acp_install_catalog.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/acp_providers.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/api_models.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/metadata.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/model.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/exceptions.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/execute.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/fetch.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/installed.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/skill.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/trigger.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/types.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/load.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/registry.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/schema.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/testing/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/testing/test_llm.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/finish.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/invoke_skill.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/switch_llm.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/think.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/vision_inspect.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/client_tool.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/defaults.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/registry.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/schema.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/spec.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/tool.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/async_executor.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/async_utils.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/cipher.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/command.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/datetime.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/deprecation.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/files.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/github.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/json.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/models.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/paging.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/path.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/pydantic_secrets.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/redact.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/truncate.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/visualize.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/base.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/local.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/models.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/__init__.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/repo.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/workspace.py +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/SOURCES.txt +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/dependency_links.txt +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/top_level.txt +0 -0
- {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/setup.cfg +0 -0
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openhands-sdk
|
|
3
|
-
Version: 1.49.
|
|
3
|
+
Version: 1.49.4
|
|
4
4
|
Summary: OpenHands SDK - Core functionality for building AI agents
|
|
5
5
|
Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
|
|
6
6
|
Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
|
|
7
7
|
Project-URL: Documentation, https://docs.openhands.dev/sdk
|
|
8
8
|
Project-URL: Bug Tracker, https://github.com/OpenHands/software-agent-sdk/issues
|
|
9
9
|
Requires-Python: >=3.12
|
|
10
|
-
Requires-Dist: agent-client-protocol<0.
|
|
10
|
+
Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
|
|
11
11
|
Requires-Dist: deprecation>=2.1.0
|
|
12
12
|
Requires-Dist: fakeredis[lua]>=2.32.1
|
|
13
13
|
Requires-Dist: fastmcp<4,>=3.2.0
|
|
14
14
|
Requires-Dist: filelock>=3.20.1
|
|
15
15
|
Requires-Dist: httpx[socks]>=0.27.0
|
|
16
16
|
Requires-Dist: jsonschema>=4.23.0
|
|
17
|
-
Requires-Dist: joserfc>=1.
|
|
17
|
+
Requires-Dist: joserfc>=1.7.5
|
|
18
18
|
Requires-Dist: litellm>=1.93.0
|
|
19
19
|
Requires-Dist: pillow>=12.3.0
|
|
20
20
|
Requires-Dist: pydantic>=2.12.5
|
|
@@ -43,21 +43,34 @@ from acp.client.connection import ClientSideConnection
|
|
|
43
43
|
from acp.exceptions import RequestError as ACPRequestError
|
|
44
44
|
from acp.helpers import image_block, text_block
|
|
45
45
|
from acp.schema import (
|
|
46
|
+
AcpMcpServer,
|
|
46
47
|
AgentMessageChunk,
|
|
47
48
|
AgentThoughtChunk,
|
|
48
49
|
AllowedOutcome,
|
|
50
|
+
CreateElicitationResponse,
|
|
51
|
+
CreateTerminalResponse,
|
|
52
|
+
DeclineElicitationResponse,
|
|
53
|
+
ElicitationMode,
|
|
49
54
|
EnvVariable,
|
|
50
55
|
HttpHeader,
|
|
51
56
|
HttpMcpServer,
|
|
52
57
|
ImageContentBlock,
|
|
58
|
+
KillTerminalResponse,
|
|
53
59
|
McpServerStdio,
|
|
60
|
+
PermissionOption,
|
|
54
61
|
PromptResponse,
|
|
62
|
+
ReadTextFileResponse,
|
|
63
|
+
ReleaseTerminalResponse,
|
|
55
64
|
RequestPermissionResponse,
|
|
56
65
|
SseMcpServer,
|
|
66
|
+
TerminalOutputResponse,
|
|
57
67
|
TextContentBlock,
|
|
58
68
|
ToolCallProgress,
|
|
59
69
|
ToolCallStart,
|
|
70
|
+
ToolCallUpdate,
|
|
60
71
|
UsageUpdate,
|
|
72
|
+
WaitForTerminalExitResponse,
|
|
73
|
+
WriteTextFileResponse,
|
|
61
74
|
)
|
|
62
75
|
from acp.transports import default_environment
|
|
63
76
|
from pydantic import (
|
|
@@ -617,14 +630,23 @@ async def _apply_acp_model(
|
|
|
617
630
|
Codex, callers may still pass a combined Canvas id such as ``gpt-5.5/high``;
|
|
618
631
|
codex-acp exposes reasoning effort as a separate config option, so split it
|
|
619
632
|
only on the config-options mechanism.
|
|
633
|
+
|
|
634
|
+
agent-client-protocol 0.12.1 dropped the UNSTABLE ``models`` extension from
|
|
635
|
+
the ACP schema and removed ``ClientSideConnection.set_session_model``. A live
|
|
636
|
+
0.12 connection therefore has no legacy RPC to call, so the ``else`` branch
|
|
637
|
+
only invokes it when the connection actually exposes the method (test
|
|
638
|
+
doubles do; real 0.12 connections do not) and otherwise no-ops rather than
|
|
639
|
+
raising ``AttributeError``.
|
|
620
640
|
"""
|
|
621
641
|
if via_config_option:
|
|
622
642
|
for config_id, value in _model_config_options(agent_name, model):
|
|
623
643
|
await conn.set_config_option(
|
|
624
644
|
config_id=config_id, value=value, session_id=session_id
|
|
625
645
|
)
|
|
626
|
-
|
|
627
|
-
await conn.set_session_model(
|
|
646
|
+
elif hasattr(conn, "set_session_model"):
|
|
647
|
+
await conn.set_session_model( # type: ignore[attr-defined]
|
|
648
|
+
model_id=model, session_id=session_id
|
|
649
|
+
)
|
|
628
650
|
|
|
629
651
|
|
|
630
652
|
def _usable_models(infos: Iterable[ACPModelInfo]) -> list[ACPModelInfo]:
|
|
@@ -689,7 +711,7 @@ def _extract_session_models(
|
|
|
689
711
|
|
|
690
712
|
|
|
691
713
|
# The ACP MCP server union accepted by new_session() / load_session().
|
|
692
|
-
_ACPMcpServer = HttpMcpServer | SseMcpServer | McpServerStdio
|
|
714
|
+
_ACPMcpServer = HttpMcpServer | SseMcpServer | McpServerStdio | AcpMcpServer
|
|
693
715
|
|
|
694
716
|
|
|
695
717
|
def _remote_mcp_headers(server: MCPServer, name: str) -> list[HttpHeader]:
|
|
@@ -1579,11 +1601,11 @@ class _OpenHandsACPBridge:
|
|
|
1579
1601
|
|
|
1580
1602
|
async def request_permission(
|
|
1581
1603
|
self,
|
|
1582
|
-
options: list[Any],
|
|
1583
1604
|
session_id: str, # noqa: ARG002
|
|
1584
|
-
tool_call:
|
|
1605
|
+
tool_call: ToolCallUpdate,
|
|
1606
|
+
options: list[PermissionOption],
|
|
1585
1607
|
**kwargs: Any, # noqa: ARG002
|
|
1586
|
-
) ->
|
|
1608
|
+
) -> RequestPermissionResponse:
|
|
1587
1609
|
"""Auto-approve all permission requests from the ACP server."""
|
|
1588
1610
|
# Pick the first option (usually "allow once")
|
|
1589
1611
|
option_id = options[0].option_id if options else "allow_once"
|
|
@@ -1596,52 +1618,74 @@ class _OpenHandsACPBridge:
|
|
|
1596
1618
|
outcome=AllowedOutcome(outcome="selected", option_id=option_id),
|
|
1597
1619
|
)
|
|
1598
1620
|
|
|
1621
|
+
async def create_elicitation(
|
|
1622
|
+
self,
|
|
1623
|
+
message: str, # noqa: ARG002
|
|
1624
|
+
mode: ElicitationMode, # noqa: ARG002
|
|
1625
|
+
**kwargs: Any, # noqa: ARG002
|
|
1626
|
+
) -> CreateElicitationResponse:
|
|
1627
|
+
"""Decline elicitation requests; the headless bridge has no user to ask.
|
|
1628
|
+
|
|
1629
|
+
Added to the ``Client`` protocol in agent-client-protocol 0.12.x. None
|
|
1630
|
+
of the pinned ACP providers elicit during a headless turn, so this is a
|
|
1631
|
+
defensive default rather than an exercised code path.
|
|
1632
|
+
"""
|
|
1633
|
+
return DeclineElicitationResponse(action="decline")
|
|
1634
|
+
|
|
1635
|
+
async def complete_elicitation(
|
|
1636
|
+
self,
|
|
1637
|
+
elicitation_id: str, # noqa: ARG002
|
|
1638
|
+
**kwargs: Any, # noqa: ARG002
|
|
1639
|
+
) -> None:
|
|
1640
|
+
"""No-op completion for an elicitation the bridge always declines."""
|
|
1641
|
+
return None
|
|
1642
|
+
|
|
1599
1643
|
# fs/terminal methods — raise NotImplementedError; ACP server handles its own
|
|
1600
1644
|
async def write_text_file(
|
|
1601
|
-
self,
|
|
1602
|
-
) -> None:
|
|
1645
|
+
self, session_id: str, path: str, content: str, **kwargs: Any
|
|
1646
|
+
) -> WriteTextFileResponse | None:
|
|
1603
1647
|
raise NotImplementedError("ACP server handles file operations")
|
|
1604
1648
|
|
|
1605
1649
|
async def read_text_file(
|
|
1606
1650
|
self,
|
|
1607
|
-
path: str,
|
|
1608
1651
|
session_id: str,
|
|
1609
|
-
|
|
1652
|
+
path: str,
|
|
1610
1653
|
line: int | None = None,
|
|
1654
|
+
limit: int | None = None,
|
|
1611
1655
|
**kwargs: Any,
|
|
1612
|
-
) ->
|
|
1656
|
+
) -> ReadTextFileResponse:
|
|
1613
1657
|
raise NotImplementedError("ACP server handles file operations")
|
|
1614
1658
|
|
|
1615
1659
|
async def create_terminal(
|
|
1616
1660
|
self,
|
|
1617
|
-
command: str,
|
|
1618
1661
|
session_id: str,
|
|
1662
|
+
command: str,
|
|
1619
1663
|
args: list[str] | None = None,
|
|
1664
|
+
env: list[EnvVariable] | None = None,
|
|
1620
1665
|
cwd: str | None = None,
|
|
1621
|
-
env: Any = None,
|
|
1622
1666
|
output_byte_limit: int | None = None,
|
|
1623
1667
|
**kwargs: Any,
|
|
1624
|
-
) ->
|
|
1668
|
+
) -> CreateTerminalResponse:
|
|
1625
1669
|
raise NotImplementedError("ACP server handles terminal operations")
|
|
1626
1670
|
|
|
1627
1671
|
async def terminal_output(
|
|
1628
1672
|
self, session_id: str, terminal_id: str, **kwargs: Any
|
|
1629
|
-
) ->
|
|
1673
|
+
) -> TerminalOutputResponse:
|
|
1630
1674
|
raise NotImplementedError("ACP server handles terminal operations")
|
|
1631
1675
|
|
|
1632
1676
|
async def release_terminal(
|
|
1633
1677
|
self, session_id: str, terminal_id: str, **kwargs: Any
|
|
1634
|
-
) -> None:
|
|
1678
|
+
) -> ReleaseTerminalResponse | None:
|
|
1635
1679
|
raise NotImplementedError("ACP server handles terminal operations")
|
|
1636
1680
|
|
|
1637
1681
|
async def wait_for_terminal_exit(
|
|
1638
1682
|
self, session_id: str, terminal_id: str, **kwargs: Any
|
|
1639
|
-
) ->
|
|
1683
|
+
) -> WaitForTerminalExitResponse:
|
|
1640
1684
|
raise NotImplementedError("ACP server handles terminal operations")
|
|
1641
1685
|
|
|
1642
1686
|
async def kill_terminal(
|
|
1643
1687
|
self, session_id: str, terminal_id: str, **kwargs: Any
|
|
1644
|
-
) -> None:
|
|
1688
|
+
) -> KillTerminalResponse | None:
|
|
1645
1689
|
raise NotImplementedError("ACP server handles terminal operations")
|
|
1646
1690
|
|
|
1647
1691
|
async def ext_method(
|
|
@@ -260,6 +260,14 @@ class AgentContext(BaseModel):
|
|
|
260
260
|
@model_validator(mode="after")
|
|
261
261
|
def _load_auto_skills(self):
|
|
262
262
|
"""Load user/legacy-public skills if enabled, then apply ``disabled_skills``."""
|
|
263
|
+
return self.resolve_auto_skills()
|
|
264
|
+
|
|
265
|
+
def resolve_auto_skills(self) -> AgentContext:
|
|
266
|
+
"""Resolve ``load_*_skills`` into ``skills`` and apply ``disabled_skills``.
|
|
267
|
+
|
|
268
|
+
Exposed because ``model_copy`` skips validators: callers that rebuild a
|
|
269
|
+
context that way must re-run this or the deny-list silently won't apply.
|
|
270
|
+
"""
|
|
263
271
|
include_public = self.load_public_skills
|
|
264
272
|
if self.load_user_skills or include_public:
|
|
265
273
|
auto_skills = load_available_skills(
|
|
@@ -1129,8 +1129,11 @@ class LLM(BaseModel, RetryMixin, NonNativeToolCallingMixin):
|
|
|
1129
1129
|
):
|
|
1130
1130
|
delta = event.delta
|
|
1131
1131
|
if delta:
|
|
1132
|
+
# ModelResponseStream mints a fresh id per instance, and a
|
|
1133
|
+
# changed chunk id reads as a retry (StreamContext._emit_delta).
|
|
1132
1134
|
delta_chunk = ModelResponseStream(
|
|
1133
|
-
|
|
1135
|
+
id=event.item_id,
|
|
1136
|
+
choices=[StreamingChoices(delta=Delta(content=delta))],
|
|
1134
1137
|
)
|
|
1135
1138
|
|
|
1136
1139
|
return output_item, delta_chunk
|
|
@@ -221,6 +221,7 @@ SEND_REASONING_CONTENT_MODELS: list[str] = [
|
|
|
221
221
|
"deepseek/deepseek-reasoner",
|
|
222
222
|
"deepseek/deepseek-v4-pro", # Dual-mode (Thinking/Non-Thinking)
|
|
223
223
|
"deepseek/deepseek-v4-flash", # Dual-mode (Thinking/Non-Thinking)
|
|
224
|
+
"deepseek/deepseek-v4.1-flash", # Dual-mode (Thinking/Non-Thinking)
|
|
224
225
|
]
|
|
225
226
|
|
|
226
227
|
# Match token -> canonical LiteLLM ID for vision metadata overrides.
|
|
@@ -53,6 +53,7 @@ VERIFIED_DEEPSEEK_MODELS = [
|
|
|
53
53
|
"deepseek-v4-pro",
|
|
54
54
|
"deepseek-v4-flash",
|
|
55
55
|
"deepseek-v4-flash-vision-exp",
|
|
56
|
+
"deepseek-v4.1-flash",
|
|
56
57
|
"deepseek-v3.2-reasoner",
|
|
57
58
|
]
|
|
58
59
|
|
|
@@ -81,6 +82,7 @@ VERIFIED_GLM_MODELS = [
|
|
|
81
82
|
VERIFIED_NVIDIA_MODELS = [
|
|
82
83
|
"nemotron-3.5-lightning-30b-a3b",
|
|
83
84
|
"nemotron-3-nano",
|
|
85
|
+
"nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
84
86
|
"nemotron-3-super-120b-a12b",
|
|
85
87
|
"nemotron-3-ultra-550b-a55b",
|
|
86
88
|
]
|
|
@@ -123,6 +125,7 @@ VERIFIED_OPENHANDS_MODELS = [
|
|
|
123
125
|
"deepseek-v4-pro",
|
|
124
126
|
"deepseek-v4-flash",
|
|
125
127
|
"deepseek-v4-flash-vision-exp",
|
|
128
|
+
"deepseek-v4.1-flash",
|
|
126
129
|
"deepseek-v3.2-reasoner",
|
|
127
130
|
"kimi-k3",
|
|
128
131
|
"kimi-k2.7-code",
|
|
@@ -4,16 +4,22 @@ This module provides classes and types for managing secrets in OpenHands.
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from openhands.sdk.secret.secrets import (
|
|
7
|
+
LocalSecretResolver,
|
|
7
8
|
LookupSecret,
|
|
8
9
|
SecretSource,
|
|
9
10
|
SecretValue,
|
|
10
11
|
StaticSecret,
|
|
12
|
+
register_local_secret_resolver,
|
|
13
|
+
unregister_local_secret_resolver,
|
|
11
14
|
)
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
__all__ = [
|
|
18
|
+
"LocalSecretResolver",
|
|
15
19
|
"SecretSource",
|
|
16
20
|
"StaticSecret",
|
|
17
21
|
"LookupSecret",
|
|
18
22
|
"SecretValue",
|
|
23
|
+
"register_local_secret_resolver",
|
|
24
|
+
"unregister_local_secret_resolver",
|
|
19
25
|
]
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
from abc import ABC, abstractmethod
|
|
5
|
+
from collections.abc import Callable
|
|
5
6
|
from urllib.parse import urljoin, urlsplit
|
|
6
7
|
|
|
7
8
|
import httpx
|
|
@@ -32,6 +33,50 @@ def _resolve_lookup_secret_url(url: str) -> str:
|
|
|
32
33
|
return urljoin(f"{base_url.rstrip('/')}/", url)
|
|
33
34
|
|
|
34
35
|
|
|
36
|
+
LocalSecretResolver = Callable[[str], str | None]
|
|
37
|
+
|
|
38
|
+
_local_secret_resolvers: list[LocalSecretResolver] = []
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def register_local_secret_resolver(resolver: LocalSecretResolver) -> None:
|
|
42
|
+
"""Register an in-process resolver for ``LookupSecret`` URLs.
|
|
43
|
+
|
|
44
|
+
A process that both serves and consumes ``LookupSecret`` URLs — an
|
|
45
|
+
agent-server running an in-process conversation, say — cannot fetch them
|
|
46
|
+
over HTTP from its own event loop: the request can only be answered by the
|
|
47
|
+
loop that is blocked waiting for it, so it stalls until the client times
|
|
48
|
+
out. Registering a resolver lets such a process answer its own URLs
|
|
49
|
+
directly and skip the round trip.
|
|
50
|
+
|
|
51
|
+
The resolver receives the fully-resolved URL and returns the secret value,
|
|
52
|
+
or ``None`` when it does not serve that URL, in which case resolution falls
|
|
53
|
+
through to the next resolver and finally to HTTP.
|
|
54
|
+
"""
|
|
55
|
+
if resolver not in _local_secret_resolvers:
|
|
56
|
+
_local_secret_resolvers.append(resolver)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def unregister_local_secret_resolver(resolver: LocalSecretResolver) -> None:
|
|
60
|
+
"""Remove a resolver registered with ``register_local_secret_resolver``."""
|
|
61
|
+
if resolver in _local_secret_resolvers:
|
|
62
|
+
_local_secret_resolvers.remove(resolver)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _resolve_secret_locally(url: str) -> str | None:
|
|
66
|
+
"""Return a locally-served value for ``url``, or ``None`` if there is none."""
|
|
67
|
+
for resolver in list(_local_secret_resolvers):
|
|
68
|
+
try:
|
|
69
|
+
value = resolver(url)
|
|
70
|
+
except Exception:
|
|
71
|
+
logger.warning(
|
|
72
|
+
"Local secret resolver raised; falling back to HTTP", exc_info=True
|
|
73
|
+
)
|
|
74
|
+
continue
|
|
75
|
+
if value is not None:
|
|
76
|
+
return value
|
|
77
|
+
return None
|
|
78
|
+
|
|
79
|
+
|
|
35
80
|
class SecretSource(DiscriminatedUnionMixin, ABC):
|
|
36
81
|
"""Source for a named secret which may be obtained dynamically"""
|
|
37
82
|
|
|
@@ -77,6 +122,9 @@ class LookupSecret(SecretSource):
|
|
|
77
122
|
return _resolve_lookup_secret_url(url)
|
|
78
123
|
|
|
79
124
|
def get_value(self) -> str:
|
|
125
|
+
local_value = _resolve_secret_locally(self.url)
|
|
126
|
+
if local_value is not None:
|
|
127
|
+
return local_value
|
|
80
128
|
response = httpx.get(self.url, headers=self.headers, timeout=30.0)
|
|
81
129
|
response.raise_for_status()
|
|
82
130
|
return response.text
|
|
@@ -886,6 +886,7 @@ class RemoteWorkspace(RemoteWorkspaceMixin, BaseWorkspace):
|
|
|
886
886
|
load_project: bool = True,
|
|
887
887
|
load_org: bool = True,
|
|
888
888
|
timeout: float = 60.0,
|
|
889
|
+
base_context: "AgentContext | None" = None,
|
|
889
890
|
) -> tuple[list["Skill"], "AgentContext"]:
|
|
890
891
|
"""Load skills via the agent-server's /api/skills endpoint.
|
|
891
892
|
|
|
@@ -906,6 +907,11 @@ class RemoteWorkspace(RemoteWorkspaceMixin, BaseWorkspace):
|
|
|
906
907
|
load_project: Load project skills from workspace directories.
|
|
907
908
|
load_org: Load organization-level skills.
|
|
908
909
|
timeout: Request timeout in seconds.
|
|
910
|
+
base_context: Existing AgentContext to preserve. All of its
|
|
911
|
+
fields survive except `skills` and `load_public_skills`,
|
|
912
|
+
which this method always sets based on whether skills
|
|
913
|
+
were found. Defaults to None, which starts from a fresh
|
|
914
|
+
AgentContext — today's behavior.
|
|
909
915
|
|
|
910
916
|
Returns:
|
|
911
917
|
Tuple of (list of Skill objects, AgentContext).
|
|
@@ -958,11 +964,20 @@ class RemoteWorkspace(RemoteWorkspaceMixin, BaseWorkspace):
|
|
|
958
964
|
if loaded_skills:
|
|
959
965
|
logger.debug(f"Skills: {[s.name for s in loaded_skills]}")
|
|
960
966
|
|
|
961
|
-
#
|
|
967
|
+
# Update `base_context` (or start fresh if none given) with the
|
|
968
|
+
# newly loaded skills — every other field the caller configured is
|
|
969
|
+
# preserved. Fall back to public skills if none loaded.
|
|
970
|
+
base = base_context if base_context is not None else AgentContext()
|
|
962
971
|
if loaded_skills:
|
|
963
|
-
agent_context =
|
|
972
|
+
agent_context = base.model_copy(
|
|
973
|
+
update={"skills": loaded_skills, "load_public_skills": False}
|
|
974
|
+
)
|
|
964
975
|
else:
|
|
965
976
|
logger.warning("No skills loaded, falling back to public skills")
|
|
966
|
-
agent_context =
|
|
977
|
+
agent_context = base.model_copy(
|
|
978
|
+
update={"skills": [], "load_public_skills": True}
|
|
979
|
+
)
|
|
967
980
|
|
|
968
|
-
|
|
981
|
+
# ``model_copy`` skips validators, so re-run the resolution that
|
|
982
|
+
# applies ``load_*_skills`` and the ``disabled_skills`` deny-list.
|
|
983
|
+
return loaded_skills, agent_context.resolve_auto_skills()
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openhands-sdk
|
|
3
|
-
Version: 1.49.
|
|
3
|
+
Version: 1.49.4
|
|
4
4
|
Summary: OpenHands SDK - Core functionality for building AI agents
|
|
5
5
|
Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
|
|
6
6
|
Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
|
|
7
7
|
Project-URL: Documentation, https://docs.openhands.dev/sdk
|
|
8
8
|
Project-URL: Bug Tracker, https://github.com/OpenHands/software-agent-sdk/issues
|
|
9
9
|
Requires-Python: >=3.12
|
|
10
|
-
Requires-Dist: agent-client-protocol<0.
|
|
10
|
+
Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
|
|
11
11
|
Requires-Dist: deprecation>=2.1.0
|
|
12
12
|
Requires-Dist: fakeredis[lua]>=2.32.1
|
|
13
13
|
Requires-Dist: fastmcp<4,>=3.2.0
|
|
14
14
|
Requires-Dist: filelock>=3.20.1
|
|
15
15
|
Requires-Dist: httpx[socks]>=0.27.0
|
|
16
16
|
Requires-Dist: jsonschema>=4.23.0
|
|
17
|
-
Requires-Dist: joserfc>=1.
|
|
17
|
+
Requires-Dist: joserfc>=1.7.5
|
|
18
18
|
Requires-Dist: litellm>=1.93.0
|
|
19
19
|
Requires-Dist: pillow>=12.3.0
|
|
20
20
|
Requires-Dist: pydantic>=2.12.5
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
agent-client-protocol<0.
|
|
1
|
+
agent-client-protocol<0.13.0,>=0.12.1
|
|
2
2
|
deprecation>=2.1.0
|
|
3
3
|
fakeredis[lua]>=2.32.1
|
|
4
4
|
fastmcp<4,>=3.2.0
|
|
5
5
|
filelock>=3.20.1
|
|
6
6
|
httpx[socks]>=0.27.0
|
|
7
7
|
jsonschema>=4.23.0
|
|
8
|
-
joserfc>=1.
|
|
8
|
+
joserfc>=1.7.5
|
|
9
9
|
litellm>=1.93.0
|
|
10
10
|
pillow>=12.3.0
|
|
11
11
|
pydantic>=2.12.5
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "openhands-sdk"
|
|
3
|
-
version = "1.49.
|
|
3
|
+
version = "1.49.4"
|
|
4
4
|
description = "OpenHands SDK - Core functionality for building AI agents"
|
|
5
5
|
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
dependencies = [
|
|
8
|
-
"agent-client-protocol>=0.
|
|
8
|
+
"agent-client-protocol>=0.12.1,<0.13.0", # 0.11.0 reordered prompt() args, broke the client (#4830)
|
|
9
9
|
"deprecation>=2.1.0",
|
|
10
10
|
"fakeredis[lua]>=2.32.1", # Explicit dependency for docket/fastmcp background tasks
|
|
11
11
|
# 3.2.0 reads back the stored absolute OAuth token expiry; 4.x requires
|
|
@@ -14,7 +14,7 @@ dependencies = [
|
|
|
14
14
|
"filelock>=3.20.1",
|
|
15
15
|
"httpx[socks]>=0.27.0",
|
|
16
16
|
"jsonschema>=4.23.0",
|
|
17
|
-
"joserfc>=1.
|
|
17
|
+
"joserfc>=1.7.5",
|
|
18
18
|
"litellm>=1.93.0",
|
|
19
19
|
"pillow>=12.3.0",
|
|
20
20
|
"pydantic>=2.12.5",
|
|
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.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/no_op_condenser.py
RENAMED
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/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
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/__init__.py
RENAMED
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/dynamic.py
RENAMED
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/planning.py
RENAMED
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/static.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/manipulation_indices.py
RENAMED
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/__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
|
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/conversation_stats.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/events_list_base.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.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/local_conversation.py
RENAMED
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/remote_conversation.py
RENAMED
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/persistence_const.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/resource_lock_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/visualizer/__init__.py
RENAMED
|
File without changes
|