mirror of
https://github.com/OpenHands/OpenHands.git
synced 2026-10-07 14:58:39 +08:00
refactor: move AppMode class to config_api/config_models.py (#14253)
Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
co-authored by
openhands
parent
49de7c8504
commit
2b59566836
@@ -4,10 +4,10 @@ from integrations.store_repo_utils import store_repositories_in_db
|
||||
from pydantic import SecretStr
|
||||
from server.auth.token_manager import TokenManager
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.github.github_service import GitHubService
|
||||
from openhands.app_server.integrations.service_types import ProviderType, Repository
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class SaaSGitHubService(GitHubService):
|
||||
|
||||
@@ -7,6 +7,7 @@ from server.auth.token_manager import TokenManager
|
||||
from storage.gitlab_webhook import GitlabWebhook, WebhookStatus
|
||||
from storage.gitlab_webhook_store import GitlabWebhookStore
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.gitlab.gitlab_service import GitLabService
|
||||
from openhands.app_server.integrations.service_types import (
|
||||
ProviderType,
|
||||
@@ -15,7 +16,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
RequestMethod,
|
||||
)
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class SaaSGitLabService(GitLabService):
|
||||
|
||||
@@ -3,9 +3,9 @@ import asyncio
|
||||
from pydantic import SecretStr
|
||||
from sqlalchemy import select
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.service_types import ProviderType
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
async def _user_has_gitlab_provider(user_id: str) -> bool:
|
||||
|
||||
@@ -22,9 +22,9 @@ from server.auth.constants import (
|
||||
)
|
||||
from server.constants import DEPLOYMENT_MODE
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.service_types import ProviderType
|
||||
from openhands.server.config.server_config import ServerConfig
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
def sign_token(payload: dict[str, object], jwt_secret: str, algorithm='HS256') -> str:
|
||||
|
||||
@@ -61,6 +61,7 @@ from openhands.app_server.config import (
|
||||
get_event_callback_service,
|
||||
resolve_provider_llm_base_url,
|
||||
)
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.errors import SandboxError
|
||||
from openhands.app_server.event.event_service import EventService
|
||||
from openhands.app_server.event_callback.event_callback_models import EventCallback
|
||||
@@ -105,7 +106,6 @@ from openhands.sdk.secret import LookupSecret, StaticSecret
|
||||
from openhands.sdk.settings import ACPAgentSettings
|
||||
from openhands.sdk.utils.paging import page_iterator
|
||||
from openhands.sdk.workspace.remote.async_remote_workspace import AsyncRemoteWorkspace
|
||||
from openhands.server.types import AppMode
|
||||
from openhands.tools.preset.default import (
|
||||
get_default_tools,
|
||||
)
|
||||
|
||||
@@ -28,6 +28,7 @@ from openhands.app_server.app_lifespan.app_lifespan_service import AppLifespanSe
|
||||
from openhands.app_server.app_lifespan.oss_app_lifespan_service import (
|
||||
OssAppLifespanService,
|
||||
)
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.config_api.llm_model_service import (
|
||||
LLMModelService,
|
||||
LLMModelServiceInjector,
|
||||
@@ -66,7 +67,6 @@ from openhands.app_server.web_client.web_client_config_injector import (
|
||||
WebClientConfigInjector,
|
||||
)
|
||||
from openhands.sdk.utils.models import OpenHandsModel
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
def get_default_persistence_dir() -> Path:
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
"""Config-related models for OpenHands App Server V1 API."""
|
||||
|
||||
from enum import Enum
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class AppMode(Enum):
|
||||
OPENHANDS = 'oss'
|
||||
SAAS = 'saas'
|
||||
|
||||
|
||||
class LLMModel(BaseModel):
|
||||
"""LLM Model object for API responses."""
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ from openhands.app_server.config import (
|
||||
get_global_config,
|
||||
get_sandbox_service,
|
||||
)
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.errors import AuthError
|
||||
from openhands.app_server.event.event_service import EventService
|
||||
from openhands.app_server.event_callback.event_callback_models import EventCallback
|
||||
@@ -50,7 +51,6 @@ from openhands.app_server.user_auth.user_auth import (
|
||||
)
|
||||
from openhands.sdk import ConversationExecutionStatus, Event
|
||||
from openhands.sdk.event import ConversationStateUpdateEvent
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
router = APIRouter(prefix='/webhooks', tags=['Webhooks'])
|
||||
event_service_dependency = depends_event_service()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
"""Repository operations for Azure DevOps integration."""
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.azure_devops.service.base import (
|
||||
AzureDevOpsMixinBase,
|
||||
)
|
||||
from openhands.app_server.integrations.service_types import ProviderType, Repository
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class AzureDevOpsReposMixin(AzureDevOpsMixinBase):
|
||||
|
||||
@@ -2,9 +2,9 @@ import re
|
||||
from typing import Any
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.bitbucket.service.base import BitBucketMixinBase
|
||||
from openhands.app_server.integrations.service_types import Repository, SuggestedTask
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class BitBucketReposMixin(BitBucketMixinBase):
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from typing import Any
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.bitbucket_data_center.service.base import (
|
||||
BitbucketDCMixinBase,
|
||||
)
|
||||
from openhands.app_server.integrations.service_types import Repository, SuggestedTask
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class BitbucketDCReposMixin(BitbucketDCMixinBase):
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.forgejo.service.base import ForgejoMixinBase
|
||||
from openhands.app_server.integrations.service_types import Repository
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class ForgejoReposMixin(ForgejoMixinBase):
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from datetime import datetime
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.github.service.base import GitHubMixinBase
|
||||
from openhands.app_server.integrations.service_types import (
|
||||
OwnerType,
|
||||
@@ -7,7 +8,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
Repository,
|
||||
)
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class GitHubReposMixin(GitHubMixinBase):
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.gitlab.service.base import GitLabMixinBase
|
||||
from openhands.app_server.integrations.service_types import (
|
||||
OwnerType,
|
||||
@@ -5,7 +6,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
Repository,
|
||||
)
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class GitLabReposMixin(GitLabMixinBase):
|
||||
|
||||
@@ -14,6 +14,7 @@ from pydantic import (
|
||||
SecretStr,
|
||||
)
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.azure_devops.azure_devops_service import (
|
||||
AzureDevOpsServiceImpl,
|
||||
)
|
||||
@@ -42,7 +43,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
)
|
||||
from openhands.app_server.utils.http_session import httpx_verify_option
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class ProviderToken(BaseModel):
|
||||
|
||||
@@ -6,7 +6,7 @@ from typing import Any, Protocol
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
from pydantic import BaseModel, SecretStr
|
||||
|
||||
from openhands.server.types import AppMode
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
|
||||
|
||||
class TokenResponse(BaseModel):
|
||||
|
||||
@@ -12,6 +12,7 @@ from openhands.app_server.config import (
|
||||
get_app_conversation_info_service,
|
||||
get_global_config,
|
||||
)
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.azure_devops.azure_devops_service import (
|
||||
AzureDevOpsServiceImpl,
|
||||
)
|
||||
@@ -36,7 +37,6 @@ from openhands.app_server.user_auth import (
|
||||
get_user_id,
|
||||
)
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
mcp_server = FastMCP('mcp', mask_error_details=True)
|
||||
|
||||
|
||||
@@ -23,10 +23,10 @@ from typing import TYPE_CHECKING
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
from openhands.app_server.config import get_global_config, get_sandbox_service
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.sandbox.sandbox_models import SandboxInfo, SandboxStatus
|
||||
from openhands.app_server.services.injector import InjectorState
|
||||
from openhands.app_server.user.specifiy_user_context import ADMIN, USER_CONTEXT_ATTR
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from openhands.app_server.user.user_context import UserContext
|
||||
|
||||
@@ -4,7 +4,7 @@ from fastapi import Depends, HTTPException, status
|
||||
from fastapi.security import APIKeyHeader
|
||||
|
||||
from openhands.app_server.config import get_global_config
|
||||
from openhands.server.types import AppMode
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
|
||||
_SESSION_API_KEY = os.getenv('SESSION_API_KEY')
|
||||
_SESSION_API_KEY_HEADER = APIKeyHeader(name='X-Session-API-Key', auto_error=False)
|
||||
|
||||
@@ -3,12 +3,12 @@ from datetime import datetime
|
||||
from pydantic import BaseModel, Field, model_validator
|
||||
|
||||
from openhands.agent_server.env_parser import DiscriminatedUnionMixin
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.service_types import ProviderType
|
||||
from openhands.app_server.web_client.web_client_deployment_mode import (
|
||||
DeploymentMode,
|
||||
get_deployment_mode,
|
||||
)
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class WebClientFeatureFlags(BaseModel):
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
# This module belongs to the old V0 web server. The V1 application server lives under openhands/app_server/.
|
||||
import os
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.utils.import_utils import get_impl
|
||||
from openhands.app_server.utils.logger import openhands_logger as logger
|
||||
from openhands.server.types import AppMode, ServerConfigInterface
|
||||
from openhands.server.types import ServerConfigInterface
|
||||
|
||||
|
||||
class ServerConfig(ServerConfigInterface):
|
||||
|
||||
@@ -7,15 +7,9 @@
|
||||
# Tag: Legacy-V0
|
||||
# This module belongs to the old V0 web server. The V1 application server lives under openhands/app_server/.
|
||||
from abc import ABC, abstractmethod
|
||||
from enum import Enum
|
||||
from typing import Any
|
||||
|
||||
|
||||
class AppMode(Enum):
|
||||
OPENHANDS = 'oss'
|
||||
SAAS = 'saas'
|
||||
|
||||
|
||||
class ServerConfigInterface(ABC):
|
||||
@abstractmethod
|
||||
def verify_config(self) -> None:
|
||||
|
||||
@@ -26,6 +26,7 @@ from openhands.app_server.app_conversation.app_conversation_models import (
|
||||
from openhands.app_server.app_conversation.live_status_app_conversation_service import (
|
||||
LiveStatusAppConversationService,
|
||||
)
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.provider import ProviderToken, ProviderType
|
||||
from openhands.app_server.integrations.service_types import SuggestedTask, TaskType
|
||||
from openhands.app_server.sandbox.sandbox_models import (
|
||||
@@ -47,7 +48,6 @@ from openhands.sdk.llm import LLM
|
||||
from openhands.sdk.secret import LookupSecret, StaticSecret
|
||||
from openhands.sdk.settings import AgentSettings, ConversationSettings
|
||||
from openhands.sdk.workspace.remote.async_remote_workspace import AsyncRemoteWorkspace
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
# True only on SDK versions that include PR #2984 (secrets acp_compatible=True).
|
||||
# When False, _build_acp_start_conversation_request skips the agent_context path.
|
||||
|
||||
@@ -135,7 +135,7 @@ class TestValidateSessionKey:
|
||||
mock_get.return_value.__aenter__ = AsyncMock(return_value=mock_svc)
|
||||
mock_get.return_value.__aexit__ = AsyncMock(return_value=False)
|
||||
|
||||
from openhands.server.types import AppMode
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
|
||||
mock_cfg.return_value.app_mode = AppMode.SAAS
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import pytest
|
||||
from fastapi import FastAPI, HTTPException, status
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.event_callback.webhook_router import (
|
||||
router as webhook_router,
|
||||
)
|
||||
@@ -23,7 +24,6 @@ from openhands.app_server.user.specifiy_user_context import (
|
||||
USER_CONTEXT_ATTR,
|
||||
SpecifyUserContext,
|
||||
)
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
class MockRequestState:
|
||||
|
||||
@@ -5,6 +5,7 @@ from unittest.mock import AsyncMock, patch
|
||||
import pytest
|
||||
from pydantic import SecretStr
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.bitbucket.bitbucket_service import (
|
||||
BitBucketService,
|
||||
)
|
||||
@@ -16,7 +17,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
from openhands.app_server.integrations.utils import validate_provider_token
|
||||
from openhands.app_server.secrets.secrets_router import check_provider_tokens
|
||||
from openhands.app_server.settings.settings_models import POSTProviderModel
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
# Provider Token Validation Tests
|
||||
|
||||
@@ -5,6 +5,7 @@ from unittest.mock import patch
|
||||
import pytest
|
||||
from pydantic import SecretStr
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.bitbucket.bitbucket_service import (
|
||||
BitBucketService,
|
||||
)
|
||||
@@ -12,7 +13,6 @@ from openhands.app_server.integrations.service_types import OwnerType, Repositor
|
||||
from openhands.app_server.integrations.service_types import (
|
||||
ProviderType as ServiceProviderType,
|
||||
)
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
@@ -6,11 +6,11 @@ from unittest.mock import patch
|
||||
import pytest
|
||||
from pydantic import SecretStr
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.bitbucket_data_center.bitbucket_dc_service import (
|
||||
BitbucketDCService,
|
||||
)
|
||||
from openhands.app_server.integrations.service_types import AuthenticationError, User
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
# ── init / BASE_URL ───────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ from unittest.mock import AsyncMock, patch
|
||||
import pytest
|
||||
from pydantic import SecretStr
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.bitbucket_data_center.bitbucket_dc_service import (
|
||||
BitbucketDCService,
|
||||
)
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
def make_service():
|
||||
|
||||
@@ -4,6 +4,7 @@ import httpx
|
||||
import pytest
|
||||
from pydantic import SecretStr
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.github.github_service import GitHubService
|
||||
from openhands.app_server.integrations.service_types import (
|
||||
AuthenticationError,
|
||||
@@ -12,7 +13,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
Repository,
|
||||
User,
|
||||
)
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
|
||||
@@ -6,6 +6,7 @@ from unittest.mock import patch
|
||||
import pytest
|
||||
from pydantic import SecretStr
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations import provider as provider_module
|
||||
from openhands.app_server.integrations.gitlab import (
|
||||
constants as gitlab_constants_module,
|
||||
@@ -17,7 +18,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
ProviderType,
|
||||
Repository,
|
||||
)
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
|
||||
@@ -3,9 +3,9 @@ from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.service_types import GitService
|
||||
from openhands.app_server.mcp.mcp_router import get_conversation_link
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
def test_mcp_server_no_stateless_http_deprecation_warning():
|
||||
|
||||
@@ -4,6 +4,7 @@ import httpx
|
||||
import pytest
|
||||
from pydantic import SecretStr
|
||||
|
||||
from openhands.app_server.config_api.config_models import AppMode
|
||||
from openhands.app_server.integrations.forgejo.forgejo_service import ForgejoService
|
||||
from openhands.app_server.integrations.service_types import (
|
||||
ProviderType,
|
||||
@@ -11,7 +12,6 @@ from openhands.app_server.integrations.service_types import (
|
||||
RequestMethod,
|
||||
User,
|
||||
)
|
||||
from openhands.server.types import AppMode
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
Reference in New Issue
Block a user