readme_table.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import re
  2. from urllib.parse import urlparse
  3. import asyncio
  4. from g4f import models, ChatCompletion
  5. from g4f.providers.types import BaseRetryProvider, ProviderType
  6. from g4f.providers.base_provider import ProviderModelMixin
  7. from g4f.Provider import __providers__
  8. from g4f.models import _all_models
  9. from g4f import debug
  10. debug.logging = True
  11. async def test_async(provider: ProviderType):
  12. if not provider.working:
  13. return False
  14. messages = [{"role": "user", "content": "Hello Assistant!"}]
  15. try:
  16. response = await asyncio.wait_for(ChatCompletion.create_async(
  17. model=models.default,
  18. messages=messages,
  19. provider=provider
  20. ), 30)
  21. return bool(response)
  22. except Exception as e:
  23. if debug.logging:
  24. print(f"{provider.__name__}: {e.__class__.__name__}: {e}")
  25. return False
  26. def test_async_list(providers: list[ProviderType]):
  27. responses: list = [
  28. asyncio.run(test_async(_provider))
  29. for _provider in providers
  30. ]
  31. return responses
  32. def print_providers():
  33. providers = [provider for provider in __providers__ if provider.working]
  34. responses = test_async_list(providers)
  35. lines = []
  36. for type in ("Free", "Auth"):
  37. lines += [
  38. "",
  39. f"## {type}",
  40. "",
  41. ]
  42. for idx, _provider in enumerate(providers):
  43. do_continue = False
  44. if type == "Auth" and _provider.needs_auth:
  45. do_continue = True
  46. elif type == "Free" and not _provider.needs_auth:
  47. do_continue = True
  48. if not do_continue:
  49. continue
  50. lines.append(
  51. f"### {getattr(_provider, 'label', _provider.__name__)}",
  52. )
  53. provider_name = f"`g4f.Provider.{_provider.__name__}`"
  54. lines.append(f"| Provider | {provider_name} |")
  55. lines.append("| -------- | ---- |")
  56. if _provider.url:
  57. netloc = urlparse(_provider.url).netloc.replace("www.", "")
  58. website = f"[{netloc}]({_provider.url})"
  59. else:
  60. website = "❌"
  61. message_history = "✔️" if _provider.supports_message_history else "❌"
  62. system = "✔️" if _provider.supports_system_message else "❌"
  63. stream = "✔️" if _provider.supports_stream else "❌"
  64. if _provider.working:
  65. status = '![Active](https://img.shields.io/badge/Active-brightgreen)'
  66. if responses[idx]:
  67. status = '![Active](https://img.shields.io/badge/Active-brightgreen)'
  68. else:
  69. status = '![Unknown](https://img.shields.io/badge/Unknown-grey)'
  70. else:
  71. status = '![Inactive](https://img.shields.io/badge/Inactive-red)'
  72. auth = "✔️" if _provider.needs_auth else "❌"
  73. lines.append(f"| **Website** | {website} | \n| **Status** | {status} |")
  74. if issubclass(_provider, ProviderModelMixin):
  75. try:
  76. all_models = _provider.get_models()
  77. models = [model for model in _all_models if model in all_models or model in _provider.model_aliases]
  78. image_models = _provider.image_models
  79. if image_models:
  80. for alias, name in _provider.model_aliases.items():
  81. if alias in _all_models and name in image_models:
  82. image_models.append(alias)
  83. image_models = [model for model in image_models if model in _all_models]
  84. if image_models:
  85. models = [model for model in models if model not in image_models]
  86. if models:
  87. lines.append(f"| **Models** | {', '.join(models)} ({len(all_models)})|")
  88. if image_models:
  89. lines.append(f"| **Image Models (Image Generation)** | {', '.join(image_models)} |")
  90. if hasattr(_provider, "vision_models"):
  91. lines.append(f"| **Vision (Image Upload)** | ✔️ |")
  92. except:
  93. pass
  94. lines.append(f"| **Authentication** | {auth} | \n| **Streaming** | {stream} |")
  95. lines.append(f"| **System message** | {system} | \n| **Message history** | {message_history} |")
  96. return lines
  97. def print_models():
  98. base_provider_names = {
  99. "google": "Google",
  100. "openai": "OpenAI",
  101. "huggingface": "Huggingface",
  102. "anthropic": "Anthropic",
  103. "inflection": "Inflection",
  104. "meta": "Meta",
  105. }
  106. provider_urls = {
  107. "google": "https://gemini.google.com/",
  108. "openai": "https://openai.com/",
  109. "huggingface": "https://huggingface.co/",
  110. "anthropic": "https://www.anthropic.com/",
  111. "inflection": "https://inflection.ai/",
  112. "meta": "https://llama.meta.com/",
  113. }
  114. lines = [
  115. "| Model | Base Provider | Provider | Website |",
  116. "| ----- | ------------- | -------- | ------- |",
  117. ]
  118. for name, model in models.ModelUtils.convert.items():
  119. if name.startswith("gpt-3.5") or name.startswith("gpt-4"):
  120. if name not in ("gpt-3.5-turbo", "gpt-4", "gpt-4-turbo"):
  121. continue
  122. name = re.split(r":|/", model.name)[-1]
  123. if model.base_provider not in base_provider_names:
  124. continue
  125. base_provider = base_provider_names[model.base_provider]
  126. if not isinstance(model.best_provider, BaseRetryProvider):
  127. provider_name = f"g4f.Provider.{model.best_provider.__name__}"
  128. else:
  129. provider_name = f"{len(model.best_provider.providers)}+ Providers"
  130. provider_url = provider_urls[model.base_provider]
  131. netloc = urlparse(provider_url).netloc.replace("www.", "")
  132. website = f"[{netloc}]({provider_url})"
  133. lines.append(f"| {name} | {base_provider} | {provider_name} | {website} |")
  134. return lines
  135. def print_image_models():
  136. lines = [
  137. "| Label | Provider | Image Model | Vision Model | Website |",
  138. "| ----- | -------- | ----------- | ------------ | ------- |",
  139. ]
  140. for provider in [provider for provider in __providers__ if provider.working and getattr(provider, "image_models", None) or getattr(provider, "vision_models", None)]:
  141. provider_url = provider.url if provider.url else "❌"
  142. netloc = urlparse(provider_url).netloc.replace("www.", "")
  143. website = f"[{netloc}]({provider_url})"
  144. label = getattr(provider, "label", provider.__name__)
  145. if provider.image_models:
  146. image_models = ", ".join([model for model in provider.image_models if model in _all_models])
  147. else:
  148. image_models = "❌"
  149. if hasattr(provider, "vision_models"):
  150. vision_models = "✔️"
  151. else:
  152. vision_models = "❌"
  153. lines.append(f'| {label} | `g4f.Provider.{provider.__name__}` | {image_models}| {vision_models} | {website} |')
  154. return lines
  155. if __name__ == "__main__":
  156. with open("docs/providers.md", "w") as f:
  157. f.write("\n".join(print_providers()))
  158. f.write(f"\n{'-' * 50} \n")
  159. #f.write("\n".join(print_models()))
  160. #f.write(f"\n{'-' * 50} \n")
  161. f.write("\n".join(print_image_models()))