mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2025-09-02 02:30:07 +00:00
116 lines
3.4 KiB
Python
116 lines
3.4 KiB
Python
import abc
|
|
import json
|
|
from datetime import datetime
|
|
from enum import StrEnum
|
|
from typing import Annotated, Literal, Union
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class ParameterType(StrEnum):
|
|
WORKFLOW = "workflow"
|
|
CONTEXT = "context"
|
|
AWS_SECRET = "aws_secret"
|
|
BITWARDEN_LOGIN_CREDENTIAL = "bitwarden_login_credential"
|
|
OUTPUT = "output"
|
|
|
|
|
|
class Parameter(BaseModel, abc.ABC):
|
|
# TODO (kerem): Should we also have organization_id here?
|
|
parameter_type: ParameterType
|
|
key: str
|
|
description: str | None = None
|
|
|
|
@classmethod
|
|
def get_subclasses(cls) -> tuple[type["Parameter"], ...]:
|
|
return tuple(cls.__subclasses__())
|
|
|
|
|
|
class AWSSecretParameter(Parameter):
|
|
parameter_type: Literal[ParameterType.AWS_SECRET] = ParameterType.AWS_SECRET
|
|
|
|
aws_secret_parameter_id: str
|
|
workflow_id: str
|
|
aws_key: str
|
|
|
|
created_at: datetime
|
|
modified_at: datetime
|
|
deleted_at: datetime | None = None
|
|
|
|
|
|
class BitwardenLoginCredentialParameter(Parameter):
|
|
parameter_type: Literal[ParameterType.BITWARDEN_LOGIN_CREDENTIAL] = ParameterType.BITWARDEN_LOGIN_CREDENTIAL
|
|
# parameter fields
|
|
bitwarden_login_credential_parameter_id: str
|
|
workflow_id: str
|
|
# bitwarden cli required fields
|
|
bitwarden_client_id_aws_secret_key: str
|
|
bitwarden_client_secret_aws_secret_key: str
|
|
bitwarden_master_password_aws_secret_key: str
|
|
# url to request the login credentials from bitwarden
|
|
url_parameter_key: str
|
|
|
|
created_at: datetime
|
|
modified_at: datetime
|
|
deleted_at: datetime | None = None
|
|
|
|
|
|
class WorkflowParameterType(StrEnum):
|
|
STRING = "string"
|
|
INTEGER = "integer"
|
|
FLOAT = "float"
|
|
BOOLEAN = "boolean"
|
|
JSON = "json"
|
|
|
|
def convert_value(self, value: str | None) -> str | int | float | bool | dict | list | None:
|
|
if value is None:
|
|
return None
|
|
if self == WorkflowParameterType.STRING:
|
|
return value
|
|
elif self == WorkflowParameterType.INTEGER:
|
|
return int(value)
|
|
elif self == WorkflowParameterType.FLOAT:
|
|
return float(value)
|
|
elif self == WorkflowParameterType.BOOLEAN:
|
|
return value.lower() in ["true", "1"]
|
|
elif self == WorkflowParameterType.JSON:
|
|
return json.loads(value)
|
|
|
|
|
|
class WorkflowParameter(Parameter):
|
|
parameter_type: Literal[ParameterType.WORKFLOW] = ParameterType.WORKFLOW
|
|
|
|
workflow_parameter_id: str
|
|
workflow_parameter_type: WorkflowParameterType
|
|
workflow_id: str
|
|
# the type of default_value will be determined by the workflow_parameter_type
|
|
default_value: str | int | float | bool | dict | list | None = None
|
|
|
|
created_at: datetime
|
|
modified_at: datetime
|
|
deleted_at: datetime | None = None
|
|
|
|
|
|
class ContextParameter(Parameter):
|
|
parameter_type: Literal[ParameterType.CONTEXT] = ParameterType.CONTEXT
|
|
|
|
source: WorkflowParameter
|
|
# value will be populated by the context manager
|
|
value: str | int | float | bool | dict | list | None = None
|
|
|
|
|
|
class OutputParameter(Parameter):
|
|
parameter_type: Literal[ParameterType.OUTPUT] = ParameterType.OUTPUT
|
|
|
|
output_parameter_id: str
|
|
workflow_id: str
|
|
|
|
created_at: datetime
|
|
modified_at: datetime
|
|
deleted_at: datetime | None = None
|
|
|
|
|
|
ParameterSubclasses = Union[
|
|
WorkflowParameter, ContextParameter, AWSSecretParameter, BitwardenLoginCredentialParameter, OutputParameter
|
|
]
|
|
PARAMETER_TYPE = Annotated[ParameterSubclasses, Field(discriminator="parameter_type")]
|