From 41b33d723dfe2cdeeb1b26b8da00ee41d8992605 Mon Sep 17 00:00:00 2001 From: Shuchang Zheng Date: Tue, 22 Jul 2025 08:25:06 -0700 Subject: [PATCH] update login interface to support wait_for_completion (#3018) --- fern/openapi/skyvern_openapi.json | 655 ++++++------------ skyvern/client/__init__.py | 22 +- skyvern/client/client.py | 198 +++++- skyvern/client/types/__init__.py | 24 +- .../client/types/bitwarden_login_request.py | 77 -- skyvern/client/types/credential_response.py | 4 +- skyvern/client/types/credential_type.py | 5 - .../client/types/credential_type_output.py | 5 + skyvern/client/types/login_request_body.py | 82 --- .../types/one_password_login_request.py | 77 -- ...sdk_schemas_credentials_credential_type.py | 5 + skyvern/client/types/skyvern_login_request.py | 72 -- ...vern_schemas_run_blocks_credential_type.py | 5 + skyvern/library/skyvern.py | 31 +- 14 files changed, 447 insertions(+), 815 deletions(-) delete mode 100644 skyvern/client/types/bitwarden_login_request.py delete mode 100644 skyvern/client/types/credential_type.py create mode 100644 skyvern/client/types/credential_type_output.py delete mode 100644 skyvern/client/types/login_request_body.py delete mode 100644 skyvern/client/types/one_password_login_request.py create mode 100644 skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py delete mode 100644 skyvern/client/types/skyvern_login_request.py create mode 100644 skyvern/client/types/skyvern_schemas_run_blocks_credential_type.py diff --git a/fern/openapi/skyvern_openapi.json b/fern/openapi/skyvern_openapi.json index 98743c5d..550b0a8e 100644 --- a/fern/openapi/skyvern_openapi.json +++ b/fern/openapi/skyvern_openapi.json @@ -1736,26 +1736,7 @@ "content": { "application/json": { "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/SkyvernLoginRequest" - }, - { - "$ref": "#/components/schemas/BitwardenLoginRequest" - }, - { - "$ref": "#/components/schemas/OnePasswordLoginRequest" - } - ], - "discriminator": { - "propertyName": "credential_type", - "mapping": { - "skyvern": "#/components/schemas/SkyvernLoginRequest", - "bitwarden": "#/components/schemas/BitwardenLoginRequest", - "1password": "#/components/schemas/OnePasswordLoginRequest" - } - }, - "title": "Login Request" + "$ref": "#/components/schemas/LoginRequest" } } } @@ -1788,15 +1769,15 @@ "code-samples": [ { "sdk": "python", - "code": "# Login with password saved in Skyvern\nfrom skyvern import Skyvern\n\nskyvern = Skyvern(api_key=\"YOUR_API_KEY\")\nawait skyvern.login(credential_id=\"cred_123\")\n" + "code": "# Login with password saved in Skyvern\nfrom skyvern import Skyvern\n\nskyvern = Skyvern(api_key=\"YOUR_API_KEY\")\nawait skyvern.login(\n url=\"https://example.com\",\n credential_type=\"skyvern\",\n credential_id=\"cred_123\"),\n)\n" }, { "sdk": "python", - "code": "# Login with password saved in Bitwarden\nfrom skyvern import Skyvern\n\nskyvern = Skyvern(api_key=\"YOUR_API_KEY\")\n# Login with a Bitwarden collection and website url filter\nawait skyvern.login(bitwarden_collection_id=\"BITWARDEN COLLECTION ID\", url_filter=\"https://example.com\")\n\n# Login with a Bitwarden item\nawait skyvern.login(bitwarden_item_id=\"BITWARDEN ITEM ID\")\n" + "code": "# Login with password saved in Bitwarden\nfrom skyvern import Skyvern\n\nskyvern = Skyvern(api_key=\"YOUR_API_KEY\")\n# Login with a Bitwarden collection and website url filter\nawait skyvern.login(\n url=\"https://example.com\",\n credential_type=\"bitwarden\",\n bitwarden_collection_id=\"BITWARDEN COLLECTION ID\",\n)\n\n# Login with a Bitwarden item\nawait skyvern.login(\n url=\"https://example.com\",\n credential_type=\"bitwarden\",\n bitwarden_item_id=\"BITWARDEN ITEM ID\",\n)\n" }, { "sdk": "python", - "code": "# Login with password saved in 1Password\nfrom skyvern import Skyvern\n\nskyvern = Skyvern(api_key=\"YOUR_API_KEY\")\nawait skyvern.login(onepassword_vault_id=\"ONEPASSWORD VAULT ID\", onepassword_item_id=\"ONEPASSWORD ITEM ID\")\n" + "code": "# Login with password saved in 1Password\nfrom skyvern import Skyvern\n\nskyvern = Skyvern(api_key=\"YOUR_API_KEY\")\nawait skyvern.login(\n url=\"https://example.com\",\n credential_type=\"onepassword\",\n onepassword_vault_id=\"1PASSWORD VAULT ID\",\n onepassword_item_id=\"1PASSWORD ITEM ID\",\n)\n" } ] } @@ -2814,153 +2795,6 @@ ], "title": "BitwardenLoginCredentialParameterYAML" }, - "BitwardenLoginRequest": { - "properties": { - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Url", - "description": "Website url" - }, - "prompt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Prompt", - "description": "Login instructions. Skyvern has default prompt/instruction for login if this field is not provided." - }, - "webhook_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Webhook Url", - "description": "Webhook URL to send login status updates" - }, - "proxy_location": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProxyLocation" - }, - { - "type": "null" - } - ], - "description": "Proxy location to use" - }, - "totp_identifier": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Totp Identifier", - "description": "Identifier for TOTP (Time-based One-Time Password) if required" - }, - "totp_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Totp Url", - "description": "TOTP URL to fetch one-time passwords" - }, - "browser_session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Browser Session Id", - "description": "ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`" - }, - "extra_http_headers": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Extra Http Headers", - "description": "Additional HTTP headers to include in requests" - }, - "max_screenshot_scrolling_times": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Max Screenshot Scrolling Times", - "description": "Maximum number of times to scroll for screenshots" - }, - "credential_type": { - "type": "string", - "const": "bitwarden", - "title": "Credential Type", - "default": "bitwarden" - }, - "bitwarden_collection_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Bitwarden Collection Id", - "description": "Bitwarden collection ID" - }, - "bitwarden_item_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Bitwarden Item Id", - "description": "Bitwarden item ID" - } - }, - "type": "object", - "title": "BitwardenLoginRequest", - "description": "Login with password saved in Bitwarden" - }, "BitwardenSensitiveInformationParameter": { "properties": { "parameter_type": { @@ -3584,7 +3418,7 @@ ] }, "credential_type": { - "$ref": "#/components/schemas/CredentialType", + "$ref": "#/components/schemas/skyvern__forge__sdk__schemas__credentials__CredentialType", "description": "Type of credential to create" }, "credential": { @@ -3742,7 +3576,7 @@ "description": "The credential data" }, "credential_type": { - "$ref": "#/components/schemas/CredentialType", + "$ref": "#/components/schemas/CredentialType-Output", "description": "Type of the credential" }, "name": { @@ -3764,7 +3598,7 @@ "title": "CredentialResponse", "description": "Response model for credential operations." }, - "CredentialType": { + "CredentialType-Output": { "type": "string", "enum": [ "password", @@ -6021,6 +5855,195 @@ ], "title": "LoginBlockYAML" }, + "LoginRequest": { + "properties": { + "credential_type": { + "$ref": "#/components/schemas/skyvern__schemas__run_blocks__CredentialType", + "description": "Where to get the credential from" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url", + "description": "Website url" + }, + "prompt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Prompt", + "description": "Login instructions. Skyvern has default prompt/instruction for login if this field is not provided." + }, + "webhook_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Webhook Url", + "description": "Webhook URL to send login status updates" + }, + "proxy_location": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProxyLocation" + }, + { + "type": "null" + } + ], + "description": "Proxy location to use" + }, + "totp_identifier": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Totp Identifier", + "description": "Identifier for TOTP (Time-based One-Time Password) if required" + }, + "totp_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Totp Url", + "description": "TOTP URL to fetch one-time passwords" + }, + "browser_session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Browser Session Id", + "description": "ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`", + "examples": [ + "pbs_123456" + ] + }, + "extra_http_headers": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Extra Http Headers", + "description": "Additional HTTP headers to include in requests" + }, + "max_screenshot_scrolling_times": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Screenshot Scrolling Times", + "description": "Maximum number of times to scroll for screenshots" + }, + "credential_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Credential Id", + "description": "ID of the Skyvern credential to use for login.", + "examples": [ + "cred_123" + ] + }, + "bitwarden_collection_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Bitwarden Collection Id", + "description": "Bitwarden collection ID. You can find it in the Bitwarden collection URL. e.g. `https://vault.bitwarden.com/vaults/collection_id/items`" + }, + "bitwarden_item_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Bitwarden Item Id", + "description": "Bitwarden item ID" + }, + "onepassword_vault_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Onepassword Vault Id", + "description": "1Password vault ID" + }, + "onepassword_item_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Onepassword Item Id", + "description": "1Password item ID" + } + }, + "type": "object", + "required": [ + "credential_type" + ], + "title": "LoginRequest" + }, "NavigationBlock": { "properties": { "label": { @@ -6685,143 +6708,6 @@ ], "title": "OnePasswordCredentialParameterYAML" }, - "OnePasswordLoginRequest": { - "properties": { - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Url", - "description": "Website url" - }, - "prompt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Prompt", - "description": "Login instructions. Skyvern has default prompt/instruction for login if this field is not provided." - }, - "webhook_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Webhook Url", - "description": "Webhook URL to send login status updates" - }, - "proxy_location": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProxyLocation" - }, - { - "type": "null" - } - ], - "description": "Proxy location to use" - }, - "totp_identifier": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Totp Identifier", - "description": "Identifier for TOTP (Time-based One-Time Password) if required" - }, - "totp_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Totp Url", - "description": "TOTP URL to fetch one-time passwords" - }, - "browser_session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Browser Session Id", - "description": "ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`" - }, - "extra_http_headers": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Extra Http Headers", - "description": "Additional HTTP headers to include in requests" - }, - "max_screenshot_scrolling_times": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Max Screenshot Scrolling Times", - "description": "Maximum number of times to scroll for screenshots" - }, - "credential_type": { - "type": "string", - "const": "1password", - "title": "Credential Type", - "default": "1password" - }, - "onepassword_vault_id": { - "type": "string", - "title": "Onepassword Vault Id", - "description": "1Password vault ID." - }, - "onepassword_item_id": { - "type": "string", - "title": "Onepassword Item Id", - "description": "1Password item ID." - } - }, - "type": "object", - "required": [ - "onepassword_vault_id", - "onepassword_item_id" - ], - "title": "OnePasswordLoginRequest", - "description": "Login with password saved in 1Password" - }, "OutputParameter": { "properties": { "parameter_type": { @@ -7274,137 +7160,6 @@ ], "title": "SendEmailBlockYAML" }, - "SkyvernLoginRequest": { - "properties": { - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Url", - "description": "Website url" - }, - "prompt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Prompt", - "description": "Login instructions. Skyvern has default prompt/instruction for login if this field is not provided." - }, - "webhook_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Webhook Url", - "description": "Webhook URL to send login status updates" - }, - "proxy_location": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProxyLocation" - }, - { - "type": "null" - } - ], - "description": "Proxy location to use" - }, - "totp_identifier": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Totp Identifier", - "description": "Identifier for TOTP (Time-based One-Time Password) if required" - }, - "totp_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Totp Url", - "description": "TOTP URL to fetch one-time passwords" - }, - "browser_session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Browser Session Id", - "description": "ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`" - }, - "extra_http_headers": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Extra Http Headers", - "description": "Additional HTTP headers to include in requests" - }, - "max_screenshot_scrolling_times": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Max Screenshot Scrolling Times", - "description": "Maximum number of times to scroll for screenshots" - }, - "credential_type": { - "type": "string", - "const": "skyvern", - "title": "Credential Type", - "default": "skyvern" - }, - "credential_id": { - "type": "string", - "title": "Credential Id", - "description": "ID of the Skyvern credential to use for login." - } - }, - "type": "object", - "required": [ - "credential_id" - ], - "title": "SkyvernLoginRequest", - "description": "Login with password saved in Skyvern" - }, "TOTPCode": { "properties": { "totp_identifier": { @@ -11052,6 +10807,24 @@ "auto_generated" ], "title": "WorkflowStatus" + }, + "skyvern__forge__sdk__schemas__credentials__CredentialType": { + "type": "string", + "enum": [ + "password", + "credit_card" + ], + "title": "CredentialType", + "description": "Type of credential stored in the system." + }, + "skyvern__schemas__run_blocks__CredentialType": { + "type": "string", + "enum": [ + "skyvern", + "bitwarden", + "1password" + ], + "title": "CredentialType" } } }, diff --git a/skyvern/client/__init__.py b/skyvern/client/__init__.py index c2b9bcfa..91af53c1 100644 --- a/skyvern/client/__init__.py +++ b/skyvern/client/__init__.py @@ -22,7 +22,6 @@ from .types import ( BitwardenCreditCardDataParameterYaml, BitwardenLoginCredentialParameter, BitwardenLoginCredentialParameterYaml, - BitwardenLoginRequest, BitwardenSensitiveInformationParameter, BitwardenSensitiveInformationParameterYaml, BrowserSessionResponse, @@ -56,7 +55,7 @@ from .types import ( CredentialParameterYaml, CredentialResponse, CredentialResponseCredential, - CredentialType, + CredentialTypeOutput, CreditCardCredentialResponse, DownloadToS3Block, DownloadToS3BlockYaml, @@ -181,10 +180,6 @@ from .types import ( LoginBlockParametersItem_Output, LoginBlockParametersItem_Workflow, LoginBlockYaml, - LoginRequestBody, - LoginRequestBody_1Password, - LoginRequestBody_Bitwarden, - LoginRequestBody_Skyvern, NavigationBlock, NavigationBlockDataSchema, NavigationBlockParametersItem, @@ -202,7 +197,6 @@ from .types import ( NonEmptyPasswordCredential, OnePasswordCredentialParameter, OnePasswordCredentialParameterYaml, - OnePasswordLoginRequest, OutputParameter, OutputParameterYaml, PasswordCredentialResponse, @@ -213,7 +207,8 @@ from .types import ( RunStatus, SendEmailBlock, SendEmailBlockYaml, - SkyvernLoginRequest, + SkyvernForgeSdkSchemasCredentialsCredentialType, + SkyvernSchemasRunBlocksCredentialType, TaskBlock, TaskBlockDataSchema, TaskBlockParametersItem, @@ -395,7 +390,6 @@ __all__ = [ "BitwardenCreditCardDataParameterYaml", "BitwardenLoginCredentialParameter", "BitwardenLoginCredentialParameterYaml", - "BitwardenLoginRequest", "BitwardenSensitiveInformationParameter", "BitwardenSensitiveInformationParameterYaml", "BrowserSessionResponse", @@ -429,7 +423,7 @@ __all__ = [ "CredentialParameterYaml", "CredentialResponse", "CredentialResponseCredential", - "CredentialType", + "CredentialTypeOutput", "CreditCardCredentialResponse", "DownloadToS3Block", "DownloadToS3BlockYaml", @@ -555,10 +549,6 @@ __all__ = [ "LoginBlockParametersItem_Output", "LoginBlockParametersItem_Workflow", "LoginBlockYaml", - "LoginRequestBody", - "LoginRequestBody_1Password", - "LoginRequestBody_Bitwarden", - "LoginRequestBody_Skyvern", "NavigationBlock", "NavigationBlockDataSchema", "NavigationBlockParametersItem", @@ -577,7 +567,6 @@ __all__ = [ "NotFoundError", "OnePasswordCredentialParameter", "OnePasswordCredentialParameterYaml", - "OnePasswordLoginRequest", "OutputParameter", "OutputParameterYaml", "PasswordCredentialResponse", @@ -590,7 +579,8 @@ __all__ = [ "SendEmailBlockYaml", "Skyvern", "SkyvernEnvironment", - "SkyvernLoginRequest", + "SkyvernForgeSdkSchemasCredentialsCredentialType", + "SkyvernSchemasRunBlocksCredentialType", "TaskBlock", "TaskBlockDataSchema", "TaskBlockParametersItem", diff --git a/skyvern/client/client.py b/skyvern/client/client.py index ae152bb1..7b8a4755 100644 --- a/skyvern/client/client.py +++ b/skyvern/client/client.py @@ -28,9 +28,9 @@ from .errors.forbidden_error import ForbiddenError import datetime as dt from .types.totp_code import TotpCode from .types.credential_response import CredentialResponse -from .types.credential_type import CredentialType +from .types.skyvern_forge_sdk_schemas_credentials_credential_type import SkyvernForgeSdkSchemasCredentialsCredentialType from .types.create_credential_request_credential import CreateCredentialRequestCredential -from .types.login_request_body import LoginRequestBody +from .types.skyvern_schemas_run_blocks_credential_type import SkyvernSchemasRunBlocksCredentialType from .core.client_wrapper import AsyncClientWrapper # this is used as the default value for optional parameters @@ -1544,7 +1544,7 @@ class Skyvern: self, *, name: str, - credential_type: CredentialType, + credential_type: SkyvernForgeSdkSchemasCredentialsCredentialType, credential: CreateCredentialRequestCredential, request_options: typing.Optional[RequestOptions] = None, ) -> CredentialResponse: @@ -1556,7 +1556,7 @@ class Skyvern: name : str Name of the credential - credential_type : CredentialType + credential_type : SkyvernForgeSdkSchemasCredentialsCredentialType Type of credential to create credential : CreateCredentialRequestCredential @@ -1740,14 +1740,74 @@ class Skyvern: raise ApiError(status_code=_response.status_code, body=_response_json) def login( - self, *, request: LoginRequestBody, request_options: typing.Optional[RequestOptions] = None + self, + *, + credential_type: SkyvernSchemasRunBlocksCredentialType, + url: typing.Optional[str] = OMIT, + prompt: typing.Optional[str] = OMIT, + webhook_url: typing.Optional[str] = OMIT, + proxy_location: typing.Optional[ProxyLocation] = OMIT, + totp_identifier: typing.Optional[str] = OMIT, + totp_url: typing.Optional[str] = OMIT, + browser_session_id: typing.Optional[str] = OMIT, + extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = OMIT, + max_screenshot_scrolling_times: typing.Optional[int] = OMIT, + credential_id: typing.Optional[str] = OMIT, + bitwarden_collection_id: typing.Optional[str] = OMIT, + bitwarden_item_id: typing.Optional[str] = OMIT, + onepassword_vault_id: typing.Optional[str] = OMIT, + onepassword_item_id: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> WorkflowRunResponse: """ Log in to a website using either credential stored in Skyvern, Bitwarden or 1Password Parameters ---------- - request : LoginRequestBody + credential_type : SkyvernSchemasRunBlocksCredentialType + Where to get the credential from + + url : typing.Optional[str] + Website url + + prompt : typing.Optional[str] + Login instructions. Skyvern has default prompt/instruction for login if this field is not provided. + + webhook_url : typing.Optional[str] + Webhook URL to send login status updates + + proxy_location : typing.Optional[ProxyLocation] + Proxy location to use + + totp_identifier : typing.Optional[str] + Identifier for TOTP (Time-based One-Time Password) if required + + totp_url : typing.Optional[str] + TOTP URL to fetch one-time passwords + + browser_session_id : typing.Optional[str] + ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456` + + extra_http_headers : typing.Optional[typing.Dict[str, typing.Optional[str]]] + Additional HTTP headers to include in requests + + max_screenshot_scrolling_times : typing.Optional[int] + Maximum number of times to scroll for screenshots + + credential_id : typing.Optional[str] + ID of the Skyvern credential to use for login. + + bitwarden_collection_id : typing.Optional[str] + Bitwarden collection ID. You can find it in the Bitwarden collection URL. e.g. `https://vault.bitwarden.com/vaults/collection_id/items` + + bitwarden_item_id : typing.Optional[str] + Bitwarden item ID + + onepassword_vault_id : typing.Optional[str] + 1Password vault ID + + onepassword_item_id : typing.Optional[str] + 1Password item ID request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1759,24 +1819,39 @@ class Skyvern: Examples -------- - from skyvern import LoginRequestBody_Skyvern, Skyvern + from skyvern import Skyvern client = Skyvern( api_key="YOUR_API_KEY", x_api_key="YOUR_X_API_KEY", ) client.login( - request=LoginRequestBody_Skyvern( - credential_id="credential_id", - ), + credential_type="skyvern", ) """ _response = self._client_wrapper.httpx_client.request( "v1/run/tasks/login", method="POST", - json=convert_and_respect_annotation_metadata( - object_=request, annotation=LoginRequestBody, direction="write" - ), + json={ + "credential_type": credential_type, + "url": url, + "prompt": prompt, + "webhook_url": webhook_url, + "proxy_location": proxy_location, + "totp_identifier": totp_identifier, + "totp_url": totp_url, + "browser_session_id": browser_session_id, + "extra_http_headers": extra_http_headers, + "max_screenshot_scrolling_times": max_screenshot_scrolling_times, + "credential_id": credential_id, + "bitwarden_collection_id": bitwarden_collection_id, + "bitwarden_item_id": bitwarden_item_id, + "onepassword_vault_id": onepassword_vault_id, + "onepassword_item_id": onepassword_item_id, + }, + headers={ + "content-type": "application/json", + }, request_options=request_options, omit=OMIT, ) @@ -3450,7 +3525,7 @@ class AsyncSkyvern: self, *, name: str, - credential_type: CredentialType, + credential_type: SkyvernForgeSdkSchemasCredentialsCredentialType, credential: CreateCredentialRequestCredential, request_options: typing.Optional[RequestOptions] = None, ) -> CredentialResponse: @@ -3462,7 +3537,7 @@ class AsyncSkyvern: name : str Name of the credential - credential_type : CredentialType + credential_type : SkyvernForgeSdkSchemasCredentialsCredentialType Type of credential to create credential : CreateCredentialRequestCredential @@ -3672,14 +3747,74 @@ class AsyncSkyvern: raise ApiError(status_code=_response.status_code, body=_response_json) async def login( - self, *, request: LoginRequestBody, request_options: typing.Optional[RequestOptions] = None + self, + *, + credential_type: SkyvernSchemasRunBlocksCredentialType, + url: typing.Optional[str] = OMIT, + prompt: typing.Optional[str] = OMIT, + webhook_url: typing.Optional[str] = OMIT, + proxy_location: typing.Optional[ProxyLocation] = OMIT, + totp_identifier: typing.Optional[str] = OMIT, + totp_url: typing.Optional[str] = OMIT, + browser_session_id: typing.Optional[str] = OMIT, + extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = OMIT, + max_screenshot_scrolling_times: typing.Optional[int] = OMIT, + credential_id: typing.Optional[str] = OMIT, + bitwarden_collection_id: typing.Optional[str] = OMIT, + bitwarden_item_id: typing.Optional[str] = OMIT, + onepassword_vault_id: typing.Optional[str] = OMIT, + onepassword_item_id: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> WorkflowRunResponse: """ Log in to a website using either credential stored in Skyvern, Bitwarden or 1Password Parameters ---------- - request : LoginRequestBody + credential_type : SkyvernSchemasRunBlocksCredentialType + Where to get the credential from + + url : typing.Optional[str] + Website url + + prompt : typing.Optional[str] + Login instructions. Skyvern has default prompt/instruction for login if this field is not provided. + + webhook_url : typing.Optional[str] + Webhook URL to send login status updates + + proxy_location : typing.Optional[ProxyLocation] + Proxy location to use + + totp_identifier : typing.Optional[str] + Identifier for TOTP (Time-based One-Time Password) if required + + totp_url : typing.Optional[str] + TOTP URL to fetch one-time passwords + + browser_session_id : typing.Optional[str] + ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456` + + extra_http_headers : typing.Optional[typing.Dict[str, typing.Optional[str]]] + Additional HTTP headers to include in requests + + max_screenshot_scrolling_times : typing.Optional[int] + Maximum number of times to scroll for screenshots + + credential_id : typing.Optional[str] + ID of the Skyvern credential to use for login. + + bitwarden_collection_id : typing.Optional[str] + Bitwarden collection ID. You can find it in the Bitwarden collection URL. e.g. `https://vault.bitwarden.com/vaults/collection_id/items` + + bitwarden_item_id : typing.Optional[str] + Bitwarden item ID + + onepassword_vault_id : typing.Optional[str] + 1Password vault ID + + onepassword_item_id : typing.Optional[str] + 1Password item ID request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -3693,7 +3828,7 @@ class AsyncSkyvern: -------- import asyncio - from skyvern import AsyncSkyvern, LoginRequestBody_Skyvern + from skyvern import AsyncSkyvern client = AsyncSkyvern( api_key="YOUR_API_KEY", @@ -3703,9 +3838,7 @@ class AsyncSkyvern: async def main() -> None: await client.login( - request=LoginRequestBody_Skyvern( - credential_id="credential_id", - ), + credential_type="skyvern", ) @@ -3714,9 +3847,26 @@ class AsyncSkyvern: _response = await self._client_wrapper.httpx_client.request( "v1/run/tasks/login", method="POST", - json=convert_and_respect_annotation_metadata( - object_=request, annotation=LoginRequestBody, direction="write" - ), + json={ + "credential_type": credential_type, + "url": url, + "prompt": prompt, + "webhook_url": webhook_url, + "proxy_location": proxy_location, + "totp_identifier": totp_identifier, + "totp_url": totp_url, + "browser_session_id": browser_session_id, + "extra_http_headers": extra_http_headers, + "max_screenshot_scrolling_times": max_screenshot_scrolling_times, + "credential_id": credential_id, + "bitwarden_collection_id": bitwarden_collection_id, + "bitwarden_item_id": bitwarden_item_id, + "onepassword_vault_id": onepassword_vault_id, + "onepassword_item_id": onepassword_item_id, + }, + headers={ + "content-type": "application/json", + }, request_options=request_options, omit=OMIT, ) diff --git a/skyvern/client/types/__init__.py b/skyvern/client/types/__init__.py index e3948ac2..8b2c6df5 100644 --- a/skyvern/client/types/__init__.py +++ b/skyvern/client/types/__init__.py @@ -23,7 +23,6 @@ from .bitwarden_credit_card_data_parameter import BitwardenCreditCardDataParamet from .bitwarden_credit_card_data_parameter_yaml import BitwardenCreditCardDataParameterYaml from .bitwarden_login_credential_parameter import BitwardenLoginCredentialParameter from .bitwarden_login_credential_parameter_yaml import BitwardenLoginCredentialParameterYaml -from .bitwarden_login_request import BitwardenLoginRequest from .bitwarden_sensitive_information_parameter import BitwardenSensitiveInformationParameter from .bitwarden_sensitive_information_parameter_yaml import BitwardenSensitiveInformationParameterYaml from .browser_session_response import BrowserSessionResponse @@ -61,7 +60,7 @@ from .credential_parameter import CredentialParameter from .credential_parameter_yaml import CredentialParameterYaml from .credential_response import CredentialResponse from .credential_response_credential import CredentialResponseCredential -from .credential_type import CredentialType +from .credential_type_output import CredentialTypeOutput from .credit_card_credential_response import CreditCardCredentialResponse from .download_to_s3block import DownloadToS3Block from .download_to_s3block_yaml import DownloadToS3BlockYaml @@ -202,12 +201,6 @@ from .login_block_parameters_item import ( LoginBlockParametersItem_Workflow, ) from .login_block_yaml import LoginBlockYaml -from .login_request_body import ( - LoginRequestBody, - LoginRequestBody_1Password, - LoginRequestBody_Bitwarden, - LoginRequestBody_Skyvern, -) from .navigation_block import NavigationBlock from .navigation_block_data_schema import NavigationBlockDataSchema from .navigation_block_parameters_item import ( @@ -227,7 +220,6 @@ from .non_empty_credit_card_credential import NonEmptyCreditCardCredential from .non_empty_password_credential import NonEmptyPasswordCredential from .one_password_credential_parameter import OnePasswordCredentialParameter from .one_password_credential_parameter_yaml import OnePasswordCredentialParameterYaml -from .one_password_login_request import OnePasswordLoginRequest from .output_parameter import OutputParameter from .output_parameter_yaml import OutputParameterYaml from .password_credential_response import PasswordCredentialResponse @@ -238,7 +230,8 @@ from .run_engine import RunEngine from .run_status import RunStatus from .send_email_block import SendEmailBlock from .send_email_block_yaml import SendEmailBlockYaml -from .skyvern_login_request import SkyvernLoginRequest +from .skyvern_forge_sdk_schemas_credentials_credential_type import SkyvernForgeSdkSchemasCredentialsCredentialType +from .skyvern_schemas_run_blocks_credential_type import SkyvernSchemasRunBlocksCredentialType from .task_block import TaskBlock from .task_block_data_schema import TaskBlockDataSchema from .task_block_parameters_item import ( @@ -431,7 +424,6 @@ __all__ = [ "BitwardenCreditCardDataParameterYaml", "BitwardenLoginCredentialParameter", "BitwardenLoginCredentialParameterYaml", - "BitwardenLoginRequest", "BitwardenSensitiveInformationParameter", "BitwardenSensitiveInformationParameterYaml", "BrowserSessionResponse", @@ -465,7 +457,7 @@ __all__ = [ "CredentialParameterYaml", "CredentialResponse", "CredentialResponseCredential", - "CredentialType", + "CredentialTypeOutput", "CreditCardCredentialResponse", "DownloadToS3Block", "DownloadToS3BlockYaml", @@ -590,10 +582,6 @@ __all__ = [ "LoginBlockParametersItem_Output", "LoginBlockParametersItem_Workflow", "LoginBlockYaml", - "LoginRequestBody", - "LoginRequestBody_1Password", - "LoginRequestBody_Bitwarden", - "LoginRequestBody_Skyvern", "NavigationBlock", "NavigationBlockDataSchema", "NavigationBlockParametersItem", @@ -611,7 +599,6 @@ __all__ = [ "NonEmptyPasswordCredential", "OnePasswordCredentialParameter", "OnePasswordCredentialParameterYaml", - "OnePasswordLoginRequest", "OutputParameter", "OutputParameterYaml", "PasswordCredentialResponse", @@ -622,7 +609,8 @@ __all__ = [ "RunStatus", "SendEmailBlock", "SendEmailBlockYaml", - "SkyvernLoginRequest", + "SkyvernForgeSdkSchemasCredentialsCredentialType", + "SkyvernSchemasRunBlocksCredentialType", "TaskBlock", "TaskBlockDataSchema", "TaskBlockParametersItem", diff --git a/skyvern/client/types/bitwarden_login_request.py b/skyvern/client/types/bitwarden_login_request.py deleted file mode 100644 index ec01295d..00000000 --- a/skyvern/client/types/bitwarden_login_request.py +++ /dev/null @@ -1,77 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from ..core.pydantic_utilities import UniversalBaseModel -import typing -import pydantic -from .proxy_location import ProxyLocation -from ..core.pydantic_utilities import IS_PYDANTIC_V2 - - -class BitwardenLoginRequest(UniversalBaseModel): - """ - Login with password saved in Bitwarden - """ - - url: typing.Optional[str] = pydantic.Field(default=None) - """ - Website url - """ - - prompt: typing.Optional[str] = pydantic.Field(default=None) - """ - Login instructions. Skyvern has default prompt/instruction for login if this field is not provided. - """ - - webhook_url: typing.Optional[str] = pydantic.Field(default=None) - """ - Webhook URL to send login status updates - """ - - proxy_location: typing.Optional[ProxyLocation] = pydantic.Field(default=None) - """ - Proxy location to use - """ - - totp_identifier: typing.Optional[str] = pydantic.Field(default=None) - """ - Identifier for TOTP (Time-based One-Time Password) if required - """ - - totp_url: typing.Optional[str] = pydantic.Field(default=None) - """ - TOTP URL to fetch one-time passwords - """ - - browser_session_id: typing.Optional[str] = pydantic.Field(default=None) - """ - ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456` - """ - - extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = pydantic.Field(default=None) - """ - Additional HTTP headers to include in requests - """ - - max_screenshot_scrolling_times: typing.Optional[int] = pydantic.Field(default=None) - """ - Maximum number of times to scroll for screenshots - """ - - bitwarden_collection_id: typing.Optional[str] = pydantic.Field(default=None) - """ - Bitwarden collection ID - """ - - bitwarden_item_id: typing.Optional[str] = pydantic.Field(default=None) - """ - Bitwarden item ID - """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/skyvern/client/types/credential_response.py b/skyvern/client/types/credential_response.py index 9b4911c4..1d2a0cb5 100644 --- a/skyvern/client/types/credential_response.py +++ b/skyvern/client/types/credential_response.py @@ -3,7 +3,7 @@ from ..core.pydantic_utilities import UniversalBaseModel import pydantic from .credential_response_credential import CredentialResponseCredential -from .credential_type import CredentialType +from .credential_type_output import CredentialTypeOutput from ..core.pydantic_utilities import IS_PYDANTIC_V2 import typing @@ -23,7 +23,7 @@ class CredentialResponse(UniversalBaseModel): The credential data """ - credential_type: CredentialType = pydantic.Field() + credential_type: CredentialTypeOutput = pydantic.Field() """ Type of the credential """ diff --git a/skyvern/client/types/credential_type.py b/skyvern/client/types/credential_type.py deleted file mode 100644 index ccd719a4..00000000 --- a/skyvern/client/types/credential_type.py +++ /dev/null @@ -1,5 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -CredentialType = typing.Union[typing.Literal["password", "credit_card"], typing.Any] diff --git a/skyvern/client/types/credential_type_output.py b/skyvern/client/types/credential_type_output.py new file mode 100644 index 00000000..324d9238 --- /dev/null +++ b/skyvern/client/types/credential_type_output.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +CredentialTypeOutput = typing.Union[typing.Literal["password", "credit_card"], typing.Any] diff --git a/skyvern/client/types/login_request_body.py b/skyvern/client/types/login_request_body.py deleted file mode 100644 index 66883b33..00000000 --- a/skyvern/client/types/login_request_body.py +++ /dev/null @@ -1,82 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from __future__ import annotations -from ..core.pydantic_utilities import UniversalBaseModel -import typing -from .proxy_location import ProxyLocation -from ..core.pydantic_utilities import IS_PYDANTIC_V2 -import pydantic - - -class LoginRequestBody_Skyvern(UniversalBaseModel): - credential_type: typing.Literal["skyvern"] = "skyvern" - url: typing.Optional[str] = None - prompt: typing.Optional[str] = None - webhook_url: typing.Optional[str] = None - proxy_location: typing.Optional[ProxyLocation] = None - totp_identifier: typing.Optional[str] = None - totp_url: typing.Optional[str] = None - browser_session_id: typing.Optional[str] = None - extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None - max_screenshot_scrolling_times: typing.Optional[int] = None - credential_id: str - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class LoginRequestBody_Bitwarden(UniversalBaseModel): - credential_type: typing.Literal["bitwarden"] = "bitwarden" - url: typing.Optional[str] = None - prompt: typing.Optional[str] = None - webhook_url: typing.Optional[str] = None - proxy_location: typing.Optional[ProxyLocation] = None - totp_identifier: typing.Optional[str] = None - totp_url: typing.Optional[str] = None - browser_session_id: typing.Optional[str] = None - extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None - max_screenshot_scrolling_times: typing.Optional[int] = None - bitwarden_collection_id: typing.Optional[str] = None - bitwarden_item_id: typing.Optional[str] = None - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -class LoginRequestBody_1Password(UniversalBaseModel): - credential_type: typing.Literal["1password"] = "1password" - url: typing.Optional[str] = None - prompt: typing.Optional[str] = None - webhook_url: typing.Optional[str] = None - proxy_location: typing.Optional[ProxyLocation] = None - totp_identifier: typing.Optional[str] = None - totp_url: typing.Optional[str] = None - browser_session_id: typing.Optional[str] = None - extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None - max_screenshot_scrolling_times: typing.Optional[int] = None - onepassword_vault_id: str - onepassword_item_id: str - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow - - -LoginRequestBody = typing.Union[LoginRequestBody_Skyvern, LoginRequestBody_Bitwarden, LoginRequestBody_1Password] diff --git a/skyvern/client/types/one_password_login_request.py b/skyvern/client/types/one_password_login_request.py deleted file mode 100644 index be038697..00000000 --- a/skyvern/client/types/one_password_login_request.py +++ /dev/null @@ -1,77 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from ..core.pydantic_utilities import UniversalBaseModel -import typing -import pydantic -from .proxy_location import ProxyLocation -from ..core.pydantic_utilities import IS_PYDANTIC_V2 - - -class OnePasswordLoginRequest(UniversalBaseModel): - """ - Login with password saved in 1Password - """ - - url: typing.Optional[str] = pydantic.Field(default=None) - """ - Website url - """ - - prompt: typing.Optional[str] = pydantic.Field(default=None) - """ - Login instructions. Skyvern has default prompt/instruction for login if this field is not provided. - """ - - webhook_url: typing.Optional[str] = pydantic.Field(default=None) - """ - Webhook URL to send login status updates - """ - - proxy_location: typing.Optional[ProxyLocation] = pydantic.Field(default=None) - """ - Proxy location to use - """ - - totp_identifier: typing.Optional[str] = pydantic.Field(default=None) - """ - Identifier for TOTP (Time-based One-Time Password) if required - """ - - totp_url: typing.Optional[str] = pydantic.Field(default=None) - """ - TOTP URL to fetch one-time passwords - """ - - browser_session_id: typing.Optional[str] = pydantic.Field(default=None) - """ - ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456` - """ - - extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = pydantic.Field(default=None) - """ - Additional HTTP headers to include in requests - """ - - max_screenshot_scrolling_times: typing.Optional[int] = pydantic.Field(default=None) - """ - Maximum number of times to scroll for screenshots - """ - - onepassword_vault_id: str = pydantic.Field() - """ - 1Password vault ID. - """ - - onepassword_item_id: str = pydantic.Field() - """ - 1Password item ID. - """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py b/skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py new file mode 100644 index 00000000..54351d73 --- /dev/null +++ b/skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SkyvernForgeSdkSchemasCredentialsCredentialType = typing.Union[typing.Literal["password", "credit_card"], typing.Any] diff --git a/skyvern/client/types/skyvern_login_request.py b/skyvern/client/types/skyvern_login_request.py deleted file mode 100644 index 5d2d6d63..00000000 --- a/skyvern/client/types/skyvern_login_request.py +++ /dev/null @@ -1,72 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -from ..core.pydantic_utilities import UniversalBaseModel -import typing -import pydantic -from .proxy_location import ProxyLocation -from ..core.pydantic_utilities import IS_PYDANTIC_V2 - - -class SkyvernLoginRequest(UniversalBaseModel): - """ - Login with password saved in Skyvern - """ - - url: typing.Optional[str] = pydantic.Field(default=None) - """ - Website url - """ - - prompt: typing.Optional[str] = pydantic.Field(default=None) - """ - Login instructions. Skyvern has default prompt/instruction for login if this field is not provided. - """ - - webhook_url: typing.Optional[str] = pydantic.Field(default=None) - """ - Webhook URL to send login status updates - """ - - proxy_location: typing.Optional[ProxyLocation] = pydantic.Field(default=None) - """ - Proxy location to use - """ - - totp_identifier: typing.Optional[str] = pydantic.Field(default=None) - """ - Identifier for TOTP (Time-based One-Time Password) if required - """ - - totp_url: typing.Optional[str] = pydantic.Field(default=None) - """ - TOTP URL to fetch one-time passwords - """ - - browser_session_id: typing.Optional[str] = pydantic.Field(default=None) - """ - ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456` - """ - - extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = pydantic.Field(default=None) - """ - Additional HTTP headers to include in requests - """ - - max_screenshot_scrolling_times: typing.Optional[int] = pydantic.Field(default=None) - """ - Maximum number of times to scroll for screenshots - """ - - credential_id: str = pydantic.Field() - """ - ID of the Skyvern credential to use for login. - """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 - else: - - class Config: - frozen = True - smart_union = True - extra = pydantic.Extra.allow diff --git a/skyvern/client/types/skyvern_schemas_run_blocks_credential_type.py b/skyvern/client/types/skyvern_schemas_run_blocks_credential_type.py new file mode 100644 index 00000000..3a2cf41f --- /dev/null +++ b/skyvern/client/types/skyvern_schemas_run_blocks_credential_type.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SkyvernSchemasRunBlocksCredentialType = typing.Union[typing.Literal["skyvern", "bitwarden", "1password"], typing.Any] diff --git a/skyvern/library/skyvern.py b/skyvern/library/skyvern.py index 7c712e59..834e4e4d 100644 --- a/skyvern/library/skyvern.py +++ b/skyvern/library/skyvern.py @@ -469,8 +469,37 @@ class Skyvern(AsyncSkyvern): totp_url: str | None = None, browser_session_id: str | None = None, extra_http_headers: dict[str, str] | None = None, + wait_for_completion: bool = False, + timeout: float = DEFAULT_AGENT_TIMEOUT, ) -> None: - return + if not self._api_key: + raise ValueError( + "Local mode is not supported for run_workflow. Please instantiate Skyvern with an API key like this: Skyvern(api_key='your-api-key')" + ) + workflow_run = await super().login( + credential_type=credential_type, + url=url, + credential_id=credential_id, + bitwarden_collection_id=bitwarden_collection_id, + bitwarden_item_id=bitwarden_item_id, + onepassword_vault_id=onepassword_vault_id, + onepassword_item_id=onepassword_item_id, + prompt=prompt, + webhook_url=webhook_url, + proxy_location=proxy_location, + totp_identifier=totp_identifier, + totp_url=totp_url, + browser_session_id=browser_session_id, + extra_http_headers=extra_http_headers, + ) + if wait_for_completion: + async with asyncio.timeout(timeout): + while True: + workflow_run = await super().get_run(workflow_run.run_id) + if RunStatus(workflow_run.status).is_final(): + break + await asyncio.sleep(DEFAULT_AGENT_HEARTBEAT_INTERVAL) + return WorkflowRunResponse.model_validate(workflow_run.model_dump()) def from_run_to_task_run_response(run_obj: GetRunResponse) -> TaskRunResponse: