SDK: file uploading (public url only) (#3867)

This commit is contained in:
Stanislav Novosad
2025-11-07 15:21:40 -07:00
committed by GitHub
parent 581d6e5332
commit d1d0c9414b
14 changed files with 379 additions and 12 deletions

View File

@@ -12,6 +12,7 @@ class SdkActionType(str, Enum):
AI_CLICK = "ai_click"
AI_INPUT_TEXT = "ai_input_text"
AI_SELECT_OPTION = "ai_select_option"
AI_UPLOAD_FILE = "ai_upload_file"
AI_ACT = "ai_act"
EXTRACT = "extract"
@@ -22,6 +23,12 @@ class SdkActionBase(BaseModel):
type: str = Field(..., description="The type of action")
def get_navigation_goal(self) -> str | None:
return None
def get_navigation_payload(self) -> dict[str, Any] | None:
return None
# Specific action types
class ClickAction(SdkActionBase):
@@ -33,6 +40,12 @@ class ClickAction(SdkActionBase):
data: str | dict[str, Any] | None = Field(None, description="Additional context data")
timeout: float = Field(default=settings.BROWSER_ACTION_TIMEOUT_MS, description="Timeout in milliseconds")
def get_navigation_goal(self) -> str | None:
return self.intention
def get_navigation_payload(self) -> dict[str, Any] | None:
return self.data if isinstance(self.data, dict) else None
class InputTextAction(SdkActionBase):
"""Input text action parameters."""
@@ -46,6 +59,12 @@ class InputTextAction(SdkActionBase):
totp_url: str | None = Field(None, description="TOTP URL for input_text actions")
timeout: float = Field(default=settings.BROWSER_ACTION_TIMEOUT_MS, description="Timeout in milliseconds")
def get_navigation_goal(self) -> str | None:
return self.intention
def get_navigation_payload(self) -> dict[str, Any] | None:
return self.data if isinstance(self.data, dict) else None
class SelectOptionAction(SdkActionBase):
"""Select option action parameters."""
@@ -57,6 +76,35 @@ class SelectOptionAction(SdkActionBase):
data: str | dict[str, Any] | None = Field(None, description="Additional context data")
timeout: float = Field(default=settings.BROWSER_ACTION_TIMEOUT_MS, description="Timeout in milliseconds")
def get_navigation_goal(self) -> str | None:
return self.intention
def get_navigation_payload(self) -> dict[str, Any] | None:
return self.data if isinstance(self.data, dict) else None
class UploadFileAction(SdkActionBase):
"""Upload file action parameters."""
type: Literal["ai_upload_file"] = "ai_upload_file"
selector: str | None = Field(default="", description="CSS selector for the element")
file_url: str | None = Field(default="", description="File URL for upload")
intention: str = Field(default="", description="The intention or goal of the upload")
data: str | dict[str, Any] | None = Field(None, description="Additional context data")
timeout: float = Field(default=settings.BROWSER_ACTION_TIMEOUT_MS, description="Timeout in milliseconds")
def get_navigation_goal(self) -> str | None:
return self.intention
def get_navigation_payload(self) -> dict[str, Any] | None:
if self.data and not isinstance(self.data, dict):
return None
data = self.data or {}
if "files" not in data:
data["files"] = self.file_url
return data
class ActAction(SdkActionBase):
"""AI act action parameters."""
@@ -65,6 +113,12 @@ class ActAction(SdkActionBase):
intention: str = Field(default="", description="Natural language prompt for the action")
data: str | dict[str, Any] | None = Field(None, description="Additional context data")
def get_navigation_goal(self) -> str | None:
return self.intention
def get_navigation_payload(self) -> dict[str, Any] | None:
return self.data if isinstance(self.data, dict) else None
class ExtractAction(SdkActionBase):
"""Extract data action parameters."""
@@ -76,10 +130,16 @@ class ExtractAction(SdkActionBase):
intention: str | None = Field(None, description="The intention or goal of the extraction")
data: str | dict[str, Any] | None = Field(None, description="Additional context data")
def get_navigation_goal(self) -> str | None:
return self.intention
def get_navigation_payload(self) -> dict[str, Any] | None:
return self.data if isinstance(self.data, dict) else None
# Discriminated union of all action types
SdkAction = Annotated[
Union[ClickAction, InputTextAction, SelectOptionAction, ActAction, ExtractAction],
Union[ClickAction, InputTextAction, SelectOptionAction, UploadFileAction, ActAction, ExtractAction],
Field(discriminator="type"),
]