fix(agent): switch roster node to inline (#37754)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
zyssyz123
2026-06-22 09:41:07 +00:00
committed by GitHub
co-authored by autofix-ci[bot]
parent 82d08851be
commit 99010dab3e
2 changed files with 144 additions and 0 deletions
+50
View File
@@ -830,6 +830,16 @@ class AgentComposerService:
) -> WorkflowAgentNodeBinding:
node_job = payload.node_job or WorkflowNodeJobConfig()
if binding:
if cls._is_start_from_scratch_request(binding=binding, payload=payload):
return cls._switch_roster_binding_to_inline_agent(
tenant_id=tenant_id,
app_id=app_id,
workflow_id=workflow_id,
node_id=node_id,
account_id=account_id,
binding=binding,
payload=payload,
)
binding.node_job_config = node_job
if payload.agent_soul is not None and binding.binding_type == WorkflowAgentBindingType.INLINE_AGENT:
current_snapshot = cls._require_version(
@@ -880,6 +890,46 @@ class AgentComposerService:
db.session.flush()
return binding
@classmethod
def _is_start_from_scratch_request(cls, *, binding: WorkflowAgentNodeBinding, payload: ComposerSavePayload) -> bool:
return (
binding.binding_type == WorkflowAgentBindingType.ROSTER_AGENT
and payload.binding is not None
and payload.binding.binding_type == WorkflowAgentBindingType.INLINE_AGENT.value
)
@classmethod
def _switch_roster_binding_to_inline_agent(
cls,
*,
tenant_id: str,
app_id: str,
workflow_id: str,
node_id: str,
account_id: str,
binding: WorkflowAgentNodeBinding,
payload: ComposerSavePayload,
) -> WorkflowAgentNodeBinding:
if payload.binding and (payload.binding.agent_id or payload.binding.current_snapshot_id):
raise ValueError("Start from Scratch must not provide an existing inline agent binding.")
agent_soul = payload.agent_soul or AgentSoulConfig()
agent = cls._create_workflow_only_agent(
tenant_id=tenant_id,
app_id=app_id,
workflow_id=workflow_id,
node_id=node_id,
account_id=account_id,
agent_soul=agent_soul,
)
binding.binding_type = WorkflowAgentBindingType.INLINE_AGENT
binding.agent_id = agent.id
binding.current_snapshot_id = agent.active_config_snapshot_id
binding.node_job_config = payload.node_job or binding.node_job_config
binding.updated_by = account_id
db.session.flush()
return binding
@classmethod
def _save_to_current_version(
cls,