> ## Documentation Index
> Fetch the complete documentation index at: https://docs.legnext.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Image Generation

> Image generation API reference for PHP SDK

## generateImage()

Create a new text-to-image generation task.

```php theme={null}
<?php
require_once(__DIR__ . '/vendor/autoload.php');

use OpenAPI\Client\Configuration;
use OpenAPI\Client\Api\ImageGenerationApi;
use OpenAPI\Client\Model\DiffusionRequest;

// Configure API client
$config = Configuration::getDefaultConfiguration();
$config->setApiKey('x-api-key', getenv('LEGNEXT_API_KEY'));
$config->setHost('https://api.legnext.ai');

$api = new ImageGenerationApi(null, $config);

try {
    $request = new DiffusionRequest();
    $request->setText('a serene mountain landscape at sunset');
    $request->setCallback('https://your-domain.com/webhook');

    $response = $api->generateImage($request);

    echo "Job ID: " . $response->getJobId() . "\n";
    echo "Status: " . $response->getStatus() . "\n";

} catch (\OpenAPI\Client\ApiException $e) {
    echo "Error: " . $e->getMessage() . "\n";
}
?>
```

**Parameters:**

* `text` (string): Text prompt (1-8192 characters)
* `callback` (string, optional): Webhook URL for completion notification

**Returns:** Response with `job_id` and `status`

***

## varyImage()

Create variations of a generated image.

```php theme={null}
<?php
use OpenAPI\Client\Model\VaryRequest;

$request = new VaryRequest();
$request->setJobId('original-job-id');
$request->setImageNo(0);
$request->setType(1);  // 0=Subtle, 1=Strong
$request->setRemixPrompt('add more clouds');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->varyImage($request);

echo "Variation Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `image_no` (int): Image index (0-3)
* `type` (int): Variation type (0=Subtle, 1=Strong)
* `remix_prompt` (string, optional): Additional prompt for variation
* `callback` (string, optional): Webhook URL for completion notification

***

## upscaleImage()

Upscale a generated image to higher resolution.

```php theme={null}
<?php
use OpenAPI\Client\Model\UpscaleRequest;

$request = new UpscaleRequest();
$request->setJobId('original-job-id');
$request->setImageNo(0);
$request->setType(1);  // 0=Subtle, 1=Creative
$request->setCallback('https://your-domain.com/webhook');

$response = $api->upscaleImage($request);

echo "Upscale Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `image_no` (int): Image index (0-3)
* `type` (int): Upscale type (0=Subtle, 1=Creative)
* `callback` (string, optional): Webhook URL for completion notification

***

## rerollImage()

Regenerate with the same prompt.

```php theme={null}
<?php
use OpenAPI\Client\Model\RerollRequest;

$request = new RerollRequest();
$request->setJobId('original-job-id');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->rerollImage($request);

echo "Reroll Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `callback` (string, optional): Webhook URL for completion notification

***

## blendImages()

Blend 2-5 images together.

```php theme={null}
<?php
use OpenAPI\Client\Model\BlendRequest;

$request = new BlendRequest();
$request->setImgUrls([
    'https://example.com/image1.png',
    'https://example.com/image2.png'
]);
$request->setAspectRatio('1:1');  // Options: 1:1, 16:9, 9:16, 3:2, 2:3
$request->setCallback('https://your-domain.com/webhook');

$response = $api->blendImages($request);

echo "Blend Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `img_urls` (array): Array of 2-5 image URLs
* `aspect_ratio` (string, optional): Output aspect ratio (1:1, 16:9, 9:16, 3:2, 2:3)
* `callback` (string, optional): Webhook URL for completion notification

***

## describeImage()

Generate text descriptions from an image.

```php theme={null}
<?php
use OpenAPI\Client\Model\DescribeRequest;

$request = new DescribeRequest();
$request->setImgUrl('https://example.com/image.png');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->describeImage($request);

echo "Describe Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `img_url` (string): URL of the image to describe
* `callback` (string, optional): Webhook URL for completion notification

***

## editImage()

Edit an image with text description.

```php theme={null}
<?php
use OpenAPI\Client\Model\EditRequest;

$request = new EditRequest();
$request->setJobId('original-job-id');
$request->setImageNo(0);
$request->setCanvas('full');  // Canvas area: full, object, background
$request->setImgPos('center');  // Image position: center, top, bottom, left, right
$request->setRemixPrompt('change the sky to sunset colors');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->editImage($request);

echo "Edit Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `image_no` (int): Image index (0-3)
* `canvas` (string): Canvas area (full, object, background)
* `img_pos` (string): Image position (center, top, bottom, left, right)
* `remix_prompt` (string): Edit instructions
* `callback` (string, optional): Webhook URL for completion notification

***

## inpaintImage()

Fill masked regions in an image.

```php theme={null}
<?php
use OpenAPI\Client\Model\InpaintRequest;

$request = new InpaintRequest();
$request->setJobId('original-job-id');
$request->setImageNo(0);
$request->setRemixPrompt('fill with forest landscape');
$request->setMask([
    'type' => 'url',  // 'url' or 'coordinates'
    'value' => 'mask-url'
]);
$request->setCallback('https://your-domain.com/webhook');

$response = $api->inpaintImage($request);

echo "Inpaint Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `image_no` (int): Image index (0-3)
* `remix_prompt` (string): Inpainting prompt
* `mask` (array): Mask object with type ('url' or 'coordinates') and value
* `callback` (string, optional): Webhook URL for completion notification

***

## outpaintImage()

Extend image boundaries.

```php theme={null}
<?php
use OpenAPI\Client\Model\OutpaintRequest;

$request = new OutpaintRequest();
$request->setJobId('original-job-id');
$request->setImageNo(0);
$request->setScale(1.5);  // Scale factor (1.1-3.0)
$request->setRemixPrompt('extend with natural landscape');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->outpaintImage($request);

echo "Outpaint Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `image_no` (int): Image index (0-3)
* `scale` (float): Expansion scale factor (1.1-3.0)
* `remix_prompt` (string, optional): Outpaint prompt
* `callback` (string, optional): Webhook URL for completion notification

***

## panImage()

Create panoramic or panned views.

```php theme={null}
<?php
use OpenAPI\Client\Model\PanRequest;

$request = new PanRequest();
$request->setJobId('original-job-id');
$request->setImageNo(0);
$request->setDirection(1);  // 0=Down, 1=Right, 2=Up, 3=Left
$request->setScale(1.5);  // Scale factor (1.1-3.0)
$request->setRemixPrompt('continue the landscape');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->panImage($request);

echo "Pan Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `image_no` (int): Image index (0-3)
* `direction` (int): Pan direction (0=Down, 1=Right, 2=Up, 3=Left)
* `scale` (float): Scale factor (1.1-3.0)
* `remix_prompt` (string, optional): Pan prompt
* `callback` (string, optional): Webhook URL for completion notification

***

## remixImage()

Create variations using remix modes (strong or subtle modification).

```php theme={null}
<?php
use OpenAPI\Client\Model\RemixRequest;

$request = new RemixRequest();
$request->setJobId('original-job-id');
$request->setImageNo(0);
$request->setMode(0);  // 0=Strong, 1=Subtle
$request->setRemixPrompt('change the lighting to blue hour');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->remixImage($request);

echo "Remix Job ID: " . $response->getJobId() . "\n";
?>
```

**Parameters:**

* `job_id` (string): Original image job ID
* `image_no` (int): Image index (0-3)
* `mode` (int): Remix mode (0=Strong, 1=Subtle)
* `remix_prompt` (string, optional): Remix instructions
* `callback` (string, optional): Webhook URL for completion notification

***

## shortenPrompt()

Optimize and simplify prompts.

```php theme={null}
<?php
use OpenAPI\Client\Model\ShortenRequest;

$request = new ShortenRequest();
$request->setPrompt('your very long and detailed prompt here with lots of unnecessary words and descriptions that could be made more concise...');
$request->setCallback('https://your-domain.com/webhook');

$response = $api->shortenPrompt($request);

echo "Shortened prompt: " . $response->getShortenedPrompt() . "\n";
?>
```

**Parameters:**

* `prompt` (string): Long prompt to optimize
* `callback` (string, optional): Webhook URL for completion notification

**Returns:** Response with `shortened_prompt`

***

## Complete Example

```php theme={null}
<?php
require_once(__DIR__ . '/vendor/autoload.php');

use OpenAPI\Client\Configuration;
use OpenAPI\Client\Api\ImageGenerationApi;
use OpenAPI\Client\Model\DiffusionRequest;
use OpenAPI\Client\Model\UpscaleRequest;

// Configure API client
$config = Configuration::getDefaultConfiguration();
$config->setApiKey('x-api-key', getenv('LEGNEXT_API_KEY'));
$config->setHost('https://api.legnext.ai');

$api = new ImageGenerationApi(null, $config);

try {
    // Step 1: Generate image
    $request = new DiffusionRequest();
    $request->setText('a beautiful sunset over mountains');

    $response = $api->generateImage($request);
    $jobId = $response->getJobId();

    echo "Image generation started: {$jobId}\n";

    // Step 2: Wait for completion (see Task Management docs)
    // ...

    // Step 3: Upscale the first image
    $upscaleRequest = new UpscaleRequest();
    $upscaleRequest->setJobId($jobId);
    $upscaleRequest->setImageNo(0);
    $upscaleRequest->setType(1);

    $upscaleResponse = $api->upscaleImage($upscaleRequest);

    echo "Upscale started: " . $upscaleResponse->getJobId() . "\n";

} catch (\OpenAPI\Client\ApiException $e) {
    echo "HTTP Status: " . $e->getCode() . "\n";
    echo "Error Message: " . $e->getMessage() . "\n";
    echo "Response Body: " . $e->getResponseBody() . "\n";
}
?>
```

***

## Error Handling

```php theme={null}
<?php
try {
    $response = $api->generateImage($request);

} catch (\OpenAPI\Client\ApiException $e) {
    $statusCode = $e->getCode();
    $errorBody = $e->getResponseBody();

    switch ($statusCode) {
        case 400:
            echo "Validation error: Check request parameters\n";
            break;
        case 401:
            echo "Authentication error: Invalid API key\n";
            break;
        case 404:
            echo "Resource not found\n";
            break;
        case 429:
            echo "Rate limit exceeded. Please retry later.\n";
            break;
        case 500:
        case 502:
        case 503:
            echo "Server error. Please retry.\n";
            break;
        default:
            echo "API error ({$statusCode}): {$errorBody}\n";
    }
}
?>
```

***

## Retry Logic

```php theme={null}
<?php
function generateWithRetry($api, $request, $maxRetries = 3) {
    $retries = 0;

    while ($retries < $maxRetries) {
        try {
            return $api->generateImage($request);

        } catch (\OpenAPI\Client\ApiException $e) {
            if ($e->getCode() === 429) {
                // Rate limited - wait and retry
                $retries++;
                sleep(5);
                continue;
            } elseif ($e->getCode() >= 500) {
                // Server error - exponential backoff
                $retries++;
                $delay = pow(2, $retries);
                sleep($delay);
                if ($retries >= $maxRetries) {
                    throw $e;
                }
                continue;
            } else {
                // Other errors - don't retry
                throw $e;
            }
        }
    }

    throw new Exception("Max retries exceeded");
}

// Usage
$request = new DiffusionRequest();
$request->setText('a beautiful landscape');

try {
    $response = generateWithRetry($api, $request, 3);
    echo "Job ID: " . $response->getJobId() . "\n";
} catch (Exception $e) {
    echo "Failed after retries: " . $e->getMessage() . "\n";
}
?>
```

***

## Next Steps

* [Video Generation](/sdk/php/video-generation)
* [Task Management](/sdk/php/task-management)
* [Quick Start](/sdk/php/quickstart)
