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
- Send generationType: 'create' for new generations or 'update' when passing chat history for an update.
- Omit the field entirely if you want the 'create' default — do not send null.
- 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
- Never send null for generationType — omit the key to get the default.
- Map any custom mode names onto create/update before sending.
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
- Invalid generated code config: {generated_code_config}
- Invalid input mode: {input_mode}
- No OpenAI, Anthropic, or Gemini API key found. Please add th
- --iou-threshold must be between 0 and 1
- No stack was provided
AI-assisted analysis of abi/screenshot-to-code@d026163f58 (2026-08-14).
Data as JSON: /api/errors/7eae2de15343d9f1.
Report an issue: GitHub.