Your task is to review pull requests. Instructions:
- Provide the response in following JSON format: {"reviews": [{"line": <line_number>, "body": "<review comment>"}]}
- Do not give positive comments or compliments.
- Provide comments and suggestions ONLY if there is something to improve, otherwise "reviews" should be an empty array.
- Write the comment in GitHub Markdown format.
- Use the given description only for the overall context and only comment the code.
- IMPORTANT: NEVER suggest adding comments to the code.

Review the following code diff in the file "g4f/Provider/hf_space/G4F.py" and take the pull request title and description into account when writing the response.
  
Pull request title: [pull] main from xtekky:main
Pull request description:
---
See [Commits](/ykatyhoney/gpt4free/pull/172/commits) and [Changes](/ykatyhoney/gpt4free/pull/172/files) for more details.

-----
Created by [<img src="https://prod.download/pull-18h-svg" valign="bottom"/> **pull[bot]**](https://github.com/wei/pull) (v2.0.0-alpha.1)

_Can you help keep this open source service alive? **[💖 Please sponsor : )](https://prod.download/pull-pr-sponsor)**_
---

Each line is prefixed by its number. Code to review:
```
1:+from __future__ import annotations
2:+
3:+from aiohttp import ClientSession
4:+import time
5:+import asyncio
6:+
7:+from ...typing import AsyncResult, Messages
8:+from ...providers.response import ImageResponse, Reasoning
9:+from ...requests.raise_for_status import raise_for_status
10:+from ..helper import format_image_prompt, get_random_string
11:+from .Janus_Pro_7B import Janus_Pro_7B, JsonConversation, get_zerogpu_token
12:+
13:+class G4F(Janus_Pro_7B):
14:+    label = "G4F framework"
15:+    space = "roxky/Janus-Pro-7B"
16:+    url = f"https://huggingface.co/spaces/roxky/g4f-space"
17:+    api_url = "https://roxky-janus-pro-7b.hf.space"
18:+    url_flux = "https://roxky-g4f-flux.hf.space/run/predict"
19:+    referer = f"{api_url}?__theme=light"
20:+
21:+    default_model = "flux"
22:+    model_aliases = {"flux-schnell": default_model, "flux-dev": default_model}
23:+    image_models = [Janus_Pro_7B.default_image_model, default_model, *model_aliases.keys()]
24:+    models = [Janus_Pro_7B.default_model, *image_models]
25:+
26:+    @classmethod
27:+    async def create_async_generator(
28:+        cls,
29:+        model: str,
30:+        messages: Messages,
31:+        proxy: str = None,
32:+        prompt: str = None,
33:+        width: int = 1024,
34:+        height: int = 1024,
35:+        seed: int = None,
36:+        cookies: dict = None,
37:+        **kwargs
38:+    ) -> AsyncResult:
39:+        if cls.default_model not in model:
40:+            async for chunk in super().create_async_generator(model, messages, prompt=prompt, seed=seed, cookies=cookies, **kwargs):
41:+                yield chunk
42:+            return
43:+
44:+        model = cls.get_model(model)
45:+        width = max(32, width - (width % 8))
46:+        height = max(32, height - (height % 8))
47:+        if prompt is None:
48:+            prompt = format_image_prompt(messages)
49:+        if seed is None:
50:+            seed = int(time.time())
51:+
52:+        payload = {
53:+            "data": [
54:+                prompt,
55:+                seed,
56:+                width,
57:+                height,
58:+                True,
59:+                1
60:+            ],
61:+            "event_data": None,
62:+            "fn_index": 3,
63:+            "session_hash": get_random_string(),
64:+            "trigger_id": 10
65:+        }
66:+        async with ClientSession() as session:
67:+            yield Reasoning(status="Acquiring GPU Token")
68:+            zerogpu_uuid, zerogpu_token = await get_zerogpu_token(cls.space, session, JsonConversation(), cookies)
69:+            headers = {
70:+                "x-zerogpu-token": zerogpu_token,
71:+                "x-zerogpu-uuid": zerogpu_uuid,
72:+            }
73:+            async def generate():
74:+                async with session.post(cls.url_flux, json=payload, proxy=proxy, headers=headers) as response:
75:+                    await raise_for_status(response)
76:+                    response_data = await response.json()
77:+                    image_url = response_data["data"][0]['url']
78:+                    return ImageResponse(images=[image_url], alt=prompt)
79:+            background_tasks = set()
80:+            started = time.time()
81:+            task = asyncio.create_task(generate())
82:+            background_tasks.add(task)
83:+            task.add_done_callback(background_tasks.discard)
84:+            while background_tasks:
85:+                yield Reasoning(status=f"Generating {time.time() - started:.2f}s")
86:+                await asyncio.sleep(0.2)
87:+            yield await task
88:+            yield Reasoning(status=f"Finished {time.time() - started:.2f}s")
```