30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Mapping
|
|
from typing import Any
|
|
|
|
from core.helper.code_executor.code_executor import CodeExecutionError, CodeExecutor
|
|
from dify_graph.nodes.code.entities import CodeLanguage
|
|
from dify_graph.template_rendering import Jinja2TemplateRenderer, TemplateRenderError
|
|
|
|
|
|
class CodeExecutorJinja2TemplateRenderer(Jinja2TemplateRenderer):
|
|
"""Sandbox-backed Jinja2 renderer for workflow-owned node composition."""
|
|
|
|
def render_template(self, template: str, variables: Mapping[str, Any]) -> str:
|
|
try:
|
|
result = CodeExecutor.execute_workflow_code_template(
|
|
language=CodeLanguage.JINJA2,
|
|
code=template,
|
|
inputs=variables,
|
|
)
|
|
except Exception as exc:
|
|
if isinstance(exc, CodeExecutionError):
|
|
raise TemplateRenderError(str(exc)) from exc
|
|
raise
|
|
|
|
rendered = result.get("result")
|
|
if not isinstance(rendered, str):
|
|
raise TemplateRenderError("Template render result must be a string.")
|
|
return rendered
|