# Image Editing

Nano Banana Pro is Google's new state-of-the-art image generation and editing model.

### Table of contents

1. [Calling the API](#calling-the-api)  
   - [Install the client](#install-the-client)  
   - [Setup your API Key](#setup-your-api-key)  
   - [Submit a request](#submit-a-request)

2. [Authentication](#authentication)  
   - [API Key](#api-key)

3. [Queue](#queue)  
   - [Submit a request](#queue-submit)  
   - [Fetch request status](#queue-status)  
   - [Get the result](#queue-result)

4. [Files](#files)  
   - [Data URI (base64)](#files-data-uri)  
   - [Hosted files (URL)](#files-from-url)  
   - [Uploading files](#files-upload)

5. [Schema](#schema)  
   - [Input](#schema-input)  
   - [Output](#schema-output)

### About

Gemini 3 Pro Image is a text-to-image model that generates images from text descriptions.

## 1. Calling the API

### Install the client

The client provides a convenient way to interact with the model API.

```bash
npm install --save @fal-ai/client
```

#### Migrate to @fal-ai/client

The `@fal-ai/serverless-client` package has been deprecated in favor of `@fal-ai/client`. Install the new package and update your imports.

### Setup your API Key

Set `FAL_KEY` as an environment variable in your runtime.

```bash
export FAL_KEY="YOUR_API_KEY"
```

### Submit a request

The client API handles the API submit protocol. It will handle the request status updates and return the result when the request is completed.

```javascript
import { fal } from "@fal-ai/client";

const result = await fal.subscribe("fal-ai/nano-banana-pro/edit", {
  input: {
    prompt: "make a photo of the man driving the car down the california coastline",
    image_urls: ["https://storage.googleapis.com/falserverless/example_inputs/nano-banana-edit-input.png", "https://storage.googleapis.com/falserverless/example_inputs/nano-banana-edit-input-2.png"]
  },
  logs: true,
  onQueueUpdate: (update) => {
    if (update.status === "IN_PROGRESS") {
      update.logs.map((log) => log.message).forEach(console.log);
    }
  },
});
console.log(result.data);
console.log(result.requestId);
```

## 2. Authentication

The API uses an API Key for authentication. It is recommended you set the `FAL_KEY` environment variable in your runtime when possible.

### API Key

In case your app is running in an environment where you cannot set environment variables, you can set the API Key manually as a client configuration.

```javascript
import { fal } from "@fal-ai/client";

fal.config({
  credentials: "YOUR_FAL_KEY"
});
```

## 3. Queue

### Submit a request

The client API provides a convenient way to submit requests to the model.

```javascript
import { fal } from "@fal-ai/client";

const { request_id } = await fal.queue.submit("fal-ai/nano-banana-pro/edit", {
  input: {
    prompt: "make a photo of the man driving the car down the california coastline",
    image_urls: ["https://storage.googleapis.com/falserverless/example_inputs/nano-banana-edit-input.png", "https://storage.googleapis.com/falserverless/example_inputs/nano-banana-edit-input-2.png"]
  },
  webhookUrl: "https://optional.webhook.url/for/results",
});
```

### Fetch request status

You can fetch the status of a request to check if it is completed or still in progress.

```javascript
import { fal } from "@fal-ai/client";

const status = await fal.queue.status("fal-ai/nano-banana-pro/edit", {
  requestId: "764cabcf-b745-4b3e-ae38-1200304cf45b",
  logs: true,
});
```

### Get the result

Once the request is completed, you can fetch the result.

```javascript
import { fal } from "@fal-ai/client";

const result = await fal.queue.result("fal-ai/nano-banana-pro/edit", {
  requestId: "764cabcf-b745-4b3e-ae38-1200304cf45b"
});
console.log(result.data);
console.log(result.requestId);
```

## 4. Files

Some attributes in the API accept file URLs as input. Whenever that's the case you can pass your own URL or a Base64 data URI.

### Data URI (base64)

You can pass a Base64 data URI as a file input. The API will handle the file decoding for you.

### Hosted files (URL)

You can also pass your own URLs as long as they are publicly accessible.

### Uploading files

You can upload files using the client API and use the returned URL in your requests.

```javascript
import { fal } from "@fal-ai/client";

const file = new File(["Hello, World!"], "hello.txt", { type: "text/plain" });
const url = await fal.storage.upload(file);
```

## 5. Schema

### Input

```json
{
  "prompt": "make a photo of the man driving the car down the california coastline",
  "num_images": 1,
  "aspect_ratio": "auto",
  "output_format": "png",
  "safety_tolerance": "4",
  "image_urls": [
    "https://storage.googleapis.com/falserverless/example_inputs/nano-banana-edit-input.png",
    "https://storage.googleapis.com/falserverless/example_inputs/nano-banana-edit-input-2.png"
  ],
  "resolution": "1K",
  "limit_generations": true
}
```

### Output

```json
{
  "images": [
    {
      "content_type": "image/png",
      "file_name": "nano-banana-pro-edit-output.png",
      "url": "https://storage.googleapis.com/falserverless/example_outputs/nano-banana-pro-edit-output.png"
    }
  ],
  "description": ""
}
```
