import {z} from 'zod' export type PILImage = {format?: string | undefined, format_description?: string | undefined}; export type SpritePose = {animation_prompt?: string | undefined, margin_ratio?: number | undefined, margin_ratio_mode?: string | undefined, name?: string | undefined, prompt?: string | undefined}; export type Sprite3DRender = {style_id?: string | undefined, style_version?: number | undefined, style_params?: Record | undefined, params?: Record | undefined, perspective?: string | undefined, direction?: string | undefined, animation_name?: string | undefined, motion?: Record | undefined, mirror?: boolean | undefined, fps?: number | undefined, keep_horizontal_travel?: boolean | undefined, keep_vertical_travel?: boolean | undefined, pixel_block?: number | undefined, generated_model?: Record | undefined}; export type GameImage = {tags?: Array | undefined, id?: string | undefined, image_id?: string | undefined, url?: string | undefined, type?: string | undefined, final_score?: number | undefined, nsfw_prob?: number | undefined, similarity?: number | undefined, width?: number | undefined, height?: number | undefined, game_id?: string | undefined, hosted_filename?: string | undefined, icon?: boolean | undefined, targetSize?: number | undefined, seed?: number | undefined, embedded?: boolean | undefined, analysed?: boolean | undefined, image?: string | undefined, image_type?: string | undefined, prompt?: string | undefined, motion_prompt?: string | undefined, request_id?: string | undefined, hints?: Array | undefined, selected_genres?: Array | undefined, selected_colors?: Array | undefined, selected_style?: string | undefined, selected_perspective?: string | undefined, is_safe?: boolean | undefined, platform?: string | undefined, loading?: boolean | undefined, original_hints?: Array | undefined, genres?: Array | undefined, edit_mask?: string | undefined, edit_mode?: string | undefined, camera_rotation?: number | undefined, camera_elevation?: number | undefined, edit_mask_pil_image?: PILImage | undefined, pil_image?: PILImage | undefined, nsfw?: number | undefined, pose?: SpritePose | undefined, render_3d?: Sprite3DRender | undefined, pixel_grid?: (Array | null) | undefined, pixel_size?: number | undefined, model?: string | undefined, normals?: string | undefined}; export type GeneratedText = {id?: string | undefined, request_id?: string | undefined, image?: GameImage | undefined, images?: Array | undefined, context_keywords?: Array | undefined, text?: string | undefined, title?: string | undefined, type?: string | undefined, image_prompt?: string | undefined, final_score?: number | undefined}; export type Annotation = {start?: number | undefined, end?: number | undefined, label?: string | undefined, text?: string | undefined, label_probs?: ({feature?: number | undefined, junk?: number | undefined, mechanic?: number | undefined, theme?: number | undefined}) | undefined}; export type SimilarGame = {id?: string | undefined, similarity?: number | undefined}; export type GenerationsSearchResult = {similar_games?: Array | undefined}; export type PrometheusGameImage = {game_id?: string | undefined, hash?: number | undefined, id?: string | undefined, origin?: string | undefined, similarity?: number | undefined}; export type MediaElement = {type?: string | undefined, url?: string | undefined}; export type Game = {_id?: string | undefined, id?: string | undefined, source_id?: string | undefined, title?: string | undefined, short_description?: string | undefined, short_description_clean?: string | undefined, summary?: string | undefined, description?: string | undefined, description_clean?: string | undefined, description_annotations?: Array | undefined, user_rating_count?: number | undefined, user_rating?: number | undefined, developers?: Array | undefined, urls?: Array | undefined, release_date?: number | undefined, update_date?: number | undefined, icon?: GameImage | undefined, header?: GameImage | undefined, videos?: Array | undefined, screenshots?: Array | undefined, url?: Array | undefined, actual_genres?: Array | undefined, predicted_genres?: Array | undefined, augmented_genres?: Array | undefined, source?: string | undefined, price?: string | undefined, platforms?: Array | undefined, keywords?: Array | undefined, game_modes?: Array | undefined, genres?: Array | undefined, advisory_rating?: string | undefined}; export type PlotlyPlotData = {mode?: string | undefined}; export type PlotlyPlot = {data?: Array | undefined, layout?: PlotlyPlotData | undefined}; export type LudoScoreInsight = {tag?: string | undefined, text?: string | undefined}; export type LudoScoreMetric = {_max_similarity?: number | undefined, _min_similarity?: number | undefined, description?: string | undefined, key?: string | undefined, name?: string | undefined, score?: number | undefined, supporting_games_title?: string | undefined, supporting_games?: Array | undefined, core_metric?: boolean | undefined, plotly_plot?: PlotlyPlot | undefined, insights?: Array | undefined}; export type LudoScoreBadge = {description?: string | undefined, icon_url?: string | undefined, key?: string | undefined, name?: string | undefined}; export type LudoScore = {metrics?: Array | undefined, params?: string | undefined, score_text?: string | undefined, score_unit?: string | undefined, score?: number | undefined, timestamp?: number | undefined, country?: string | undefined, sources?: Array | undefined, version?: string | undefined, badge?: LudoScoreBadge | undefined, insights?: Array | undefined}; export type StepValue = {step?: string | undefined, description?: string | undefined, value?: string | undefined, score?: LudoScore | undefined}; export type GeneratedGame = {tags?: Array | undefined, id?: string | undefined, title?: string | undefined, summary?: string | undefined, text_raw?: string | undefined, genres?: Array | undefined, keywords?: Array | undefined, description?: string | undefined, description_raw?: string | undefined, description_annotations?: Array | undefined, search_results?: GenerationsSearchResult | undefined, images?: Array | undefined, screenshots?: Array | undefined, image?: GameImage | undefined, blending?: Array | undefined, blended_games?: Array | undefined, platform?: string | undefined, perspective?: string | undefined, platforms?: Array | undefined, sentence?: string | undefined, punchline?: string | undefined, art_style?: string | undefined, quality_score?: number | undefined, uniqueness_score?: number | undefined, final_score?: number | undefined, hints?: Array | undefined, request_id?: string | undefined, prompt?: string | undefined, selected_genres?: Array | undefined, mechanics?: Array | undefined, step_choices?: Array | undefined, score?: LudoScore | undefined, image_prompt?: string | undefined}; export type ThreeDGenerationParameters = {model?: ('prop' | 'hero') | undefined, rig?: boolean | undefined, rig_type?: ('general' | 'humanoid' | 'game' | 'humanoid_template' | 'humanoid_template_hands') | undefined, joint_naming?: ('smpl' | 'mixamo' | 'humanik' | 'unreal' | 'godot' | 'rigify' | 'vroid') | undefined, target_num_faces?: number | undefined, dynamic_simplification?: number | undefined, remeshing?: string | undefined, texture_size?: number | undefined, texture_type?: string | undefined, render_format?: string | undefined, render_video?: boolean | undefined}; export type AssetGeneration = {id?: string | undefined, rigged?: boolean | undefined, animatable?: boolean | undefined, seed?: number | undefined, images_b64?: Array | undefined, params_encrypted?: string | undefined, request_id?: string | undefined, video_b64?: string | undefined, mesh_video_b64?: string | undefined, snapshots_b64?: Array | undefined, model_b64?: string | undefined, binary_data_b64?: string | undefined, voxels_b64?: string | undefined, mask_snapshots_b64?: Array | undefined, depth_snapshots_b64?: Array | undefined, normal_snapshots_b64?: Array | undefined, textured?: boolean | undefined, view_azimuths?: Array | undefined, generation_model?: string | undefined, generation_parameters?: ThreeDGenerationParameters | undefined}; export type Animation3DClip = {_id: string, user_id: string, model_asset_id: string, clip_name?: string | undefined, prompt?: string | undefined, preset_id?: string | undefined, motion_id?: string | undefined, mirror?: boolean | undefined, mode?: ('rot_trans' | 'rot_only') | undefined, seed?: number | undefined, glb_url?: string | undefined, preview_url?: string | undefined, accepted?: boolean | undefined, motion?: number | undefined, fit_rmse?: number | undefined, date?: number | undefined, deleted?: boolean | undefined}; export type ThreeDAsset = {tags?: Array | undefined, asset?: AssetGeneration | undefined, image?: GameImage | undefined, back_image?: GameImage | undefined, sprite3d_look?: Record | undefined, api_model_url?: string | undefined, sprite3d_attachments?: Array> | undefined, animations?: Array | undefined}; export type GeneratedVideo = {tags?: Array | undefined, id?: string | undefined, original_prompt?: string | undefined, prompt?: string | undefined, url?: string | undefined, image?: GameImage | undefined, pil_image?: PILImage | undefined, seed?: number | undefined, duration?: number | undefined, has_audio?: boolean | undefined, model?: string | undefined, pixel_grid?: (Array | null) | undefined, reference_url?: string | undefined, reference_clip?: Record | undefined, crop_and_center_image?: boolean | undefined, middle_image?: GameImage | undefined, final_image?: GameImage | undefined, margin_ratio?: number | undefined, margin_ratio_horizontal?: number | undefined, margin_ratio_vertical?: number | undefined, motion_duration?: number | undefined, moderation_rewrite?: boolean | undefined}; export type PackAlignment = {description?: string | undefined, sizeHeightPx?: number | undefined, groundOffset?: number | undefined, horizontalOffset?: number | undefined}; export type Spritesheet = {tags?: Array | undefined, id?: string | undefined, audio_b64?: string | undefined, duration?: number | undefined, billed_duration?: number | undefined, start_timestamp?: number | undefined, end_timestamp?: number | undefined, num_frames?: number | undefined, num_cols?: number | undefined, num_rows?: number | undefined, max_num_frames?: number | undefined, margin_ratio?: number | undefined, margin_ratio_horizontal?: number | undefined, margin_ratio_vertical?: number | undefined, margin_ratio_mode?: string | undefined, target_frame_size?: number | undefined, loop?: boolean | undefined, bad_loop?: boolean | undefined, out_of_frame?: boolean | undefined, out_of_frame_edges?: Array | undefined, loop_score?: number | undefined, loop_detected?: boolean | undefined, frame_width?: number | undefined, frame_height?: number | undefined, pixel_block?: number | undefined, stats_encrypted?: string | undefined, crop?: boolean | undefined, original_prompt?: string | undefined, motion_prompt?: string | undefined, prompt?: string | undefined, seed?: number | undefined, sprite_sheet?: PILImage | undefined, sprite_sheet_b64?: string | undefined, sprite_sheet_raw_b64?: string | undefined, sprite_sheet_normals_b64?: string | undefined, sprite_sheet_watermarked_b64?: string | undefined, sprite_sheet_raw_watermarked_b64?: string | undefined, watermarked?: boolean | undefined, video?: GeneratedVideo | undefined, preview_video_b64?: string | undefined, first_frame_b64?: string | undefined, last_frame_b64?: string | undefined, image?: GameImage | undefined, middle_image?: GameImage | undefined, final_image?: GameImage | undefined, has_audio?: boolean | undefined, model?: string | undefined, is_edited?: boolean | undefined, generation_mode?: string | undefined, pixel_art_filter?: string | undefined, degraded?: boolean | undefined, use_pixel_grid?: boolean | undefined, label?: string | undefined, preview_scale?: number | undefined, pack_alignment?: PackAlignment | undefined, render_3d?: Sprite3DRender | undefined}; export type VoicePreset = {id?: string | undefined, language?: string | undefined, emotion?: string | undefined}; export type GeneratedAudio = {tags?: Array | undefined, id?: string | undefined, audio_b64?: string | undefined, original_prompt?: string | undefined, original_text?: string | undefined, prompt?: string | undefined, text?: string | undefined, sample_url?: string | undefined, seed?: number | undefined, type?: string | undefined, loop?: boolean | undefined, duration?: number | undefined, voice_preset?: VoicePreset | undefined, model?: string | undefined, delivery?: string | undefined, image?: GameImage | undefined}; export type GDDPlaceholder = {id?: string | undefined, type?: string | undefined}; export type GDDMedia = {id: string, type: 'image' | 'three_d_asset' | 'video' | 'spritesheet' | 'game_id' | 'audio', uploaded?: boolean | undefined, image?: GameImage | undefined, three_d_asset?: ThreeDAsset | undefined, video?: GeneratedVideo | undefined, spritesheet?: Spritesheet | undefined, audio?: GeneratedAudio | undefined, placeholder?: GDDPlaceholder | undefined, game_id?: string | undefined, loading?: boolean | undefined}; export type GDDElement = {id: string, type: string, title?: string | undefined, sub_title?: string | undefined, text?: string | undefined, mod_date?: number | undefined, media?: Array | undefined, loading?: number | undefined, pending?: boolean | undefined, collapsed?: boolean | undefined, country?: string | undefined}; export type GDD3 = {project_id?: string | undefined, title?: string | undefined, elements?: Array | undefined, icon?: GDDMedia | undefined, header?: GDDMedia | undefined, genres?: Array | undefined, platform?: string | undefined, country?: string | undefined, art_style?: string | undefined, perspective?: string | undefined, aspect_ratio?: string | undefined, step_choices?: Array | undefined, score?: LudoScore | undefined}; export type GenerateFilters = {n?: number | undefined, platforms?: Array | undefined, platform?: string | undefined, genres?: Array | undefined, creative_mode?: boolean | undefined, duration?: number | undefined}; export type GenerateNewPayload = {save_normals?: boolean | undefined, request_id?: string | undefined, model?: string | undefined, descriptions?: Array | undefined, game_ids?: Array | undefined, search_images?: number | undefined, image_type?: string | undefined, context?: string | undefined, art_style?: string | undefined, perspective?: string | undefined, components?: Array | undefined, generations?: Array | undefined, hints?: Array | undefined, gdds?: Array | undefined, context_gdd?: GDD3 | undefined, project_id?: string | undefined, filters?: GenerateFilters | undefined, previous_generations?: Array | undefined, initial_game_image?: GameImage | undefined, initial_generated_image?: GameImage | undefined, initial_image_file?: GameImage | undefined, back_image_file?: GameImage | undefined, middle_image_file?: GameImage | undefined, final_image_file?: GameImage | undefined, additional_input_images?: Array | undefined, mask_image?: string | undefined, strength?: number | undefined, aspect_ratio?: string | undefined, preserve_color?: boolean | undefined, preserve_composition?: boolean | undefined, preserve_details?: boolean | undefined, edit_mode?: string | undefined, camera_rotation?: number | undefined, camera_elevation?: number | undefined, loop?: boolean | undefined, crop?: boolean | undefined, frames?: number | undefined, frame_size?: number | undefined, use_pixel_grid?: boolean | undefined, margin_ratio?: number | undefined, margin_ratio_horizontal?: number | undefined, margin_ratio_vertical?: number | undefined, margin_ratio_mode?: string | undefined, spritesheet?: Spritesheet | undefined, pose?: SpritePose | undefined, generation_parameters?: ThreeDGenerationParameters | undefined, duration?: number | undefined, force?: boolean | undefined, prompt?: string | undefined}; export type CreateApiJobsGenerateSpriteArgs = {body: GenerateNewPayload}; export type CreateApiJobsGenerateSpriteOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const jobAcceptedResponse = z.object({jobId: z.string(), status: z.enum(["queued", "running", "succeeded", "failed", "canceled"]), queue_position: z.number().int().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Enqueue a sprite generation job (Roles: user) * * POST /jobs/generate-sprite */ export const createApiJobsGenerateSprite = async (args: CreateApiJobsGenerateSpriteArgs, options: CreateApiJobsGenerateSpriteOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/jobs/generate-sprite${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(jobAcceptedResponse, await res.json()) };