openhands-sdk 1.4.0__tar.gz → 1.4.1__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 (168) hide show
  1. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/PKG-INFO +1 -1
  2. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/conversation_stats.py +38 -1
  3. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/conversation_state.py +8 -0
  4. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/logger/logger.py +7 -0
  5. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands_sdk.egg-info/PKG-INFO +1 -1
  6. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/pyproject.toml +1 -1
  7. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/__init__.py +0 -0
  8. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/__init__.py +0 -0
  9. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/agent.py +0 -0
  10. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/base.py +0 -0
  11. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/in_context_learning_example.j2 +0 -0
  12. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/in_context_learning_example_suffix.j2 +0 -0
  13. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/security_policy.j2 +0 -0
  14. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/security_risk_assessment.j2 +0 -0
  15. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/system_prompt.j2 +0 -0
  16. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/system_prompt_interactive.j2 +0 -0
  17. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/system_prompt_long_horizon.j2 +0 -0
  18. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/system_prompt_planning.j2 +0 -0
  19. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/prompts/system_prompt_tech_philosophy.j2 +0 -0
  20. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/agent/utils.py +0 -0
  21. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/__init__.py +0 -0
  22. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/agent_context.py +0 -0
  23. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/condenser/__init__.py +0 -0
  24. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/condenser/base.py +0 -0
  25. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +0 -0
  26. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
  27. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
  28. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/condenser/prompts/summarizing_prompt.j2 +0 -0
  29. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/prompts/__init__.py +0 -0
  30. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/prompts/prompt.py +0 -0
  31. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
  32. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
  33. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/prompts/templates/system_message_suffix.j2 +0 -0
  34. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/skills/__init__.py +0 -0
  35. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/skills/exceptions.py +0 -0
  36. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/skills/skill.py +0 -0
  37. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/skills/trigger.py +0 -0
  38. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/skills/types.py +0 -0
  39. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/context/view.py +0 -0
  40. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/__init__.py +0 -0
  41. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/base.py +0 -0
  42. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/conversation.py +0 -0
  43. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/event_store.py +0 -0
  44. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/events_list_base.py +0 -0
  45. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/exceptions.py +0 -0
  46. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/fifo_lock.py +0 -0
  47. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/impl/__init__.py +0 -0
  48. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/impl/local_conversation.py +0 -0
  49. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/impl/remote_conversation.py +0 -0
  50. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/persistence_const.py +0 -0
  51. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/response_utils.py +0 -0
  52. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/secret_registry.py +0 -0
  53. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/secret_source.py +0 -0
  54. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/serialization_diff.py +0 -0
  55. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/state.py +0 -0
  56. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/stuck_detector.py +0 -0
  57. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/title_utils.py +0 -0
  58. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/types.py +0 -0
  59. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
  60. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/visualizer/base.py +0 -0
  61. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/conversation/visualizer/default.py +0 -0
  62. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/critic/__init__.py +0 -0
  63. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/critic/base.py +0 -0
  64. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/critic/impl/__init__.py +0 -0
  65. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/critic/impl/agent_finished.py +0 -0
  66. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/critic/impl/empty_patch.py +0 -0
  67. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/critic/impl/pass_critic.py +0 -0
  68. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/__init__.py +0 -0
  69. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/base.py +0 -0
  70. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/condenser.py +0 -0
  71. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/conversation_error.py +0 -0
  72. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/llm_completion_log.py +0 -0
  73. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
  74. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/llm_convertible/action.py +0 -0
  75. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/llm_convertible/message.py +0 -0
  76. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/llm_convertible/observation.py +0 -0
  77. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/llm_convertible/system.py +0 -0
  78. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/token.py +0 -0
  79. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/types.py +0 -0
  80. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/event/user_action.py +0 -0
  81. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/git/exceptions.py +0 -0
  82. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/git/git_changes.py +0 -0
  83. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/git/git_diff.py +0 -0
  84. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/git/models.py +0 -0
  85. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/git/utils.py +0 -0
  86. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/io/__init__.py +0 -0
  87. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/io/base.py +0 -0
  88. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/io/local.py +0 -0
  89. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/io/memory.py +0 -0
  90. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/__init__.py +0 -0
  91. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/exceptions/__init__.py +0 -0
  92. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/exceptions/classifier.py +0 -0
  93. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/exceptions/mapping.py +0 -0
  94. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/exceptions/types.py +0 -0
  95. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/llm.py +0 -0
  96. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/llm_registry.py +0 -0
  97. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/llm_response.py +0 -0
  98. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/message.py +0 -0
  99. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
  100. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
  101. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/options/__init__.py +0 -0
  102. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/options/chat_options.py +0 -0
  103. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/options/common.py +0 -0
  104. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/options/responses_options.py +0 -0
  105. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/router/__init__.py +0 -0
  106. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/router/base.py +0 -0
  107. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
  108. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/router/impl/random.py +0 -0
  109. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/streaming.py +0 -0
  110. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/utils/metrics.py +0 -0
  111. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/utils/model_features.py +0 -0
  112. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/utils/model_info.py +0 -0
  113. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
  114. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/utils/telemetry.py +0 -0
  115. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/utils/unverified_models.py +0 -0
  116. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/llm/utils/verified_models.py +0 -0
  117. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/logger/__init__.py +0 -0
  118. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/logger/rolling.py +0 -0
  119. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/mcp/__init__.py +0 -0
  120. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/mcp/client.py +0 -0
  121. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/mcp/definition.py +0 -0
  122. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/mcp/exceptions.py +0 -0
  123. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/mcp/tool.py +0 -0
  124. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/mcp/utils.py +0 -0
  125. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/observability/__init__.py +0 -0
  126. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/observability/laminar.py +0 -0
  127. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/observability/utils.py +0 -0
  128. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/py.typed +0 -0
  129. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/security/__init__.py +0 -0
  130. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/security/analyzer.py +0 -0
  131. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/security/confirmation_policy.py +0 -0
  132. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/security/llm_analyzer.py +0 -0
  133. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/security/risk.py +0 -0
  134. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/__init__.py +0 -0
  135. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/builtins/__init__.py +0 -0
  136. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/builtins/finish.py +0 -0
  137. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/builtins/think.py +0 -0
  138. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/registry.py +0 -0
  139. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/schema.py +0 -0
  140. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/spec.py +0 -0
  141. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/tool/tool.py +0 -0
  142. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/__init__.py +0 -0
  143. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/async_executor.py +0 -0
  144. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/async_utils.py +0 -0
  145. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/cipher.py +0 -0
  146. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/command.py +0 -0
  147. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/deprecation.py +0 -0
  148. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/github.py +0 -0
  149. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/json.py +0 -0
  150. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/models.py +0 -0
  151. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/pydantic_diff.py +0 -0
  152. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/pydantic_secrets.py +0 -0
  153. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/truncate.py +0 -0
  154. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/utils/visualize.py +0 -0
  155. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/__init__.py +0 -0
  156. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/base.py +0 -0
  157. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/local.py +0 -0
  158. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/models.py +0 -0
  159. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/remote/__init__.py +0 -0
  160. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
  161. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/remote/base.py +0 -0
  162. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
  163. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands/sdk/workspace/workspace.py +0 -0
  164. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands_sdk.egg-info/SOURCES.txt +0 -0
  165. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands_sdk.egg-info/dependency_links.txt +0 -0
  166. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands_sdk.egg-info/requires.txt +0 -0
  167. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/openhands_sdk.egg-info/top_level.txt +0 -0
  168. {openhands_sdk-1.4.0 → openhands_sdk-1.4.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.4.0
3
+ Version: 1.4.1
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,4 +1,6 @@
1
- from pydantic import BaseModel, Field, PrivateAttr
1
+ from typing import Any
2
+
3
+ from pydantic import BaseModel, Field, PrivateAttr, model_serializer
2
4
 
3
5
  from openhands.sdk.llm.llm_registry import RegistryEvent
4
6
  from openhands.sdk.llm.utils.metrics import Metrics
@@ -18,6 +20,41 @@ class ConversationStats(BaseModel):
18
20
 
19
21
  _restored_usage_ids: set[str] = PrivateAttr(default_factory=set)
20
22
 
23
+ @model_serializer(mode="wrap")
24
+ def _serialize_with_context(self, serializer: Any, info: Any) -> dict[str, Any]:
25
+ """Serialize metrics based on context.
26
+
27
+ By default, preserves full metrics history including costs,
28
+ response_latencies, and token_usages lists for persistence.
29
+
30
+ When context={'use_snapshot': True} is passed, converts Metrics to
31
+ MetricsSnapshot format to minimize payload size for network transmission.
32
+
33
+ Args:
34
+ serializer: Pydantic's default serializer
35
+ info: Serialization info containing context
36
+
37
+ Returns:
38
+ Dictionary with metrics serialized based on context
39
+ """
40
+ # Get the default serialization
41
+ data = serializer(self)
42
+
43
+ # Check if we should use snapshot serialization
44
+ context = info.context if info else None
45
+ use_snapshot = context.get("use_snapshot", False) if context else False
46
+
47
+ if use_snapshot and "usage_to_metrics" in data:
48
+ # Replace each Metrics with its snapshot
49
+ usage_to_snapshots = {}
50
+ for usage_id, metrics in self.usage_to_metrics.items():
51
+ snapshot = metrics.get_snapshot()
52
+ usage_to_snapshots[usage_id] = snapshot.model_dump()
53
+
54
+ data["usage_to_metrics"] = usage_to_snapshots
55
+
56
+ return data
57
+
21
58
  def get_combined_metrics(self) -> Metrics:
22
59
  total_metrics = Metrics()
23
60
  for metrics in self.usage_to_metrics.values():
@@ -49,6 +49,14 @@ class ConversationStateUpdateEvent(Event):
49
49
 
50
50
  @field_validator("value")
51
51
  def validate_value(cls, value, info):
52
+ # Prevent circular import
53
+ from openhands.sdk.conversation.conversation_stats import ConversationStats
54
+
55
+ # For ConversationStats, use snapshot serialization to avoid
56
+ # sending lengthy lists over WebSocket
57
+ if isinstance(value, ConversationStats):
58
+ return value.model_dump(mode="json", context={"use_snapshot": True})
59
+
52
60
  key = info.data.get("key")
53
61
  if key is None:
54
62
  # Allow value without key for flexibility
@@ -105,7 +105,14 @@ def setup_logging(
105
105
  keep = ENV_BACKUP_COUNT if backup_count is None else backup_count
106
106
 
107
107
  root = logging.getLogger()
108
+ old_level = root.level
108
109
  root.setLevel(lvl)
110
+
111
+ # Set the level for any existing logger with the same intial level
112
+ for logger in logging.root.manager.loggerDict.values():
113
+ if isinstance(logger, logging.Logger) and logger.level == old_level:
114
+ logger.setLevel(lvl)
115
+
109
116
  # Do NOT clear existing handlers; Uvicorn installs these before importing the app.
110
117
  # Only add ours if there isn't already a comparable stream handler.
111
118
  has_stream = any(isinstance(h, logging.StreamHandler) for h in root.handlers)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.4.0
3
+ Version: 1.4.1
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.4.0"
3
+ version = "1.4.1"
4
4
  description = "OpenHands SDK - Core functionality for building AI agents"
5
5
 
6
6
  requires-python = ">=3.12"
File without changes