mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2026-04-28 19:50:42 +00:00
58 lines
2.9 KiB
Python
58 lines
2.9 KiB
Python
from typing import Any
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from skyvern.core.script_generations.script_skyvern_page import ScriptSkyvernPage, script_run_context_manager
|
|
from skyvern.core.script_generations.skyvern_page import RunContext, SkyvernPage
|
|
from skyvern.forge import app
|
|
from skyvern.forge.sdk.core import skyvern_context
|
|
from skyvern.forge.sdk.workflow.models.parameter import WorkflowParameterType
|
|
|
|
|
|
async def setup(
|
|
parameters: dict[str, Any],
|
|
generated_parameter_cls: type[BaseModel] | None = None,
|
|
browser_session_id: str | None = None,
|
|
) -> tuple[SkyvernPage, RunContext]:
|
|
# transform any secrets/credential parameters. For example, if there's only one credential in the parameters: {"cred_12345": "cred_12345"},
|
|
# it should be transformed to {"cred_12345": {"username": "secret_5fBoa_username", "password": "secret_5fBoa_password"}}
|
|
# context comes from app.WORKFLOW_CONTEXT_MANAGER.get_workflow_run_context(workflow_run_id)
|
|
context = skyvern_context.current()
|
|
if context and context.organization_id and context.workflow_run_id:
|
|
browser_session_id = browser_session_id or context.browser_session_id
|
|
workflow_run_context = app.WORKFLOW_CONTEXT_MANAGER.get_workflow_run_context(context.workflow_run_id)
|
|
parameters_in_workflow_context = workflow_run_context.parameters
|
|
for key in parameters:
|
|
if key in parameters_in_workflow_context:
|
|
parameter = parameters_in_workflow_context[key]
|
|
if parameter.workflow_parameter_type == WorkflowParameterType.CREDENTIAL_ID:
|
|
parameters[key] = workflow_run_context.values[key]
|
|
context.script_run_parameters.update(parameters)
|
|
skyvern_page = await ScriptSkyvernPage.create(browser_session_id=browser_session_id)
|
|
run_context = RunContext(
|
|
parameters=parameters,
|
|
page=skyvern_page,
|
|
# TODO: generate all parameters with llm here - then we can skip generating input text one by one in the fill/type methods
|
|
generated_parameters=generated_parameter_cls().model_dump() if generated_parameter_cls else None,
|
|
)
|
|
script_run_context_manager.set_run_context(run_context)
|
|
return skyvern_page, run_context
|
|
|
|
|
|
# async def transform_parameters(parameters: dict[str, Any] | BaseModel | None = None, generated_parameter_cls: type[BaseModel] | None = None) -> dict[str, Any] | None:
|
|
# if parameters is None:
|
|
# return None
|
|
|
|
# if generated_parameter_cls:
|
|
# if isinstance(parameters, dict):
|
|
# # TODO: use llm to generate
|
|
# return generated_parameter_cls.model_validate(parameters)
|
|
# if isinstance(parameters, BaseModel):
|
|
# return parameters
|
|
# return generated_parameter_cls.model_validate(parameters)
|
|
# else:
|
|
# if isinstance(parameters, dict):
|
|
# return parameters
|
|
# if isinstance(parameters, BaseModel):
|
|
# return parameters.model_dump()
|
|
# return parameters
|