import {z} from 'zod' export type GetApiChatGddIdConversationsConversationIdArgs = {id: string, conversationId: string}; export type GetApiChatGddIdConversationsConversationIdOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const assistantFollowUp = z.object({text: z.string().optional(), type: z.string().optional()}); export const pILImage = z.object({format: z.string().optional(), format_description: z.string().optional()}); export const spritePose = z.object({animation_prompt: z.string().optional(), margin_ratio: z.number().optional(), margin_ratio_mode: z.string().optional(), name: z.string().optional(), prompt: z.string().optional()}); export const sprite3DRender = z.object({style_id: z.string().optional(), style_version: z.number().int().optional(), style_params: z.object({}).optional(), params: z.object({}).optional(), perspective: z.string().optional(), direction: z.string().optional(), animation_name: z.string().optional(), motion: z.object({}).optional(), mirror: z.boolean().optional(), fps: z.number().optional(), keep_horizontal_travel: z.boolean().optional(), keep_vertical_travel: z.boolean().optional(), pixel_block: z.number().int().optional(), generated_model: z.object({}).optional()}); export const gameImage = z.object({tags: z.array(z.string()).optional(), id: z.string().optional(), image_id: z.string().optional(), url: z.string().optional(), type: z.string().optional(), final_score: z.number().optional(), nsfw_prob: z.number().optional(), similarity: z.number().optional(), width: z.number().int().optional(), height: z.number().int().optional(), game_id: z.string().optional(), hosted_filename: z.string().optional(), icon: z.boolean().optional(), targetSize: z.number().int().optional(), seed: z.number().int().optional(), embedded: z.boolean().optional(), analysed: z.boolean().optional(), image: z.string().optional(), image_type: z.string().optional(), prompt: z.string().optional(), motion_prompt: z.string().optional(), request_id: z.string().optional(), hints: z.array(z.string()).optional(), selected_genres: z.array(z.string()).optional(), selected_colors: z.array(z.string()).optional(), selected_style: z.string().optional(), selected_perspective: z.string().optional(), is_safe: z.boolean().optional(), platform: z.string().optional(), loading: z.boolean().optional(), original_hints: z.array(z.string()).optional(), genres: z.array(z.string()).optional(), edit_mask: z.string().optional(), edit_mode: z.string().optional(), camera_rotation: z.number().int().gte(-180).lte(180).optional(), camera_elevation: z.number().int().gte(-30).lte(60).optional(), edit_mask_pil_image: pILImage.optional(), pil_image: pILImage.optional(), nsfw: z.number().optional(), pose: spritePose.optional(), render_3d: sprite3DRender.optional(), pixel_grid: z.array(z.number().int()).nullable().optional(), pixel_size: z.number().optional(), model: z.string().optional(), normals: z.string().optional()}); export const generatedVideo = z.object({tags: z.array(z.string()).optional(), id: z.string().optional(), original_prompt: z.string().optional(), prompt: z.string().optional(), url: z.string().optional(), image: gameImage.optional(), pil_image: pILImage.optional(), seed: z.number().int().optional(), duration: z.number().optional(), has_audio: z.boolean().optional(), model: z.string().optional(), pixel_grid: z.array(z.number().int()).nullable().optional(), reference_url: z.string().optional(), reference_clip: z.object({}).optional(), crop_and_center_image: z.boolean().optional(), middle_image: gameImage.optional(), final_image: gameImage.optional(), margin_ratio: z.number().optional(), margin_ratio_horizontal: z.number().optional(), margin_ratio_vertical: z.number().optional(), motion_duration: z.number().optional(), moderation_rewrite: z.boolean().optional()}); export const packAlignment = z.object({description: z.string().optional(), sizeHeightPx: z.number().optional(), groundOffset: z.number().optional(), horizontalOffset: z.number().optional()}); export const spritesheet = z.object({tags: z.array(z.string()).optional(), id: z.string().optional(), audio_b64: z.string().optional(), duration: z.number().optional(), billed_duration: z.number().optional(), start_timestamp: z.number().optional(), end_timestamp: z.number().optional(), num_frames: z.number().optional(), num_cols: z.number().optional(), num_rows: z.number().optional(), max_num_frames: z.number().optional(), margin_ratio: z.number().optional(), margin_ratio_horizontal: z.number().optional(), margin_ratio_vertical: z.number().optional(), margin_ratio_mode: z.string().optional(), target_frame_size: z.number().optional(), loop: z.boolean().optional(), bad_loop: z.boolean().optional(), out_of_frame: z.boolean().optional(), out_of_frame_edges: z.array(z.string()).optional(), loop_score: z.number().optional(), loop_detected: z.boolean().optional(), frame_width: z.number().optional(), frame_height: z.number().optional(), pixel_block: z.number().optional(), stats_encrypted: z.string().optional(), crop: z.boolean().optional(), original_prompt: z.string().optional(), motion_prompt: z.string().optional(), prompt: z.string().optional(), seed: z.number().optional(), sprite_sheet: pILImage.optional(), sprite_sheet_b64: z.string().optional(), sprite_sheet_raw_b64: z.string().optional(), sprite_sheet_normals_b64: z.string().optional(), sprite_sheet_watermarked_b64: z.string().optional(), sprite_sheet_raw_watermarked_b64: z.string().optional(), watermarked: z.boolean().optional(), video: generatedVideo.optional(), preview_video_b64: z.string().optional(), first_frame_b64: z.string().optional(), last_frame_b64: z.string().optional(), image: gameImage.optional(), middle_image: gameImage.optional(), final_image: gameImage.optional(), has_audio: z.boolean().optional(), model: z.string().optional(), is_edited: z.boolean().optional(), generation_mode: z.string().optional(), pixel_art_filter: z.string().optional(), degraded: z.boolean().optional(), use_pixel_grid: z.boolean().optional(), label: z.string().optional(), preview_scale: z.number().optional(), pack_alignment: packAlignment.optional(), render_3d: sprite3DRender.optional()}); export const assistantFunctionCall = z.object({args: z.object({}).optional(), name: z.string().optional()}); export const threeDGenerationParameters = z.object({model: z.enum(["prop", "hero"]).optional(), rig: z.boolean().optional(), rig_type: z.enum(["general", "humanoid", "game", "humanoid_template", "humanoid_template_hands"]).optional(), joint_naming: z.enum(["smpl", "mixamo", "humanik", "unreal", "godot", "rigify", "vroid"]).optional(), target_num_faces: z.number().int().optional(), dynamic_simplification: z.number().optional(), remeshing: z.string().optional(), texture_size: z.number().int().optional(), texture_type: z.string().optional(), render_format: z.string().optional(), render_video: z.boolean().optional()}); export const assetGeneration = z.object({id: z.string().optional(), rigged: z.boolean().optional(), animatable: z.boolean().optional(), seed: z.number().int().optional(), images_b64: z.array(z.string()).optional(), params_encrypted: z.string().optional(), request_id: z.string().optional(), video_b64: z.string().optional(), mesh_video_b64: z.string().optional(), snapshots_b64: z.array(z.string()).optional(), model_b64: z.string().optional(), binary_data_b64: z.string().optional(), voxels_b64: z.string().optional(), mask_snapshots_b64: z.array(z.string()).optional(), depth_snapshots_b64: z.array(z.string()).optional(), normal_snapshots_b64: z.array(z.string()).optional(), textured: z.boolean().optional(), view_azimuths: z.array(z.number()).optional(), generation_model: z.string().optional(), generation_parameters: threeDGenerationParameters.optional()}); export const animation3DClip = z.object({_id: z.string(), user_id: z.string(), model_asset_id: z.string(), clip_name: z.string().optional(), prompt: z.string().optional(), preset_id: z.string().optional(), motion_id: z.string().optional(), mirror: z.boolean().optional(), mode: z.enum(["rot_trans", "rot_only"]).optional(), seed: z.number().int().optional(), glb_url: z.string().optional(), preview_url: z.string().optional(), accepted: z.boolean().optional(), motion: z.number().optional(), fit_rmse: z.number().optional(), date: z.number().int().optional(), deleted: z.boolean().optional()}); export const threeDAsset = z.object({tags: z.array(z.string()).optional(), asset: assetGeneration.optional(), image: gameImage.optional(), back_image: gameImage.optional(), sprite3d_look: z.object({}).optional(), api_model_url: z.string().optional(), sprite3d_attachments: z.array(z.object({})).optional(), animations: z.array(animation3DClip).optional()}); export const annotation = z.object({start: z.number().int().optional(), end: z.number().int().optional(), label: z.string().optional(), text: z.string().optional(), label_probs: z.object({feature: z.number().optional(), junk: z.number().optional(), mechanic: z.number().optional(), theme: z.number().optional()}).optional()}); export const similarGame = z.object({id: z.string().optional(), similarity: z.number().optional()}); export const generationsSearchResult = z.object({similar_games: z.array(similarGame).optional()}); export const prometheusGameImage = z.object({game_id: z.string().optional(), hash: z.number().int().optional(), id: z.string().optional(), origin: z.string().optional(), similarity: z.number().optional()}); export const mediaElement = z.object({type: z.string().optional(), url: z.string().optional()}); export const game = z.object({_id: z.string().optional(), id: z.string().optional(), source_id: z.string().optional(), title: z.string().optional(), short_description: z.string().optional(), short_description_clean: z.string().optional(), summary: z.string().optional(), description: z.string().optional(), description_clean: z.string().optional(), description_annotations: z.array(annotation).optional(), user_rating_count: z.number().int().optional(), user_rating: z.number().optional(), developers: z.array(z.string()).optional(), urls: z.array(z.string()).optional(), release_date: z.number().int().optional(), update_date: z.number().int().optional(), icon: gameImage.optional(), header: gameImage.optional(), videos: z.array(mediaElement).optional(), screenshots: z.array(gameImage).optional(), url: z.array(z.string()).optional(), actual_genres: z.array(z.string()).optional(), predicted_genres: z.array(z.string()).optional(), augmented_genres: z.array(z.string()).optional(), source: z.string().optional(), price: z.string().optional(), platforms: z.array(z.string()).optional(), keywords: z.array(z.string()).optional(), game_modes: z.array(z.string()).optional(), genres: z.array(z.string()).optional(), advisory_rating: z.string().optional()}); export const generatedText = z.object({id: z.string().optional(), request_id: z.string().optional(), image: gameImage.optional(), images: z.array(gameImage).optional(), context_keywords: z.array(z.string()).optional(), text: z.string().optional(), title: z.string().optional(), type: z.string().optional(), image_prompt: z.string().optional(), final_score: z.number().optional()}); export const plotlyPlotData = z.object({mode: z.string().optional()}); export const plotlyPlot = z.object({data: z.array(plotlyPlotData).optional(), layout: plotlyPlotData.optional()}); export const ludoScoreInsight = z.object({tag: z.string().optional(), text: z.string().optional()}); export const ludoScoreMetric = z.object({_max_similarity: z.number().optional(), _min_similarity: z.number().optional(), description: z.string().optional(), key: z.string().optional(), name: z.string().optional(), score: z.number().optional(), supporting_games_title: z.string().optional(), supporting_games: z.array(z.string()).optional(), core_metric: z.boolean().optional(), plotly_plot: plotlyPlot.optional(), insights: z.array(ludoScoreInsight).optional()}); export const ludoScoreBadge = z.object({description: z.string().optional(), icon_url: z.string().optional(), key: z.string().optional(), name: z.string().optional()}); export const ludoScore = z.object({metrics: z.array(ludoScoreMetric).optional(), params: z.string().optional(), score_text: z.string().optional(), score_unit: z.string().optional(), score: z.number().optional(), timestamp: z.number().int().optional(), country: z.string().optional(), sources: z.array(z.string()).optional(), version: z.string().optional(), badge: ludoScoreBadge.optional(), insights: z.array(ludoScoreInsight).optional()}); export const stepValue = z.object({step: z.string().optional(), description: z.string().optional(), value: z.string().optional(), score: ludoScore.optional()}); export const generatedGame = z.object({tags: z.array(z.string()).optional(), id: z.string().optional(), title: z.string().optional(), summary: z.string().optional(), text_raw: z.string().optional(), genres: z.array(z.string()).optional(), keywords: z.array(z.string()).optional(), description: z.string().optional(), description_raw: z.string().optional(), description_annotations: z.array(annotation).optional(), search_results: generationsSearchResult.optional(), images: z.array(prometheusGameImage).optional(), screenshots: z.array(gameImage).optional(), image: gameImage.optional(), blending: z.array(z.string()).optional(), blended_games: z.array(game).optional(), platform: z.string().optional(), perspective: z.string().optional(), platforms: z.array(z.string()).optional(), sentence: z.string().optional(), punchline: z.string().optional(), art_style: z.string().optional(), quality_score: z.number().optional(), uniqueness_score: z.number().optional(), final_score: z.number().optional(), hints: z.array(z.string()).optional(), request_id: z.string().optional(), prompt: z.string().optional(), selected_genres: z.array(z.string()).optional(), mechanics: z.array(generatedText).optional(), step_choices: z.array(stepValue).optional(), score: ludoScore.optional(), image_prompt: z.string().optional()}); export const chatMessage = z.object({text: z.string().optional(), role: z.string(), timestamp: z.number().optional(), followups: z.array(assistantFollowUp).optional(), selected_element: z.string().optional(), images: z.array(gameImage).optional(), videos: z.array(generatedVideo).optional(), sprites: z.array(spritesheet).optional(), function_calls: z.array(assistantFunctionCall).optional(), assets: z.array(threeDAsset).optional(), game_ideas: z.array(generatedGame).optional()}); export const gddConversation = z.object({_id: z.string().optional(), user_id: z.string().optional(), project_id: z.string().optional(), title: z.string().optional(), date: z.number().optional(), date_created: z.number().optional(), message_history: z.array(chatMessage).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 }; /** * Gets one of the caller's GDD chat conversations (Roles: user) * * GET /chat/gdd/{id}/conversations/{conversationId} */ export const getApiChatGddIdConversationsConversationId = async (args: GetApiChatGddIdConversationsConversationIdArgs, options: GetApiChatGddIdConversationsConversationIdOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/chat/gdd/${encodeURIComponent(String(args.id))}/conversations/${encodeURIComponent(String(args.conversationId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(gddConversation, await res.json()) };