import gradio as gr import json def build_json( api_key, reference_image, scene, subject_type, age_range, hair, makeup, jewellery, top, bottom, footwear, wardrobe_notes, pose_angle, body_pose, hands_pose, framing, camera_device, flash, orientation, aspect_ratio, distance, focus, texture, sharpness, color, effects, background_environment, background_props, style_genre, authenticity, use_original_structure, face_description, ban_mirror, ban_phone, ban_selfie, ban_grainy, ban_harsh_flash, ban_logos, ban_nsfw, ban_cropped_feet, output_count, output_size, safety, variant_name, variant_angle, ): banned_items = [] if ban_mirror: banned_items.append("mirror") if ban_phone: banned_items.append("phone") if ban_selfie: banned_items.append("selfie look") if ban_grainy: banned_items.append("grainy noise") if ban_harsh_flash: banned_items.append("harsh LED flash") if ban_logos: banned_items.append("logos/brand text") if ban_nsfw: banned_items.append("nsfw") if ban_cropped_feet: banned_items.append("cropped feet") output_json = { "scene": scene, "subject": { "type": subject_type, "age_range": age_range, "hair": hair, "makeup": makeup, "jewellery": jewellery, }, "wardrobe": { "top": top, "bottom": bottom, "footwear": footwear, "notes": wardrobe_notes, }, "pose": { "angle": pose_angle, "body": body_pose, "hands": hands_pose, "framing": framing, }, "camera": { "device": camera_device, "flash": flash, "orientation": orientation, "aspect_ratio": aspect_ratio, "distance": distance, "focus": focus, }, "look": { "texture": texture, "sharpness": sharpness, "color": color, "effects": effects, }, "background": { "environment": background_environment, "props": background_props, }, "style": {"genre": style_genre, "authenticity": authenticity}, "reference_face": { "use_original_structure": use_original_structure, "description": face_description, }, "ban": banned_items, "output": { "count": output_count, "size": output_size, "safety": safety }, "variants": [{"name": variant_name, "angle": variant_angle}], } # The user's API key is available in the 'api_key' variable. # You can now use this key and the reference_image path to call the # gemini nano banana API with the generated 'output_json'. # For this example, we will just return the generated JSON. return json.dumps(output_json, indent=4) with gr.Blocks() as demo: gr.Markdown("# Gemini Nano Banana Image Generator Interface") gr.Markdown( "Fill in the details below to generate the JSON input for the image generation model." ) with gr.Tabs(): with gr.TabItem("Authentication and Image"): api_key_input = gr.Textbox( label="Gemini Nano Banana API Key", type="password" ) reference_image_input = gr.Image( label="Reference Image", type="filepath" ) with gr.TabItem("Scene and Subject"): with gr.Row(): scene_input = gr.Textbox( label="Scene", value="cinematic outdoor portrait; professional photography" ) with gr.Row(): subject_type_input = gr.Textbox( label="Subject Type", value="adult woman (idol vibe)" ) age_range_input = gr.Textbox(label="Age Range", value="20s") with gr.Row(): hair_input = gr.Textbox( label="Hair", value="straight or styled natural open hair with natural shine", ) makeup_input = gr.Textbox( label="Makeup", value="glossy lips, soft eyeliner, luminous skin" ) jewellery_input = gr.Textbox( label="Jewellery", value="small hoops, thin chain, subtle bracelets" ) with gr.TabItem("Wardrobe"): with gr.Row(): top_input = gr.Textbox(label="Top", value="basic tee or camisole") bottom_input = gr.Textbox( label="Bottom", value="denim shorts or mini skirt" ) footwear_input = gr.Textbox( label="Footwear", value="sneakers or ankle boots" ) with gr.Row(): wardrobe_notes_input = gr.Textbox( label="Wardrobe Notes", value="casual modern look, styled for natural setting", ) with gr.TabItem("Pose and Framing"): with gr.Row(): pose_angle_input = gr.Dropdown( label="Pose Angle", choices=["three-quarter", "full body"], value="three-quarter", ) body_pose_input = gr.Textbox( label="Body Pose", value="standing or walking casually, relaxed natural posture", ) with gr.Row(): hands_pose_input = gr.Textbox( label="Hands Pose", value="one resting by side or touching hair, the other relaxed", ) framing_input = gr.Dropdown( label="Framing", choices=["head-to-toe", "waist-up"], value="waist-up", ) with gr.TabItem("Camera and Look"): with gr.Row(): camera_device_input = gr.Textbox( label="Camera Device", value="professional cinema camera / DSLR with prime lens", ) flash_input = gr.Textbox( label="Flash", value="none; natural golden hour light or soft reflectors" ) with gr.Row(): orientation_input = gr.Dropdown( label="Orientation", choices=["vertical", "horizontal"], value="vertical" ) aspect_ratio_input = gr.Dropdown( label="Aspect Ratio", choices=["16:9", "3:2", "4:3", "1:1"], value="16:9" ) with gr.Row(): distance_input = gr.Textbox( label="Distance", value="cinematic portrait distance with shallow depth" ) focus_input = gr.Textbox( label="Focus", value="sharp on subject; soft bokeh background" ) with gr.Row(): texture_input = gr.Textbox( label="Texture", value="smooth high-resolution detail" ) sharpness_input = gr.Textbox( label="Sharpness", value="very high; crisp cinematic clarity" ) with gr.Row(): color_input = gr.Textbox( label="Color", value="warm cinematic grading; golden tones and soft contrast" ) effects_input = gr.Textbox( label="Effects", value="subtle film grain; natural light flares, depth of field", ) with gr.TabItem("Background and Style"): with gr.Row(): background_environment_input = gr.Textbox( label="Background Environment", value="nature setting — forest, park, or meadow with soft light", ) background_props_input = gr.Textbox( label="Background Props", value="none; focus on subject against natural backdrop" ) with gr.Row(): style_genre_input = gr.Textbox( label="Style Genre", value="cinematic portrait photography" ) authenticity_input = gr.Textbox( label="Authenticity", value="natural, elegant, polished" ) with gr.TabItem("Reference Face and Bans"): with gr.Row(): use_original_structure_input = gr.Checkbox( label="Use Original Face Structure", value=True ) with gr.Row(): face_description_input = gr.Textbox( label="Face Description", value="maintain the same face shape, features, and proportions as in the provided reference image", ) with gr.Row(): gr.Markdown("#### Banned Items") with gr.Row(): ban_mirror_input = gr.Checkbox(label="Mirror") ban_phone_input = gr.Checkbox(label="Phone") ban_selfie_input = gr.Checkbox(label="Selfie Look") ban_grainy_input = gr.Checkbox(label="Grainy Noise") with gr.Row(): ban_harsh_flash_input = gr.Checkbox(label="Harsh LED Flash") ban_logos_input = gr.Checkbox(label="Logos/Brand Text") ban_nsfw_input = gr.Checkbox(label="NSFW") ban_cropped_feet_input = gr.Checkbox(label="Cropped Feet") with gr.TabItem("Output and Variants"): with gr.Row(): output_count_input = gr.Slider( label="Output Count", minimum=1, maximum=10, step=1, value=1 ) output_size_input = gr.Textbox(label="Output Size", value="1920x1080") safety_input = gr.Dropdown( label="Safety", choices=["strict", "moderate", "none"], value="strict" ) with gr.Row(): variant_name_input = gr.Textbox( label="Variant Name", value="cinematic_nature_fullbody" ) variant_angle_input = gr.Textbox( label="Variant Angle", value="full-body shot in meadow or forest path, subject centered with depth of field", ) generate_button = gr.Button("Generate JSON") json_output = gr.JSON(label="Generated JSON") generate_button.click( fn=build_json, inputs=[ api_key_input, reference_image_input, scene_input, subject_type_input, age_range_input, hair_input, makeup_input, jewellery_input, top_input, bottom_input, footwear_input, wardrobe_notes_input, pose_angle_input, body_pose_input, hands_pose_input, framing_input, camera_device_input, flash_input, orientation_input, aspect_ratio_input, distance_input, focus_input, texture_input, sharpness_input, color_input, effects_input, background_environment_input, background_props_input, style_genre_input, authenticity_input, use_original_structure_input, face_description_input, ban_mirror_input, ban_phone_input, ban_selfie_input, ban_grainy_input, ban_harsh_flash_input, ban_logos_input, ban_nsfw_input, ban_cropped_feet_input, output_count_input, output_size_input, safety_input, variant_name_input, variant_angle_input, ], outputs=json_output, ) if __name__ == "__main__": demo.launch()