CopilotAccount.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from __future__ import annotations
  2. import os
  3. from typing import AsyncIterator
  4. from ..base_provider import AsyncAuthedProvider
  5. from ..Copilot import Copilot, readHAR, has_nodriver, get_access_token_and_cookies
  6. from ...providers.response import AuthResult, RequestLogin
  7. from ...typing import AsyncResult, Messages
  8. from ...errors import NoValidHarFileError
  9. from ... import debug
  10. def cookies_to_dict():
  11. return Copilot._cookies if isinstance(Copilot._cookies, dict) else {c.name: c.value for c in Copilot._cookies}
  12. class CopilotAccount(AsyncAuthedProvider, Copilot):
  13. needs_auth = True
  14. use_nodriver = True
  15. parent = "Copilot"
  16. default_model = "Copilot"
  17. default_vision_model = default_model
  18. models = [default_model]
  19. image_models = models
  20. model_aliases = {
  21. "dall-e-3": default_model
  22. }
  23. @classmethod
  24. async def on_auth_async(cls, proxy: str = None, **kwargs) -> AsyncIterator:
  25. try:
  26. Copilot._access_token, Copilot._cookies = readHAR(cls.url)
  27. except NoValidHarFileError as h:
  28. debug.log(f"Copilot: {h}")
  29. if has_nodriver:
  30. login_url = os.environ.get("G4F_LOGIN_URL")
  31. if login_url:
  32. yield RequestLogin(cls.label, login_url)
  33. Copilot._access_token, Copilot._cookies = await get_access_token_and_cookies(cls.url, proxy)
  34. else:
  35. raise h
  36. yield AuthResult(
  37. api_key=Copilot._access_token,
  38. cookies=cookies_to_dict()
  39. )
  40. @classmethod
  41. async def create_authed(
  42. cls,
  43. model: str,
  44. messages: Messages,
  45. auth_result: AuthResult,
  46. **kwargs
  47. ) -> AsyncResult:
  48. Copilot._access_token = getattr(auth_result, "api_key")
  49. Copilot._cookies = getattr(auth_result, "cookies")
  50. Copilot.needs_auth = cls.needs_auth
  51. for chunk in Copilot.create_completion(model, messages, **kwargs):
  52. yield chunk
  53. auth_result.cookies = cookies_to_dict()