FreeGpt.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from __future__ import annotations
  2. import time
  3. import hashlib
  4. import random
  5. from typing import AsyncGenerator, Optional, Dict, Any
  6. from ..typing import Messages
  7. from ..requests import StreamSession, raise_for_status
  8. from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
  9. from ..errors import RateLimitError
  10. # Constants
  11. DOMAINS = [
  12. "https://s.aifree.site",
  13. "https://v.aifree.site/",
  14. "https://al.aifree.site/",
  15. "https://u4.aifree.site/"
  16. ]
  17. RATE_LIMIT_ERROR_MESSAGE = "当前地区当日额度已消耗完"
  18. class FreeGpt(AsyncGeneratorProvider, ProviderModelMixin):
  19. url = "https://freegptsnav.aifree.site"
  20. working = True
  21. supports_message_history = True
  22. supports_system_message = True
  23. default_model = 'gemini-1.5-pro'
  24. models = [default_model, 'gemini-1.5-flash']
  25. @classmethod
  26. async def create_async_generator(
  27. cls,
  28. model: str,
  29. messages: Messages,
  30. proxy: Optional[str] = None,
  31. timeout: int = 120,
  32. **kwargs: Any
  33. ) -> AsyncGenerator[str, None]:
  34. prompt = messages[-1]["content"]
  35. timestamp = int(time.time())
  36. data = cls._build_request_data(messages, prompt, timestamp)
  37. domain = random.choice(DOMAINS)
  38. async with StreamSession(
  39. impersonate="chrome",
  40. timeout=timeout,
  41. proxies={"all": proxy} if proxy else None
  42. ) as session:
  43. async with session.post(f"{domain}/api/generate", json=data) as response:
  44. await raise_for_status(response)
  45. async for chunk in response.iter_content():
  46. chunk_decoded = chunk.decode(errors="ignore")
  47. if chunk_decoded == RATE_LIMIT_ERROR_MESSAGE:
  48. raise RateLimitError("Rate limit reached")
  49. yield chunk_decoded
  50. @staticmethod
  51. def _build_request_data(messages: Messages, prompt: str, timestamp: int, secret: str = "") -> Dict[str, Any]:
  52. return {
  53. "messages": messages,
  54. "time": timestamp,
  55. "pass": None,
  56. "sign": generate_signature(timestamp, prompt, secret)
  57. }
  58. def generate_signature(timestamp: int, message: str, secret: str = "") -> str:
  59. data = f"{timestamp}:{message}:{secret}"
  60. return hashlib.sha256(data.encode()).hexdigest()