openhands-sdk 1.5.0__tar.gz → 1.5.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.
Files changed (169) hide show
  1. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/PKG-INFO +1 -1
  2. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/base.py +25 -6
  3. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/base.py +17 -0
  4. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/impl/local_conversation.py +50 -0
  5. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/impl/remote_conversation.py +15 -0
  6. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/utils/verified_models.py +3 -0
  7. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/tool.py +2 -2
  8. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands_sdk.egg-info/PKG-INFO +1 -1
  9. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/pyproject.toml +1 -1
  10. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/__init__.py +0 -0
  11. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/__init__.py +0 -0
  12. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/agent.py +0 -0
  13. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/in_context_learning_example.j2 +0 -0
  14. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/in_context_learning_example_suffix.j2 +0 -0
  15. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/security_policy.j2 +0 -0
  16. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/security_risk_assessment.j2 +0 -0
  17. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/system_prompt.j2 +0 -0
  18. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/system_prompt_interactive.j2 +0 -0
  19. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/system_prompt_long_horizon.j2 +0 -0
  20. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/system_prompt_planning.j2 +0 -0
  21. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/prompts/system_prompt_tech_philosophy.j2 +0 -0
  22. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/agent/utils.py +0 -0
  23. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/__init__.py +0 -0
  24. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/agent_context.py +0 -0
  25. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/condenser/__init__.py +0 -0
  26. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/condenser/base.py +0 -0
  27. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +0 -0
  28. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
  29. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
  30. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/condenser/prompts/summarizing_prompt.j2 +0 -0
  31. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/prompts/__init__.py +0 -0
  32. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/prompts/prompt.py +0 -0
  33. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
  34. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
  35. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/prompts/templates/system_message_suffix.j2 +0 -0
  36. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/skills/__init__.py +0 -0
  37. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/skills/exceptions.py +0 -0
  38. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/skills/skill.py +0 -0
  39. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/skills/trigger.py +0 -0
  40. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/skills/types.py +0 -0
  41. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/context/view.py +0 -0
  42. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/__init__.py +0 -0
  43. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/conversation.py +0 -0
  44. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/conversation_stats.py +0 -0
  45. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/event_store.py +0 -0
  46. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/events_list_base.py +0 -0
  47. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/exceptions.py +0 -0
  48. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/fifo_lock.py +0 -0
  49. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/impl/__init__.py +0 -0
  50. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/persistence_const.py +0 -0
  51. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/response_utils.py +0 -0
  52. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/secret_registry.py +0 -0
  53. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/serialization_diff.py +0 -0
  54. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/state.py +0 -0
  55. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/stuck_detector.py +0 -0
  56. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/title_utils.py +0 -0
  57. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/types.py +0 -0
  58. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
  59. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/visualizer/base.py +0 -0
  60. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/conversation/visualizer/default.py +0 -0
  61. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/critic/__init__.py +0 -0
  62. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/critic/base.py +0 -0
  63. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/critic/impl/__init__.py +0 -0
  64. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/critic/impl/agent_finished.py +0 -0
  65. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/critic/impl/empty_patch.py +0 -0
  66. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/critic/impl/pass_critic.py +0 -0
  67. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/__init__.py +0 -0
  68. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/base.py +0 -0
  69. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/condenser.py +0 -0
  70. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/conversation_error.py +0 -0
  71. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/conversation_state.py +0 -0
  72. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/llm_completion_log.py +0 -0
  73. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
  74. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/llm_convertible/action.py +0 -0
  75. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/llm_convertible/message.py +0 -0
  76. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/llm_convertible/observation.py +0 -0
  77. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/llm_convertible/system.py +0 -0
  78. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/token.py +0 -0
  79. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/types.py +0 -0
  80. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/event/user_action.py +0 -0
  81. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/git/exceptions.py +0 -0
  82. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/git/git_changes.py +0 -0
  83. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/git/git_diff.py +0 -0
  84. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/git/models.py +0 -0
  85. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/git/utils.py +0 -0
  86. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/io/__init__.py +0 -0
  87. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/io/base.py +0 -0
  88. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/io/local.py +0 -0
  89. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/io/memory.py +0 -0
  90. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/__init__.py +0 -0
  91. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/exceptions/__init__.py +0 -0
  92. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/exceptions/classifier.py +0 -0
  93. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/exceptions/mapping.py +0 -0
  94. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/exceptions/types.py +0 -0
  95. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/llm.py +0 -0
  96. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/llm_registry.py +0 -0
  97. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/llm_response.py +0 -0
  98. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/message.py +0 -0
  99. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
  100. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
  101. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/options/__init__.py +0 -0
  102. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/options/chat_options.py +0 -0
  103. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/options/common.py +0 -0
  104. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/options/responses_options.py +0 -0
  105. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/router/__init__.py +0 -0
  106. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/router/base.py +0 -0
  107. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
  108. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/router/impl/random.py +0 -0
  109. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/streaming.py +0 -0
  110. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/utils/metrics.py +0 -0
  111. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/utils/model_features.py +0 -0
  112. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/utils/model_info.py +0 -0
  113. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
  114. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/utils/telemetry.py +0 -0
  115. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/llm/utils/unverified_models.py +0 -0
  116. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/logger/__init__.py +0 -0
  117. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/logger/logger.py +0 -0
  118. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/logger/rolling.py +0 -0
  119. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/mcp/__init__.py +0 -0
  120. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/mcp/client.py +0 -0
  121. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/mcp/definition.py +0 -0
  122. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/mcp/exceptions.py +0 -0
  123. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/mcp/tool.py +0 -0
  124. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/mcp/utils.py +0 -0
  125. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/observability/__init__.py +0 -0
  126. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/observability/laminar.py +0 -0
  127. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/observability/utils.py +0 -0
  128. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/py.typed +0 -0
  129. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/secret/__init__.py +0 -0
  130. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/secret/secrets.py +0 -0
  131. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/security/__init__.py +0 -0
  132. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/security/analyzer.py +0 -0
  133. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/security/confirmation_policy.py +0 -0
  134. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/security/llm_analyzer.py +0 -0
  135. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/security/risk.py +0 -0
  136. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/__init__.py +0 -0
  137. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/builtins/__init__.py +0 -0
  138. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/builtins/finish.py +0 -0
  139. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/builtins/think.py +0 -0
  140. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/registry.py +0 -0
  141. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/schema.py +0 -0
  142. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/tool/spec.py +0 -0
  143. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/__init__.py +0 -0
  144. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/async_executor.py +0 -0
  145. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/async_utils.py +0 -0
  146. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/cipher.py +0 -0
  147. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/command.py +0 -0
  148. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/deprecation.py +0 -0
  149. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/github.py +0 -0
  150. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/json.py +0 -0
  151. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/models.py +0 -0
  152. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/pydantic_diff.py +0 -0
  153. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/pydantic_secrets.py +0 -0
  154. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/truncate.py +0 -0
  155. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/utils/visualize.py +0 -0
  156. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/__init__.py +0 -0
  157. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/base.py +0 -0
  158. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/local.py +0 -0
  159. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/models.py +0 -0
  160. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/remote/__init__.py +0 -0
  161. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
  162. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/remote/base.py +0 -0
  163. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
  164. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands/sdk/workspace/workspace.py +0 -0
  165. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands_sdk.egg-info/SOURCES.txt +0 -0
  166. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands_sdk.egg-info/dependency_links.txt +0 -0
  167. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands_sdk.egg-info/requires.txt +0 -0
  168. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/openhands_sdk.egg-info/top_level.txt +0 -0
  169. {openhands_sdk-1.5.0 → openhands_sdk-1.5.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.5.0
3
+ Version: 1.5.2
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
@@ -3,6 +3,7 @@ import re
3
3
  import sys
4
4
  from abc import ABC, abstractmethod
5
5
  from collections.abc import Generator, Iterable
6
+ from concurrent.futures import ThreadPoolExecutor
6
7
  from typing import TYPE_CHECKING, Any
7
8
 
8
9
  from pydantic import BaseModel, ConfigDict, Field, PrivateAttr
@@ -196,13 +197,25 @@ class AgentBase(DiscriminatedUnionMixin, ABC):
196
197
  return
197
198
 
198
199
  tools: list[ToolDefinition] = []
199
- for tool_spec in self.tools:
200
- tools.extend(resolve_tool(tool_spec, state))
201
200
 
202
- # Add MCP tools if configured
203
- if self.mcp_config:
204
- mcp_tools = create_mcp_tools(self.mcp_config, timeout=30)
205
- tools.extend(mcp_tools)
201
+ # Use ThreadPoolExecutor to parallelize tool resolution
202
+ with ThreadPoolExecutor(max_workers=4) as executor:
203
+ futures = []
204
+
205
+ # Submit tool resolution tasks
206
+ for tool_spec in self.tools:
207
+ future = executor.submit(resolve_tool, tool_spec, state)
208
+ futures.append(future)
209
+
210
+ # Submit MCP tools creation if configured
211
+ if self.mcp_config:
212
+ future = executor.submit(create_mcp_tools, self.mcp_config, 30)
213
+ futures.append(future)
214
+
215
+ # Collect results as they complete
216
+ for future in futures:
217
+ result = future.result()
218
+ tools.extend(result)
206
219
 
207
220
  logger.info(
208
221
  f"Loaded {len(tools)} tools from spec: {[tool.name for tool in tools]}"
@@ -292,6 +305,12 @@ class AgentBase(DiscriminatedUnionMixin, ABC):
292
305
  )
293
306
  updates["condenser"] = new_condenser
294
307
 
308
+ # Reconcile agent_context - always use the current environment's agent_context
309
+ # This allows resuming conversations from different directories and handles
310
+ # cases where skills, working directory, or other context has changed
311
+ if self.agent_context is not None:
312
+ updates["agent_context"] = self.agent_context
313
+
295
314
  # Create maps by tool name for easy lookup
296
315
  runtime_tools_map = {tool.name: tool for tool in self.tools}
297
316
  persisted_tools_map = {tool.name: tool for tool in persisted.tools}
@@ -245,6 +245,23 @@ class BaseConversation(ABC):
245
245
  """
246
246
  ...
247
247
 
248
+ @abstractmethod
249
+ def condense(self) -> None:
250
+ """Force condensation of the conversation history.
251
+
252
+ This method uses the existing condensation request pattern to trigger
253
+ condensation. It adds a CondensationRequest event to the conversation
254
+ and forces the agent to take a single step to process it.
255
+
256
+ The condensation will be applied immediately and will modify the conversation
257
+ state by adding a condensation event to the history.
258
+
259
+ Raises:
260
+ ValueError: If no condenser is configured or the condenser doesn't
261
+ handle condensation requests.
262
+ """
263
+ ...
264
+
248
265
  @staticmethod
249
266
  def compose_callbacks(callbacks: Iterable[CallbackType]) -> CallbackType:
250
267
  """Compose multiple callbacks into a single callback function.
@@ -24,6 +24,7 @@ from openhands.sdk.conversation.visualizer import (
24
24
  DefaultConversationVisualizer,
25
25
  )
26
26
  from openhands.sdk.event import (
27
+ CondensationRequest,
27
28
  MessageEvent,
28
29
  PauseEvent,
29
30
  UserRejectObservation,
@@ -540,6 +541,55 @@ class LocalConversation(BaseConversation):
540
541
  events=self._state.events, llm=llm_to_use, max_length=max_length
541
542
  )
542
543
 
544
+ def condense(self) -> None:
545
+ """Synchronously force condense the conversation history.
546
+
547
+ If the agent is currently running, `condense()` will wait for the
548
+ ongoing step to finish before proceeding.
549
+
550
+ Raises ValueError if no compatible condenser exists.
551
+ """
552
+
553
+ # Check if condenser is configured and handles condensation requests
554
+ if (
555
+ self.agent.condenser is None
556
+ or not self.agent.condenser.handles_condensation_requests()
557
+ ):
558
+ condenser_info = (
559
+ "No condenser configured"
560
+ if self.agent.condenser is None
561
+ else (
562
+ f"Condenser {type(self.agent.condenser).__name__} does not handle "
563
+ "condensation requests"
564
+ )
565
+ )
566
+ raise ValueError(
567
+ f"Cannot condense conversation: {condenser_info}. "
568
+ "To enable manual condensation, configure an "
569
+ "LLMSummarizingCondenser:\n\n"
570
+ "from openhands.sdk.context.condenser import LLMSummarizingCondenser\n"
571
+ "agent = Agent(\n"
572
+ " llm=your_llm,\n"
573
+ " condenser=LLMSummarizingCondenser(\n"
574
+ " llm=your_llm,\n"
575
+ " max_size=120,\n"
576
+ " keep_first=4\n"
577
+ " )\n"
578
+ ")"
579
+ )
580
+
581
+ # Add a condensation request event
582
+ condensation_request = CondensationRequest()
583
+ self._on_event(condensation_request)
584
+
585
+ # Force the agent to take a single step to process the condensation request
586
+ # This will trigger the condenser if it handles condensation requests
587
+ with self._state:
588
+ # Take a single step to process the condensation request
589
+ self.agent.step(self, on_event=self._on_event, on_token=self._on_token)
590
+
591
+ logger.info("Condensation request processed")
592
+
543
593
  def __del__(self) -> None:
544
594
  """Ensure cleanup happens when conversation is destroyed."""
545
595
  try:
@@ -746,6 +746,21 @@ class RemoteConversation(BaseConversation):
746
746
  data = resp.json()
747
747
  return data["title"]
748
748
 
749
+ def condense(self) -> None:
750
+ """Force condensation of the conversation history.
751
+
752
+ This method sends a condensation request to the remote agent server.
753
+ The server will use the existing condensation request pattern to trigger
754
+ condensation if a condenser is configured and handles condensation requests.
755
+
756
+ The condensation will be applied on the server side and will modify the
757
+ conversation state by adding a condensation event to the history.
758
+
759
+ Raises:
760
+ HTTPError: If the server returns an error (e.g., no condenser configured).
761
+ """
762
+ _send_request(self._client, "POST", f"/api/conversations/{self._id}/condense")
763
+
749
764
  def close(self) -> None:
750
765
  """Close the conversation and clean up resources.
751
766
 
@@ -1,4 +1,7 @@
1
1
  VERIFIED_OPENAI_MODELS = [
2
+ "gpt-5.1-codex-max",
3
+ "gpt-5.1-codex",
4
+ "gpt-5.1-codex-mini",
2
5
  "gpt-5-codex",
3
6
  "gpt-5-2025-08-07",
4
7
  "gpt-5-mini-2025-08-07",
@@ -364,7 +364,7 @@ class ToolDefinition[ActionT, ObservationT](DiscriminatedUnionMixin, ABC):
364
364
  action_type: type[Schema] | None = None,
365
365
  ) -> dict[str, Any]:
366
366
  action_type = action_type or self.action_type
367
- action_type_with_risk = _create_action_type_with_risk(action_type)
367
+ action_type_with_risk = create_action_type_with_risk(action_type)
368
368
 
369
369
  add_security_risk_prediction = add_security_risk_prediction and (
370
370
  self.annotations is None or (not self.annotations.readOnlyHint)
@@ -460,7 +460,7 @@ class ToolDefinition[ActionT, ObservationT](DiscriminatedUnionMixin, ABC):
460
460
  raise ValueError(error_msg)
461
461
 
462
462
 
463
- def _create_action_type_with_risk(action_type: type[Schema]) -> type[Schema]:
463
+ def create_action_type_with_risk(action_type: type[Schema]) -> type[Schema]:
464
464
  action_type_with_risk = _action_types_with_risk.get(action_type)
465
465
  if action_type_with_risk:
466
466
  return action_type_with_risk
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.5.0
3
+ Version: 1.5.2
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.5.0"
3
+ version = "1.5.2"
4
4
  description = "OpenHands SDK - Core functionality for building AI agents"
5
5
 
6
6
  requires-python = ">=3.12"
File without changes