openhands-sdk 1.7.2__tar.gz → 1.7.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/PKG-INFO +1 -1
  2. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/agent.py +22 -9
  3. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +10 -0
  4. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/remote_conversation.py +37 -0
  5. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/model_features.py +1 -0
  6. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/registry.py +23 -0
  7. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/PKG-INFO +1 -1
  8. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/pyproject.toml +1 -1
  9. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/__init__.py +0 -0
  10. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/__init__.py +0 -0
  11. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/base.py +0 -0
  12. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/in_context_learning_example.j2 +0 -0
  13. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/in_context_learning_example_suffix.j2 +0 -0
  14. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/anthropic_claude.j2 +0 -0
  15. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/google_gemini.j2 +0 -0
  16. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/openai_gpt/gpt-5-codex.j2 +0 -0
  17. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/model_specific/openai_gpt/gpt-5.j2 +0 -0
  18. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/security_policy.j2 +0 -0
  19. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/security_risk_assessment.j2 +0 -0
  20. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/self_documentation.j2 +0 -0
  21. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt.j2 +0 -0
  22. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_interactive.j2 +0 -0
  23. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_long_horizon.j2 +0 -0
  24. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_planning.j2 +0 -0
  25. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/prompts/system_prompt_tech_philosophy.j2 +0 -0
  26. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/agent/utils.py +0 -0
  27. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/__init__.py +0 -0
  28. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/agent_context.py +0 -0
  29. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/__init__.py +0 -0
  30. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/base.py +0 -0
  31. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
  32. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
  33. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/prompts/summarizing_prompt.j2 +0 -0
  34. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/condenser/utils.py +0 -0
  35. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/__init__.py +0 -0
  36. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/prompt.py +0 -0
  37. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
  38. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
  39. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/prompts/templates/system_message_suffix.j2 +0 -0
  40. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/__init__.py +0 -0
  41. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/exceptions.py +0 -0
  42. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/skill.py +0 -0
  43. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/trigger.py +0 -0
  44. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/skills/types.py +0 -0
  45. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/context/view.py +0 -0
  46. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/__init__.py +0 -0
  47. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/base.py +0 -0
  48. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/conversation.py +0 -0
  49. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/conversation_stats.py +0 -0
  50. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/event_store.py +0 -0
  51. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/events_list_base.py +0 -0
  52. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/exceptions.py +0 -0
  53. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/fifo_lock.py +0 -0
  54. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/__init__.py +0 -0
  55. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/impl/local_conversation.py +0 -0
  56. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/persistence_const.py +0 -0
  57. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/response_utils.py +0 -0
  58. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/secret_registry.py +0 -0
  59. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/serialization_diff.py +0 -0
  60. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/state.py +0 -0
  61. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/stuck_detector.py +0 -0
  62. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/title_utils.py +0 -0
  63. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/types.py +0 -0
  64. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
  65. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/base.py +0 -0
  66. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/conversation/visualizer/default.py +0 -0
  67. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/critic/__init__.py +0 -0
  68. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/critic/base.py +0 -0
  69. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/__init__.py +0 -0
  70. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/agent_finished.py +0 -0
  71. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/empty_patch.py +0 -0
  72. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/critic/impl/pass_critic.py +0 -0
  73. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/__init__.py +0 -0
  74. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/base.py +0 -0
  75. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/condenser.py +0 -0
  76. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/conversation_error.py +0 -0
  77. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/conversation_state.py +0 -0
  78. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_completion_log.py +0 -0
  79. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
  80. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/action.py +0 -0
  81. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/message.py +0 -0
  82. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/observation.py +0 -0
  83. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/llm_convertible/system.py +0 -0
  84. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/token.py +0 -0
  85. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/types.py +0 -0
  86. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/event/user_action.py +0 -0
  87. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/git/exceptions.py +0 -0
  88. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/git/git_changes.py +0 -0
  89. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/git/git_diff.py +0 -0
  90. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/git/models.py +0 -0
  91. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/git/utils.py +0 -0
  92. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/hooks/__init__.py +0 -0
  93. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/hooks/config.py +0 -0
  94. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/hooks/conversation_hooks.py +0 -0
  95. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/hooks/executor.py +0 -0
  96. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/hooks/manager.py +0 -0
  97. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/hooks/types.py +0 -0
  98. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/io/__init__.py +0 -0
  99. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/io/base.py +0 -0
  100. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/io/cache.py +0 -0
  101. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/io/local.py +0 -0
  102. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/io/memory.py +0 -0
  103. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/__init__.py +0 -0
  104. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/__init__.py +0 -0
  105. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/classifier.py +0 -0
  106. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/mapping.py +0 -0
  107. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/exceptions/types.py +0 -0
  108. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/llm.py +0 -0
  109. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/llm_registry.py +0 -0
  110. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/llm_response.py +0 -0
  111. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/message.py +0 -0
  112. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
  113. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
  114. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/__init__.py +0 -0
  115. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/chat_options.py +0 -0
  116. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/common.py +0 -0
  117. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/options/responses_options.py +0 -0
  118. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/__init__.py +0 -0
  119. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/base.py +0 -0
  120. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
  121. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/router/impl/random.py +0 -0
  122. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/streaming.py +0 -0
  123. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/metrics.py +0 -0
  124. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/model_info.py +0 -0
  125. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/model_prompt_spec.py +0 -0
  126. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
  127. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/telemetry.py +0 -0
  128. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/unverified_models.py +0 -0
  129. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/llm/utils/verified_models.py +0 -0
  130. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/logger/__init__.py +0 -0
  131. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/logger/logger.py +0 -0
  132. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/logger/rolling.py +0 -0
  133. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/mcp/__init__.py +0 -0
  134. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/mcp/client.py +0 -0
  135. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/mcp/definition.py +0 -0
  136. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/mcp/exceptions.py +0 -0
  137. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/mcp/tool.py +0 -0
  138. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/mcp/utils.py +0 -0
  139. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/observability/__init__.py +0 -0
  140. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/observability/laminar.py +0 -0
  141. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/observability/utils.py +0 -0
  142. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/py.typed +0 -0
  143. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/secret/__init__.py +0 -0
  144. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/secret/secrets.py +0 -0
  145. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/security/__init__.py +0 -0
  146. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/security/analyzer.py +0 -0
  147. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/security/confirmation_policy.py +0 -0
  148. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/security/llm_analyzer.py +0 -0
  149. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/security/risk.py +0 -0
  150. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/__init__.py +0 -0
  151. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/builtins/__init__.py +0 -0
  152. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/builtins/finish.py +0 -0
  153. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/builtins/think.py +0 -0
  154. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/schema.py +0 -0
  155. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/spec.py +0 -0
  156. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/tool/tool.py +0 -0
  157. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/__init__.py +0 -0
  158. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/async_executor.py +0 -0
  159. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/async_utils.py +0 -0
  160. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/cipher.py +0 -0
  161. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/command.py +0 -0
  162. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/deprecation.py +0 -0
  163. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/github.py +0 -0
  164. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/json.py +0 -0
  165. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/models.py +0 -0
  166. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/paging.py +0 -0
  167. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/pydantic_diff.py +0 -0
  168. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/pydantic_secrets.py +0 -0
  169. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/truncate.py +0 -0
  170. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/utils/visualize.py +0 -0
  171. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/__init__.py +0 -0
  172. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/base.py +0 -0
  173. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/local.py +0 -0
  174. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/models.py +0 -0
  175. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/__init__.py +0 -0
  176. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
  177. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/base.py +0 -0
  178. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
  179. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands/sdk/workspace/workspace.py +0 -0
  180. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/SOURCES.txt +0 -0
  181. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/dependency_links.txt +0 -0
  182. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/requires.txt +0 -0
  183. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/openhands_sdk.egg-info/top_level.txt +0 -0
  184. {openhands_sdk-1.7.2 → openhands_sdk-1.7.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.7.2
3
+ Version: 1.7.3
4
4
  Summary: OpenHands SDK - Core functionality for building AI agents
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: deprecation>=2.1.0
@@ -502,16 +502,29 @@ class Agent(AgentBase):
502
502
  )
503
503
 
504
504
  # Execute actions!
505
- if should_enable_observability():
506
- tool_name = extract_action_name(action_event)
507
- observation: Observation = observe(name=tool_name, span_type="TOOL")(tool)(
508
- action_event.action, conversation
505
+ try:
506
+ if should_enable_observability():
507
+ tool_name = extract_action_name(action_event)
508
+ observation: Observation = observe(name=tool_name, span_type="TOOL")(
509
+ tool
510
+ )(action_event.action, conversation)
511
+ else:
512
+ observation = tool(action_event.action, conversation)
513
+ assert isinstance(observation, Observation), (
514
+ f"Tool '{tool.name}' executor must return an Observation"
509
515
  )
510
- else:
511
- observation = tool(action_event.action, conversation)
512
- assert isinstance(observation, Observation), (
513
- f"Tool '{tool.name}' executor must return an Observation"
514
- )
516
+ except ValueError as e:
517
+ # Tool execution raised a ValueError (e.g., invalid argument combination)
518
+ # Convert to AgentErrorEvent so the agent can correct itself
519
+ err = f"Error executing tool '{tool.name}': {e}"
520
+ logger.warning(err)
521
+ error_event = AgentErrorEvent(
522
+ error=err,
523
+ tool_name=tool.name,
524
+ tool_call_id=action_event.tool_call.id,
525
+ )
526
+ on_event(error_event)
527
+ return error_event
515
528
 
516
529
  obs_event = ObservationEvent(
517
530
  observation=observation,
@@ -120,7 +120,17 @@ class LLMSummarizingCondenser(RollingCondenser):
120
120
 
121
121
  Returns:
122
122
  Condensation: The generated condensation object.
123
+
124
+ Raises:
125
+ ValueError: If forgotten_events is empty (0 events to condense).
123
126
  """
127
+ if len(forgotten_events) == 0:
128
+ raise ValueError(
129
+ "Cannot condense 0 events. This typically occurs when a tool loop "
130
+ "spans almost the entire view, leaving no valid range for forgetting "
131
+ "events. Consider adjusting keep_first or max_size parameters."
132
+ )
133
+
124
134
  # Convert events to strings for the template
125
135
  event_strings = [str(forgotten_event) for forgotten_event in forgotten_events]
126
136
 
@@ -28,6 +28,7 @@ from openhands.sdk.conversation.visualizer import (
28
28
  DefaultConversationVisualizer,
29
29
  )
30
30
  from openhands.sdk.event.base import Event
31
+ from openhands.sdk.event.conversation_error import ConversationErrorEvent
31
32
  from openhands.sdk.event.conversation_state import (
32
33
  FULL_STATE_KEY,
33
34
  ConversationStateUpdateEvent,
@@ -489,6 +490,11 @@ class RemoteConversation(BaseConversation):
489
490
  self._cleanup_initiated = False
490
491
 
491
492
  if conversation_id is None:
493
+ # Import here to avoid circular imports
494
+ from openhands.sdk.tool.registry import get_tool_module_qualnames
495
+
496
+ tool_qualnames = get_tool_module_qualnames()
497
+ logger.debug(f"Sending tool_module_qualnames to server: {tool_qualnames}")
492
498
  payload = {
493
499
  "agent": agent.model_dump(
494
500
  mode="json", context={"expose_secrets": True}
@@ -500,6 +506,8 @@ class RemoteConversation(BaseConversation):
500
506
  "workspace": LocalWorkspace(
501
507
  working_dir=self.workspace.working_dir
502
508
  ).model_dump(),
509
+ # Include tool module qualnames for dynamic registration on server
510
+ "tool_module_qualnames": tool_qualnames,
503
511
  }
504
512
  if stuck_detection_thresholds is not None:
505
513
  # Convert to StuckDetectionThresholds if dict, then serialize
@@ -759,6 +767,19 @@ class RemoteConversation(BaseConversation):
759
767
  status = info.get("execution_status")
760
768
 
761
769
  if status != ConversationExecutionStatus.RUNNING.value:
770
+ if status == ConversationExecutionStatus.ERROR.value:
771
+ detail = self._get_last_error_detail()
772
+ raise ConversationRunError(
773
+ self._id,
774
+ RuntimeError(
775
+ detail or "Remote conversation ended with error"
776
+ ),
777
+ )
778
+ if status == ConversationExecutionStatus.STUCK.value:
779
+ raise ConversationRunError(
780
+ self._id,
781
+ RuntimeError("Remote conversation got stuck"),
782
+ )
762
783
  logger.info(
763
784
  f"Run completed with status: {status} (elapsed: {elapsed:.1f}s)"
764
785
  )
@@ -771,6 +792,22 @@ class RemoteConversation(BaseConversation):
771
792
 
772
793
  time.sleep(poll_interval)
773
794
 
795
+ def _get_last_error_detail(self) -> str | None:
796
+ """Return the most recent ConversationErrorEvent detail, if available."""
797
+ try:
798
+ events = self._state.events
799
+ for idx in range(len(events) - 1, -1, -1):
800
+ event = events[idx]
801
+ if isinstance(event, ConversationErrorEvent):
802
+ detail = event.detail.strip()
803
+ code = event.code.strip()
804
+ if detail and code:
805
+ return f"{code}: {detail}"
806
+ return detail or code or None
807
+ except Exception as exc:
808
+ logger.debug("Failed to read conversation error detail: %s", exc)
809
+ return None
810
+
774
811
  def set_confirmation_policy(self, policy: ConfirmationPolicyBase) -> None:
775
812
  payload = {"policy": policy.model_dump()}
776
813
  _send_request(
@@ -152,6 +152,7 @@ FORCE_STRING_SERIALIZER_MODELS: list[str] = [
152
152
  # in the message input
153
153
  SEND_REASONING_CONTENT_MODELS: list[str] = [
154
154
  "kimi-k2-thinking",
155
+ "openrouter/minimax-m2", # MiniMax-M2 via OpenRouter (interleaved thinking)
155
156
  "deepseek/deepseek-reasoner",
156
157
  ]
157
158
 
@@ -29,6 +29,7 @@ Returns: A sequence of ToolDefinition instances. Most of the time this will be a
29
29
 
30
30
  _LOCK = RLock()
31
31
  _REG: dict[str, Resolver] = {}
32
+ _MODULE_QUALNAMES: dict[str, str] = {} # Maps tool name to module qualname
32
33
 
33
34
 
34
35
  def _resolver_from_instance(name: str, tool: ToolDefinition) -> Resolver:
@@ -137,11 +138,22 @@ def register_tool(
137
138
  "(3) a callable factory returning a Sequence[ToolDefinition]"
138
139
  )
139
140
 
141
+ # Track the module qualname for this tool
142
+ module_qualname = None
143
+ if isinstance(factory, type):
144
+ module_qualname = factory.__module__
145
+ elif callable(factory):
146
+ module_qualname = getattr(factory, "__module__", None)
147
+ elif isinstance(factory, ToolDefinition):
148
+ module_qualname = factory.__class__.__module__
149
+
140
150
  with _LOCK:
141
151
  # TODO: throw exception when registering duplicate name tools
142
152
  if name in _REG:
143
153
  logger.warning(f"Duplicate tool name registerd {name}")
144
154
  _REG[name] = resolver
155
+ if module_qualname:
156
+ _MODULE_QUALNAMES[name] = module_qualname
145
157
 
146
158
 
147
159
  def resolve_tool(
@@ -159,3 +171,14 @@ def resolve_tool(
159
171
  def list_registered_tools() -> list[str]:
160
172
  with _LOCK:
161
173
  return list(_REG.keys())
174
+
175
+
176
+ def get_tool_module_qualnames() -> dict[str, str]:
177
+ """Get a mapping of tool names to their module qualnames.
178
+
179
+ Returns:
180
+ A dictionary mapping tool names to module qualnames (e.g.,
181
+ {"glob": "openhands.tools.glob.definition"}).
182
+ """
183
+ with _LOCK:
184
+ return dict(_MODULE_QUALNAMES)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.7.2
3
+ Version: 1.7.3
4
4
  Summary: OpenHands SDK - Core functionality for building AI agents
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: deprecation>=2.1.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openhands-sdk"
3
- version = "1.7.2"
3
+ version = "1.7.3"
4
4
  description = "OpenHands SDK - Core functionality for building AI agents"
5
5
 
6
6
  requires-python = ">=3.12"
File without changes