shorten random string for secret value (#3263)
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import copy
|
import copy
|
||||||
import uuid
|
|
||||||
from typing import TYPE_CHECKING, Any, Self
|
from typing import TYPE_CHECKING, Any, Self
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
@@ -38,6 +37,7 @@ from skyvern.forge.sdk.workflow.models.parameter import (
|
|||||||
WorkflowParameter,
|
WorkflowParameter,
|
||||||
WorkflowParameterType,
|
WorkflowParameterType,
|
||||||
)
|
)
|
||||||
|
from skyvern.utils.strings import generate_random_string
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRunParameter
|
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRunParameter
|
||||||
@@ -193,7 +193,7 @@ class WorkflowRunContext:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def generate_random_secret_id() -> str:
|
def generate_random_secret_id() -> str:
|
||||||
return f"secret_{uuid.uuid4()}"
|
return f"secret_{generate_random_string()}"
|
||||||
|
|
||||||
async def _get_credential_vault_and_item_ids(self, credential_id: str) -> tuple[str, str]:
|
async def _get_credential_vault_and_item_ids(self, credential_id: str) -> tuple[str, str]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -6,10 +6,8 @@ import asyncio
|
|||||||
import csv
|
import csv
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import random
|
|
||||||
import re
|
import re
|
||||||
import smtplib
|
import smtplib
|
||||||
import string
|
|
||||||
import textwrap
|
import textwrap
|
||||||
import uuid
|
import uuid
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
@@ -83,6 +81,7 @@ from skyvern.forge.sdk.workflow.models.parameter import (
|
|||||||
)
|
)
|
||||||
from skyvern.schemas.runs import RunEngine
|
from skyvern.schemas.runs import RunEngine
|
||||||
from skyvern.schemas.workflows import BlockResult, BlockStatus, BlockType, FileStorageType, FileType
|
from skyvern.schemas.workflows import BlockResult, BlockStatus, BlockType, FileStorageType, FileType
|
||||||
|
from skyvern.utils.strings import generate_random_string
|
||||||
from skyvern.utils.url_validators import prepend_scheme_and_validate_url
|
from skyvern.utils.url_validators import prepend_scheme_and_validate_url
|
||||||
from skyvern.webeye.browser_factory import BrowserState
|
from skyvern.webeye.browser_factory import BrowserState
|
||||||
from skyvern.webeye.utils.page import SkyvernFrame
|
from skyvern.webeye.utils.page import SkyvernFrame
|
||||||
@@ -91,11 +90,6 @@ LOG = structlog.get_logger()
|
|||||||
jinja_sandbox_env = SandboxedEnvironment()
|
jinja_sandbox_env = SandboxedEnvironment()
|
||||||
|
|
||||||
|
|
||||||
def _generate_random_string(length: int = 8) -> str:
|
|
||||||
"""Generate a random string for unique identifiers."""
|
|
||||||
return "".join(random.choices(string.ascii_lowercase + string.digits, k=length))
|
|
||||||
|
|
||||||
|
|
||||||
# Mapping from TaskV2Status to the corresponding BlockStatus. Declared once at
|
# Mapping from TaskV2Status to the corresponding BlockStatus. Declared once at
|
||||||
# import time so it is not recreated on each block execution.
|
# import time so it is not recreated on each block execution.
|
||||||
TASKV2_TO_BLOCK_STATUS: dict[TaskV2Status, BlockStatus] = {
|
TASKV2_TO_BLOCK_STATUS: dict[TaskV2Status, BlockStatus] = {
|
||||||
@@ -991,7 +985,7 @@ class ForLoopBlock(Block):
|
|||||||
|
|
||||||
# Update the loop variable reference to point to the extracted loop values
|
# Update the loop variable reference to point to the extracted loop values
|
||||||
# We'll use a temporary key that we can reference
|
# We'll use a temporary key that we can reference
|
||||||
temp_key = f"extracted_loop_values_{_generate_random_string()}"
|
temp_key = f"extracted_loop_values_{generate_random_string()}"
|
||||||
workflow_run_context.set_value(temp_key, loop_values)
|
workflow_run_context.set_value(temp_key, loop_values)
|
||||||
self.loop_variable_reference = temp_key
|
self.loop_variable_reference = temp_key
|
||||||
|
|
||||||
@@ -1119,7 +1113,7 @@ class ForLoopBlock(Block):
|
|||||||
|
|
||||||
output_param = OutputParameter(
|
output_param = OutputParameter(
|
||||||
output_parameter_id=str(uuid.uuid4()),
|
output_parameter_id=str(uuid.uuid4()),
|
||||||
key=f"natural_lang_extraction_{_generate_random_string()}",
|
key=f"natural_lang_extraction_{generate_random_string()}",
|
||||||
workflow_id=self.output_parameter.workflow_id,
|
workflow_id=self.output_parameter.workflow_id,
|
||||||
created_at=datetime.now(),
|
created_at=datetime.now(),
|
||||||
modified_at=datetime.now(),
|
modified_at=datetime.now(),
|
||||||
@@ -1128,7 +1122,7 @@ class ForLoopBlock(Block):
|
|||||||
)
|
)
|
||||||
|
|
||||||
return ExtractionBlock(
|
return ExtractionBlock(
|
||||||
label=f"natural_lang_extraction_{_generate_random_string()}",
|
label=f"natural_lang_extraction_{generate_random_string()}",
|
||||||
data_extraction_goal=extraction_goal,
|
data_extraction_goal=extraction_goal,
|
||||||
data_schema=data_schema,
|
data_schema=data_schema,
|
||||||
output_parameter=output_param,
|
output_parameter=output_param,
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import string
|
import string
|
||||||
from datetime import UTC, datetime
|
from datetime import UTC, datetime
|
||||||
from typing import Any
|
from typing import Any
|
||||||
@@ -58,6 +56,7 @@ from skyvern.schemas.workflows import (
|
|||||||
WorkflowStatus,
|
WorkflowStatus,
|
||||||
)
|
)
|
||||||
from skyvern.utils.prompt_engine import load_prompt_with_elements
|
from skyvern.utils.prompt_engine import load_prompt_with_elements
|
||||||
|
from skyvern.utils.strings import generate_random_string
|
||||||
from skyvern.webeye.browser_factory import BrowserState
|
from skyvern.webeye.browser_factory import BrowserState
|
||||||
from skyvern.webeye.scraper.scraper import ScrapedPage, scrape_website
|
from skyvern.webeye.scraper.scraper import ScrapedPage, scrape_website
|
||||||
from skyvern.webeye.utils.page import SkyvernFrame
|
from skyvern.webeye.utils.page import SkyvernFrame
|
||||||
@@ -1045,7 +1044,7 @@ async def _generate_loop_task(
|
|||||||
artifact_type=ArtifactType.SCREENSHOT_LLM,
|
artifact_type=ArtifactType.SCREENSHOT_LLM,
|
||||||
data=screenshot,
|
data=screenshot,
|
||||||
)
|
)
|
||||||
loop_random_string = _generate_random_string()
|
loop_random_string = generate_random_string()
|
||||||
label = f"extraction_task_for_loop_{loop_random_string}"
|
label = f"extraction_task_for_loop_{loop_random_string}"
|
||||||
loop_values_key = f"loop_values_{loop_random_string}"
|
loop_values_key = f"loop_values_{loop_random_string}"
|
||||||
extraction_block_yaml = ExtractionBlockYAML(
|
extraction_block_yaml = ExtractionBlockYAML(
|
||||||
@@ -1145,7 +1144,7 @@ async def _generate_loop_task(
|
|||||||
)
|
)
|
||||||
app.WORKFLOW_CONTEXT_MANAGER.add_context_parameter(workflow_run_id, url_value_context_parameter)
|
app.WORKFLOW_CONTEXT_MANAGER.add_context_parameter(workflow_run_id, url_value_context_parameter)
|
||||||
|
|
||||||
task_in_loop_label = f"task_in_loop_{_generate_random_string()}"
|
task_in_loop_label = f"task_in_loop_{generate_random_string()}"
|
||||||
context = skyvern_context.ensure_context()
|
context = skyvern_context.ensure_context()
|
||||||
task_in_loop_metadata_prompt = prompt_engine.load_prompt(
|
task_in_loop_metadata_prompt = prompt_engine.load_prompt(
|
||||||
"task_v2_generate_task_block",
|
"task_v2_generate_task_block",
|
||||||
@@ -1215,7 +1214,7 @@ async def _generate_loop_task(
|
|||||||
|
|
||||||
# use the output parameter of the extraction block to create the for loop block
|
# use the output parameter of the extraction block to create the for loop block
|
||||||
for_loop_yaml = ForLoopBlockYAML(
|
for_loop_yaml = ForLoopBlockYAML(
|
||||||
label=f"loop_{_generate_random_string()}",
|
label=f"loop_{generate_random_string()}",
|
||||||
loop_over_parameter_key=loop_for_context_parameter.key,
|
loop_over_parameter_key=loop_for_context_parameter.key,
|
||||||
loop_blocks=[block_yaml],
|
loop_blocks=[block_yaml],
|
||||||
)
|
)
|
||||||
@@ -1273,7 +1272,7 @@ async def _generate_extraction_task(
|
|||||||
|
|
||||||
# create OutputParameter for the data_extraction block
|
# create OutputParameter for the data_extraction block
|
||||||
data_schema: dict[str, Any] | list | None = generate_extraction_task_response.get("schema")
|
data_schema: dict[str, Any] | list | None = generate_extraction_task_response.get("schema")
|
||||||
label = f"data_extraction_{_generate_random_string()}"
|
label = f"data_extraction_{generate_random_string()}"
|
||||||
url: str | None = None
|
url: str | None = None
|
||||||
if not task_history:
|
if not task_history:
|
||||||
# data extraction is the very first block
|
# data extraction is the very first block
|
||||||
@@ -1312,7 +1311,7 @@ async def _generate_navigation_task(
|
|||||||
totp_identifier: str | None = None,
|
totp_identifier: str | None = None,
|
||||||
) -> tuple[NavigationBlock, list[BLOCK_YAML_TYPES], list[PARAMETER_YAML_TYPES]]:
|
) -> tuple[NavigationBlock, list[BLOCK_YAML_TYPES], list[PARAMETER_YAML_TYPES]]:
|
||||||
LOG.info("Generating navigation task", navigation_goal=navigation_goal, original_url=original_url)
|
LOG.info("Generating navigation task", navigation_goal=navigation_goal, original_url=original_url)
|
||||||
label = f"navigation_{_generate_random_string()}"
|
label = f"navigation_{generate_random_string()}"
|
||||||
navigation_block_yaml = NavigationBlockYAML(
|
navigation_block_yaml = NavigationBlockYAML(
|
||||||
label=label,
|
label=label,
|
||||||
url=original_url,
|
url=original_url,
|
||||||
@@ -1346,7 +1345,7 @@ async def _generate_goto_url_task(
|
|||||||
) -> tuple[UrlBlock, list[BLOCK_YAML_TYPES], list[PARAMETER_YAML_TYPES]]:
|
) -> tuple[UrlBlock, list[BLOCK_YAML_TYPES], list[PARAMETER_YAML_TYPES]]:
|
||||||
LOG.info("Generating goto url task", url=url)
|
LOG.info("Generating goto url task", url=url)
|
||||||
# create OutputParameter for the data_extraction block
|
# create OutputParameter for the data_extraction block
|
||||||
label = f"goto_url_{_generate_random_string()}"
|
label = f"goto_url_{generate_random_string()}"
|
||||||
|
|
||||||
url_block_yaml = UrlBlockYAML(
|
url_block_yaml = UrlBlockYAML(
|
||||||
label=label,
|
label=label,
|
||||||
@@ -1368,12 +1367,6 @@ async def _generate_goto_url_task(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _generate_random_string(length: int = 5) -> str:
|
|
||||||
# Use the current timestamp as the seed
|
|
||||||
random.seed(os.urandom(16))
|
|
||||||
return "".join(random.choices(RANDOM_STRING_POOL, k=length))
|
|
||||||
|
|
||||||
|
|
||||||
async def get_thought_timelines(*, task_v2_id: str, organization_id: str) -> list[WorkflowRunTimeline]:
|
async def get_thought_timelines(*, task_v2_id: str, organization_id: str) -> list[WorkflowRunTimeline]:
|
||||||
thoughts = await app.DATABASE.get_thoughts(
|
thoughts = await app.DATABASE.get_thoughts(
|
||||||
task_v2_id=task_v2_id,
|
task_v2_id=task_v2_id,
|
||||||
|
|||||||
11
skyvern/utils/strings.py
Normal file
11
skyvern/utils/strings.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import os
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
|
||||||
|
RANDOM_STRING_POOL = string.ascii_letters + string.digits
|
||||||
|
|
||||||
|
|
||||||
|
def generate_random_string(length: int = 5) -> str:
|
||||||
|
# Use the os.urandom(16) as the seed
|
||||||
|
random.seed(os.urandom(16))
|
||||||
|
return "".join(random.choices(RANDOM_STRING_POOL, k=length))
|
||||||
Reference in New Issue
Block a user