{"record":{"id":"86c2fa0f0ec80e30","repo":"invoke-ai/InvokeAI","slug":"invalid-call-saved-workflow-dynamic-input-field","errorCode":null,"errorMessage":"Invalid call_saved_workflow dynamic input field '${field_name}'","messagePattern":"Invalid call_saved_workflow dynamic input field '(.+?)'","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/app/invocations/call_saved_workflow.py","lineNumber":23,"sourceCode":"from invokeai.app.invocations.workflow_return import WorkflowReturnOutput\nfrom invokeai.app.services.shared.invocation_context import InvocationContext\nfrom invokeai.app.services.workflow_records.workflow_records_common import WorkflowCategory, WorkflowNotFoundError\n\nCALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX = \"saved_workflow_input::\"\n\n\ndef is_call_saved_workflow_dynamic_input(field_name: str) -> bool:\n    return field_name.startswith(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX)\n\n\ndef parse_call_saved_workflow_dynamic_input(field_name: str) -> tuple[str, str]:\n    if not is_call_saved_workflow_dynamic_input(field_name):\n        raise ValueError(f\"'{field_name}' is not a call_saved_workflow dynamic input field\")\n\n    raw_identifier = field_name.removeprefix(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX)\n    node_id, separator, input_field_name = raw_identifier.rpartition(\"::\")\n    if not separator or not node_id or not input_field_name:\n        raise ValueError(f\"Invalid call_saved_workflow dynamic input field '{field_name}'\")\n\n    return node_id, input_field_name\n\n\n@invocation(\n    \"call_saved_workflow\",\n    title=\"Call Saved Workflow\",\n    tags=[\"workflow\", \"saved\", \"library\"],\n    category=\"workflow\",\n    version=\"1.0.0\",\n    use_cache=False,\n    classification=Classification.Beta,\n)\nclass CallSavedWorkflowInvocation(BaseInvocation):\n    \"\"\"Displays and later executes against a selected saved workflow.\"\"\"\n\n    workflow_id: str = InputField(\n        default=\"\",","sourceCodeStart":5,"sourceCodeEnd":41,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/invocations/call_saved_workflow.py#L5-L41","documentation":"parse_call_saved_workflow_dynamic_input() raises this ValueError when the field name has the dynamic prefix but its remainder does not split on '::' into a non-empty node_id and input_field_name (rpartition returns no separator or empty parts). The encoded identifier is malformed.","triggerScenarios":"A dynamic field like 'prefix_nodeid_without_separator' or 'prefix_::' or 'prefix_node::' — the prefix is present but the node_id and/or input field name part is empty or the '::' separator is missing.","commonSituations":"Custom code building dynamic field names with wrong join token (e.g. single ':' or '.'); manual editing of saved workflows corrupting the encoded identifier; downstream node IDs or field names being empty strings when the field name was generated.","solutions":["Build dynamic field names as PREFIX + node_id + '::' + input_field_name, ensuring both parts are non-empty.","Validate the generated field name with is_call_saved_workflow_dynamic_input and a '::' split check before use.","Re-export/re-save the corrupted workflow from the workflow editor to regenerate correct field names."],"exampleFix":"// before\nname = PREFIX + node_id + \":\" + field_name  # wrong separator\n\n// after\nname = f\"{PREFIX}{node_id}::{field_name}\"  # both parts non-empty, '::' separator","handlingStrategy":"validation","validationCode":"raw = field_name.removeprefix(PREFIX)\nnode_id, sep, input_field = raw.rpartition(\"::\")\nassert sep and node_id and input_field, f\"malformed dynamic field: {field_name!r}\"","typeGuard":"def is_well_formed_dynamic_input(field_name: str) -> bool:\n    if not field_name.startswith(PREFIX):\n        return False\n    node_id, sep, input_field = field_name.removeprefix(PREFIX).rpartition(\"::\")\n    return bool(sep and node_id and input_field)","tryCatchPattern":"try:\n    node_id, field = parse_call_saved_workflow_dynamic_input(field_name)\nexcept ValueError:\n    logger.warning(\"malformed dynamic field %r\", field_name)","preventionTips":["Join encoded names with '::' exactly, never ':' or '.'","Reject empty node_id or field name when generating dynamic inputs","Re-save manually edited workflows to repair corrupted identifiers"],"tags":["valueerror","workflow","field-naming"],"backgroundTag":"invalid-argument-format","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}