abi/screenshot-to-code · error · ValueError

Invalid generation type: {generation_type}

Error message

Invalid generation type: {generation_type}

What it means

Error emitted via throw_error in backend/routes/generate_code.py:335 when params['generationType'] (defaulting to 'create') is not 'create' or 'update'. The backend only supports creating a new project from a screenshot or updating an existing one; any other value is rejected.

Source

Thrown at backend/routes/generate_code.py:335

        # Base URL for OpenAI API
        openai_base_url: str | None = None
        # Disable user-specified OpenAI Base URL in prod
        if not IS_PROD:
            openai_base_url = self._get_from_settings_dialog_or_env(
                params, "openAiBaseURL", OPENAI_BASE_URL
            )
        if not openai_base_url:
            print("Using official OpenAI URL")

        # Feature preferences default to enabled for older clients.
        should_generate_images = bool(params.get("isImageGenerationEnabled", True))
        should_extract_assets = bool(params.get("isAssetExtractionEnabled", True))

        # Extract and validate generation type
        generation_type = params.get("generationType", "create")
        if generation_type not in ["create", "update"]:
            await self.throw_error(f"Invalid generation type: {generation_type}")
            raise ValueError(f"Invalid generation type: {generation_type}")
        generation_type = cast(Literal["create", "update"], generation_type)

        # Extract prompt content
        prompt: UserTurnInput = parse_prompt_content(params.get("prompt"))

        # Extract history (default to empty list)
        history: List[PromptHistoryMessage] = parse_prompt_history(
            params.get("history")
        )

        prompt = append_uploaded_asset_ids_to_prompt(prompt, self.asset_base_url)
        history = append_uploaded_asset_ids_to_history(history, self.asset_base_url)

        # Extract file state for agent edits
        raw_file_state = params.get("fileState")
        file_state: Dict[str, str] | None = None
        if isinstance(raw_file_state, dict):
            content = raw_file_state.get("content")

View on GitHub (pinned to d026163f58)

Solutions

  1. Send generationType: 'create' for new generations or 'update' when passing chat history for an update.
  2. Omit the field entirely if you want the 'create' default — do not send null.
  3. Implement edit/refine flows as 'update' with an appropriate prompt.

Example fix

// before
payload.generationType = mode === 'edit' ? 'edit' : 'create';

// after
payload.generationType = mode === 'update' ? 'update' : 'create';
Defensive patterns

Strategy: validation

Validate before calling

const GENERATION_TYPES = ['create', 'update'] as const;
if (!GENERATION_TYPES.includes(generationType)) {
  generationType = hasHistory ? 'update' : 'create';
}
if (generationType === null) delete payload.generationType; // rely on 'create' default

Type guard

function isGenerationType(v: unknown): v is 'create' | 'update' {
  return v === 'create' || v === 'update';
}

Try / catch

if (msg.type === 'error' && msg.message.startsWith('Invalid generation type')) {
  // coerce to 'create' or 'update' and resend
}

Prevention

When it happens

Trigger: WebSocket request with generationType: 'edit', 'refine', missing-then-defaulted incorrectly (e.g. null, which is not 'create'), or any third-party extension value.

Common situations: Clients written against a different tool's terminology; frontend sending null instead of omitting the field; custom workflows trying to invoke modes this backend does not have.

Related errors


AI-assisted analysis of abi/screenshot-to-code@d026163f58 (2026-08-14). Data as JSON: /api/errors/7eae2de15343d9f1. Report an issue: GitHub.