{"record":{"id":"9eebb613f5b35163","repo":"calesthio/OpenMontage","slug":"family-does-not-expose-generation-mode-operatio","errorCode":null,"errorMessage":"{family} does not expose generation_mode={operation!r} on Atlas Cloud","messagePattern":"(.+?) does not expose generation_mode=(.+?) on Atlas Cloud","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"tools/graphics/atlas_image.py","lineNumber":139,"sourceCode":"                str(inputs.get(\"model\", _DEFAULT_MODEL)),\n                str(inputs.get(\"generation_mode\", \"generate\")),\n            )\n        except ValueError:\n            return _DEFAULT_COST\n        return float(IMAGE_MODELS[model][\"cost_per_image\"])\n\n    def estimate_runtime(self, inputs: dict[str, Any]) -> float:\n        return 30.0\n\n    def _resolve_model(self, model: str, operation: str) -> str:\n        if model not in IMAGE_MODELS:\n            raise ValueError(\n                f\"Unsupported Atlas image model id {model!r}. Use get_info()['model_catalog'] for live routes.\"\n            )\n        family = IMAGE_MODELS[model][\"family\"]\n        route = IMAGE_ROUTES.get(family, {}).get(operation)\n        if not route:\n            raise ValueError(f\"{family} does not expose generation_mode={operation!r} on Atlas Cloud\")\n        return route\n\n    def _build_payload(self, inputs: dict[str, Any], model: str) -> dict[str, Any]:\n        spec = IMAGE_MODELS[model]\n        payload: dict[str, Any] = {\"model\": model, \"prompt\": inputs.get(\"prompt\", \"\")}\n        width = int(inputs.get(\"width\", 2048))\n        height = int(inputs.get(\"height\", 2048))\n        style = spec[\"size_style\"]\n\n        if style == \"star\":\n            payload[\"size\"] = f\"{width}*{height}\"\n        elif style == \"x\":\n            payload[\"size\"] = f\"{width}x{height}\"\n        elif style == \"ratio\":\n            payload[\"aspect_ratio\"] = inputs.get(\"aspect_ratio\") or atlas_client.aspect_ratio_from_size(\n                width, height, _COMMON_RATIOS\n            )\n        elif style == \"tier\":","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/calesthio/OpenMontage/blob/95e1c3d0ab93482159818560f6a8c8e866b9139f/tools/graphics/atlas_image.py#L121-L157","documentation":"ValueError raised by _resolve_model when the model's family exists in IMAGE_ROUTES but has no route for the requested generation_mode (operation). Each family supports only specific operations (generate, edit, etc.); asking an edit-only model to generate (or vice versa) fails here even though the model id itself is valid.","triggerScenarios":"Passing generation_mode='edit' with a text-to-image-only model, or generation_mode='generate' with an image-to-image/edit model — i.e. any (family, operation) pair absent from IMAGE_ROUTES.","commonSituations":"Copy-pasting parameter sets between models ('this worked for seedream, use the same for nano-banana'), assuming all models support edit/variation/inpaint, or defaulting generation_mode incorrectly per model.","solutions":["Check the family's supported modes in the tool's get_info() output / IMAGE_ROUTES table and set generation_mode accordingly.","Switch to a model in a family that supports the operation you need (e.g. an edit-capable model for image editing).","For edit operations remember most require source images as well (see the image-count validations).","Build a small wrapper that maps desired operation -> allowed models so callers cannot mismatch."],"exampleFix":"# before\ninputs = {\"model\": \"<t2i-only-id>\", \"generation_mode\": \"edit\", \"image_urls\": [u]}  # -> ValueError\n\n# after\ninputs = {\"model\": \"<edit-capable-id>\", \"generation_mode\": \"edit\", \"image_urls\": [u]}","handlingStrategy":"validation","validationCode":"family = IMAGE_MODELS[inputs[\"model\"]][\"family\"]\nsupported_ops = set(IMAGE_ROUTES.get(family, {}))\nassert inputs.get(\"generation_mode\", \"generate\") in supported_ops","typeGuard":"def supports_mode(family_routes: dict, family: str, mode: str) -> bool:\n    return family in family_routes and mode in family_routes[family]","tryCatchPattern":"try:\n    result = tool.run(inputs)\nexcept ValueError as e:\n    if \"does not expose generation_mode\" in str(e):\n        inputs[\"model\"] = pick_model_for_mode(IMAGE_ROUTES, inputs[\"generation_mode\"])\n        result = tool.run(inputs)\n    else:\n        raise","preventionTips":["Map each operation to its allowed model families in one lookup table in your code.","Never copy full parameter dicts between different model families.","Validate (model, generation_mode) pairs before submitting paid requests."],"tags":["atlas-cloud","image","generation-mode","validation"],"backgroundTag":null,"analyzedSha":"95e1c3d0ab93482159818560f6a8c8e866b9139f","analyzedAt":"2026-08-15T06:31:20.014Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}