File size: 6,816 Bytes
a4b70d9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
from __future__ import annotations
import json
from ..typing import AsyncResult, Messages
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin
from ..requests import StreamSession, get_args_from_nodriver, raise_for_status, merge_cookies
from ..requests import DEFAULT_HEADERS, has_nodriver, has_curl_cffi
from ..providers.response import FinishReason, Usage
from ..errors import ResponseStatusError, ModelNotFoundError
from .. import debug
from .helper import render_messages
def clean_name(name: str) -> str:
return name.split("/")[-1].replace(
"-instruct", "").replace(
"-17b-16e", "").replace(
"-chat", "").replace(
"-fp8", "").replace(
"-fast", "").replace(
"-int8", "").replace(
"-awq", "").replace(
"-qvq", "").replace(
"-r1", "").replace(
"meta-llama-", "llama-").replace(
"-it", "").replace(
"qwen-", "qwen").replace(
"qwen", "qwen-")
# models = []
# model_aliases = {clean_name(m.get("name")): m.get("name") for m in models}
# open(__file__, "a").write(f"""# Generated by g4f.models.cloudflare.py
# model_aliases = {model_aliases}
# """)
class Cloudflare(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin):
label = "Cloudflare AI"
url = "https://playground.ai.cloudflare.com"
working = has_curl_cffi
use_nodriver = True
active_by_default = True
api_endpoint = "https://playground.ai.cloudflare.com/api/inference"
models_url = "https://playground.ai.cloudflare.com/api/models"
supports_stream = True
supports_system_message = True
supports_message_history = True
default_model = 'llama-3.3-70b'
model_aliases = {
'deepseek-coder-6.7b-base': '@hf/thebloke/deepseek-coder-6.7b-base-awq',
'deepseek-coder-6.7b': '@hf/thebloke/deepseek-coder-6.7b-instruct-awq',
'deepseek-math-7b': '@cf/deepseek-ai/deepseek-math-7b-instruct',
'deepseek-distill-qwen-32b': '@cf/deepseek-ai/deepseek-r1-distill-qwen-32b',
'discolm-german-7b-v1': '@cf/thebloke/discolm-german-7b-v1-awq',
'falcon-7b': '@cf/tiiuae/falcon-7b-instruct',
'gemma-3-12b': '@cf/google/gemma-3-12b-it',
'gemma-7b': '@hf/google/gemma-7b-it',
'hermes-2-pro-mistral-7b': '@hf/nousresearch/hermes-2-pro-mistral-7b',
'llama-2-13b': '@hf/thebloke/llama-2-13b-chat-awq',
'llama-2-7b-fp16': '@cf/meta/llama-2-7b-chat-fp16',
'llama-2-7b': '@cf/meta/llama-2-7b-chat-int8',
'llama-3-8b': '@hf/meta-llama/meta-llama-3-8b-instruct',
'llama-3.1-8b': '@cf/meta/llama-3.1-8b-instruct-fp8',
'llama-3.2-11b-vision': '@cf/meta/llama-3.2-11b-vision-instruct',
'llama-3.2-1b': '@cf/meta/llama-3.2-1b-instruct',
'llama-3.2-3b': '@cf/meta/llama-3.2-3b-instruct',
'llama-3.3-70b': '@cf/meta/llama-3.3-70b-instruct-fp8-fast',
'llama-4-scout': '@cf/meta/llama-4-scout-17b-16e-instruct',
'llama-guard-3-8b': '@cf/meta/llama-guard-3-8b',
'llamaguard-7b': '@hf/thebloke/llamaguard-7b-awq',
'mistral-7b-v0.1': '@hf/thebloke/mistral-7b-instruct-v0.1-awq',
'mistral-7b-v0.2': '@hf/mistral/mistral-7b-instruct-v0.2',
'mistral-small-3.1-24b': '@cf/mistralai/mistral-small-3.1-24b-instruct',
'neural-7b-v3-1': '@hf/thebloke/neural-chat-7b-v3-1-awq',
'openchat-3.5-0106': '@cf/openchat/openchat-3.5-0106',
'openhermes-2.5-mistral-7b': '@hf/thebloke/openhermes-2.5-mistral-7b-awq',
'phi-2': '@cf/microsoft/phi-2',
'qwen1.5-0.5b': '@cf/qwen/qwen1.5-0.5b-chat',
'qwen-1.5-1.8b': '@cf/qwen/qwen1.5-1.8b-chat',
'qwen-1.5-14b': '@cf/qwen/qwen1.5-14b-chat-awq',
'qwen-1.5-7b': '@cf/qwen/qwen1.5-7b-chat-awq',
'qwen-2.5-coder-32b': '@cf/qwen/qwen2.5-coder-32b-instruct',
'qwq-32b': '@cf/qwen/qwq-32b',
'sqlcoder-7b-2': '@cf/defog/sqlcoder-7b-2',
'starling-lm-7b-beta': '@hf/nexusflow/starling-lm-7b-beta',
'tinyllama-1.1b-v1.0': '@cf/tinyllama/tinyllama-1.1b-chat-v1.0',
'una-cybertron-7b-v2-bf16': '@cf/fblgit/una-cybertron-7b-v2-bf16',
'zephyr-7b-beta': '@hf/thebloke/zephyr-7b-beta-awq'
}
models = list(model_aliases.keys())
_args: dict = None
@classmethod
async def create_async_generator(
cls,
model: str,
messages: Messages,
proxy: str = None,
max_tokens: int = 2048,
**kwargs
) -> AsyncResult:
cache_file = cls.get_cache_file()
if cls._args is None:
headers = DEFAULT_HEADERS.copy()
headers["referer"] = f"{cls.url}"
headers["origin"] = cls.url
if cache_file.exists():
with cache_file.open("r") as f:
cls._args = json.load(f)
elif has_nodriver:
try:
cls._args = await get_args_from_nodriver(cls.url, proxy=proxy)
except (RuntimeError, FileNotFoundError) as e:
debug.log(f"Cloudflare: Nodriver is not available:", e)
cls._args = {"headers": headers, "cookies": {}, "impersonate": "chrome"}
else:
cls._args = {"headers": headers, "cookies": {}, "impersonate": "chrome"}
try:
model = cls.get_model(model)
except ModelNotFoundError:
pass
data = {
"messages": [{
**message,
"parts": [{"type":"text", "text": message["content"]}]} for message in render_messages(messages)],
"lora": None,
"model": model,
"max_tokens": max_tokens,
"stream": True,
"system_message":"You are a helpful assistant",
"tools":[]
}
async with StreamSession(**cls._args) as session:
async with session.post(
cls.api_endpoint,
json=data,
) as response:
cls._args["cookies"] = merge_cookies(cls._args["cookies"] , response)
try:
await raise_for_status(response)
except ResponseStatusError:
cls._args = None
if cache_file.exists():
cache_file.unlink()
raise
async for line in response.iter_lines():
if line.startswith(b'0:'):
yield json.loads(line[2:])
elif line.startswith(b'e:'):
finish = json.loads(line[2:])
yield Usage(**finish.get("usage"))
yield FinishReason(finish.get("finishReason"))
with cache_file.open("w") as f:
json.dump(cls._args, f)
|