{"record":{"id":"d5395ea1d747d352","repo":"invoke-ai/InvokeAI","slug":"unsupported-string-generator-type-generator-type","errorCode":null,"errorMessage":"Unsupported string generator type '{generator_type}'","messagePattern":"Unsupported string generator type '(.+?)'","errorType":"exception","errorClass":"UnsupportedWorkflowNodeError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/session_processor/workflow_call_batch.py","lineNumber":308,"sourceCode":"        split_values = _parse_split_values(str(value.get(\"input\", \"\")), str(value.get(\"splitOn\", \",\")))\n        return [int(v.strip()) for v in split_values if v.strip()]\n    raise UnsupportedWorkflowNodeError(f\"Unsupported integer generator type '{generator_type}'\")\n\n\ndef _resolve_string_generator(value: Mapping[str, Any]) -> list[str]:\n    generator_type = value.get(\"type\")\n    if generator_type == \"string_generator_parse_string\":\n        return [v for v in _parse_split_values(str(value.get(\"input\", \"\")), str(value.get(\"splitOn\", \",\"))) if v]\n    if generator_type == \"string_generator_dynamic_prompts_combinatorial\":\n        generator = CombinatorialPromptGenerator()\n        return list(generator.generate(str(value.get(\"input\", \"\")), max_prompts=int(value.get(\"maxPrompts\", 10))))\n    if generator_type == \"string_generator_dynamic_prompts_random\":\n        seed = value.get(\"seed\")\n        if seed is None:\n            seed = random.randint(0, 2**31 - 1)\n        generator = RandomPromptGenerator(seed=int(seed))\n        return list(generator.generate(str(value.get(\"input\", \"\")), num_images=int(value.get(\"count\", 10))))\n    raise UnsupportedWorkflowNodeError(f\"Unsupported string generator type '{generator_type}'\")\n\n\ndef _assert_user_can_access_board(board_id: str, services: Any, user_id: str | None) -> None:\n    if not user_id:\n        return\n\n    board_records = getattr(services, \"board_records\", None)\n    if board_records is None or not hasattr(board_records, \"get\"):\n        return\n\n    users = getattr(services, \"users\", None)\n    user = users.get(user_id) if users is not None and hasattr(users, \"get\") else None\n    is_admin = bool(user and getattr(user, \"is_admin\", False))\n    if is_admin:\n        return\n\n    try:\n        board_record = board_records.get(board_id)","sourceCodeStart":290,"sourceCodeEnd":326,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/session_processor/workflow_call_batch.py#L290-L326","documentation":"A string_generator node in a called batch child workflow declares a generator 'type' not implemented by _resolve_string_generator. Only string_generator_parse_string, string_generator_dynamic_prompts_combinatorial, and string_generator_dynamic_prompts_random are supported in this expansion path.","triggerScenarios":"Calling a saved workflow with a string_generator whose inputs.generator.value.type is absent, a typo (e.g. 'string_parser'), or a dynamicprompts variant not supported for child-workflow batch expansion.","commonSituations":"Hand-edited workflow JSON; workflows exported from newer InvokeAI versions with new string generator kinds; mixing generator config from the batch queue UI into saved child workflows.","solutions":["Use a supported type: string_generator_parse_string, string_generator_dynamic_prompts_combinatorial, or string_generator_dynamic_prompts_random","Fix the 'type' string in the generator input value","Pre-generate the strings and supply them as a direct list on the string_batch node","Upgrade InvokeAI if the generator type is available in a newer release"],"exampleFix":"// before\n{ \"type\": \"string_generator_dynamicprompts\", \"input\": \"{red|blue}\" }\n// after\n{ \"type\": \"string_generator_dynamic_prompts_combinatorial\", \"input\": \"{red|blue}\", \"maxPrompts\": 10 }","handlingStrategy":"validation","validationCode":"SUPPORTED_STRING_TYPES = {\"string_generator_parse_string\", \"string_generator_dynamic_prompts_combinatorial\", \"string_generator_dynamic_prompts_random\"}\nfor node in workflow.get(\"nodes\", []):\n    d = node.get(\"data\", {}) if isinstance(node, dict) else {}\n    if d.get(\"type\") == \"string_generator\":\n        t = d.get(\"inputs\", {}).get(\"generator\", {}).get(\"value\", {}).get(\"type\")\n        if t not in SUPPORTED_STRING_TYPES:\n            raise ValueError(f\"unsupported string generator type: {t!r}\")","typeGuard":"def is_supported_string_generator(value: object) -> bool:\n    return (isinstance(value, dict) and value.get(\"type\") in {\n        \"string_generator_parse_string\",\n        \"string_generator_dynamic_prompts_combinatorial\",\n        \"string_generator_dynamic_prompts_random\"})","tryCatchPattern":"try:\n    sessions = build_batch_child_workflow_sessions(...)\nexcept UnsupportedWorkflowNodeError as e:\n    m = re.search(r\"Unsupported string generator type '(.+?)'\", str(e))\n    if m:\n        workflow = expand_strings_client_side(workflow, m.group(1))\n        sessions = build_batch_child_workflow_sessions(...)\n    else:\n        raise","preventionTips":["Limit child-workflow string generators to parse_string or the two dynamic_prompts kinds","Lint generator type strings when saving workflows programmatically","Pre-generate prompt variants externally when needed","Upgrade the server if a generator type is newer than the running version"],"tags":["workflow","generator","unsupported-type","invokeai"],"backgroundTag":"unsupported-enum-value","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}