From 48e2396a3ae96e4a51171affde1676f824207e9a Mon Sep 17 00:00:00 2001 From: openhands Date: Sat, 14 Mar 2026 01:55:30 +0000 Subject: [PATCH 1/2] feat(sdk): export public utility and workspace symbols Co-authored-by: openhands --- openhands-sdk/openhands/sdk/__init__.py | 6 ++++++ openhands-sdk/openhands/sdk/llm/__init__.py | 3 ++- openhands-sdk/openhands/sdk/utils/__init__.py | 2 ++ .../openhands/sdk/workspace/__init__.py | 3 ++- .../openhands/sdk/workspace/remote/__init__.py | 2 ++ tests/sdk/test_public_api_exports.py | 16 ++++++++++++++++ 6 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/sdk/test_public_api_exports.py diff --git a/openhands-sdk/openhands/sdk/__init__.py b/openhands-sdk/openhands/sdk/__init__.py index cdb58d9d62..0b29a2e0fd 100644 --- a/openhands-sdk/openhands/sdk/__init__.py +++ b/openhands-sdk/openhands/sdk/__init__.py @@ -39,6 +39,7 @@ TextContent, ThinkingBlock, TokenCallbackType, + TokenUsage, ) from openhands.sdk.logger import get_logger from openhands.sdk.mcp import ( @@ -64,7 +65,9 @@ register_tool, resolve_tool, ) +from openhands.sdk.utils import page_iterator from openhands.sdk.workspace import ( + AsyncRemoteWorkspace, LocalWorkspace, RemoteWorkspace, Workspace, @@ -86,6 +89,7 @@ "LLMStreamChunk", "FallbackStrategy", "TokenCallbackType", + "TokenUsage", "ConversationStats", "RegistryEvent", "Message", @@ -125,6 +129,7 @@ "Workspace", "LocalWorkspace", "RemoteWorkspace", + "AsyncRemoteWorkspace", "register_agent", "load_project_agents", "load_user_agents", @@ -133,5 +138,6 @@ "load_project_skills", "load_skills_from_dir", "load_user_skills", + "page_iterator", "__version__", ] diff --git a/openhands-sdk/openhands/sdk/llm/__init__.py b/openhands-sdk/openhands/sdk/llm/__init__.py index f50815b622..5f007037a8 100644 --- a/openhands-sdk/openhands/sdk/llm/__init__.py +++ b/openhands-sdk/openhands/sdk/llm/__init__.py @@ -21,7 +21,7 @@ ) from openhands.sdk.llm.router import RouterLLM from openhands.sdk.llm.streaming import LLMStreamChunk, TokenCallbackType -from openhands.sdk.llm.utils.metrics import Metrics, MetricsSnapshot +from openhands.sdk.llm.utils.metrics import Metrics, MetricsSnapshot, TokenUsage from openhands.sdk.llm.utils.unverified_models import ( UNVERIFIED_MODELS_EXCLUDING_BEDROCK, get_unverified_models, @@ -58,6 +58,7 @@ # Metrics "Metrics", "MetricsSnapshot", + "TokenUsage", # Models "VERIFIED_MODELS", "UNVERIFIED_MODELS_EXCLUDING_BEDROCK", diff --git a/openhands-sdk/openhands/sdk/utils/__init__.py b/openhands-sdk/openhands/sdk/utils/__init__.py index 328d3c91ba..0316a52296 100644 --- a/openhands-sdk/openhands/sdk/utils/__init__.py +++ b/openhands-sdk/openhands/sdk/utils/__init__.py @@ -6,6 +6,7 @@ warn_deprecated, ) from .github import sanitize_openhands_mentions +from .paging import page_iterator from .truncate import ( DEFAULT_TEXT_CONTENT_LIMIT, DEFAULT_TRUNCATE_NOTICE, @@ -20,5 +21,6 @@ "deprecated", "warn_deprecated", "sanitize_openhands_mentions", + "page_iterator", "sanitized_env", ] diff --git a/openhands-sdk/openhands/sdk/workspace/__init__.py b/openhands-sdk/openhands/sdk/workspace/__init__.py index 6760c8aa58..d0008a6b03 100644 --- a/openhands-sdk/openhands/sdk/workspace/__init__.py +++ b/openhands-sdk/openhands/sdk/workspace/__init__.py @@ -1,11 +1,12 @@ from .base import BaseWorkspace from .local import LocalWorkspace from .models import CommandResult, FileOperationResult, PlatformType, TargetType -from .remote import RemoteWorkspace +from .remote import AsyncRemoteWorkspace, RemoteWorkspace from .workspace import Workspace __all__ = [ + "AsyncRemoteWorkspace", "BaseWorkspace", "CommandResult", "FileOperationResult", diff --git a/openhands-sdk/openhands/sdk/workspace/remote/__init__.py b/openhands-sdk/openhands/sdk/workspace/remote/__init__.py index 4794c76631..84fd241e22 100644 --- a/openhands-sdk/openhands/sdk/workspace/remote/__init__.py +++ b/openhands-sdk/openhands/sdk/workspace/remote/__init__.py @@ -1,8 +1,10 @@ """Remote workspace implementations.""" +from .async_remote_workspace import AsyncRemoteWorkspace from .base import RemoteWorkspace __all__ = [ + "AsyncRemoteWorkspace", "RemoteWorkspace", ] diff --git a/tests/sdk/test_public_api_exports.py b/tests/sdk/test_public_api_exports.py new file mode 100644 index 0000000000..8a957f4fd3 --- /dev/null +++ b/tests/sdk/test_public_api_exports.py @@ -0,0 +1,16 @@ +from openhands.sdk import AsyncRemoteWorkspace, TokenUsage, page_iterator +from openhands.sdk.llm import TokenUsage as LLMTokenUsage +from openhands.sdk.utils import page_iterator as utils_page_iterator +from openhands.sdk.workspace import ( + AsyncRemoteWorkspace as WorkspaceAsyncRemoteWorkspace, +) +from openhands.sdk.workspace.remote import ( + AsyncRemoteWorkspace as RemoteAsyncRemoteWorkspace, +) + + +def test_top_level_exports_match_package_exports(): + assert TokenUsage is LLMTokenUsage + assert page_iterator is utils_page_iterator + assert AsyncRemoteWorkspace is WorkspaceAsyncRemoteWorkspace + assert AsyncRemoteWorkspace is RemoteAsyncRemoteWorkspace From c8e1da2d1c77f77fafc4e38309d32fc5a1092722 Mon Sep 17 00:00:00 2001 From: enyst Date: Sat, 14 Mar 2026 02:20:31 +0000 Subject: [PATCH 2/2] chore(sdk): drop import-only export test Co-authored-by: openhands --- tests/sdk/test_public_api_exports.py | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 tests/sdk/test_public_api_exports.py diff --git a/tests/sdk/test_public_api_exports.py b/tests/sdk/test_public_api_exports.py deleted file mode 100644 index 8a957f4fd3..0000000000 --- a/tests/sdk/test_public_api_exports.py +++ /dev/null @@ -1,16 +0,0 @@ -from openhands.sdk import AsyncRemoteWorkspace, TokenUsage, page_iterator -from openhands.sdk.llm import TokenUsage as LLMTokenUsage -from openhands.sdk.utils import page_iterator as utils_page_iterator -from openhands.sdk.workspace import ( - AsyncRemoteWorkspace as WorkspaceAsyncRemoteWorkspace, -) -from openhands.sdk.workspace.remote import ( - AsyncRemoteWorkspace as RemoteAsyncRemoteWorkspace, -) - - -def test_top_level_exports_match_package_exports(): - assert TokenUsage is LLMTokenUsage - assert page_iterator is utils_page_iterator - assert AsyncRemoteWorkspace is WorkspaceAsyncRemoteWorkspace - assert AsyncRemoteWorkspace is RemoteAsyncRemoteWorkspace