Your task is to review a pull request. Instructions:
- Write in name of g4f copilot. Don't use placeholder.
- Write the review in GitHub Markdown format.
- Thank the author for contributing to the project.

Pull request author: None
Pull request title: Add new provider, enhance functionality, and update docs
Pull request description:
---
## # New provider added
   - **g4f/Provider/GizAI.py**
      - **Text generation:** `gemini-flash, gemini-pro, gpt-4o-mini, gpt-4o, claude-3.5-sonnet, claude-3-haiku, llama-3.1-70b, llama-3.1-8b, mistral-large`
      - **Image generation:** `sdxl, sd-1.5, sd-3.5, flux-schnell`
---



## G4F update
## # New feature added to G4F for anthropics
**(g4f/client/client.py): add system prompt support**
   - Enhance the Completions class by adding support for system prompts
      - Introduce a 'system' parameter to the create and async_create methods
      - Prepend the system message to the user messages if provided

> This change improves flexibility and aligns with best practices seen in APIs like Anthropic's, allowing better management of system-level instructions.

> **Reference:** [docs.anthropic](https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/system-prompts#financial-analysis-without-role-prompting)


**Sample use of the new feature:**
**G4F Client**
```python
from g4f.client import Client

client = Client()

response = client.chat.completions.create(
    system="You are a helpful assistant.",
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "user",
            "content": "Say this is a test"
        }
    ]
    # Add any other necessary parameters
)

print(response.choices[0].message.content)
```

**G4F async client**
```python
import asyncio
from g4f.client import Client

async def main():
    client = Client()
    
    response = await client.chat.completions.async_create(
        system="You are a helpful assistant.", # <-- role prompt
        model="gpt-3.5-turbo",
        messages=[
            {
                "role": "user",
                "content": "Say this is a test"
            }
        ]
    )
    
    print(response.choices[0].message.content)

asyncio.run(main())
```


---
## # New feature added to Images Album G4F-GUI

**(g4f/gui/server/api.py): enhance image handling and directory management**
   - Enhance image handling functionalities and ensure image directory exists
      - Add ensure_images_dir function to create image directory if it doesn't exist
      - Modify serve_images and _copy_images methods to use ensure_images_dir
      - Remove unnecessary imports to clean up code
      - Update typing annotations to improve type safety

> This ensures that the directory for storing images is always present and improves code readability and maintainability.
---
**(g4f/gui/server/backend.py): add route to list generated images**
   - Introduce a new endpoint `/images` to list all generated images
   - Implement `get_images` method to retrieve and return image paths as JSON
   - Update `serve_images` method to serve images from the `./generated_images` directory
   - Enhance route registration to include the new `/images` endpoint

> This addition provides a way to dynamically list and access generated images via the API.
---
**(g4f/gui/server/website.py): add redirect for /images/ endpoint**
   - Add a new route '/images/' to the website routes configuration
      - The new route redirects to the home page similar to other routes
      - Supports both GET and POST methods

> This change ensures consistency in route management and better handles potential future expansion for the '/images/' endpoint.
---
**(g4f/gui/client/index.html): add image album and enhance model/provider options**
   - Added "Images Album" button in the bottom_buttons section for easier access to image-related functionalities.
   - Enhanced model selection options by adding new models such as gpt-4o, gpt-4o-mini, llama-3.1-405b, mixtral-8x7b, gemini-flash, claude-3-haiku, and claude-3.5-sonnet.
   - Enhanced provider selection options by adding new providers such as DeepInfraChat, ReplicateHome, Blackbox, HuggingChat, DDG, and Pizzagpt.
   - Introduced an image modal with navigation controls for better image viewing experience.

> These changes improve the user interface by adding new functionalities and expanding the available options for models and providers.
---
**(g4f/gui/client/static/css/style.css): add image modal and navigation controls**
   - Implemented a modal for displaying images in larger view with navigation controls.
      - Added styles for album images, modal, and navigation buttons.
      - Included close button and image counter within the modal.
      - Updated the blink animation for better visual feedback.
---
**(g4f/gui/client/static/js/chat.v1.js): add image album functionality**
   - Implement functionality to load, display, and navigate through images
      - Fetch images from the server and display them in the album
      - Add modal to view images in a larger format with zoom functionality
      - Allow navigation between images using arrow keys and buttons

**Changes:**
   - Added `loadImages`, `displayImages`, `openImageModal`, and navigation functions
   - Modified event listeners for image inputs and modal interactions
   - Updated CSS classes for hidden states and image styling
---


## # G4F improvements
**(g4f/api/__init__.py): refactor API structure and improve async handling**
   - Updated `create_app` to accept an optional `g4f_api_key` parameter.
   - Refactored `ChatCompletionsForm` to `ChatCompletionsConfig` and `ImagesGenerateForm` to `ImageGenerationConfig`.
   - Improved async handling for `chat_completions` and `generate_image` endpoints.
   - Added type hints for better readability and maintainability.
   - Updated routes to include `/v1/images/generate`.
   - Enhanced error handling and logging.
   - Introduced global `list_ignored_providers` and related setter method.

> Breaking change: Some API endpoints and request/response formats have been modified.
> https://github.com/xtekky/gpt4free/issues/2222#issue-2521995710
---
**(g4f/models.py): add new provider GizAI and update best providers**
   Add GizAI as a new provider for various models and update best provider lists
      - Add GizAI to the imports and update best provider lists for several models
      - Update `default` model's best providers
      - Adjust `gpt-4o`, `gpt-4o-mini`, `gpt-4`, `o1-mini`, `llama-3.1-8b`, `llama-3.1-70b`, `mistral-large`, `claude-3-haiku`, `claude-3.5-sonnet`, `gemini-pro`, `gemini-flash`, `sd-1.5`, `sd-3.5`, and `flux-schnell` to include GizAI

> Breaking change: Best provider logic updated to include new provider
---



## # Updating documentation and improving G4F
**(README.md): update README with badges and links**
   - Add new badges for commits, issues, and license at the top for improved visibility
   - Enhance author attribution with centered formatting
   - Correct various internal links within the Table of Contents
   - Fix broken link to the Interference API documentation
   - Adjust formatting for better readability and consistency throughout the file
   
   - Correct typo in the "Latest version" note and update internal links
      - Fix "Lastet" to "Latest" in the version note section
      - Update "Installation Guide for Windows (.exe)" link in the What's New section
      - Update link formats for internal references and external URLs
---
**(docs/async_client.md): update guide with Anthropic compatibility and improved chat completions example**
   - Add compatibility note for Anthropic API
   - Introduce new section for creating chat completions with an improved example
   - Update table of contents to include new section

> This update enhances the guide by providing clearer instructions for developers familiar with the OpenAI and Anthropic interfaces, making the transition to G4F smoother. The improved example helps developers understand how to create chat completions more effectively.
---
**(docs/client.md): update G4F Client API guide**
   - Update the G4F Client API guide to include new sections and examples:
      - Added section `Creating Chat Completions`
      - Improved example for creating chat completions with system message
      - Updated `Introduction` to mention Anthropic client compatibility
      - Minor text and format adjustments for clarity and completeness
---
**(docs/interference-api.md): update Interference API usage guide**
   - Enhance the Interference API usage guide with detailed instructions and examples for better clarity and usability.
      - Added sections for "Using the Interference API" and "Basic Usage"
      - Introduced example curl commands for text and image generation
      - Updated existing examples with improved formatting and explanations
      - Included a "Conclusion" section to summarize the guide's content
      - Defined how to run the API from both PyPI and the repository more clearly

> These updates aim to provide a more comprehensive and user-friendly guide for integrating G4F with OpenAI-based applications.
---

---

Diff:
```diff
diff --git a/README.md b/README.md
index 74e9a0bffd..7d009c1452 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
+[![Badge Commits]][Commit Rate]
+[![Badge Issues]][Issues]
+[![Badge License]][License]
 
+---
 
 ![248433934-7886223b-c1d1-4260-82aa-da5741f303bb](https://github.com/xtekky/gpt4free/assets/98614666/ea012c87-76e0-496a-8ac4-e2de090cc6c9)
 
@@ -6,7 +10,7 @@
 
 ---
 
-Written by [@xtekky](https://github.com/xtekky)
+<p align="center"><strong>Written by <a href="https://github.com/xtekky">@xtekky</a></strong></p>
 
 <div id="top"></div>
 
@@ -17,7 +21,7 @@ Written by [@xtekky](https://github.com/xtekky)
 > _"gpt4free"_ serves as a **PoC** (proof of concept), demonstrating the development of an API package with multi-provider requests, with features like timeouts, load balance and flow control.
 
 > [!NOTE]
-> <sup><strong>Lastet version:</strong></sup> [![PyPI version](https://img.shields.io/pypi/v/g4f?color=blue)](https://pypi.org/project/g4f) [![Docker version](https://img.shields.io/docker/v/hlohaus789/g4f?label=docker&color=blue)](https://hub.docker.com/r/hlohaus789/g4f)  
+> <sup><strong>Latest version:</strong></sup> [![PyPI version](https://img.shields.io/pypi/v/g4f?color=blue)](https://pypi.org/project/g4f) [![Docker version](https://img.shields.io/docker/v/hlohaus789/g4f?label=docker&color=blue)](https://hub.docker.com/r/hlohaus789/g4f)  
 > <sup><strong>Stats:</strong></sup> [![Downloads](https://static.pepy.tech/badge/g4f)](https://pepy.tech/project/g4f) [![Downloads](https://static.pepy.tech/badge/g4f/month)](https://pepy.tech/project/g4f)
 
 ```sh
@@ -30,10 +34,11 @@ docker pull hlohaus789/g4f
 
 ## 🆕 What's New
    - **For comprehensive details on new features and updates, please refer to our [Releases](https://github.com/xtekky/gpt4free/releases) page**
-   - **Installation Guide for Windows (.exe):** 💻 [#installation-guide-for-windows](#installation-guide-for-windows-exe)
+   - **Installation Guide for Windows (.exe):** 💻 [Installation Guide for Windows (.exe)](#installation-guide-for-windows-exe)
    - **Join our Telegram Channel:** 📨 [telegram.me/g4f_channel](https://telegram.me/g4f_channel)
    - **Join our Discord Group:** 💬 [discord.gg/XfybzPXPH5](https://discord.gg/XfybzPXPH5)
 
+
 ## 🔻 Site Takedown
 
 Is your site on this repository and you want to take it down? Send an email to <PRESIDIO_ANONYMIZED_EMAIL_ADDRESS> with proof it is yours and it will be removed as fast as possible. To prevent reproduction please secure your API. 😉
@@ -53,33 +58,32 @@ Is your site on this repository and you want to take it down? Send an email to t
    - [ ] 🚧 Improve compatibility and error handling
 
 ## 📚 Table of Contents
-
-- [🆕 What's New](#-whats-new)
-- [📚 Table of Contents](#-table-of-contents)
-- [🛠️ Getting Started](#-getting-started)
-  - [Docker Container Guide](#docker-container-guide)
-  - [Installation Guide for Windows (.exe)](#installation-guide-for-windows-exe)
-  - [Use python](#use-python)
-    - [Prerequisites](#prerequisites)
-    - [Install using PyPI package:](#install-using-pypi-package)
-    - [Install from source:](#install-from-source)
-    - [Install using Docker:](#install-using-docker)
-- [💡 Usage](#-usage)
-  - [Text Generation](#text-generation)
-  - [Image Generation](#image-generation)
-  - [Web UI](#web-ui)
-  - [Interference API](docs/interference.md)
-  - [Local inference](docs/local.md)
-  - [Configuration](#configuration)
-- [🚀 Providers and Models](docs/providers-and-models.md)
-- [🔗 Powered by gpt4free](#-powered-by-gpt4free)
-- [🤝 Contribute](#-contribute)
-  - [How do i create a new Provider?](#guide-how-do-i-create-a-new-provider)
-  - [How can AI help me with writing code?](#guide-how-can-ai-help-me-with-writing-code)
-- [🙌 Contributors](#-contributors)
-- [©️ Copyright](#-copyright)
-- [⭐ Star History](#-star-history)
-- [📄 License](#-license)
+   - [🆕 What's New](#-whats-new)
+   - [📚 Table of Contents](#-table-of-contents)
+   - [🛠️ Getting Started](#-getting-started)
+      - [Docker Container Guide](#docker-container-guide)
+      - [Installation Guide for Windows (.exe)](#installation-guide-for-windows-exe)
+   - [Use python](#use-python)
+      - [Prerequisites](#prerequisites)
+      - [Install using PyPI package](#install-using-pypi-package)
+      - [Install from source](#install-from-source)
+   - [Install using Docker](#install-using-docker)
+   - [💡 Usage](#-usage)
+      - [Text Generation](#text-generation)
+      - [Image Generation](#image-generation)
+      - [Web UI](#web-ui)
+      - [Interference API](#interference-api)
+      - [Local Inference](docs/local.md)
+      - [Configuration](#configuration)
+   - [🚀 Providers and Models](docs/providers-and-models.md)
+   - [🔗 Powered by gpt4free](#-powered-by-gpt4free)
+   - [🤝 Contribute](#-contribute)
+      - [How do i create a new Provider?](#guide-how-do-i-create-a-new-provider)
+      - [How can AI help me with writing code?](#guide-how-can-ai-help-me-with-writing-code)
+   - [🙌 Contributors](#-contributors)
+   - [©️ Copyright](#-copyright)
+   - [⭐ Star History](#-star-history)
+   - [📄 License](#-license)
 
 ## 🛠️ Getting Started
 
@@ -123,7 +127,7 @@ To ensure the seamless operation of our application, please follow the instructi
 
 By following these steps, you should be able to successfully install and run the application on your Windows system. If you encounter any issues during the installation process, please refer to our Issue Tracker or try to get contact over Discord for assistance.
 
-Run the **Webview UI** on other Platfroms:
+Run the **Webview UI** on other Platforms:
 
 - [/docs/guides/webview](docs/webview.md)
 
@@ -771,10 +775,10 @@ set G4F_PROXY=http://host:port
 We welcome contributions from the community. Whether you're adding new providers or features, or simply fixing typos and making small improvements, your input is valued. Creating a pull request is all it takes – our co-pilot will handle the code review process. Once all changes have been addressed, we'll merge the pull request into the main branch and release the updates at a later time.
 
 ###### Guide: How do i create a new Provider?
-   - Read: [/docs/guides/create_provider](docs/guides/create_provider.md)
+   - Read: [Create Provider Guide](docs/guides/create_provider.md)
 
 ###### Guide: How can AI help me with writing code?
-   - Read: [/docs/guides/help_me](docs/guides/help_me.md)
+   - Read: [AI Assistance Guide](docs/guides/help_me.md)
 
 ## 🙌 Contributors
 A list of all contributors is available [here](https://github.com/xtekky/gpt4free/graphs/contributors)
@@ -866,4 +870,7 @@ This project is licensed under <a href="https://github.com/xtekky/gpt4free/blob/
   </tr>
 </table>
 
+---
+
 <p align="right">(<a href="#top">🔼 Back to top</a>)</p>
+
diff --git a/docs/async_client.md b/docs/async_client.md
index 0c296c09fb..05c7a0b850 100644
--- a/docs/async_client.md
+++ b/docs/async_client.md
@@ -3,13 +3,14 @@ The G4F async client API is a powerful asynchronous interface for interacting wi
 
 
 ## Compatibility Note
-The G4F async client API is designed to be compatible with the OpenAI API, making it easy for developers familiar with OpenAI's interface to transition to G4F.
+The G4F async client API is designed to be compatible with the OpenAI and Anthropic API, making it easy for developers familiar with OpenAI's or Anthropic's interface to transition to G4F.
 
 ## Table of Contents
    - [Introduction](#introduction)
    - [Key Features](#key-features)
    - [Getting Started](#getting-started)
    - [Initializing the Client](#initializing-the-client)
+   - [Creating Chat Completions](#creating-chat-completions)
    - [Configuration](#configuration)
    - [Usage Examples](#usage-examples)
    - [Text Completions](#text-completions)
@@ -51,6 +52,30 @@ client = Client(
 )
 ```
 
+
+## Creating Chat Completions
+**Here’s an improved example of creating chat completions:**
+```python
+response = await async_client.chat.completions.create(
+    system="You are a helpful assistant.",
+    model="gpt-3.5-turbo",
+    messages=[
+        {
+            "role": "user",
+            "content": "Say this is a test"
+        }
+    ]
+     # Add other parameters as needed
+)
+```
+
+**This example:**
+   - Sets a system message to define the assistant's role
+   - Asks a specific question `Say this is a test`
+   - Configures various parameters like temperature and max_tokens for more control over the output
+   - Disables streaming for a complete response
+
+You can adjust these parameters based on your specific needs.
   
 
 ### Configuration
diff --git a/docs/client.md b/docs/client.md
index 0844540269..9621e3c2d9 100644
--- a/docs/client.md
+++ b/docs/client.md
@@ -7,6 +7,7 @@
    - [Getting Started](#getting-started)
    - [Switching to G4F Client](#switching-to-g4f-client)
    - [Initializing the Client](#initializing-the-client)
+   - [Creating Chat Completions](#creating-chat-completions)
    - [Configuration](#configuration)
    - [Usage Examples](#usage-examples)
    - [Text Completions](#text-completions)
@@ -22,7 +23,7 @@
   
 
 ## Introduction
-Welcome to the G4F Client API, a cutting-edge tool for seamlessly integrating advanced AI capabilities into your Python applications. This guide is designed to facilitate your transition from using the OpenAI client to the G4F Client, offering enhanced features while maintaining compatibility with the existing OpenAI API.
+Welcome to the G4F Client API, a cutting-edge tool for seamlessly integrating advanced AI capabilities into your Python applications. This guide is designed to facilitate your transition from using the OpenAI or Anthropic client to the G4F Client, offering enhanced features while maintaining compatibility with the existing OpenAI and Anthropic API.
 
 ## Getting Started
 ### Switching to G4F Client
@@ -42,7 +43,7 @@ from g4f.client import Client as OpenAI
 
   
 
-The G4F Client preserves the same familiar API interface as OpenAI, ensuring a smooth transition process.
+The G4F Client preserves the same familiar API interface as OpenAI or Anthropic, ensuring a smooth transition process.
 
 ## Initializing the Client
 To utilize the G4F Client, create a new instance. **Below is an example showcasing custom providers:**
@@ -56,6 +57,30 @@ client = Client(
     # Add any other necessary parameters
 )
 ```
+
+## Creating Chat Completions
+**Here’s an improved example of creating chat completions:**
+```python
+response = client.chat.completions.create(
+    system="You are a helpful assistant.",
+    model="gpt-3.5-turbo",
+    messages=[
+        {
+            "role": "user",
+            "content": "Say this is a test"
+        }
+    ]
+    # Add any other necessary parameters
+)
+```
+
+**This example:**
+   - Sets a system message to define the assistant's role
+   - Asks a specific question `Say this is a test`
+   - Configures various parameters like temperature and max_tokens for more control over the output
+   - Disables streaming for a complete response
+
+You can adjust these parameters based on your specific needs.
  
 
 ## Configuration
@@ -271,6 +296,7 @@ while True:
     try:
         # Get GPT's response
         response = client.chat.completions.create(
+            system="You are a helpful assistant.",
             messages=messages,
             model=g4f.models.default,
         )
diff --git a/docs/interference-api.md b/docs/interference-api.md
index 4050f84fd9..617df9cdc5 100644
--- a/docs/interference-api.md
+++ b/docs/interference-api.md
@@ -1,23 +1,30 @@
-
 # G4F - Interference API Usage Guide
-
+  
 
 ## Table of Contents
    - [Introduction](#introduction)
    - [Running the Interference API](#running-the-interference-api)
    - [From PyPI Package](#from-pypi-package)
    - [From Repository](#from-repository)
-   - [Usage with OpenAI Library](#usage-with-openai-library)
-   - [Usage with Requests Library](#usage-with-requests-library)
+   - [Using the Interference API](#using-the-interference-api)
+   - [Basic Usage](#basic-usage)
+   - [With OpenAI Library](#with-openai-library)
+   - [With Requests Library](#with-requests-library)
    - [Key Points](#key-points)
+   - [Conclusion](#conclusion)
+  
 
 ## Introduction
-The Interference API allows you to serve other OpenAI integrations with G4F. It acts as a proxy, translating requests to the OpenAI API into requests to the G4F providers.
+The G4F Interference API is a powerful tool that allows you to serve other OpenAI integrations using G4F (Gpt4free). It acts as a proxy, translating requests intended for the OpenAI and Anthropic API into requests compatible with G4F providers. This guide will walk you through the process of setting up, running, and using the Interference API effectively.
+  
 
 ## Running the Interference API
+**You can run the Interference API in two ways:** using the PyPI package or from the repository.
+  
 
 ### From PyPI Package
-**You can run the Interference API directly from the G4F PyPI package:**
+**To run the Interference API directly from the G4F PyPI package, use the following Python code:**
+
 ```python
 from g4f.api import run_api
 
@@ -25,37 +32,80 @@ run_api()
 ```
 
   
-
 ### From Repository
-Alternatively, you can run the Interference API from the cloned repository.  
+**If you prefer to run the Interference API from the cloned repository, you have two options:**
 
-**Run the server with:**
+1. **Using the command line:**
 ```bash
 g4f api
 ```
-or
+
+2. **Using Python:**
 ```bash
 python -m g4f.api.run
 ```
 
+**Once running, the API will be accessible at:** `http://localhost:1337/v1`
   
 
-## Usage with OpenAI Library
+## Using the Interference API
 
-  
+### Basic Usage
+**You can interact with the Interference API using curl commands for both text and image generation:**
 
+**For text generation:**
+```bash
+curl -X POST "http://localhost:1337/v1/chat/completions" \
+     -H "Content-Type: application/json" \
+     -d '{
+           "messages": [
+             {
+               "role": "user",
+               "content": "Hello"
+             }
+           ],
+           "model": "gpt-3.5-turbo"
+         }'
+```
+
+**For image generation:**
+1. **url:**
+```bash
+curl -X POST "http://localhost:1337/v1/images/generate" \
+     -H "Content-Type: application/json" \
+     -d '{
+           "prompt": "a white siamese cat",
+           "model": "dall-e-3",
+           "response_format": "url"
+         }'
+```
+
+2. **b64_json**
+```bash
+curl -X POST "http://localhost:1337/v1/images/generate" \
+     -H "Content-Type: application/json" \
+     -d '{
+           "prompt": "a white siamese cat",
+           "model": "dall-e-3",
+           "response_format": "b64_json"
+         }'
+```
+
+
+### With OpenAI Library
+
+**You can use the Interference API with the OpenAI Python library by changing the `base_url`:**
 ```python
 from openai import OpenAI
 
 client = OpenAI(
     api_key="",
-    # Change the API base URL to the local interference API
-    base_url="http://localhost:1337/v1"  
+    base_url="http://localhost:1337/v1"
 )
 
 response = client.chat.completions.create(
     model="gpt-3.5-turbo",
-    messages=[{"role": "user", "content": "write a poem about a tree"}],
+    messages=[{"role": "user", "content": "Write a poem about a tree"}],
     stream=True,
 )
 
@@ -68,20 +118,20 @@ else:
         content = token.choices[0].delta.content
         if content is not None:
             print(content, end="", flush=True)
-```
 
+```
   
 
-## Usage with Requests Library
-You can also send requests directly to the Interference API using the requests library. 
+### With Requests Library
 
-**Send a POST request to `/v1/chat/completions` with the request body containing the model and other parameters:**
+**You can also send requests directly to the Interference API using the `requests` library:**
 ```python
 import requests
 
 url = "http://localhost:1337/v1/chat/completions"
+
 body = {
-    "model": "gpt-3.5-turbo", 
+    "model": "gpt-3.5-turbo",
     "stream": False,
     "messages": [
         {"role": "assistant", "content": "What can you do?"}
@@ -92,18 +142,20 @@ json_response = requests.post(url, json=body).json().get('choices', [])
 
 for choice in json_response:
     print(choice.get('message', {}).get('content', ''))
-```
 
-  
+```
 
 ## Key Points
-- The Interference API translates OpenAI API requests into G4F provider requests
-- You can run it from the PyPI package or the cloned repository
-- It supports usage with the OpenAI Python library by changing the `base_url`
-- Direct requests can be sent to the API endpoints using libraries like `requests`
+   - The Interference API translates OpenAI API requests into G4F provider requests.
+   - It can be run from either the PyPI package or the cloned repository.
+   - The API supports usage with the OpenAI Python library by changing the `base_url`.
+   - Direct requests can be sent to the API endpoints using libraries like `requests`.
+   - Both text and image generation are supported.
 
   
-**_The Interference API allows easy integration of G4F with existing OpenAI-based applications and tools._**
+## Conclusion
+The G4F Interference API provides a seamless way to integrate G4F with existing OpenAI-based applications and tools. By following this guide, you should now be able to set up, run, and use the Interference API effectively. Whether you're using it for text generation, image creation, or as a drop-in replacement for OpenAI in your projects, the Interference API offers flexibility and power for your AI-driven applications.
+ 
 
 ---
 
diff --git a/docs/providers-and-models.md b/docs/providers-and-models.md
index a6d7ec4ba7..4bb22db4e8 100644
--- a/docs/providers-and-models.md
+++ b/docs/providers-and-models.md
@@ -51,6 +51,7 @@ This document provides an overview of various AI providers and models, including
 |[free.netfly.top](https://free.netfly.top)|`g4f.Provider.FreeNetfly`|✔|❌|❌|?|![Cloudflare](https://img.shields.io/badge/Cloudflare-f48d37)|❌|
 |[gemini.google.com](https://gemini.google.com)|`g4f.Provider.Gemini`|✔|❌|❌|✔|![Active](https://img.shields.io/badge/Active-brightgreen)|✔|
 |[ai.google.dev](https://ai.google.dev)|`g4f.Provider.GeminiPro`|✔|❌|✔|?|![Active](https://img.shields.io/badge/Active-brightgreen)|✔|
+|[app.giz.ai](https://app.giz.ai/assistant/)|`g4f.Provider.GizAI`|`gemini-flash, gemini-pro, gpt-4o-mini, gpt-4o, claude-3.5-sonnet, claude-3-haiku, llama-3.1-70b, llama-3.1-8b, mistral-large`|`sdxl, sd-1.5, sd-3.5, dalle-3, flux-schnell, flux1-pro`|❌|✔|![Active](https://img.shields.io/badge/Active-brightgreen)|❌|
 |[developers.sber.ru](https://developers.sber.ru/gigachat)|`g4f.Provider.GigaChat`|✔|❌|❌|✔|![Active](https://img.shields.io/badge/Active-brightgreen)|✔|
 |[gprochat.com](https://gprochat.com)|`g4f.Provider.GPROChat`|`gemini-pro`|❌|❌|✔|![Active](https://img.shields.io/badge/Active-brightgreen)|❌|
 |[console.groq.com/playground](https://console.groq.com/playground)|`g4f.Provider.Groq`|✔|❌|❌|?|![Active](https://img.shields.io/badge/Active-brightgreen)|✔|
@@ -201,6 +202,7 @@ This document provides an overview of various AI providers and models, including
 |sdxl-turbo|Stability AI|1+ Providers|[huggingface.co](https://huggingface.co/stabilityai/sdxl-turbo)|
 |sd-1.5|Stability AI|1+ Providers|[huggingface.co](https://huggingface.co/runwayml/stable-diffusion-v1-5)|
 |sd-3|Stability AI|1+ Providers|[huggingface.co](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/stable_diffusion_3)|
+|sd-3.5|Stability AI|1+ Providers|[stability.ai](https://stability.ai/news/introducing-stable-diffusion-3-5)|
 |playground-v2.5|Playground AI|1+ Providers|[huggingface.co](https://huggingface.co/playgroundai/playground-v2.5-1024px-aesthetic)|
 |flux|Black Forest Labs|2+ Providers|[github.com/black-forest-labs/flux](https://github.com/black-forest-labs/flux)|
 |flux-pro|Black Forest Labs|2+ Providers|[github.com/black-forest-labs/flux](https://github.com/black-forest-labs/flux)|
diff --git a/g4f/Provider/AI365VIP.py b/g4f/Provider/AI365VIP.py
index c7ebf6b527..511ad56851 100644
--- a/g4f/Provider/AI365VIP.py
+++ b/g4f/Provider/AI365VIP.py
@@ -10,7 +10,7 @@
 class AI365VIP(AsyncGeneratorProvider, ProviderModelMixin):
     url = "https://chat.ai365vip.com"
     api_endpoint = "/api/chat"
-    working = True
+    working = False
     default_model = 'gpt-3.5-turbo'
     models = [
         'gpt-3.5-turbo',
diff --git a/g4f/Provider/AiMathGPT.py b/g4f/Provider/AiMathGPT.py
index 4399320a70..90931691a6 100644
--- a/g4f/Provider/AiMathGPT.py
+++ b/g4f/Provider/AiMathGPT.py
@@ -59,10 +59,6 @@ async def create_async_generator(
         async with ClientSession(headers=headers) as session:
             data = {
                 "messages": [
-                    {
-                        "role": "system",
-                        "content": ""
-                    },
                     {
                         "role": "user",
                         "content": format_prompt(messages)
diff --git a/g4f/Provider/GizAI.py b/g4f/Provider/GizAI.py
new file mode 100644
index 0000000000..127edc9e42
--- /dev/null
+++ b/g4f/Provider/GizAI.py
@@ -0,0 +1,151 @@
+from __future__ import annotations
+
+import json
+from aiohttp import ClientSession
+
+from ..typing import AsyncResult, Messages
+from ..image import ImageResponse
+from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
+from .helper import format_prompt
+
+class GizAI(AsyncGeneratorProvider, ProviderModelMixin):
+    url = "https://app.giz.ai/assistant/"
+    api_endpoint = "https://app.giz.ai/api/data/users/inferenceServer.infer"
+    working = True
+    
+    supports_system_message = True
+    supports_message_history = True
+    
+    # Chat models
+    default_model = 'chat-gemini-flash'
+    chat_models = [
+        default_model,
+        'chat-gemini-pro',
+        'chat-gpt4m',
+        'chat-gpt4',
+        'claude-sonnet',
+        'claude-haiku',
+        'llama-3-70b',
+        'llama-3-8b',
+        'mistral-large',
+        'chat-o1-mini'
+    ]
+
+    # Image models
+    image_models = [
+        'flux1',
+        'sdxl',
+        'sd',
+        'sd35',
+    ]
+
+    models = [*chat_models, *image_models]
+    
+    model_aliases = {
+        # Chat model aliases
+        "gemini-flash": "chat-gemini-flash",
+        "gemini-pro": "chat-gemini-pro",
+        "gpt-4o-mini": "chat-gpt4m",
+        "gpt-4o": "chat-gpt4",
+        "claude-3.5-sonnet": "claude-sonnet",
+        "claude-3-haiku": "claude-haiku",
+        "llama-3.1-70b": "llama-3-70b",
+        "llama-3.1-8b": "llama-3-8b",
+        "o1-mini": "chat-o1-mini",
+        # Image model aliases
+        "sd-1.5": "sd",
+        "sd-3.5": "sd35",
+        "flux-schnell": "flux1",
+    }
+
+    @classmethod
+    def get_model(cls, model: str) -> str:
+        if model in cls.models:
+            return model
+        elif model in cls.model_aliases:
+            return cls.model_aliases[model]
+        else:
+            return cls.default_model
+
+    @classmethod
+    def is_image_model(cls, model: str) -> bool:
+        return model in cls.image_models
+
+    @classmethod
+    async def create_async_generator(
+        cls,
+        model: str,
+        messages: Messages,
+        proxy: str = None,
+        **kwargs
+    ) -> AsyncResult:
+        model = cls.get_model(model)
+        
+        headers = {
+            'Accept': 'application/json, text/plain, */*',
+            'Accept-Language': 'en-US,en;q=0.9',
+            'Cache-Control': 'no-cache',
+            'Connection': 'keep-alive',
+            'Content-Type': 'application/json',
+            'Origin': 'https://app.giz.ai',
+            'Pragma': 'no-cache',
+            'Sec-Fetch-Dest': 'empty',
+            'Sec-Fetch-Mode': 'cors',
+            'Sec-Fetch-Site': 'same-origin',
+            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
+            'sec-ch-ua': '"Not?A_Brand";v="99", "Chromium";v="130"',
+            'sec-ch-ua-mobile': '?0',
+            'sec-ch-ua-platform': '"Linux"'
+        }
+
+        async with ClientSession() as session:
+            if cls.is_image_model(model):
+                # Image generation
+                prompt = messages[-1]["content"]
+                data = {
+                    "model": model,
+                    "input": {
+                        "width": "1024",
+                        "height": "1024",
+                        "steps": 4,
+                        "output_format": "webp",
+                        "batch_size": 1,
+                        "mode": "plan",
+                        "prompt": prompt
+                    }
+                }
+                async with session.post(
+                    cls.api_endpoint,
+                    headers=headers,
+                    data=json.dumps(data),
+                    proxy=proxy
+                ) as response:
+                    response.raise_for_status()
+                    response_data = await response.json()
+                    if response_data.get('status') == 'completed' and response_data.get('output'):
+                        for url in response_data['output']:
+                            yield ImageResponse(images=url, alt="Generated Image")
+            else:
+                # Chat completion
+                data = {
+                    "model": model,
+                    "input": {
+                        "messages": [
+                            {
+                                "type": "human",
+                                "content": format_prompt(messages)
+                            }
+                        ],
+                        "mode": "plan"
+                    },
+                    "noStream": True
+                }
+                async with session.post(
+                    cls.api_endpoint,
+                    headers=headers,
+                    data=json.dumps(data),
+                    proxy=proxy
+                ) as response:
+                    response.raise_for_status()
+                    result = await response.json()
+                    yield result.get('output', '')
diff --git a/g4f/Provider/__init__.py b/g4f/Provider/__init__.py
index 8f36606ba4..1caf8aaf7f 100644
--- a/g4f/Provider/__init__.py
+++ b/g4f/Provider/__init__.py
@@ -47,6 +47,7 @@
 from .FreeGpt          import FreeGpt
 from .FreeNetfly       import FreeNetfly
 from .GeminiPro        import GeminiPro
+from .GizAI            import GizAI
 from .GPROChat         import GPROChat
 from .HuggingChat      import HuggingChat
 from .HuggingFace      import HuggingFace
diff --git a/g4f/api/__init__.py b/g4f/api/__init__.py
index 83df469a83..754a48f1cf 100644
--- a/g4f/api/__init__.py
+++ b/g4f/api/__init__.py
@@ -14,17 +14,18 @@
 from fastapi.encoders import jsonable_encoder
 from fastapi.middleware.cors import CORSMiddleware
 from pydantic import BaseModel
-from typing import Union, Optional
+from typing import Union, Optional, Iterator
 
 import g4f
 import g4f.debug
-from g4f.client import Client
+from g4f.client import Client, ChatCompletion, ChatCompletionChunk, ImagesResponse
 from g4f.typing import Messages
 from g4f.cookies import read_cookie_files
 
-def create_app():
+def create_app(g4f_api_key: str = None):
     app = FastAPI()
-    api = Api(app)
+
+    # Add CORS middleware
     app.add_middleware(
         CORSMiddleware,
         allow_origin_regex=".*",
@@ -32,18 +33,19 @@ def create_app():
         allow_methods=["*"],
         allow_headers=["*"],
     )
+
+    api = Api(app, g4f_api_key=g4f_api_key)
     api.register_routes()
     api.register_authorization()
     api.register_validation_exception_handler()
+
+    # Read cookie files if not ignored
     if not AppConfig.ignore_cookie_files:
         read_cookie_files()
-    return app
 
-def create_app_debug():
-    g4f.debug.logging = True
-    return create_app()
+    return app
 
-class ChatCompletionsForm(BaseModel):
+class ChatCompletionsConfig(BaseModel):
     messages: Messages
     model: str
     provider: Optional[str] = None
@@ -55,15 +57,12 @@ class ChatCompletionsForm(BaseModel):
     web_search: Optional[bool] = None
     proxy: Optional[str] = None
 
-class ImagesGenerateForm(BaseModel):
-    model: Optional[str] = None
-    provider: Optional[str] = None
+class ImageGenerationConfig(BaseModel):
     prompt: str
-    response_format: Optional[str] = None
-    api_key: Optional[str] = None
-    proxy: Optional[str] = None
+    model: Optional[str] = None
+    response_format: str = "url"
 
-class AppConfig():
+class AppConfig:
     ignored_providers: Optional[list[str]] = None
     g4f_api_key: Optional[str] = None
     ignore_cookie_files: bool = False
@@ -74,16 +73,23 @@ def set_config(cls, **data):
         for key, value in data.items():
             setattr(cls, key, value)
 
+list_ignored_providers: list[str] = None
+
+def set_list_ignored_providers(ignored: list[str]):
+    global list_ignored_providers
+    list_ignored_providers = ignored
+
 class Api:
-    def __init__(self, app: FastAPI) -> None:
+    def __init__(self, app: FastAPI, g4f_api_key=None) -> None:
         self.app = app
         self.client = Client()
+        self.g4f_api_key = g4f_api_key
         self.get_g4f_api_key = APIKeyHeader(name="g4f-api-key")
 
     def register_authorization(self):
         @self.app.middleware("http")
         async def authorization(request: Request, call_next):
-            if AppConfig.g4f_api_key and request.url.path in ["/v1/chat/completions", "/v1/completions"]:
+            if self.g4f_api_key and request.url.path in ["/v1/chat/completions", "/v1/completions", "/v1/images/generate"]:
                 try:
                     user_g4f_api_key = await self.get_g4f_api_key(request)
                 except HTTPException as e:
@@ -92,22 +98,26 @@ async def authorization(request: Request, call_next):
                             status_code=HTTP_401_UNAUTHORIZED,
                             content=jsonable_encoder({"detail": "G4F API key required"}),
                         )
-                if not secrets.compare_digest(AppConfig.g4f_api_key, user_g4f_api_key):
+                if not secrets.compare_digest(self.g4f_api_key, user_g4f_api_key):
                     return JSONResponse(
                         status_code=HTTP_403_FORBIDDEN,
                         content=jsonable_encoder({"detail": "Invalid G4F API key"}),
                     )
-            return await call_next(request)
+
+            response = await call_next(request)
+            return response
 
     def register_validation_exception_handler(self):
         @self.app.exception_handler(RequestValidationError)
         async def validation_exception_handler(request: Request, exc: RequestValidationError):
             details = exc.errors()
-            modified_details = [{
-                "loc": error["loc"],
-                "message": error["msg"],
-                "type": error["type"],
-            } for error in details]
+            modified_details = []
+            for error in details:
+                modified_details.append({
+                    "loc": error["loc"],
+                    "message": error["msg"],
+                    "type": error["type"],
+                })
             return JSONResponse(
                 status_code=HTTP_422_UNPROCESSABLE_ENTITY,
                 content=jsonable_encoder({"detail": modified_details}),
@@ -121,25 +131,23 @@ async def read_root():
         @self.app.get("/v1")
         async def read_root_v1():
             return HTMLResponse('g4f API: Go to '
-                                '<a href="/v1/chat/completions">chat/completions</a> '
-                                'or <a href="/v1/models">models</a>.')
+                                '<a href="/v1/chat/completions">chat/completions</a>, '
+                                '<a href="/v1/models">models</a>, or '
+                                '<a href="/v1/images/generate">images/generate</a>.')
 
         @self.app.get("/v1/models")
         async def models():
-            model_list = {
-                model: g4f.models.ModelUtils.convert[model]
+            model_list = dict(
+                (model, g4f.models.ModelUtils.convert[model])
                 for model in g4f.Model.__all__()
-            }
+            )
             model_list = [{
                 'id': model_id,
                 'object': 'model',
                 'created': 0,
                 'owned_by': model.base_provider
             } for model_id, model in model_list.items()]
-            return JSONResponse({
-                "object": "list",
-                "data": model_list,
-            })
+            return JSONResponse(model_list)
 
         @self.app.get("/v1/models/{model_name}")
         async def model_info(model_name: str):
@@ -155,7 +163,7 @@ async def model_info(model_name: str):
                 return JSONResponse({"error": "The model does not exist."})
 
         @self.app.post("/v1/chat/completions")
-        async def chat_completions(config: ChatCompletionsForm, request: Request = None, provider: str = None):
+        async def chat_completions(config: ChatCompletionsConfig, request: Request = None, provider: str = None):
             try:
                 config.provider = provider if config.provider is None else config.provider
                 if config.api_key is None and request is not None:
@@ -164,17 +172,27 @@ async def chat_completions(config: ChatCompletionsForm, request: Request = None,
                         auth_header = auth_header.split(None, 1)[-1]
                         if auth_header and auth_header != "Bearer":
                             config.api_key = auth_header
-                # Use the asynchronous create method and await it
-                response = await self.client.chat.completions.async_create(
+
+                # Create the completion response
+                response = self.client.chat.completions.create(
                     **{
                         **AppConfig.defaults,
                         **config.dict(exclude_none=True),
                     },
                     ignored=AppConfig.ignored_providers
                 )
-                if not config.stream:
+
+                # Check if the response is synchronous or asynchronous
+                if isinstance(response, ChatCompletion):
+                    # Synchronous response
                     return JSONResponse(response.to_json())
 
+                if not config.stream:
+                    # If the response is an iterator but not streaming, collect the result
+                    response_list = list(response) if isinstance(response, Iterator) else [response]
+                    return JSONResponse(response_list[0].to_json())
+
+                # Streaming response
                 async def streaming():
                     try:
                         async for chunk in response:
@@ -185,41 +203,38 @@ async def streaming():
                         logging.exception(e)
                         yield f'data: {format_exception(e, config)}\n\n'
                     yield "data: [DONE]\n\n"
+
                 return StreamingResponse(streaming(), media_type="text/event-stream")
 
             except Exception as e:
                 logging.exception(e)
                 return Response(content=format_exception(e, config), status_code=500, media_type="application/json")
 
-        @self.app.post("/v1/completions")
-        async def completions():
-            return Response(content=json.dumps({'info': 'Not working yet.'}, indent=4), media_type="application/json")
-
-        @self.app.post("/v1/images/generations")
-        async def images_generate(config: ImagesGenerateForm, request: Request = None, provider: str = None):
+        @self.app.post("/v1/images/generate")
+        async def generate_image(config: ImageGenerationConfig):
             try:
-                config.provider = provider if config.provider is None else config.provider
-                if config.api_key is None and request is not None:
-                    auth_header = request.headers.get("Authorization")
-                    if auth_header is not None:
-                        auth_header = auth_header.split(None, 1)[-1]
-                        if auth_header and auth_header != "Bearer":
-                            config.api_key = auth_header
-                # Use the asynchronous generate method and await it
-                response = await self.client.images.async_generate(
-                    **config.dict(exclude_none=True),
+                response: ImagesResponse = await self.client.images.async_generate(
+                    prompt=config.prompt,
+                    model=config.model,
+                    response_format=config.response_format
                 )
-                return JSONResponse(response.to_json())
+                # Convert Image objects to dictionaries
+                response_data = [image.to_dict() for image in response.data]
+                return JSONResponse({"data": response_data})
             except Exception as e:
                 logging.exception(e)
                 return Response(content=format_exception(e, config), status_code=500, media_type="application/json")
 
-def format_exception(e: Exception, config: ChatCompletionsForm) -> str:
+        @self.app.post("/v1/completions")
+        async def completions():
+            return Response(content=json.dumps({'info': 'Not working yet.'}, indent=4), media_type="application/json")
+
+def format_exception(e: Exception, config: Union[ChatCompletionsConfig, ImageGenerationConfig]) -> str:
     last_provider = g4f.get_last_provider(True)
     return json.dumps({
         "error": {"message": f"{e.__class__.__name__}: {e}"},
-        "model": last_provider.get("model") if last_provider else config.model,
-        "provider": last_provider.get("name") if last_provider else config.provider
+        "model": last_provider.get("model") if last_provider else getattr(config, 'model', None),
+        "provider": last_provider.get("name") if last_provider else getattr(config, 'provider', None)
     })
 
 def run_api(
@@ -228,18 +243,22 @@ def run_api(
     bind: str = None,
     debug: bool = False,
     workers: int = None,
-    use_colors: bool = None
+    use_colors: bool = None,
+    g4f_api_key: str = None
 ) -> None:
     print(f'Starting server... [g4f v-{g4f.version.utils.current_version}]' + (" (debug)" if debug else ""))
     if use_colors is None:
         use_colors = debug
     if bind is not None:
         host, port = bind.split(":")
+    if debug:
+        g4f.debug.logging = True
     uvicorn.run(
-        f"g4f.api:create_app{'_debug' if debug else ''}",
-        host=host, port=int(port),
-        workers=workers,
-        use_colors=use_colors,
-        factory=True,
+        "g4f.api:create_app", 
+        host=host, 
+        port=int(port), 
+        workers=workers, 
+        use_colors=use_colors, 
+        factory=True, 
         reload=debug
     )
diff --git a/g4f/client/client.py b/g4f/client/client.py
index 41238df5ef..2772f9bb11 100644
--- a/g4f/client/client.py
+++ b/g4f/client/client.py
@@ -149,6 +149,7 @@ def create(
         self,
         messages: Messages,
         model: str,
+        system: str = None,  # Added system parameter
         provider: ProviderType = None,
         stream: bool = False,
         proxy: str = None,
@@ -161,6 +162,12 @@ def create(
         ignore_stream: bool = False,
         **kwargs
     ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]:
+        # If a system prompt is provided, prepend it to the messages
+        if system:
+            system_message = {"role": "system", "content": system}
+            messages = [system_message] + messages
+
+        # Existing implementation continues...
         model, provider = get_model_and_provider(
             model,
             self.provider if provider is None else provider,
@@ -221,6 +228,7 @@ async def async_create(
         self,
         messages: Messages,
         model: str,
+        system: str = None,  # Added system parameter
         provider: ProviderType = None,
         stream: bool = False,
         proxy: str = None,
@@ -233,6 +241,12 @@ async def async_create(
         ignore_stream: bool = False,
         **kwargs
     ) -> Union[ChatCompletion, AsyncIterator[ChatCompletionChunk]]:
+        # If a system prompt is provided, prepend it to the messages
+        if system:
+            system_message = {"role": "system", "content": system}
+            messages = [system_message] + messages
+
+        # Existing implementation continues...
         model, provider = get_model_and_provider(
             model,
             self.provider if provider is None else provider,
@@ -271,16 +285,18 @@ async def async_create(
                 **kwargs
             )
 
-        # Removed 'await' here since 'async_iter_response' returns an async generator
-        response = async_iter_response(response, stream, response_format, max_tokens, stop)
-        response = async_iter_append_model_and_provider(response)
-
+        # Handle streaming or non-streaming responses
         if stream:
+            response = async_iter_response(response, stream, response_format, max_tokens, stop)
+            response = async_iter_append_model_and_provider(response)
             return response
         else:
+            response = async_iter_response(response, stream, response_format, max_tokens, stop)
+            response = async_iter_append_model_and_provider(response)
             async for result in response:
                 return result
 
+
 class Chat:
     completions: Completions
 
@@ -401,6 +417,12 @@ def __init__(self, url: str = None, b64_json: str = None):
     def __repr__(self):
         return f"Image(url={self.url}, b64_json={'<base64 data>' if self.b64_json else None})"
 
+    def to_dict(self):
+        return {
+            "url": self.url,
+            "b64_json": self.b64_json
+        }
+
 class ImagesResponse:
     def __init__(self, data: list[Image]):
         self.data = data
diff --git a/g4f/gui/client/index.html b/g4f/gui/client/index.html
index 1a660062ce..f8c11ea2e6 100644
--- a/g4f/gui/client/index.html
+++ b/g4f/gui/client/index.html
@@ -1,258 +1,272 @@
 <!DOCTYPE html>
 <html lang="en" data-framework="javascript">
-
-<head>
-    <meta charset="UTF-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0">
-    <meta name="description" content="A conversational AI system that listens, learns, and challenges">
-    <meta property="og:title" content="ChatGPT">
-    <meta property="og:image" content="https://openai.com/content/images/2022/11/ChatGPT.jpg">
-    <meta property="og:description" content="A conversational AI system that listens, learns, and challenges">
-    <meta property="og:url" content="https://g4f.ai">
-    <link rel="stylesheet" href="/static/css/style.css">
-    <link rel="apple-touch-icon" sizes="180x180" href="/static/img/apple-touch-icon.png">
-    <link rel="icon" type="image/png" sizes="32x32" href="/static/img/favicon-32x32.png">
-    <link rel="icon" type="image/png" sizes="16x16" href="/static/img/favicon-16x16.png">
-    <link rel="manifest" href="/static/img/site.webmanifest">
-    <script src="/static/js/icons.js"></script>
-    <script src="/static/js/highlightjs-copy.min.js"></script>
-    <script src="/static/js/chat.v1.js" defer></script>
-    <script src="https://cdn.jsdelivr.net/npm/markdown-it@13.0.1/dist/markdown-it.min.js"></script>
-    <link rel="stylesheet" href="/static/css/dracula.min.css">
-    <script>
-        MathJax = {
-            chtml: {
-                scale: 1,
-                displayAlign: 'left'
-            }
-        };
-    </script>
-    <script id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" async></script>
-    <script type="module" src="https://cdn.jsdelivr.net/npm/mistral-tokenizer-js" async>
-        import mistralTokenizer from "mistral-tokenizer-js"
-    </script>
-    <script type="module" src="https://cdn.jsdelivr.net/gh/belladoreai/llama-tokenizer-js@master/llama-tokenizer.js" async>
-        import llamaTokenizer from "llama-tokenizer-js"
-    </script>
-    <script src="https://cdn.jsdelivr.net/npm/gpt-tokenizer/dist/cl100k_base.js" async></script>
-    <script src="/static/js/text_to_speech/index.js" async></script>
-    <!--
-            <script src="/static/js/whisper-web/index.js" async></script>
-    -->
-    <script>
-        const user_image = '<img src="/static/img/user.png" alt="your avatar">';
-        const gpt_image = '<img src="/static/img/gpt.png" alt="your avatar">';
-    </script>
-    <script src="/static/js/highlight.min.js"></script>
-    <script>window.conversation_id = "{{chat_id}}"</script>
-    <title>g4f - gui</title>
-</head>
-
-<body>
-    <div class="gradient"></div>
-    <div class="row">
-        <div class="box conversations">
+   <head>
+      <meta charset="UTF-8">
+      <meta http-equiv="X-UA-Compatible" content="IE=edge">
+      <meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0">
+      <meta name="description" content="A conversational AI system that listens, learns, and challenges">
+      <meta property="og:title" content="ChatGPT">
+      <meta property="og:image" content="https://openai.com/content/images/2022/11/ChatGPT.jpg">
+      <meta property="og:description" content="A conversational AI system that listens, learns, and challenges">
+      <meta property="og:url" content="https://g4f.ai">
+      <link rel="stylesheet" href="/static/css/style.css">
+      <link rel="apple-touch-icon" sizes="180x180" href="/static/img/apple-touch-icon.png">
+      <link rel="icon" type="image/png" sizes="32x32" href="/static/img/favicon-32x32.png">
+      <link rel="icon" type="image/png" sizes="16x16" href="/static/img/favicon-16x16.png">
+      <link rel="manifest" href="/static/img/site.webmanifest">
+      <script src="/static/js/icons.js"></script>
+      <script src="/static/js/highlightjs-copy.min.js"></script>
+      <script src="/static/js/chat.v1.js" defer></script>
+      <script src="https://cdn.jsdelivr.net/npm/markdown-it@13.0.1/dist/markdown-it.min.js"></script>
+      <link rel="stylesheet" href="/static/css/dracula.min.css">
+      <script>
+         MathJax = {
+             chtml: {
+                 scale: 1,
+                 displayAlign: 'left'
+             }
+         };
+      </script>
+      <script id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" async></script>
+      <script type="module" src="https://cdn.jsdelivr.net/npm/mistral-tokenizer-js" async>
+         import mistralTokenizer from "mistral-tokenizer-js"
+      </script>
+      <script type="module" src="https://cdn.jsdelivr.net/gh/belladoreai/llama-tokenizer-js@master/llama-tokenizer.js" async>
+         import llamaTokenizer from "llama-tokenizer-js"
+      </script>
+      <script src="https://cdn.jsdelivr.net/npm/gpt-tokenizer/dist/cl100k_base.js" async></script>
+      <script src="/static/js/text_to_speech/index.js" async></script>
+      <!--
+         <script src="/static/js/whisper-web/index.js" async></script>
+         -->
+      <script>
+         const user_image = '<img src="/static/img/user.png" alt="your avatar">';
+         const gpt_image = '<img src="/static/img/gpt.png" alt="your avatar">';
+      </script>
+      <script src="/static/js/highlight.min.js"></script>
+      <script>window.conversation_id = "{{chat_id}}"</script>
+      <title>g4f - gui</title>
+   </head>
+   <body>
+      <div class="gradient"></div>
+      <div class="row">
+         <div class="box conversations">
             <div class="top">
-                <button class="new_convo" onclick="new_conversation()">
-                    <i class="fa-regular fa-plus"></i>
-                    <span>New Conversation</span>
-                </button>
+               <button class="new_convo" onclick="new_conversation()">
+               <i class="fa-regular fa-plus"></i>
+               <span>New Conversation</span>
+               </button>
             </div>
             <div class="bottom_buttons">
-                <!--
-                <button onclick="open_album();">
-                    <i class="fa-solid fa-toolbox"></i>
-                    <span>Images Album</span>
-                </button>
-                -->
-                <button onclick="open_settings();">
-                    <i class="fa-solid fa-toolbox"></i>
-                    <span>Open Settings</span>
-                </button>
-                <div class="info">
-                    <i class="fa-brands fa-discord"></i>
-                    <span class="convo-title">discord ~ <a href="https://discord.gg/XfybzPXPH5">discord.gg/XfybzPXPH5</a>
-                    </span>
-                </div>
-                <div class="info">
-                    <i class="fa-brands fa-github"></i>
-                    <span class="convo-title">github ~ <a href="https://github.com/xtekky/gpt4free">@xtekky/gpt4free</a>
-                    </span>
-                </div>
-                <div class="info">
-                    <i class="fa-solid fa-star"></i>
-                    <span id="version_text" class="convo-title"></span>
-                </div>
+               <button onclick="open_album();">
+               <i class="fa-solid fa-toolbox"></i>
+               <span>Images Album</span>
+               </button>
+               <button onclick="open_settings();">
+               <i class="fa-solid fa-toolbox"></i>
+               <span>Open Settings</span>
+               </button>
+               <div class="info">
+                  <i class="fa-brands fa-discord"></i>
+                  <span class="convo-title">discord ~ <a href="https://discord.gg/XfybzPXPH5">discord.gg/XfybzPXPH5</a>
+                  </span>
+               </div>
+               <div class="info">
+                  <i class="fa-brands fa-github"></i>
+                  <span class="convo-title">github ~ <a href="https://github.com/xtekky/gpt4free">@xtekky/gpt4free</a>
+                  </span>
+               </div>
+               <div class="info">
+                  <i class="fa-solid fa-star"></i>
+                  <span id="version_text" class="convo-title"></span>
+               </div>
             </div>
-        </div>
-        <div class="images hidden">
-            
-        </div>
-        <div class="settings hidden">
+         </div>
+         <div class="images hidden">
+         </div>
+         <div class="settings hidden">
             <div class="paper">
-            <h3>Settings</h3>
-            <div class="field">
-                <span class="label">Enable Dark Mode</span>
-                <input type="checkbox" id="darkMode" checked />
-                <label for="darkMode" class="toogle" title=""></label>
-            </div>
-            <div class="field">
-                <span class="label">Web Access with DuckDuckGo</span>
-                <input type="checkbox" id="switch" />
-                <label for="switch" class="toogle" title="Add the pages of the first 5 search results to the query."></label>
-            </div>
-            <div class="field">
-                <span class="label">Disable Conversation History</span>
-                <input type="checkbox" id="history" />
-                <label for="history" class="toogle" title="To improve the reaction time or if you have trouble with large conversations."></label>
-            </div>
-            <div class="field">
-                <span class="label">Hide System-prompt</span>
-                <input type="checkbox" id="hide-systemPrompt" />
-                <label for="hide-systemPrompt" class="toogle" title="For more space on phones"></label>
-            </div>
-            <div class="field">
-                <span class="label">Auto continue in ChatGPT</span>
-                <input id="auto_continue" type="checkbox" name="auto_continue" checked/>
-                <label for="auto_continue" class="toogle" title="Continue large responses in OpenaiChat"></label>
-            </div>
-            <div class="field box">
-                <label for="message-input-height" class="label" title="">Input max. height</label>
-                <input type="number" id="message-input-height" value="200"/>
-            </div>
-            <div class="field box">
-                <label for="recognition-language" class="label" title="">Speech recognition lang</label>
-                <input type="text" id="recognition-language" value="" placeholder="navigator.language"/>
-            </div>
-            <div class="field box">
-                <label for="BingCreateImages-api_key" class="label" title="">Microsoft Designer in Bing:</label>
-                <textarea id="BingCreateImages-api_key" name="BingCreateImages[api_key]" placeholder="&quot;_U&quot; cookie"></textarea>
-            </div>
-            <div class="field box">
-                <label for="DeepInfra-api_key" class="label" title="">DeepInfra:</label>
-                <textarea id="DeepInfra-api_key" name="DeepInfra[api_key]" class="DeepInfraImage-api_key" placeholder="api_key"></textarea>
-            </div>
-            <div class="field box">
-                <label for="GeminiPro-api_key" class="label" title="">Gemini API:</label>
-                <textarea id="GeminiPro-api_key" name="GeminiPro[api_key]" placeholder="api_key"></textarea>
-            </div>
-            <div class="field box">
-                <label for="Groq-api_key" class="label" title="">Groq:</label>
-                <textarea id="Groq-api_key" name="Groq[api_key]" placeholder="api_key"></textarea>
-            </div>
-            <div class="field box">
-                <label for="HuggingFace-api_key" class="label" title="">HuggingFace:</label>
-                <textarea id="HuggingFace-api_key" name="HuggingFace[api_key]" placeholder="api_key"></textarea>
-            </div>
-            <div class="field box">
-                <label for="Openai-api_key" class="label" title="">OpenAI API:</label>
-                <textarea id="Openai-api_key" name="Openai[api_key]" placeholder="api_key"></textarea>
-            </div>
-            <div class="field box">
-                <label for="OpenRouter-api_key" class="label" title="">OpenRouter:</label>
-                <textarea id="OpenRouter-api_key" name="OpenRouter[api_key]" placeholder="api_key"></textarea>
-            </div>
-            <div class="field box">
-                <label for="PerplexityApi-api_key" class="label" title="">Perplexity API:</label>
-                <textarea id="PerplexityApi-api_key" name="PerplexityApi[api_key]" placeholder="api_key"></textarea>
-            </div>
-            <div class="field box">
-                <label for="Replicate-api_key" class="label" title="">Replicate:</label>
-                <textarea id="Replicate-api_key" name="Replicate[api_key]" class="ReplicateImage-api_key" placeholder="api_key"></textarea>
-            </div>
+               <h3>Settings</h3>
+               <div class="field">
+                  <span class="label">Enable Dark Mode</span>
+                  <input type="checkbox" id="darkMode" checked />
+                  <label for="darkMode" class="toogle" title=""></label>
+               </div>
+               <div class="field">
+                  <span class="label">Web Access with DuckDuckGo</span>
+                  <input type="checkbox" id="switch" />
+                  <label for="switch" class="toogle" title="Add the pages of the first 5 search results to the query."></label>
+               </div>
+               <div class="field">
+                  <span class="label">Disable Conversation History</span>
+                  <input type="checkbox" id="history" />
+                  <label for="history" class="toogle" title="To improve the reaction time or if you have trouble with large conversations."></label>
+               </div>
+               <div class="field">
+                  <span class="label">Hide System-prompt</span>
+                  <input type="checkbox" id="hide-systemPrompt" />
+                  <label for="hide-systemPrompt" class="toogle" title="For more space on phones"></label>
+               </div>
+               <div class="field">
+                  <span class="label">Auto continue in ChatGPT</span>
+                  <input id="auto_continue" type="checkbox" name="auto_continue" checked/>
+                  <label for="auto_continue" class="toogle" title="Continue large responses in OpenaiChat"></label>
+               </div>
+               <div class="field box">
+                  <label for="message-input-height" class="label" title="">Input max. height</label>
+                  <input type="number" id="message-input-height" value="200"/>
+               </div>
+               <div class="field box">
+                  <label for="recognition-language" class="label" title="">Speech recognition lang</label>
+                  <input type="text" id="recognition-language" value="" placeholder="navigator.language"/>
+               </div>
+               <div class="field box">
+                  <label for="BingCreateImages-api_key" class="label" title="">Microsoft Designer in Bing:</label>
+                  <textarea id="BingCreateImages-api_key" name="BingCreateImages[api_key]" placeholder="&quot;_U&quot; cookie"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="DeepInfra-api_key" class="label" title="">DeepInfra:</label>
+                  <textarea id="DeepInfra-api_key" name="DeepInfra[api_key]" class="DeepInfraImage-api_key" placeholder="api_key"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="GeminiPro-api_key" class="label" title="">Gemini API:</label>
+                  <textarea id="GeminiPro-api_key" name="GeminiPro[api_key]" placeholder="api_key"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="Groq-api_key" class="label" title="">Groq:</label>
+                  <textarea id="Groq-api_key" name="Groq[api_key]" placeholder="api_key"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="HuggingFace-api_key" class="label" title="">HuggingFace:</label>
+                  <textarea id="HuggingFace-api_key" name="HuggingFace[api_key]" placeholder="api_key"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="Openai-api_key" class="label" title="">OpenAI API:</label>
+                  <textarea id="Openai-api_key" name="Openai[api_key]" placeholder="api_key"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="OpenRouter-api_key" class="label" title="">OpenRouter:</label>
+                  <textarea id="OpenRouter-api_key" name="OpenRouter[api_key]" placeholder="api_key"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="PerplexityApi-api_key" class="label" title="">Perplexity API:</label>
+                  <textarea id="PerplexityApi-api_key" name="PerplexityApi[api_key]" placeholder="api_key"></textarea>
+               </div>
+               <div class="field box">
+                  <label for="Replicate-api_key" class="label" title="">Replicate:</label>
+                  <textarea id="Replicate-api_key" name="Replicate[api_key]" class="ReplicateImage-api_key" placeholder="api_key"></textarea>
+               </div>
             </div>
             <div class="bottom_buttons">
-                <button onclick="delete_conversations()">
-                    <i class="fa-regular fa-trash"></i>
-                    <span>Clear Conversations</span>
-                </button>
-                <button onclick="save_storage()">
-                    <i class="fa-solid fa-download"></i>
-                    <a href="" onclick="return false;">Export Conversations</a>
-                </button>
+               <button onclick="delete_conversations()">
+               <i class="fa-regular fa-trash"></i>
+               <span>Clear Conversations</span>
+               </button>
+               <button onclick="save_storage()">
+               <i class="fa-solid fa-download"></i>
+               <a href="" onclick="return false;">Export Conversations</a>
+               </button>
             </div>
-        </div>
-        <div class="conversation">
+         </div>
+         <div class="conversation">
             <textarea id="systemPrompt" class="box" placeholder="System prompt"></textarea>
             <div id="messages" class="box"></div>
             <button class="slide-systemPrompt">
-                <i class="fa-solid fa-angles-up"></i>
+            <i class="fa-solid fa-angles-up"></i>
             </button>
             <div class="toolbar">
-                <div id="input-count" class="">
-                    <button class="hide-input">
-                        <i class="fa-solid fa-angles-down"></i>
-                    </button>
-                    <span class="text"></span>
-                </div>
-                <div class="stop_generating stop_generating-hidden">
-                    <button id="cancelButton">
-                        <span>Stop Generating</span>
-                        <i class="fa-regular fa-stop"></i>
-                    </button>
-                </div>
-                <div class="regenerate regenerate-hidden">
-                    <button id="regenerateButton">
-                        <span>Regenerate</span>
-                        <i class="fa-solid fa-rotate"></i>
-                    </button>
-                </div>
+               <div id="input-count" class="">
+                  <button class="hide-input">
+                  <i class="fa-solid fa-angles-down"></i>
+                  </button>
+                  <span class="text"></span>
+               </div>
+               <div class="stop_generating stop_generating-hidden">
+                  <button id="cancelButton">
+                  <span>Stop Generating</span>
+                  <i class="fa-regular fa-stop"></i>
+                  </button>
+               </div>
+               <div class="regenerate regenerate-hidden">
+                  <button id="regenerateButton">
+                  <span>Regenerate</span>
+                  <i class="fa-solid fa-rotate"></i>
+                  </button>
+               </div>
             </div>
             <div class="user-input">
-                <div class="box input-box">
-                    <textarea id="message-input" placeholder="Ask a question" cols="30" rows="10"
-                        style="white-space: pre-wrap;resize: none;"></textarea>
-                    <label class="file-label image-label" for="image" title="Works with Bing, Gemini, OpenaiChat and You">
-                        <input type="file" id="image" name="image" accept="image/*" required/>
-                        <i class="fa-regular fa-image"></i>
-                    </label>
-                    <label class="file-label image-label" for="camera">
-                        <input type="file" id="camera" name="camera" accept="image/*" capture="camera" required/>
-                        <i class="fa-solid fa-camera"></i>
-                    </label>
-                    <label class="file-label" for="file">
-                        <input type="file" id="file" name="file" accept="text/plain, text/html, text/xml, application/json, text/javascript, .sh, .py, .php, .css, .yaml, .sql, .log, .csv, .twig, .md" required/>
-                        <i class="fa-solid fa-paperclip"></i>
-                    </label>
-                    <label class="micro-label" for="micro">
-                        <i class="fa-solid fa-microphone-slash"></i>
-                    </label>
-                    <div id="send-button">
-                        <i class="fa-solid fa-paper-plane-top"></i>
-                    </div>
-                </div>
+               <div class="box input-box">
+                  <textarea id="message-input" placeholder="Ask a question" cols="30" rows="10"
+                     style="white-space: pre-wrap;resize: none;"></textarea>
+                  <label class="file-label image-label" for="image" title="Works with Bing, Gemini, OpenaiChat and You">
+                  <input type="file" id="image" name="image" accept="image/*" required/>
+                  <i class="fa-regular fa-image"></i>
+                  </label>
+                  <label class="file-label image-label" for="camera">
+                  <input type="file" id="camera" name="camera" accept="image/*" capture="camera" required/>
+                  <i class="fa-solid fa-camera"></i>
+                  </label>
+                  <label class="file-label" for="file">
+                  <input type="file" id="file" name="file" accept="text/plain, text/html, text/xml, application/json, text/javascript, .sh, .py, .php, .css, .yaml, .sql, .log, .csv, .twig, .md" required/>
+                  <i class="fa-solid fa-paperclip"></i>
+                  </label>
+                  <label class="micro-label" for="micro">
+                  <i class="fa-solid fa-microphone-slash"></i>
+                  </label>
+                  <div id="send-button">
+                     <i class="fa-solid fa-paper-plane-top"></i>
+                  </div>
+               </div>
             </div>
             <div class="buttons">
-                <div class="field">
-                    <select name="model" id="model">
-                        <option value="">Model: Default</option>
-                        <option value="gpt-4">gpt-4</option>
-                        <option value="gpt-3.5-turbo">gpt-3.5-turbo</option>
-                        <option value="llama-3-70b-chat">llama-3-70b-chat</option>
-                        <option value="llama-3.1-70b">llama-3.1-70b</option>
-                        <option value="gemini-pro">gemini-pro</option>
-                        <option value="">----</option>
-                    </select>
-                    <select name="model2" id="model2" class="hidden"></select>
-                </div>
-                <div class="field">
-                    <select name="provider" id="provider">
-                        <option value="">Provider: Auto</option>
-                        <option value="Bing">Bing</option>
-                        <option value="OpenaiChat">OpenAI ChatGPT</option>
-                        <option value="Gemini">Gemini</option>
-                        <option value="Liaobots">Liaobots</option>
-                        <option value="MetaAI">Meta AI</option>
-                        <option value="You">You</option>
-                        <option value="">----</option>
-                    </select>
-                </div>
+               <div class="field">
+                  <select name="model" id="model">
+                     <option value="">Model: Default</option>
+                     <option value="gpt-4">gpt-4</option>
+                     <option value="gpt-4o">gpt-4o</option>
+                     <option value="gpt-4o-mini">gpt-4o-mini</option>
+                     <option value="llama-3.1-70b">llama-3.1-70b</option>
+                     <option value="llama-3.1-70b">llama-3.1-405b</option>
+                     <option value="llama-3.1-70b">mixtral-8x7b</option>
+                     <option value="gemini-pro">gemini-pro</option>
+                     <option value="gemini-flash">gemini-flash</option>
+                     <option value="claude-3-haiku">claude-3-haiku</option>
+                     <option value="claude-3.5-sonnet">claude-3.5-sonnet</option>
+                     <option value="">----</option>
+                  </select>
+                  <select name="model2" id="model2" class="hidden"></select>
+               </div>
+               <div class="field">
+                  <select name="provider" id="provider">
+                     <option value="">Provider: Auto</option>
+                     <option value="OpenaiChat">OpenAI ChatGPT</option>
+                     <option value="Gemini">Gemini</option>
+                     <option value="MetaAI">Meta AI</option>
+                     <option value="DeepInfraChat">DeepInfraChat</option>
+                     <option value="ReplicateHome">ReplicateHome</option>
+                     <option value="Blackbox">Blackbox</option>
+                     <option value="HuggingChat">HuggingChat</option>
+                     <option value="DDG">DDG</option>
+                     <option value="Pizzagpt">Pizzagpt</option>
+                     <option value="">----</option>
+                  </select>
+               </div>
             </div>
-        </div>
-    </div>
-    <div class="mobile-sidebar">
-        <i class="fa-solid fa-bars"></i>
-    </div>
-</body>
+         </div>
+      </div>
+      <div id="imageModal" class="modal hidden">
+         <span class="close">&times;</span>
+         <img class="modal-content" id="img01">
+         <div id="caption"></div>
+         <div class="navigation-controls">
+            <button id="prevImage" class="nav-button left">&#10094;</button>
+            <span id="imageCounter" class="image-counter"></span>
+            <button id="nextImage" class="nav-button right">&#10095;</button>
+         </div>
+      </div>
+      <div class="mobile-sidebar">
+         <i class="fa-solid fa-bars"></i>
+      </div>
+   </body>
 </html>
+
diff --git a/g4f/gui/client/static/css/style.css b/g4f/gui/client/static/css/style.css
index 441e204243..72f3ec4f2c 100644
--- a/g4f/gui/client/static/css/style.css
+++ b/g4f/gui/client/static/css/style.css
@@ -474,7 +474,6 @@ body {
 
 .stop_generating, .toolbar .regenerate {
     position: absolute;
-    z-index: 1000000;
     top: 0;
     right: 0;
 }
@@ -1118,6 +1117,92 @@ a:-webkit-any-link {
     display: none;
 }
 
+.album-image {
+    width: 100px;
+    height: auto;
+    margin: 5px;
+    display: inline-block;
+}
+
+.modal {
+    display: none;
+    position: fixed;
+    z-index: 1;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    background-color: rgba(0,0,0,0.9);
+}
+
+.modal-content {
+    margin: auto;
+    display: block;
+    max-width: 80%;
+    max-height: 80%;
+    transition: transform 0.2s;
+}
+
+.close {
+    position: absolute;
+    top: 15px;
+    right: 35px;
+    color: #f1f1f1;
+    font-size: 40px;
+    font-weight: bold;
+    transition: 0.3s;
+}
+
+.close:hover,
+.close:focus {
+    color: #bbb;
+    text-decoration: none;
+    cursor: pointer;
+}
+
+
+.image-counter {
+    color: #fff;
+    font-size: 18px;
+    margin: auto 10px;
+    user-select: none;
+}
+
+.nav-button {
+    background-color: #555;
+    color: #fff;
+    border: none;
+    padding: 10px;
+    font-size: 20px;
+    cursor: pointer;
+}
+
+.nav-button:hover {
+    background-color: #777;
+}
+
+.nav-button {
+    position: relative;
+}
+
+.nav-button.left {
+    left: 0;
+}
+
+.nav-button.right {
+    right: 0;
+}
+
+.navigation-controls {
+    position: absolute;
+    bottom: 20px;
+    left: 50%;
+    transform: translateX(-50%);
+    display: flex;
+    gap: 10px;
+}
+
 .blink {
     animation: blinker 1s step-start infinite;
 }
diff --git a/g4f/gui/client/static/js/chat.v1.js b/g4f/gui/client/static/js/chat.v1.js
index 9790b261d5..10b5c1f070 100644
--- a/g4f/gui/client/static/js/chat.v1.js
+++ b/g4f/gui/client/static/js/chat.v1.js
@@ -306,6 +306,14 @@ const prepare_messages = (messages, message_index = -1) => {
         messages = messages.filter((_, index) => message_index >= index);
     }
 
+    let new_messages = [];
+    if (systemPrompt?.value) {
+        new_messages.push({
+            "role": "system",
+            "content": systemPrompt.value
+        });
+    }
+
     // Remove history, if it's selected
     if (document.getElementById('history')?.checked) {
         if (message_index == null) {
@@ -315,13 +323,6 @@ const prepare_messages = (messages, message_index = -1) => {
         }
     }
 
-    let new_messages = [];
-    if (systemPrompt?.value) {
-        new_messages.push({
-            "role": "system",
-            "content": systemPrompt.value
-        });
-    }
     messages.forEach((new_message) => {
         // Include only not regenerated messages
         if (new_message && !new_message.regenerate) {
@@ -334,6 +335,7 @@ const prepare_messages = (messages, message_index = -1) => {
     return new_messages;
 }
 
+
 async function add_message_chunk(message) {
     if (message.type == "conversation") {
         console.info("Conversation used:", message.conversation)
@@ -902,17 +904,127 @@ function open_settings() {
     }
 }
 
+async function loadImages() {
+    try {
+        const response = await fetch('/images');
+        const images = await response.json();
+        console.log(images);
+        displayImages(images);
+    } catch (error) {
+        console.error('Error fetching images:', error);
+    }
+}
+
+function displayImages(images) {
+    const album = document.querySelector('.images');
+    album.innerHTML = '';
+    images.forEach(image => {
+        const imgElement = document.createElement('img');
+        imgElement.src = image;
+        imgElement.alt = 'Generated Image';
+        imgElement.classList.add('album-image');
+        album.appendChild(imgElement);
+    });
+}
+
+document.addEventListener('DOMContentLoaded', () => {
+    loadImages();
+});
+
 function open_album() {
+    const album = document.querySelector('.images');
     if (album.classList.contains("hidden")) {
         sidebar.classList.remove("shown");
         settings.classList.add("hidden");
         album.classList.remove("hidden");
         history.pushState({}, null, "/images/");
+        loadImages();
     } else {
         album.classList.add("hidden");
     }
 }
 
+let currentScale = 1;
+let currentImageIndex = 0;
+let imagesList = [];
+
+function displayImages(images) {
+    imagesList = images;
+    const album = document.querySelector('.images');
+    album.innerHTML = '';
+    images.forEach((image, index) => {
+        const imgElement = document.createElement('img');
+        imgElement.src = image;
+        imgElement.alt = 'Generated Image';
+        imgElement.classList.add('album-image');
+        imgElement.style.cursor = 'pointer';
+        imgElement.addEventListener('click', () => openImageModal(index));
+        album.appendChild(imgElement);
+    });
+}
+
+function openImageModal(index) {
+    currentImageIndex = index;
+    const modal = document.getElementById('imageModal');
+    const modalImg = document.getElementById('img01');
+    const imageCounter = document.getElementById('imageCounter');
+    modal.style.display = 'block';
+    modalImg.src = imagesList[index];
+    currentScale = 1;
+    modalImg.style.transform = `scale(${currentScale})`;
+    imageCounter.textContent = `${index + 1} / ${imagesList.length}`;
+}
+
+const modal = document.getElementById('imageModal');
+const span = document.getElementsByClassName('close')[0];
+const prevImageButton = document.getElementById('prevImage');
+const nextImageButton = document.getElementById('nextImage');
+
+span.onclick = function() {
+    modal.style.display = 'none';
+}
+
+window.onclick = function(event) {
+    if (event.target == modal) {
+        modal.style.display = 'none';
+    }
+}
+
+document.getElementById('img01').addEventListener('wheel', function(event) {
+    event.preventDefault();
+    if (event.deltaY < 0) {
+        currentScale += 0.1;
+    } else if (currentScale > 0.1) {
+        currentScale -= 0.1;
+    }
+    document.getElementById('img01').style.transform = `scale(${currentScale})`;
+});
+
+prevImageButton.onclick = function() {
+    if (currentImageIndex > 0) {
+        currentImageIndex--;
+        openImageModal(currentImageIndex);
+    }
+}
+
+nextImageButton.onclick = function() {
+    if (currentImageIndex < imagesList.length - 1) {
+        currentImageIndex++;
+        openImageModal(currentImageIndex);
+    }
+}
+
+document.addEventListener('keydown', function(event) {
+    if (modal.style.display === 'block') {
+        if (event.key === 'ArrowLeft') {
+            prevImageButton.click();
+        } else if (event.key === 'ArrowRight') {
+            nextImageButton.click();
+        }
+    }
+});
+
+
 const register_settings_storage = async () => {
     optionElements.forEach((element) => {
         if (element.type == "textarea") {
@@ -1424,4 +1536,4 @@ if (SpeechRecognition) {
             recognition.start();
         }
     });
-}
\ No newline at end of file
+}
diff --git a/g4f/gui/server/api.py b/g4f/gui/server/api.py
index 57f3eaa192..51cf3d32f5 100644
--- a/g4f/gui/server/api.py
+++ b/g4f/gui/server/api.py
@@ -2,12 +2,11 @@
 
 import logging
 import os
-import os.path
 import uuid
 import asyncio
 import time
 from aiohttp import ClientSession
-from typing import Iterator, Optional
+from typing import Iterator, Optional, AsyncIterator, Union
 from flask import send_from_directory
 
 from g4f import version, models
@@ -20,21 +19,20 @@
 from g4f.providers.base_provider import ProviderModelMixin, FinishReason
 from g4f.providers.conversation import BaseConversation
 
-conversations: dict[dict[str, BaseConversation]] = {}
+# Define the directory for generated images
 images_dir = "./generated_images"
 
+# Function to ensure the images directory exists
+def ensure_images_dir():
+    if not os.path.exists(images_dir):
+        os.makedirs(images_dir)
+
+conversations: dict[dict[str, BaseConversation]] = {}
+
 
 class Api:
     @staticmethod
     def get_models() -> list[str]:
-        """
-        Return a list of all models.
-
-        Fetches and returns a list of all available models in the system.
-
-        Returns:
-            List[str]: A list of model names.
-        """
         return models._all_models
 
     @staticmethod
@@ -82,9 +80,6 @@ def get_image_models() -> list[dict]:
 
     @staticmethod
     def get_providers() -> list[str]:
-        """
-        Return a list of all working providers.
-        """
         return {
             provider.__name__: (
                 provider.label if hasattr(provider, "label") else provider.__name__
@@ -99,12 +94,6 @@ def get_providers() -> list[str]:
 
     @staticmethod
     def get_version():
-        """
-        Returns the current and latest version of the application.
-
-        Returns:
-            dict: A dictionary containing the current and latest version.
-        """
         try:
             current_version = version.utils.current_version
         except VersionNotFoundError:
@@ -115,18 +104,10 @@ def get_version():
         }
 
     def serve_images(self, name):
+        ensure_images_dir()
         return send_from_directory(os.path.abspath(images_dir), name)
 
     def _prepare_conversation_kwargs(self, json_data: dict, kwargs: dict):
-        """
-        Prepares arguments for chat completion based on the request data.
-
-        Reads the request and prepares the necessary arguments for handling 
-        a chat completion request.
-
-        Returns:
-            dict: Arguments prepared for chat completion.
-        """
         model = json_data.get('model') or models.default
         provider = json_data.get('provider')
         messages = json_data['messages']
@@ -159,13 +140,11 @@ def _create_response_stream(self, kwargs: dict, conversation_id: str, provider:
             result = ChatCompletion.create(**kwargs)
             first = True
             if isinstance(result, ImageResponse):
-                # Якщо результат є ImageResponse, обробляємо його як одиночний елемент
                 if first:
                     first = False
                     yield self._format_json("provider", get_last_provider(True))
                 yield self._format_json("content", str(result))
             else:
-                # Якщо результат є ітерабельним, обробляємо його як раніше
                 for chunk in result:
                     if first:
                         first = False
@@ -181,7 +160,6 @@ def _create_response_stream(self, kwargs: dict, conversation_id: str, provider:
                     elif isinstance(chunk, ImagePreview):
                         yield self._format_json("preview", chunk.to_string())
                     elif isinstance(chunk, ImageResponse):
-                        # Обробка ImageResponse
                         images = asyncio.run(self._copy_images(chunk.get_list(), chunk.options.get("cookies")))
                         yield self._format_json("content", str(ImageResponse(images, chunk.alt)))
                     elif not isinstance(chunk, FinishReason):
@@ -190,8 +168,8 @@ def _create_response_stream(self, kwargs: dict, conversation_id: str, provider:
             logging.exception(e)
             yield self._format_json('error', get_error_message(e))
 
-    # Додайте цей метод до класу Api
     async def _copy_images(self, images: list[str], cookies: Optional[Cookies] = None):
+        ensure_images_dir()
         async with ClientSession(
             connector=get_connector(None, os.environ.get("G4F_PROXY")),
             cookies=cookies
@@ -212,16 +190,6 @@ async def copy_image(image):
             return await asyncio.gather(*[copy_image(image) for image in images])
 
     def _format_json(self, response_type: str, content):
-        """
-        Formats and returns a JSON response.
-
-        Args:
-            response_type (str): The type of the response.
-            content: The content to be included in the response.
-
-        Returns:
-            str: A JSON formatted string.
-        """
         return {
             'type': response_type,
             response_type: content
@@ -229,15 +197,6 @@ def _format_json(self, response_type: str, content):
 
 
 def get_error_message(exception: Exception) -> str:
-    """
-    Generates a formatted error message from an exception.
-
-    Args:
-        exception (Exception): The exception to format.
-
-    Returns:
-        str: A formatted error message string.
-    """
     message = f"{type(exception).__name__}: {exception}"
     provider = get_last_provider()
     if provider is None:
diff --git a/g4f/gui/server/backend.py b/g4f/gui/server/backend.py
index dc1b1080c5..e24d4da2e6 100644
--- a/g4f/gui/server/backend.py
+++ b/g4f/gui/server/backend.py
@@ -1,5 +1,6 @@
 import json
-from flask import request, Flask
+import os
+from flask import request, Flask, jsonify, send_from_directory
 from g4f.image import is_allowed_extension, to_image
 from .api import Api
 
@@ -54,6 +55,10 @@ def __init__(self, app: Flask) -> None:
             '/images/<path:name>': {
                 'function': self.serve_images,
                 'methods': ['GET']
+            },
+            '/images': {
+                'function': self.get_images,
+                'methods': ['GET']
             }
         }
 
@@ -110,4 +115,19 @@ def _format_json(self, response_type: str, content) -> str:
         Returns:
             str: A JSON formatted string.
         """
-        return json.dumps(super()._format_json(response_type, content)) + "\n"
\ No newline at end of file
+        return json.dumps(super()._format_json(response_type, content)) + "\n"
+
+    @staticmethod
+    def get_images():
+        images_dir = "./generated_images"
+        try:
+            images = [f for f in os.listdir(images_dir) if os.path.isfile(os.path.join(images_dir, f))]
+            images = [f"/images/{image}" for image in images if image.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp'))]
+            return jsonify(images)
+        except Exception as e:
+            return str(e), 500
+
+    @staticmethod
+    def serve_images(name):
+        images_dir = "./generated_images"
+        return send_from_directory(os.path.abspath(images_dir), name)
diff --git a/g4f/gui/server/website.py b/g4f/gui/server/website.py
index 5e63367484..3cabcdf3e4 100644
--- a/g4f/gui/server/website.py
+++ b/g4f/gui/server/website.py
@@ -27,6 +27,10 @@ def redirect_home():
                 'function': redirect_home,
                 'methods': ['GET', 'POST']
             },
+            '/images/': {
+                'function': redirect_home,
+                'methods': ['GET', 'POST']
+            },
         }
 
     def _chat(self, conversation_id):
@@ -35,4 +39,4 @@ def _chat(self, conversation_id):
         return render_template('index.html', chat_id=conversation_id)
 
     def _index(self):
-        return render_template('index.html', chat_id=str(uuid.uuid4()))
\ No newline at end of file
+        return render_template('index.html', chat_id=str(uuid.uuid4()))
diff --git a/g4f/models.py b/g4f/models.py
index 1cea644783..1bea9eec38 100644
--- a/g4f/models.py
+++ b/g4f/models.py
@@ -23,7 +23,6 @@
     DDG,
     DeepInfra,
     DeepInfraChat,
-    DeepInfraImage,
     Editee,
     Free2GPT,
     FreeChatgpt,
@@ -31,6 +30,7 @@
     FreeNetfly,
     Gemini,
     GeminiPro,
+    GizAI,
     GigaChat,
     GPROChat,
     HuggingChat,
@@ -87,6 +87,8 @@ def __all__() -> list[str]:
         """Returns a list of all model names."""
         return _all_models
 
+
+### Default ###
 default = Model(
     name          = "",
     base_provider = "",
@@ -113,6 +115,8 @@ def __all__() -> list[str]:
     ])
 )
 
+
+
 ############
 ### Text ###
 ############
@@ -136,13 +140,13 @@ def __all__() -> list[str]:
 gpt_4o = Model(
     name          = 'gpt-4o',
     base_provider = 'OpenAI',
-    best_provider = IterListProvider([NexraChatGPT4o, Blackbox, ChatGptEs, AmigoChat, DarkAI, Editee, Liaobots, Airforce, OpenaiChat])
+    best_provider = IterListProvider([NexraChatGPT4o, Blackbox, ChatGptEs, AmigoChat, DarkAI, Editee, GizAI, Airforce, Liaobots, OpenaiChat])
 )
 
 gpt_4o_mini = Model(
     name          = 'gpt-4o-mini',
     base_provider = 'OpenAI',
-    best_provider = IterListProvider([DDG, ChatGptEs, FreeNetfly, Pizzagpt, MagickPen, AmigoChat, RubiksAI, Liaobots, Airforce, ChatgptFree, Koala, OpenaiChat, ChatGpt])
+    best_provider = IterListProvider([DDG, ChatGptEs, FreeNetfly, Pizzagpt, MagickPen, AmigoChat, RubiksAI, Liaobots, Airforce, GizAI, ChatgptFree, Koala, OpenaiChat, ChatGpt])
 )
 
 gpt_4_turbo = Model(
@@ -167,7 +171,7 @@ def __all__() -> list[str]:
 o1_mini = Model(
     name          = 'o1-mini',
     base_provider = 'OpenAI',
-    best_provider = AmigoChat
+    best_provider = IterListProvider([AmigoChat, GizAI])
 )
 
 
@@ -216,13 +220,13 @@ def __all__() -> list[str]:
 llama_3_1_8b = Model(
     name          = "llama-3.1-8b",
     base_provider = "Meta Llama",
-    best_provider = IterListProvider([Blackbox, DeepInfraChat, ChatHub, Cloudflare, Airforce, PerplexityLabs])
+    best_provider = IterListProvider([Blackbox, DeepInfraChat, ChatHub, Cloudflare, Airforce, GizAI, PerplexityLabs])
 )
 
 llama_3_1_70b = Model(
     name          = "llama-3.1-70b",
     base_provider = "Meta Llama",
-    best_provider = IterListProvider([DDG, HuggingChat, Blackbox, FreeGpt, TeachAnything, Free2GPT, DeepInfraChat, DarkAI, Airforce, AiMathGPT, RubiksAI, HuggingFace, PerplexityLabs])
+    best_provider = IterListProvider([DDG, HuggingChat, Blackbox, FreeGpt, TeachAnything, Free2GPT, DeepInfraChat, DarkAI, Airforce, AiMathGPT, RubiksAI, GizAI, HuggingFace, PerplexityLabs])
 )
 
 llama_3_1_405b = Model(
@@ -299,7 +303,7 @@ def __all__() -> list[str]:
 mistral_large = Model(
     name          = "mistral-large",
     base_provider = "Mistral",
-    best_provider = Editee
+    best_provider = IterListProvider([Editee, GizAI])
 )
 
 
@@ -347,13 +351,13 @@ def __all__() -> list[str]:
 gemini_pro = Model(
     name          = 'gemini-pro',
     base_provider = 'Google DeepMind',
-    best_provider = IterListProvider([GeminiPro, Blackbox, AIChatFree, GPROChat, NexraGeminiPro, AmigoChat, Editee, Liaobots, Airforce])
+    best_provider = IterListProvider([GeminiPro, Blackbox, AIChatFree, GPROChat, NexraGeminiPro, AmigoChat, Editee, GizAI, Airforce, Liaobots])
 )
 
 gemini_flash = Model(
     name          = 'gemini-flash',
     base_provider = 'Google DeepMind',
-    best_provider = IterListProvider([Blackbox, Liaobots, Airforce])
+    best_provider = IterListProvider([Blackbox, GizAI, Airforce, Liaobots])
 )
 
 gemini = Model(
@@ -424,14 +428,14 @@ def __all__() -> list[str]:
 claude_3_haiku = Model(
     name          = 'claude-3-haiku',
     base_provider = 'Anthropic',
-    best_provider = IterListProvider([DDG, Airforce, Liaobots])
+    best_provider = IterListProvider([DDG, Airforce, GizAI, Liaobots])
 )
 
 # claude 3.5
 claude_3_5_sonnet = Model(
     name          = 'claude-3.5-sonnet',
     base_provider = 'Anthropic',
-    best_provider = IterListProvider([Blackbox, Editee, AmigoChat, Airforce, Liaobots])
+    best_provider = IterListProvider([Blackbox, Editee, AmigoChat, Airforce, GizAI, Liaobots])
 )
 
 
@@ -753,14 +757,14 @@ def __all__() -> list[str]:
 sdxl = Model(
     name = 'sdxl',
     base_provider = 'Stability AI',
-    best_provider = IterListProvider([ReplicateHome, DeepInfraImage])
+    best_provider = IterListProvider([ReplicateHome])
     
 )
 
 sd_1_5 = Model(
     name = 'sd-1.5',
     base_provider = 'Stability AI',
-    best_provider = NexraSD15
+    best_provider = IterListProvider([NexraSD15, GizAI])
     
 )
 
@@ -771,6 +775,13 @@ def __all__() -> list[str]:
     
 )
 
+sd_3_5 = Model(
+    name = 'sd-3.5',
+    base_provider = 'Stability AI',
+    best_provider = GizAI
+    
+)
+
 ### Playground ###
 playground_v2_5 = Model(
     name = 'playground-v2.5',
@@ -791,7 +802,7 @@ def __all__() -> list[str]:
 flux_pro = Model(
     name = 'flux-pro',
     base_provider = 'Flux AI',
-    best_provider = IterListProvider([AmigoChat, NexraFluxPro])
+    best_provider = IterListProvider([NexraFluxPro, AmigoChat])
     
 )
 
@@ -840,7 +851,7 @@ def __all__() -> list[str]:
 flux_schnell = Model(
     name = 'flux-schnell',
     base_provider = 'Flux AI',
-    best_provider = ReplicateHome
+    best_provider = IterListProvider([ReplicateHome, GizAI])
     
 )
 
@@ -1123,6 +1134,7 @@ class ModelUtils:
 'sdxl-turbo': sdxl_turbo,
 'sd-1.5': sd_1_5,
 'sd-3': sd_3,
+'sd-3.5': sd_3_5,
         
         
 ### Playground ###

```