diff --git a/dev_config/python/.pre-commit-config.yaml b/dev_config/python/.pre-commit-config.yaml index a076d6cef7..5cbdc1c508 100644 --- a/dev_config/python/.pre-commit-config.yaml +++ b/dev_config/python/.pre-commit-config.yaml @@ -58,8 +58,8 @@ repos: types-Markdown, pydantic, lxml, - "openhands-sdk==1.14", - "openhands-tools==1.14", + "openhands-sdk==1.16.1", + "openhands-tools==1.16.1", ] # To see gaps add `--html-report mypy-report/` entry: mypy --config-file dev_config/python/mypy.ini openhands/ diff --git a/enterprise/server/sharing/sql_shared_conversation_info_service.py b/enterprise/server/sharing/sql_shared_conversation_info_service.py index bd584168dd..d804553d61 100644 --- a/enterprise/server/sharing/sql_shared_conversation_info_service.py +++ b/enterprise/server/sharing/sql_shared_conversation_info_service.py @@ -33,8 +33,7 @@ from openhands.app_server.app_conversation.sql_app_conversation_info_service imp ) from openhands.app_server.services.injector import InjectorState from openhands.integrations.provider import ProviderType -from openhands.sdk.llm import MetricsSnapshot -from openhands.sdk.llm.utils.metrics import TokenUsage +from openhands.sdk.llm import MetricsSnapshot, TokenUsage logger = logging.getLogger(__name__) diff --git a/enterprise/tests/unit/test_sharing/test_aws_shared_event_service.py b/enterprise/tests/unit/test_sharing/test_aws_shared_event_service.py index c90a741b1d..6994a24899 100644 --- a/enterprise/tests/unit/test_sharing/test_aws_shared_event_service.py +++ b/enterprise/tests/unit/test_sharing/test_aws_shared_event_service.py @@ -17,8 +17,7 @@ from server.sharing.shared_conversation_models import SharedConversation from openhands.agent_server.models import EventPage, EventSortOrder from openhands.app_server.event.event_service import EventService -from openhands.sdk.llm import MetricsSnapshot -from openhands.sdk.llm.utils.metrics import TokenUsage +from openhands.sdk.llm import MetricsSnapshot, TokenUsage @pytest.fixture diff --git a/enterprise/tests/unit/test_sharing/test_sharing_shared_conversation_info_service.py b/enterprise/tests/unit/test_sharing/test_sharing_shared_conversation_info_service.py index 60cd0ee29c..00c7245ea4 100644 --- a/enterprise/tests/unit/test_sharing/test_sharing_shared_conversation_info_service.py +++ b/enterprise/tests/unit/test_sharing/test_sharing_shared_conversation_info_service.py @@ -26,8 +26,7 @@ from openhands.app_server.app_conversation.sql_app_conversation_info_service imp from openhands.app_server.user.specifiy_user_context import SpecifyUserContext from openhands.app_server.utils.sql_utils import Base from openhands.integrations.provider import ProviderType -from openhands.sdk.llm import MetricsSnapshot -from openhands.sdk.llm.utils.metrics import TokenUsage +from openhands.sdk.llm import MetricsSnapshot, TokenUsage from openhands.storage.data_models.conversation_metadata import ConversationTrigger diff --git a/enterprise/tests/unit/test_sharing/test_sharing_shared_event_service.py b/enterprise/tests/unit/test_sharing/test_sharing_shared_event_service.py index 5185953dfb..a2633bf374 100644 --- a/enterprise/tests/unit/test_sharing/test_sharing_shared_event_service.py +++ b/enterprise/tests/unit/test_sharing/test_sharing_shared_event_service.py @@ -17,8 +17,7 @@ from server.sharing.shared_conversation_models import SharedConversation from openhands.agent_server.models import EventPage, EventSortOrder from openhands.app_server.event.event_service import EventService -from openhands.sdk.llm import MetricsSnapshot -from openhands.sdk.llm.utils.metrics import TokenUsage +from openhands.sdk.llm import MetricsSnapshot, TokenUsage @pytest.fixture diff --git a/openhands/app_server/app_conversation/app_conversation_models.py b/openhands/app_server/app_conversation/app_conversation_models.py index 7c59b10ffd..3a3b8c900d 100644 --- a/openhands/app_server/app_conversation/app_conversation_models.py +++ b/openhands/app_server/app_conversation/app_conversation_models.py @@ -12,7 +12,7 @@ from openhands.app_server.event_callback.event_callback_models import ( ) from openhands.app_server.sandbox.sandbox_models import SandboxStatus from openhands.integrations.service_types import ProviderType, SuggestedTask -from openhands.sdk.conversation.state import ConversationExecutionStatus +from openhands.sdk.conversation import ConversationExecutionStatus from openhands.sdk.llm import MetricsSnapshot from openhands.sdk.plugin import PluginSource from openhands.storage.data_models.conversation_metadata import ConversationTrigger diff --git a/openhands/app_server/app_conversation/app_conversation_service_base.py b/openhands/app_server/app_conversation/app_conversation_service_base.py index 72dfd19fcf..70fc940b8f 100644 --- a/openhands/app_server/app_conversation/app_conversation_service_base.py +++ b/openhands/app_server/app_conversation/app_conversation_service_base.py @@ -28,19 +28,18 @@ from openhands.app_server.app_conversation.skill_loader import ( ) from openhands.app_server.sandbox.sandbox_models import SandboxInfo from openhands.app_server.user.user_context import UserContext -from openhands.sdk import Agent -from openhands.sdk.context.agent_context import AgentContext -from openhands.sdk.context.condenser import LLMSummarizingCondenser +from openhands.sdk import Agent, LLMSummarizingCondenser +from openhands.sdk.context import AgentContext from openhands.sdk.context.skills import Skill from openhands.sdk.llm import LLM -from openhands.sdk.security.analyzer import SecurityAnalyzerBase -from openhands.sdk.security.confirmation_policy import ( +from openhands.sdk.security import ( AlwaysConfirm, ConfirmationPolicyBase, ConfirmRisky, + LLMSecurityAnalyzer, NeverConfirm, + SecurityAnalyzerBase, ) -from openhands.sdk.security.llm_analyzer import LLMSecurityAnalyzer from openhands.sdk.workspace.remote.async_remote_workspace import AsyncRemoteWorkspace from openhands.utils.git import ensure_valid_git_branch_name diff --git a/openhands/app_server/app_conversation/skill_loader.py b/openhands/app_server/app_conversation/skill_loader.py index d83d9b83ee..b242ac7818 100644 --- a/openhands/app_server/app_conversation/skill_loader.py +++ b/openhands/app_server/app_conversation/skill_loader.py @@ -19,8 +19,7 @@ from openhands.app_server.sandbox.sandbox_models import SandboxInfo from openhands.app_server.user.user_context import UserContext from openhands.integrations.provider import ProviderType from openhands.integrations.service_types import AuthenticationError -from openhands.sdk.context.skills import Skill -from openhands.sdk.context.skills.trigger import KeywordTrigger, TaskTrigger +from openhands.sdk.context.skills import KeywordTrigger, Skill, TaskTrigger _logger = logging.getLogger(__name__) diff --git a/openhands/app_server/app_conversation/sql_app_conversation_info_service.py b/openhands/app_server/app_conversation/sql_app_conversation_info_service.py index eed359f2c0..204e0eb025 100644 --- a/openhands/app_server/app_conversation/sql_app_conversation_info_service.py +++ b/openhands/app_server/app_conversation/sql_app_conversation_info_service.py @@ -55,10 +55,9 @@ from openhands.app_server.utils.sql_utils import ( create_json_type_decorator, ) from openhands.integrations.provider import ProviderType -from openhands.sdk.conversation.conversation_stats import ConversationStats +from openhands.sdk import ConversationStats from openhands.sdk.event import ConversationStateUpdateEvent -from openhands.sdk.llm import MetricsSnapshot -from openhands.sdk.llm.utils.metrics import TokenUsage +from openhands.sdk.llm import MetricsSnapshot, TokenUsage from openhands.storage.data_models.conversation_metadata import ConversationTrigger logger = logging.getLogger(__name__) diff --git a/openhands/app_server/event_callback/event_callback_result_models.py b/openhands/app_server/event_callback/event_callback_result_models.py index cc966fe2cc..84e5924420 100644 --- a/openhands/app_server/event_callback/event_callback_result_models.py +++ b/openhands/app_server/event_callback/event_callback_result_models.py @@ -5,7 +5,7 @@ from uuid import uuid4 from pydantic import BaseModel, Field from openhands.agent_server.utils import OpenHandsUUID, utc_now -from openhands.sdk.event.types import EventID +from openhands.sdk.event import EventID class EventCallbackResultStatus(Enum): diff --git a/openhands/server/routes/manage_conversations.py b/openhands/server/routes/manage_conversations.py index cab0755111..5945a626e4 100644 --- a/openhands/server/routes/manage_conversations.py +++ b/openhands/server/routes/manage_conversations.py @@ -72,7 +72,7 @@ from openhands.integrations.service_types import ( ) from openhands.runtime import get_runtime_cls from openhands.runtime.runtime_status import RuntimeStatus -from openhands.sdk.conversation.state import ConversationExecutionStatus +from openhands.sdk.conversation import ConversationExecutionStatus from openhands.server.data_models.agent_loop_info import AgentLoopInfo from openhands.server.data_models.conversation_info import ConversationInfo from openhands.server.data_models.conversation_info_result_set import ( diff --git a/tests/unit/app_server/test_app_conversation_service_base.py b/tests/unit/app_server/test_app_conversation_service_base.py index b1c546e743..23c1eb5a60 100644 --- a/tests/unit/app_server/test_app_conversation_service_base.py +++ b/tests/unit/app_server/test_app_conversation_service_base.py @@ -471,7 +471,7 @@ def test_create_security_analyzer_returns_llm_analyzer(): result = service._create_security_analyzer_from_string(security_analyzer_str) # Assert - from openhands.sdk.security.llm_analyzer import LLMSecurityAnalyzer + from openhands.sdk.security import LLMSecurityAnalyzer assert isinstance(result, LLMSecurityAnalyzer) @@ -508,7 +508,7 @@ def test_select_confirmation_policy_when_disabled_returns_never_confirm(): policy = service._select_confirmation_policy(confirmation_mode, security_analyzer) # Assert - from openhands.sdk.security.confirmation_policy import NeverConfirm + from openhands.sdk.security import NeverConfirm assert isinstance(policy, NeverConfirm) @@ -526,7 +526,7 @@ def test_select_confirmation_policy_llm_returns_confirm_risky(): policy = service._select_confirmation_policy(confirmation_mode, security_analyzer) # Assert - from openhands.sdk.security.confirmation_policy import ConfirmRisky + from openhands.sdk.security import ConfirmRisky assert isinstance(policy, ConfirmRisky) @@ -546,7 +546,7 @@ def test_select_confirmation_policy_non_llm_returns_always_confirm( policy = service._select_confirmation_policy(confirmation_mode, security_analyzer) # Assert - from openhands.sdk.security.confirmation_policy import AlwaysConfirm + from openhands.sdk.security import AlwaysConfirm assert isinstance(policy, AlwaysConfirm) diff --git a/tests/unit/app_server/test_sql_app_conversation_info_service.py b/tests/unit/app_server/test_sql_app_conversation_info_service.py index 48e9693641..6322dc27be 100644 --- a/tests/unit/app_server/test_sql_app_conversation_info_service.py +++ b/tests/unit/app_server/test_sql_app_conversation_info_service.py @@ -23,8 +23,7 @@ from openhands.app_server.app_conversation.sql_app_conversation_info_service imp from openhands.app_server.user.specifiy_user_context import SpecifyUserContext from openhands.app_server.utils.sql_utils import Base from openhands.integrations.service_types import ProviderType -from openhands.sdk.llm import MetricsSnapshot -from openhands.sdk.llm.utils.metrics import TokenUsage +from openhands.sdk.llm import MetricsSnapshot, TokenUsage from openhands.storage.data_models.conversation_metadata import ConversationTrigger # Note: org_id column exists but foreign key constraint is not enforced in tests diff --git a/tests/unit/app_server/test_webhook_router_parent_conversation.py b/tests/unit/app_server/test_webhook_router_parent_conversation.py index d57fb88739..fe2ca6bba0 100644 --- a/tests/unit/app_server/test_webhook_router_parent_conversation.py +++ b/tests/unit/app_server/test_webhook_router_parent_conversation.py @@ -24,7 +24,7 @@ from openhands.app_server.sandbox.sandbox_models import SandboxInfo, SandboxStat from openhands.app_server.user.specifiy_user_context import SpecifyUserContext from openhands.app_server.utils.sql_utils import Base from openhands.integrations.provider import ProviderType -from openhands.sdk.conversation.state import ConversationExecutionStatus +from openhands.sdk.conversation import ConversationExecutionStatus from openhands.storage.data_models.conversation_metadata import ConversationTrigger diff --git a/tests/unit/app_server/test_webhook_router_stats.py b/tests/unit/app_server/test_webhook_router_stats.py index 229eeb8e17..3384180a3b 100644 --- a/tests/unit/app_server/test_webhook_router_stats.py +++ b/tests/unit/app_server/test_webhook_router_stats.py @@ -22,9 +22,9 @@ from openhands.app_server.app_conversation.sql_app_conversation_info_service imp ) from openhands.app_server.user.specifiy_user_context import SpecifyUserContext from openhands.app_server.utils.sql_utils import Base -from openhands.sdk.conversation.conversation_stats import ConversationStats +from openhands.sdk import ConversationStats from openhands.sdk.event import ConversationStateUpdateEvent -from openhands.sdk.llm.utils.metrics import Metrics, TokenUsage +from openhands.sdk.llm import Metrics, TokenUsage # --------------------------------------------------------------------------- # Fixtures @@ -492,7 +492,7 @@ class TestOnEventStatsProcessing: # Set up process_stats_event to call update_conversation_statistics async def process_stats_event_side_effect(event, conversation_id): # Simulate what process_stats_event does - call update_conversation_statistics - from openhands.sdk.conversation.conversation_stats import ConversationStats + from openhands.sdk import ConversationStats if isinstance(event.value, dict): stats = ConversationStats.model_validate(event.value) diff --git a/tests/unit/server/data_models/test_conversation.py b/tests/unit/server/data_models/test_conversation.py index 3c84afd0c6..bef88a7b89 100644 --- a/tests/unit/server/data_models/test_conversation.py +++ b/tests/unit/server/data_models/test_conversation.py @@ -40,8 +40,8 @@ from openhands.integrations.service_types import ( TaskType, ) from openhands.runtime.runtime_status import RuntimeStatus -from openhands.sdk.conversation.state import ConversationExecutionStatus -from openhands.sdk.workspace.models import FileOperationResult +from openhands.sdk.conversation import ConversationExecutionStatus +from openhands.sdk.workspace import FileOperationResult from openhands.sdk.workspace.remote.async_remote_workspace import ( AsyncRemoteWorkspace, ) diff --git a/tests/unit/server/routes/test_conversation_routes.py b/tests/unit/server/routes/test_conversation_routes.py index 7a5a250cca..63b8b79fec 100644 --- a/tests/unit/server/routes/test_conversation_routes.py +++ b/tests/unit/server/routes/test_conversation_routes.py @@ -28,7 +28,7 @@ from openhands.core.config.mcp_config import MCPConfig, MCPStdioServerConfig from openhands.microagent.microagent import KnowledgeMicroagent, RepoMicroagent from openhands.microagent.types import MicroagentMetadata, MicroagentType from openhands.runtime.runtime_status import RuntimeStatus -from openhands.sdk.conversation.state import ConversationExecutionStatus +from openhands.sdk.conversation import ConversationExecutionStatus from openhands.server.data_models.agent_loop_info import AgentLoopInfo from openhands.server.data_models.conversation_info import ConversationStatus from openhands.server.data_models.conversation_info_result_set import (