script gen run code block using the block interface (#3401)
This commit is contained in:
@@ -4,6 +4,7 @@ import hashlib
|
||||
import importlib.util
|
||||
import json
|
||||
import os
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from typing import Any, cast
|
||||
|
||||
@@ -25,7 +26,8 @@ from skyvern.forge.sdk.core import skyvern_context
|
||||
from skyvern.forge.sdk.models import Step, StepStatus
|
||||
from skyvern.forge.sdk.schemas.files import FileInfo
|
||||
from skyvern.forge.sdk.schemas.tasks import Task, TaskOutput, TaskStatus
|
||||
from skyvern.forge.sdk.workflow.models.block import TaskBlock
|
||||
from skyvern.forge.sdk.workflow.models.block import CodeBlock, TaskBlock
|
||||
from skyvern.forge.sdk.workflow.models.parameter import PARAMETER_TYPE
|
||||
from skyvern.forge.sdk.workflow.models.workflow import Workflow
|
||||
from skyvern.schemas.runs import RunEngine
|
||||
from skyvern.schemas.scripts import CreateScriptResponse, FileEncoding, FileNode, ScriptFileCreate
|
||||
@@ -451,21 +453,17 @@ async def _update_workflow_block(
|
||||
|
||||
task_output = TaskOutput.from_task(updated_task, downloaded_files)
|
||||
final_output = task_output.model_dump()
|
||||
await app.DATABASE.update_workflow_run_block(
|
||||
workflow_run_block_id=workflow_run_block_id,
|
||||
organization_id=context.organization_id if context else None,
|
||||
status=status,
|
||||
failure_reason=failure_reason,
|
||||
output=final_output,
|
||||
)
|
||||
else:
|
||||
final_output = None
|
||||
await app.DATABASE.update_workflow_run_block(
|
||||
workflow_run_block_id=workflow_run_block_id,
|
||||
organization_id=context.organization_id if context else None,
|
||||
status=status,
|
||||
failure_reason=failure_reason,
|
||||
)
|
||||
|
||||
await app.DATABASE.update_workflow_run_block(
|
||||
workflow_run_block_id=workflow_run_block_id,
|
||||
organization_id=context.organization_id if context else None,
|
||||
status=status,
|
||||
failure_reason=failure_reason,
|
||||
output=final_output,
|
||||
)
|
||||
|
||||
await _record_output_parameter_value(
|
||||
context.workflow_run_id,
|
||||
context.workflow_id,
|
||||
@@ -1375,3 +1373,42 @@ def render_template(template: str, data: dict[str, Any] | None = None) -> str:
|
||||
template_data.update(workflow_run_context.values)
|
||||
|
||||
return jinja_template.render(template_data)
|
||||
|
||||
|
||||
# Non-task-based blocks
|
||||
async def run_code(
|
||||
code: str,
|
||||
label: str | None = None,
|
||||
parameters: list[PARAMETER_TYPE] | None = None,
|
||||
) -> dict[str, Any]:
|
||||
context = skyvern_context.ensure_context()
|
||||
workflow_id = context.workflow_id
|
||||
workflow_run_id = context.workflow_run_id
|
||||
organization_id = context.organization_id
|
||||
browser_session_id = context.browser_session_id
|
||||
if not workflow_id:
|
||||
raise Exception("Workflow ID is required")
|
||||
if not workflow_run_id:
|
||||
raise Exception("Workflow run ID is required")
|
||||
if not organization_id:
|
||||
raise Exception("Organization ID is required")
|
||||
workflow = await app.DATABASE.get_workflow(workflow_id=workflow_id, organization_id=organization_id)
|
||||
if not workflow:
|
||||
raise Exception("Workflow not found")
|
||||
label = label or f"block_{uuid.uuid4()}"
|
||||
output_parameter = workflow.get_output_parameter(label)
|
||||
if not output_parameter:
|
||||
raise Exception("Output parameter not found")
|
||||
|
||||
code_block = CodeBlock(
|
||||
code=code,
|
||||
label=label,
|
||||
parameters=parameters or [],
|
||||
output_parameter=output_parameter,
|
||||
)
|
||||
block_result = await code_block.execute_safe(
|
||||
workflow_run_id=workflow_run_id,
|
||||
organization_id=organization_id,
|
||||
browser_session_id=browser_session_id,
|
||||
)
|
||||
return cast(dict[str, Any], block_result.output_parameter_value)
|
||||
|
||||
Reference in New Issue
Block a user