mirror of
https://github.com/langgenius/dify.git
synced 2026-09-24 23:22:26 +08:00
feat: wire workflow agent node runtime (#36437)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
autofix-ci[bot]
parent
56d4d54c16
commit
60cd346fa6
@@ -0,0 +1,59 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from core.workflow.nodes.agent_v2.validators import WorkflowAgentNodeValidator
|
||||
from models.agent import WorkflowAgentNodeBinding
|
||||
from models.agent_config_entities import WorkflowNodeJobConfig
|
||||
from models.workflow import Workflow
|
||||
|
||||
|
||||
class WorkflowAgentPublishService:
|
||||
"""Validate and freeze Workflow Agent v2 bindings during workflow publish."""
|
||||
|
||||
@classmethod
|
||||
def validate_agent_nodes_for_publish(cls, *, session: Session, draft_workflow: Workflow) -> None:
|
||||
WorkflowAgentNodeValidator.validate_published_workflow(session=session, workflow=draft_workflow)
|
||||
|
||||
@classmethod
|
||||
def validate_agent_nodes_for_draft_sync(cls, *, session: Session, draft_workflow: Workflow) -> None:
|
||||
WorkflowAgentNodeValidator.validate_draft_workflow(session=session, workflow=draft_workflow)
|
||||
|
||||
@classmethod
|
||||
def copy_agent_node_bindings_to_published(
|
||||
cls,
|
||||
*,
|
||||
session: Session,
|
||||
draft_workflow: Workflow,
|
||||
published_workflow: Workflow,
|
||||
) -> None:
|
||||
node_ids = {
|
||||
node_id for node_id, _node_data in WorkflowAgentNodeValidator.iter_agent_v2_nodes(draft_workflow.graph_dict)
|
||||
}
|
||||
if not node_ids:
|
||||
return
|
||||
|
||||
bindings = session.scalars(
|
||||
select(WorkflowAgentNodeBinding).where(
|
||||
WorkflowAgentNodeBinding.tenant_id == draft_workflow.tenant_id,
|
||||
WorkflowAgentNodeBinding.app_id == draft_workflow.app_id,
|
||||
WorkflowAgentNodeBinding.workflow_id == draft_workflow.id,
|
||||
WorkflowAgentNodeBinding.node_id.in_(node_ids),
|
||||
)
|
||||
).all()
|
||||
|
||||
for binding in bindings:
|
||||
copied = WorkflowAgentNodeBinding(
|
||||
tenant_id=binding.tenant_id,
|
||||
app_id=binding.app_id,
|
||||
workflow_id=published_workflow.id,
|
||||
node_id=binding.node_id,
|
||||
binding_type=binding.binding_type,
|
||||
agent_id=binding.agent_id,
|
||||
current_snapshot_id=binding.current_snapshot_id,
|
||||
node_job_config=WorkflowNodeJobConfig.model_validate(binding.node_job_config_dict),
|
||||
created_by=binding.created_by,
|
||||
updated_by=binding.updated_by,
|
||||
)
|
||||
session.add(copied)
|
||||
@@ -312,6 +312,13 @@ class WorkflowService:
|
||||
workflow.environment_variables = environment_variables
|
||||
workflow.conversation_variables = conversation_variables
|
||||
|
||||
from services.agent.workflow_publish_service import WorkflowAgentPublishService
|
||||
|
||||
WorkflowAgentPublishService.validate_agent_nodes_for_draft_sync(
|
||||
session=cast(Session, db.session),
|
||||
draft_workflow=workflow,
|
||||
)
|
||||
|
||||
# commit db session changes
|
||||
db.session.commit()
|
||||
|
||||
@@ -457,6 +464,13 @@ class WorkflowService:
|
||||
# validate graph structure
|
||||
self.validate_graph_structure(graph=draft_workflow.graph_dict)
|
||||
|
||||
from services.agent.workflow_publish_service import WorkflowAgentPublishService
|
||||
|
||||
WorkflowAgentPublishService.validate_agent_nodes_for_publish(
|
||||
session=session,
|
||||
draft_workflow=draft_workflow,
|
||||
)
|
||||
|
||||
# billing check
|
||||
if dify_config.BILLING_ENABLED:
|
||||
limit_info = BillingService.get_info(app_model.tenant_id)
|
||||
@@ -490,6 +504,11 @@ class WorkflowService:
|
||||
|
||||
# commit db session changes
|
||||
session.add(workflow)
|
||||
WorkflowAgentPublishService.copy_agent_node_bindings_to_published(
|
||||
session=session,
|
||||
draft_workflow=draft_workflow,
|
||||
published_workflow=workflow,
|
||||
)
|
||||
|
||||
# trigger app workflow events
|
||||
app_published_workflow_was_updated.send(app_model, published_workflow=workflow)
|
||||
|
||||
Reference in New Issue
Block a user