Janus_Pro_7B.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. from __future__ import annotations
  2. import json
  3. import uuid
  4. import re
  5. from datetime import datetime, timezone, timedelta
  6. import urllib.parse
  7. from ...typing import AsyncResult, Messages, Cookies
  8. from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
  9. from ..helper import format_prompt, format_image_prompt
  10. from ...providers.response import JsonConversation, ImageResponse, Notification
  11. from ...requests.aiohttp import StreamSession, StreamResponse
  12. from ...requests.raise_for_status import raise_for_status
  13. from ...cookies import get_cookies
  14. from ...errors import ResponseError
  15. from ... import debug
  16. class Janus_Pro_7B(AsyncGeneratorProvider, ProviderModelMixin):
  17. url = "https://huggingface.co/spaces/deepseek-ai/Janus-Pro-7B"
  18. api_url = "https://deepseek-ai-janus-pro-7b.hf.space"
  19. referer = f"{api_url}?__theme=light"
  20. working = True
  21. supports_stream = True
  22. supports_system_message = True
  23. supports_message_history = True
  24. default_model = "janus-pro-7b"
  25. default_image_model = "janus-pro-7b-image"
  26. models = [default_model, default_image_model]
  27. image_models = [default_image_model]
  28. @classmethod
  29. def run(cls, method: str, session: StreamSession, prompt: str, conversation: JsonConversation):
  30. if method == "post":
  31. return session.post(f"{cls.api_url}/gradio_api/queue/join?__theme=light", **{
  32. "headers": {
  33. "content-type": "application/json",
  34. "x-zerogpu-token": conversation.zerogpu_token,
  35. "x-zerogpu-uuid": conversation.zerogpu_uuid,
  36. "referer": cls.referer,
  37. },
  38. "json": {"data":[None,prompt,42,0.95,0.1],"event_data":None,"fn_index":2,"trigger_id":10,"session_hash":conversation.session_hash},
  39. })
  40. elif method == "image":
  41. return session.post(f"{cls.api_url}/gradio_api/queue/join?__theme=light", **{
  42. "headers": {
  43. "content-type": "application/json",
  44. "x-zerogpu-token": conversation.zerogpu_token,
  45. "x-zerogpu-uuid": conversation.zerogpu_uuid,
  46. "referer": cls.referer,
  47. },
  48. "json": {"data":[prompt,1234,5,1],"event_data":None,"fn_index":3,"trigger_id":20,"session_hash":conversation.session_hash},
  49. })
  50. return session.get(f"{cls.api_url}/gradio_api/queue/data?session_hash={conversation.session_hash}", **{
  51. "headers": {
  52. "accept": "text/event-stream",
  53. "content-type": "application/json",
  54. "referer": cls.referer,
  55. }
  56. })
  57. @classmethod
  58. async def create_async_generator(
  59. cls,
  60. model: str,
  61. messages: Messages,
  62. prompt: str = None,
  63. proxy: str = None,
  64. cookies: Cookies = None,
  65. return_conversation: bool = False,
  66. conversation: JsonConversation = None,
  67. **kwargs
  68. ) -> AsyncResult:
  69. def generate_session_hash():
  70. """Generate a unique session hash."""
  71. return str(uuid.uuid4()).replace('-', '')[:12]
  72. method = "post"
  73. if model == cls.default_image_model or prompt is not None:
  74. method = "image"
  75. prompt = format_prompt(messages) if prompt is None and conversation is None else prompt
  76. prompt = format_image_prompt(messages, prompt)
  77. session_hash = generate_session_hash() if conversation is None else getattr(conversation, "session_hash")
  78. async with StreamSession(proxy=proxy, impersonate="chrome") as session:
  79. session_hash = generate_session_hash() if conversation is None else getattr(conversation, "session_hash")
  80. zerogpu_uuid, zerogpu_token = await get_zerogpu_token(session, conversation, cookies)
  81. if conversation is None or not hasattr(conversation, "session_hash"):
  82. conversation = JsonConversation(session_hash=session_hash, zerogpu_token=zerogpu_token, zerogpu_uuid=zerogpu_uuid)
  83. conversation.zerogpu_token = zerogpu_token
  84. if return_conversation:
  85. yield conversation
  86. async with cls.run(method, session, prompt, conversation) as response:
  87. await raise_for_status(response)
  88. async with cls.run("get", session, prompt, conversation) as response:
  89. response: StreamResponse = response
  90. async for line in response.iter_lines():
  91. decoded_line = line.decode(errors="replace")
  92. if decoded_line.startswith('data: '):
  93. try:
  94. json_data = json.loads(decoded_line[6:])
  95. if json_data.get('msg') == 'log':
  96. yield Notification(json_data["log"])
  97. if json_data.get('msg') == 'process_generating':
  98. if 'output' in json_data and 'data' in json_data['output']:
  99. yield f"data: {json.dumps(json_data['output']['data'])}"
  100. if json_data.get('msg') == 'process_completed':
  101. if 'output' in json_data and 'error' in json_data['output']:
  102. raise ResponseError("Text model is not working. Try out image model" if "AttributeError" in json_data['output']['error'] else json_data['output']['error'])
  103. if 'output' in json_data and 'data' in json_data['output']:
  104. if "image" in json_data['output']['data'][0][0]:
  105. yield ImageResponse([image["image"]["url"] for image in json_data['output']['data'][0]], prompt)
  106. else:
  107. yield f"data: {json.dumps(json_data['output']['data'])}"
  108. break
  109. except json.JSONDecodeError:
  110. debug.log("Could not parse JSON:", decoded_line)
  111. async def get_zerogpu_token(session: StreamSession, conversation: JsonConversation, cookies: Cookies = None):
  112. zerogpu_uuid = None if conversation is None else getattr(conversation, "zerogpu_uuid", None)
  113. zerogpu_token = "[object Object]"
  114. cookies = get_cookies("huggingface.co", raise_requirements_error=False) if cookies is None else cookies
  115. if zerogpu_uuid is None:
  116. async with session.get(Janus_Pro_7B.url, cookies=cookies) as response:
  117. match = re.search(r""token":"([^&]+?)"", await response.text())
  118. if match:
  119. zerogpu_token = match.group(1)
  120. match = re.search(r""sessionUuid":"([^&]+?)"", await response.text())
  121. if match:
  122. zerogpu_uuid = match.group(1)
  123. if cookies:
  124. # Get current UTC time + 10 minutes
  125. dt = (datetime.now(timezone.utc) + timedelta(minutes=10)).isoformat(timespec='milliseconds')
  126. encoded_dt = urllib.parse.quote(dt)
  127. async with session.get(f"https://huggingface.co/api/spaces/deepseek-ai/Janus-Pro-7B/jwt?expiration={encoded_dt}&include_pro_status=true", cookies=cookies) as response:
  128. zerogpu_token = (await response.json())
  129. zerogpu_token = zerogpu_token["token"]
  130. return zerogpu_uuid, zerogpu_token