fix(SKY-9283): auto-route browser type from profile source (#5734)

This commit is contained in:
LawyZheng 2026-04-30 17:13:35 +08:00 committed by GitHub
parent 89400b0dad
commit 804f814097
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 64 additions and 0 deletions

View file

@ -0,0 +1,30 @@
"""add source_browser_type to browser_profiles
Revision ID: 696a7bba1ce6
Revises: a5fe08ea4990
Create Date: 2026-04-30T09:04:59.788467+00:00
"""
from typing import Sequence, Union
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "696a7bba1ce6"
down_revision: Union[str, None] = "a5fe08ea4990"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.add_column(
"browser_profiles",
sa.Column("source_browser_type", sa.String(), nullable=True),
)
def downgrade() -> None:
op.drop_column("browser_profiles", "source_browser_type")

View file

@ -991,6 +991,7 @@ class BrowserProfileModel(Base):
organization_id = Column(String, nullable=False)
name = Column(String, nullable=False)
description = Column(String, nullable=True)
source_browser_type = Column(String, nullable=True)
created_at = Column(DateTime, default=datetime.datetime.utcnow, nullable=False)
modified_at = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow, nullable=False)
deleted_at = Column(DateTime, nullable=True)

View file

@ -36,12 +36,14 @@ class BrowserSessionsRepository(BaseRepository):
organization_id: str,
name: str,
description: str | None = None,
source_browser_type: str | None = None,
) -> BrowserProfile:
async with self.Session() as session:
browser_profile = BrowserProfileModel(
organization_id=organization_id,
name=name,
description=description,
source_browser_type=source_browser_type,
)
session.add(browser_profile)
await session.commit()

View file

@ -319,11 +319,14 @@ async def _create_profile_from_session(
),
)
source_browser_type = browser_session.browser_type.value if browser_session.browser_type else None
try:
profile = await app.DATABASE.browser_sessions.create_browser_profile(
organization_id=organization_id,
name=name,
description=description,
source_browser_type=source_browser_type,
)
except IntegrityError as exc:
_handle_duplicate_profile_name(organization_id=organization_id, name=name, exc=exc)

View file

@ -10,6 +10,7 @@ class BrowserProfile(BaseModel):
organization_id: str
name: str
description: str | None = None
source_browser_type: str | None = None
created_at: datetime
modified_at: datetime
deleted_at: datetime | None = None

View file

@ -32,6 +32,13 @@ class PersistentBrowserType(StrEnum):
Chrome = "chrome"
StealthChromium = "stealth-chromium"
@classmethod
def from_source_browser_type(cls, value: str) -> "PersistentBrowserType | None":
try:
return cls(value)
except ValueError:
return None
class Extensions(StrEnum):
AdBlocker = "ad-blocker"

View file

@ -0,0 +1,20 @@
from skyvern.forge.sdk.schemas.persistent_browser_sessions import PersistentBrowserType
class TestPersistentBrowserTypeFromSourceBrowserType:
def test_chrome(self) -> None:
assert PersistentBrowserType.from_source_browser_type("chrome") == PersistentBrowserType.Chrome
def test_msedge(self) -> None:
assert PersistentBrowserType.from_source_browser_type("msedge") == PersistentBrowserType.MSEdge
def test_stealth_chromium(self) -> None:
assert (
PersistentBrowserType.from_source_browser_type("stealth-chromium") == PersistentBrowserType.StealthChromium
)
def test_unknown_returns_none(self) -> None:
assert PersistentBrowserType.from_source_browser_type("unknown-browser") is None
def test_empty_string_returns_none(self) -> None:
assert PersistentBrowserType.from_source_browser_type("") is None