{"record":{"id":"5e7a2273a4da297c","repo":"invoke-ai/InvokeAI","slug":"field-name-is-not-a-call-saved-workflow-dynam","errorCode":null,"errorMessage":"'${field_name}' is not a call_saved_workflow dynamic input field","messagePattern":"'(.+?)' is not a call_saved_workflow dynamic input field","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/app/invocations/call_saved_workflow.py","lineNumber":18,"sourceCode":"from typing import Any\n\nfrom invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation\nfrom invokeai.app.invocations.fields import InputField, UIType\nfrom 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)","sourceCodeStart":1,"sourceCodeEnd":36,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/invocations/call_saved_workflow.py#L1-L36","documentation":"parse_call_saved_workflow_dynamic_input() raises ValueError when given a field name that lacks the call_saved_workflow dynamic-field prefix. These special field names encode '<node_id>::<input_field_name>' and are generated for sub-workflow (call_saved_workflow) invocations; anything not starting with the prefix is not parseable.","triggerScenarios":"Calling parse_call_saved_workflow_dynamic_input on a plain input field name (e.g. 'image' or 'prompt') that was not generated with the dynamic prefix, e.g. from apply_workflow_inputs_to_graph / _build_compatibility_workflow_inputs iterating arbitrary workflow inputs.","commonSituations":"Passing regular workflow inputs to the compatibility layer which only accepts prefixed dynamic inputs; custom tooling building field names without the required CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX.","solutions":["Filter inputs through is_call_saved_workflow_dynamic_input() before parsing; skip or handle non-dynamic fields separately.","Construct the field name with the dynamic prefix: prefix + node_id + '::' + input_field_name.","Check callers (_build_compatibility_workflow_inputs, apply_workflow_inputs_to_workflow/graph) so only dynamic fields reach this parser."],"exampleFix":"// before\nnode_id, field = parse_call_saved_workflow_dynamic_input(name)  # ValueError on plain names\n\n// after\nif is_call_saved_workflow_dynamic_input(name):\n    node_id, field = parse_call_saved_workflow_dynamic_input(name)\nelse:\n    continue  # or handle as a plain input","handlingStrategy":"type-guard","validationCode":"CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX = \"call_saved_workflow_input_\"  # adjust to actual constant\nassert field_name.startswith(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX), f\"{field_name} is not a dynamic input\"","typeGuard":"def is_dynamic_input(field_name: str) -> bool:\n    return field_name.startswith(CALL_SAVED_WORKFLOW_DYNAMIC_FIELD_PREFIX)","tryCatchPattern":"try:\n    node_id, field = parse_call_saved_workflow_dynamic_input(field_name)\nexcept ValueError:\n    node_id, field = None, None  # not a dynamic field; handle as plain input","preventionTips":["Always check is_call_saved_workflow_dynamic_input before parsing","Generate dynamic field names only via the library's helpers","Keep plain workflow inputs on a separate code path"],"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"}