openhands-sdk 1.58.0__tar.gz → 1.58.2__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.58.0 → openhands_sdk-1.58.2}/PKG-INFO +2 -1
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_agent.py +51 -5
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/call_context.py +14 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/chat_options.py +2 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/common.py +12 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/responses_options.py +2 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/PKG-INFO +2 -1
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/requires.txt +1 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/pyproject.toml +2 -1
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_contracts.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_file_credentials.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_model_discovery.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_models.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_tracing.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/agent.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/critic_mixin.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/parallel_executor.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/response_dispatch.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/stream_context.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/automation/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/banner.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/agent_context.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/prompts/summarizing_events.j2 +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/prompts/summarizing_system.j2 +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/memory.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/presets.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/prompt.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/registry.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/section.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/dynamic.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/planning.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/static.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/manipulation_indices.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/batch_atomicity.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/observation_uniqueness.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/tool_call_matching.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/tool_loop_atomicity.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/view.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/cancellation.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/conversation.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/conversation_stats.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/event_store.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/events_list_base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/exceptions.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/fifo_lock.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/controller.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/judge.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/prompts.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/runner.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/local_conversation.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/remote_conversation.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/message_request.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/persistence_const.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/request.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/resource_lock_manager.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/response_utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/secret_registry.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/state.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/stuck_detector.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/title_utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/types.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/visualizer/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/visualizer/default.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/credential.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/agent_finished.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/chat_template.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/client.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/critic.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/taxonomy.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/empty_patch.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/pass_critic.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/result.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/acp_tool_call.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/condenser.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/conversation_error.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/conversation_state.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/error_classification.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/hook_execution.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_completion_log.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/action.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/message.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/observation.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/reasoning_utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/system.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/resume_transcript.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/security.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/streaming_delta.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/token.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/types.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/user_action.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/fetch.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/info.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/interface.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/manager.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/metadata.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/cached_repo.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/exceptions.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/git_changes.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/git_commits.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/git_diff.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/models.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/config.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/conversation_hooks.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/executor.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/manager.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/types.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/cache.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/local.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/memory.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/errors.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/finalize.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/preview.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/resolve.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/_message_normalization.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/_response_stream.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/_tokenizer.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/auth/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/auth/credentials.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/auth/openai.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/cleanup_profile.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/classifier.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/mapping.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/types.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/fallback_strategy.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm_profile_store.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm_registry.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm_response.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/message.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/meta_profile_store.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/mixins/fn_call_examples.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/provider_connection_store.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/impl/random.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/streaming.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/image_inline.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/image_resize.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/litellm_provider.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/metrics.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/model_features.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/model_info.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/model_prompt_spec.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/openhands_provider.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/providers/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/providers/openrouter.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/responses_serialization.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/runtime_metadata.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/telemetry.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/unverified_models.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/verified_models.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/vertex_preflight.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/_rich_handler.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/logger.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/rolling.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/registration.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/registry.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/types.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/client.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/config.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/definition.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/exceptions.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/oauth.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/tool.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/observability/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/observability/laminar.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/observability/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/discovery.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/fetch.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/agent_plugins.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/agent_plugins_mcp.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/claude_code.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/schemas/mcp-1.0.0.schema.json +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/schemas/plugin-1.0.0.schema.json +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/installed.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/loader.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/paths.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/plugin.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/source.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/strict_fetch.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/types.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/agent_profile.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/agent_profile_store.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/profile_refs.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/resolver.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/seed.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/py.typed +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/secret/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/secret/secrets.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/_shell_ast.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/analyzer.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/confirmation_policy.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/pattern.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/policy_rails.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/shell_semantics.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/ensemble.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/grayswan/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/grayswan/analyzer.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/grayswan/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/llm_analyzer.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/risk.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/shell_parser.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/toolshield_helpers.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/toolshield_llm_analyzer.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/acp_install_catalog.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/acp_providers.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/api_models.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/metadata.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/model.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/exceptions.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/execute.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/fetch.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/installed.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/skill.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/trigger.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/types.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/load.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/registry.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/schema.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/scope.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/testing/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/testing/test_llm.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/classify_and_switch_llm.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/finish.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/invoke_skill.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/switch_llm.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/think.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/vision_inspect.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/client_tool.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/defaults.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/registry.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/schema.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/spec.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/tool.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/async_executor.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/async_utils.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/cipher.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/command.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/datetime.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/deprecation.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/files.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/github.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/json.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/masking.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/models.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/paging.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/path.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/pydantic_secrets.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/redact.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/truncate.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/visualize.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/local.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/models.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/__init__.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/base.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/repo.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/workspace.py +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/SOURCES.txt +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/dependency_links.txt +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/top_level.txt +0 -0
- {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openhands-sdk
|
|
3
|
-
Version: 1.58.
|
|
3
|
+
Version: 1.58.2
|
|
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
|
|
@@ -8,6 +8,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
10
|
Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
|
|
11
|
+
Requires-Dist: certifi>=2026.10.19
|
|
11
12
|
Requires-Dist: deprecation>=2.1.0
|
|
12
13
|
Requires-Dist: fakeredis[lua]>=2.32.1
|
|
13
14
|
Requires-Dist: fastmcp<4,>=3.2.0
|
|
@@ -126,7 +126,7 @@ from openhands.sdk.event import (
|
|
|
126
126
|
from openhands.sdk.event.conversation_error import ConversationErrorEvent
|
|
127
127
|
from openhands.sdk.llm import LLM, ImageContent, Message, MessageToolCall, TextContent
|
|
128
128
|
from openhands.sdk.logger import get_logger
|
|
129
|
-
from openhands.sdk.mcp.config import MCPServer
|
|
129
|
+
from openhands.sdk.mcp.config import MCPOAuthAuthCredential, MCPServer
|
|
130
130
|
from openhands.sdk.observability.laminar import maybe_init_laminar, observe
|
|
131
131
|
from openhands.sdk.settings.acp_providers import (
|
|
132
132
|
ACP_PROVIDERS,
|
|
@@ -672,20 +672,65 @@ def _extract_session_models(
|
|
|
672
672
|
_ACPMcpServer = HttpMcpServer | SseMcpServer | McpServerStdio | AcpMcpServer
|
|
673
673
|
|
|
674
674
|
|
|
675
|
+
def _oauth_bearer_header(auth: MCPOAuthAuthCredential, name: str) -> dict[str, str]:
|
|
676
|
+
"""Forward a stored OAuth2 access token as an ``Authorization`` header.
|
|
677
|
+
|
|
678
|
+
The ACP subprocess owns its own MCP transport and has no access to the
|
|
679
|
+
FastMCP token store the native path uses, so the token persisted in the
|
|
680
|
+
connection's ``auth.state`` is the only credential available here. Without
|
|
681
|
+
this the server is forwarded as a bare URL and the ACP agent reports it is
|
|
682
|
+
not logged in (``codex mcp login ...``).
|
|
683
|
+
|
|
684
|
+
A missing or expired token still forwards what exists: a 401 from the
|
|
685
|
+
server is more actionable than an unauthenticated URL. Both cases are
|
|
686
|
+
logged so the drop is not silent.
|
|
687
|
+
"""
|
|
688
|
+
state = auth.state
|
|
689
|
+
token = state.tokens.access_token if state is not None and state.tokens else None
|
|
690
|
+
if token is None:
|
|
691
|
+
logger.warning(
|
|
692
|
+
"ACP MCP server %r has an OAuth2 connection with no stored access "
|
|
693
|
+
"token; forwarding it unauthenticated",
|
|
694
|
+
name,
|
|
695
|
+
)
|
|
696
|
+
return {}
|
|
697
|
+
if (
|
|
698
|
+
state is not None
|
|
699
|
+
and state.token_expires_at is not None
|
|
700
|
+
and state.token_expires_at <= time.time()
|
|
701
|
+
):
|
|
702
|
+
logger.warning(
|
|
703
|
+
"ACP MCP server %r has an expired OAuth2 access token; the ACP path "
|
|
704
|
+
"cannot refresh it, forwarding it as-is",
|
|
705
|
+
name,
|
|
706
|
+
)
|
|
707
|
+
return {"Authorization": f"Bearer {token.get_secret_value()}"}
|
|
708
|
+
|
|
709
|
+
|
|
675
710
|
def _remote_mcp_headers(server: MCPServer, name: str) -> list[HttpHeader]:
|
|
676
|
-
"""Convert remote MCP headers/auth into ACP's header-only representation.
|
|
711
|
+
"""Convert remote MCP headers/auth into ACP's header-only representation.
|
|
712
|
+
|
|
713
|
+
Header-compatible auth (api key / bearer / basic / explicit headers)
|
|
714
|
+
converts directly. OAuth2 does not -- ``to_http_headers()`` returns ``None``
|
|
715
|
+
because the native path materializes tokens through FastMCP's token store --
|
|
716
|
+
so its stored access token is forwarded explicitly instead.
|
|
717
|
+
"""
|
|
677
718
|
headers = [
|
|
678
719
|
HttpHeader(name=name, value=value.get_secret_value())
|
|
679
720
|
for name, value in (server.headers or {}).items()
|
|
680
721
|
]
|
|
681
722
|
|
|
682
|
-
|
|
723
|
+
auth = server.auth
|
|
724
|
+
if isinstance(auth, MCPOAuthAuthCredential):
|
|
725
|
+
auth_headers = _oauth_bearer_header(auth, name)
|
|
726
|
+
else:
|
|
727
|
+
auth_headers = auth.to_http_headers() if auth is not None else {}
|
|
683
728
|
if auth_headers is None:
|
|
684
729
|
logger.warning(
|
|
685
730
|
"ACP MCP server %r uses unsupported remote MCP auth type %r; "
|
|
686
731
|
"only header-compatible auth can be forwarded",
|
|
687
732
|
name,
|
|
688
|
-
type(
|
|
733
|
+
type(auth).__name__,
|
|
689
734
|
)
|
|
690
735
|
return headers
|
|
691
736
|
headers.extend(
|
|
@@ -724,7 +769,8 @@ def _mcp_config_to_acp_servers(
|
|
|
724
769
|
with a warning rather than failing init — one misconfigured server should
|
|
725
770
|
not sink the whole conversation. ``env`` / ``headers`` maps are converted
|
|
726
771
|
to the protocol's ``[{name, value}]`` list form; header-compatible auth
|
|
727
|
-
credentials
|
|
772
|
+
credentials, and the stored access token of an OAuth2 connection, are also
|
|
773
|
+
converted to headers.
|
|
728
774
|
"""
|
|
729
775
|
caps = normalize_mcp_capabilities(mcp_capabilities)
|
|
730
776
|
http_ok = caps.http
|
|
@@ -69,12 +69,19 @@ def apply_llm_call_context(
|
|
|
69
69
|
context: LLMCallContext,
|
|
70
70
|
*,
|
|
71
71
|
supports_prompt_cache_key: bool = False,
|
|
72
|
+
openrouter: bool = False,
|
|
72
73
|
) -> None:
|
|
73
74
|
"""Apply SDK-owned call context to provider request options in one place.
|
|
74
75
|
|
|
75
76
|
``prompt_cache_key`` is only sent to providers that accept it as an OpenAI
|
|
76
77
|
param (OpenAI Responses/Chat). Anthropic and Gemini reject it with a 400
|
|
77
78
|
``UnsupportedParamsError`` when litellm validates non-default params.
|
|
79
|
+
|
|
80
|
+
``openrouter`` selects OpenRouter's own affinity parameter: OpenRouter keys
|
|
81
|
+
sticky routing off ``session_id``, so later turns of a conversation return
|
|
82
|
+
to the endpoint holding the warm prompt cache. Without it OpenRouter derives
|
|
83
|
+
the routing key by hashing the opening messages, which agent conversations
|
|
84
|
+
rewrite as they compact, so affinity is lost mid-run.
|
|
78
85
|
"""
|
|
79
86
|
if context.prompt_cache_key and supports_prompt_cache_key:
|
|
80
87
|
options["prompt_cache_key"] = context.prompt_cache_key
|
|
@@ -84,3 +91,10 @@ def apply_llm_call_context(
|
|
|
84
91
|
**existing,
|
|
85
92
|
"x-litellm-session-id": context.session_id,
|
|
86
93
|
}
|
|
94
|
+
if openrouter:
|
|
95
|
+
# Merge rather than replace: extra_body may already carry caller
|
|
96
|
+
# routing (e.g. provider.only) that must survive. An explicit
|
|
97
|
+
# session_id from the caller wins over the conversation id.
|
|
98
|
+
extra_body = dict(options.get("extra_body") or {})
|
|
99
|
+
extra_body.setdefault("session_id", context.session_id)
|
|
100
|
+
options["extra_body"] = extra_body
|
|
@@ -10,6 +10,7 @@ from openhands.sdk.llm.options.common import (
|
|
|
10
10
|
apply_defaults_if_absent,
|
|
11
11
|
apply_extra_body,
|
|
12
12
|
apply_extra_headers,
|
|
13
|
+
is_openrouter,
|
|
13
14
|
)
|
|
14
15
|
|
|
15
16
|
|
|
@@ -96,6 +97,7 @@ def select_chat_options(
|
|
|
96
97
|
out,
|
|
97
98
|
context,
|
|
98
99
|
supports_prompt_cache_key=model_features.supports_prompt_cache_key,
|
|
100
|
+
openrouter=is_openrouter(llm),
|
|
99
101
|
)
|
|
100
102
|
|
|
101
103
|
return out
|
|
@@ -55,3 +55,15 @@ def apply_extra_body(user_kwargs: dict[str, Any], llm: LLM) -> dict[str, Any]:
|
|
|
55
55
|
if llm.litellm_extra_body:
|
|
56
56
|
out["extra_body"] = llm.litellm_extra_body
|
|
57
57
|
return out
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def is_openrouter(llm: LLM) -> bool:
|
|
61
|
+
"""Return whether this LLM routes through OpenRouter.
|
|
62
|
+
|
|
63
|
+
Matches the ``openrouter/`` model prefix and the ``openrouter.ai`` base URL
|
|
64
|
+
that the OpenRouter runtime-metadata resolver also keys off, so the two
|
|
65
|
+
agree on what counts as OpenRouter.
|
|
66
|
+
"""
|
|
67
|
+
model = llm.model or ""
|
|
68
|
+
base_url = llm.base_url or ""
|
|
69
|
+
return model.startswith("openrouter/") or "openrouter.ai" in base_url
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/responses_options.py
RENAMED
|
@@ -10,6 +10,7 @@ from openhands.sdk.llm.options.common import (
|
|
|
10
10
|
apply_defaults_if_absent,
|
|
11
11
|
apply_extra_body,
|
|
12
12
|
apply_extra_headers,
|
|
13
|
+
is_openrouter,
|
|
13
14
|
)
|
|
14
15
|
|
|
15
16
|
|
|
@@ -90,6 +91,7 @@ def select_responses_options(
|
|
|
90
91
|
out,
|
|
91
92
|
context,
|
|
92
93
|
supports_prompt_cache_key=model_features.supports_prompt_cache_key,
|
|
94
|
+
openrouter=is_openrouter(llm),
|
|
93
95
|
)
|
|
94
96
|
|
|
95
97
|
return out
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openhands-sdk
|
|
3
|
-
Version: 1.58.
|
|
3
|
+
Version: 1.58.2
|
|
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
|
|
@@ -8,6 +8,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
10
|
Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
|
|
11
|
+
Requires-Dist: certifi>=2026.10.19
|
|
11
12
|
Requires-Dist: deprecation>=2.1.0
|
|
12
13
|
Requires-Dist: fakeredis[lua]>=2.32.1
|
|
13
14
|
Requires-Dist: fastmcp<4,>=3.2.0
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "openhands-sdk"
|
|
3
|
-
version = "1.58.
|
|
3
|
+
version = "1.58.2"
|
|
4
4
|
description = "OpenHands SDK - Core functionality for building AI agents"
|
|
5
5
|
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
dependencies = [
|
|
8
8
|
"agent-client-protocol>=0.12.1,<0.13.0", # 0.11.0 reordered prompt() args, broke the client (#4830)
|
|
9
|
+
"certifi>=2026.10.19", # eMudhra CA distrust: GHSA-6q48-6c7w-9gw2
|
|
9
10
|
"deprecation>=2.1.0",
|
|
10
11
|
"fakeredis[lua]>=2.32.1", # Explicit dependency for docket/fastmcp background tasks
|
|
11
12
|
# 3.2.0 reads back the stored absolute OAuth token expiry; 4.x requires
|
|
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.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/no_op_condenser.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/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
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/__init__.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/dynamic.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/planning.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/static.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/manipulation_indices.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/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.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/conversation_stats.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/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.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/local_conversation.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/remote_conversation.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/persistence_const.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/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.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/visualizer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/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
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/chat_template.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.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/message.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/observation.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/reasoning_utils.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
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/interface.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/manager.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/metadata.py
RENAMED
|
File without changes
|
{openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/utils.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
|