fix login schema (#3017)

This commit is contained in:
Shuchang Zheng
2025-07-22 07:39:17 -07:00
committed by GitHub
parent 51ce4e8627
commit 2dbab09425
2 changed files with 27 additions and 34 deletions

View File

@@ -85,6 +85,8 @@ async def login(
yaml_parameters = [] yaml_parameters = []
parameter_key = "credential" parameter_key = "credential"
if login_request.credential_type == CredentialType.skyvern: if login_request.credential_type == CredentialType.skyvern:
if not login_request.credential_id:
raise HTTPException(status_code=400, detail="credential_id is required to login with Skyvern credential")
credential = await app.DATABASE.get_credential(login_request.credential_id, organization.organization_id) credential = await app.DATABASE.get_credential(login_request.credential_id, organization.organization_id)
if not credential: if not credential:
raise HTTPException(status_code=404, detail=f"Credential {login_request.credential_id} not found") raise HTTPException(status_code=404, detail=f"Credential {login_request.credential_id} not found")
@@ -111,6 +113,14 @@ async def login(
) )
] ]
elif login_request.credential_type == CredentialType.onepassword: elif login_request.credential_type == CredentialType.onepassword:
if not login_request.onepassword_vault_id:
raise HTTPException(
status_code=400, detail="onepassword_vault_id is required to login with 1Password credential"
)
if not login_request.onepassword_item_id:
raise HTTPException(
status_code=400, detail="onepassword_item_id is required to login with 1Password credential"
)
yaml_parameters = [ yaml_parameters = [
OnePasswordCredentialParameterYAML( OnePasswordCredentialParameterYAML(
key=parameter_key, key=parameter_key,

View File

@@ -1,5 +1,4 @@
from enum import StrEnum from enum import StrEnum
from typing import Annotated, Literal, Union
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@@ -12,7 +11,8 @@ class CredentialType(StrEnum):
onepassword = "1password" onepassword = "1password"
class LoginRequestBase(BaseModel): class LoginRequest(BaseModel):
credential_type: CredentialType = Field(..., description="Where to get the credential from")
url: str | None = Field(default=None, description="Website url") url: str | None = Field(default=None, description="Website url")
prompt: str | None = Field( prompt: str | None = Field(
default=None, default=None,
@@ -25,7 +25,9 @@ class LoginRequestBase(BaseModel):
) )
totp_url: str | None = Field(default=None, description="TOTP URL to fetch one-time passwords") totp_url: str | None = Field(default=None, description="TOTP URL to fetch one-time passwords")
browser_session_id: str | None = Field( browser_session_id: str | None = Field(
default=None, description="ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`" default=None,
description="ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`",
examples=["pbs_123456"],
) )
extra_http_headers: dict[str, str] | None = Field( extra_http_headers: dict[str, str] | None = Field(
default=None, description="Additional HTTP headers to include in requests" default=None, description="Additional HTTP headers to include in requests"
@@ -34,37 +36,18 @@ class LoginRequestBase(BaseModel):
default=None, description="Maximum number of times to scroll for screenshots" default=None, description="Maximum number of times to scroll for screenshots"
) )
# Skyvern credential
credential_id: str | None = Field(
default=None, description="ID of the Skyvern credential to use for login.", examples=["cred_123"]
)
class SkyvernLoginRequest(LoginRequestBase): # Bitwarden credential
""" bitwarden_collection_id: str | None = Field(
Login with password saved in Skyvern default=None,
""" description="Bitwarden collection ID. You can find it in the Bitwarden collection URL. e.g. `https://vault.bitwarden.com/vaults/collection_id/items`",
)
credential_type: Literal[CredentialType.skyvern] = CredentialType.skyvern
credential_id: str = Field(..., description="ID of the Skyvern credential to use for login.")
class BitwardenLoginRequest(LoginRequestBase):
"""
Login with password saved in Bitwarden
"""
credential_type: Literal[CredentialType.bitwarden] = CredentialType.bitwarden
bitwarden_collection_id: str | None = Field(default=None, description="Bitwarden collection ID")
bitwarden_item_id: str | None = Field(default=None, description="Bitwarden item ID") bitwarden_item_id: str | None = Field(default=None, description="Bitwarden item ID")
# 1Password credential
class OnePasswordLoginRequest(LoginRequestBase): onepassword_vault_id: str | None = Field(default=None, description="1Password vault ID")
""" onepassword_item_id: str | None = Field(default=None, description="1Password item ID")
Login with password saved in 1Password
"""
credential_type: Literal[CredentialType.onepassword] = CredentialType.onepassword
onepassword_vault_id: str = Field(..., description="1Password vault ID.")
onepassword_item_id: str = Field(..., description="1Password item ID.")
LoginRequest = Annotated[
Union[SkyvernLoginRequest, BitwardenLoginRequest, OnePasswordLoginRequest],
Field(discriminator="credential_type"),
]