G4F.py 3.3 KB

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