返回提交历史
Modified
g4f/Provider/Providers/Vercel.py
+8
-109
XFEstudio/gpt4free
Update Vercel.py
a8f24951
代码差异
1 个文件
+8
-109
@@ -42,120 +42,19 @@ vercel_models = {'anthropic:claude-instant-v1': {'id': 'anthropic:claude-instant
42
42
'id': 'huggingface:bigcode/santacoder', 'provider': 'huggingface', 'providerHumanName': 'HuggingFace', 'makerHumanName': 'BigCode', 'instructions': 'The model was trained on GitHub code. As such it is not an instruction model and commands like "Write a function that computes the square root." do not work well. You should phrase commands like they occur in source code such as comments (e.g. # the following function computes the sqrt) or write a function signature and docstring and let the model complete the function body.', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 0.95, 'range': [0.01, 0.99]}, 'topK': {'value': 4, 'range': [1, 500]}, 'repetitionPenalty': {'value': 1.03, 'range': [0.1, 2]}}, 'name': 'santacoder'}, 'cohere:command-medium-nightly': {'id': 'cohere:command-medium-nightly', 'provider': 'cohere', 'providerHumanName': 'Cohere', 'makerHumanName': 'Cohere', 'name': 'command-medium-nightly', 'parameters': {'temperature': {'value': 0.9, 'range': [0, 2]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0, 1]}, 'topK': {'value': 0, 'range': [0, 500]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'cohere:command-xlarge-nightly': {'id': 'cohere:command-xlarge-nightly', 'provider': 'cohere', 'providerHumanName': 'Cohere', 'makerHumanName': 'Cohere', 'name': 'command-xlarge-nightly', 'parameters': {'temperature': {'value': 0.9, 'range': [0, 2]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0, 1]}, 'topK': {'value': 0, 'range': [0, 500]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:gpt-4': {'id': 'openai:gpt-4', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'gpt-4', 'minBillingTier': 'pro', 'parameters': {'temperature': {'value': 0.7, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:code-cushman-001': {'id': 'openai:code-cushman-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}, 'name': 'code-cushman-001'}, 'openai:code-davinci-002': {'id': 'openai:code-davinci-002', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}, 'name': 'code-davinci-002'}, 'openai:gpt-3.5-turbo': {'id': 'openai:gpt-3.5-turbo', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'parameters': {'temperature': {'value': 0.7, 'range': [0, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'topK': {'value': 1, 'range': [1, 500]}, 'presencePenalty': {'value': 1, 'range': [0, 1]}, 'frequencyPenalty': {'value': 1, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}, 'name': 'gpt-3.5-turbo'}, 'openai:text-ada-001': {'id': 'openai:text-ada-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-ada-001', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-babbage-001': {'id': 'openai:text-babbage-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-babbage-001', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-curie-001': {'id': 'openai:text-curie-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-curie-001', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-davinci-002': {'id': 'openai:text-davinci-002', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-davinci-002', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-davinci-003': {'id': 'openai:text-davinci-003', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-davinci-003', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}}
43
43
44
44
45
# based on https://github.com/ading2210/vercel-llm-api // modified
46
class Client:
47
def __init__(self):
48
self.session = requests.Session()
49
self.headers = {
50
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110 Safari/537.36',
51
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
52
'Accept-Encoding': 'gzip, deflate, br',
53
'Accept-Language': 'en-US,en;q=0.5',
54
'Te': 'trailers',
55
'Upgrade-Insecure-Requests': '1'
56
}
57
self.session.headers.update(self.headers)
58
59
def get_token(self):
60
b64 = self.session.get('https://sdk.vercel.ai/openai.jpeg').text
61
data = json.loads(base64.b64decode(b64))
62
63
code = 'const globalThis = {data: `sentinel`}; function token() {return (%s)(%s)}' % (
64
data['c'], data['a'])
65
66
token_string = json.dumps(separators=(',', ':'),
67
obj={'r': execjs.compile(code).call('token'), 't': data['t']})
68
69
return base64.b64encode(token_string.encode()).decode()
70
71
def get_default_params(self, model_id):
72
return {key: param['value'] for key, param in vercel_models[model_id]['parameters'].items()}
73
74
def generate(self, model_id: str, prompt: str, params: dict = {}):
75
if not ':' in model_id:
76
model_id = models[model_id]
77
78
defaults = self.get_default_params(model_id)
79
80
payload = defaults | params | {
81
'prompt': prompt,
82
'model': model_id,
83
}
84
85
headers = self.headers | {
86
'Accept-Encoding': 'gzip, deflate, br',
87
'Custom-Encoding': self.get_token(),
88
'Host': 'sdk.vercel.ai',
89
'Origin': 'https://sdk.vercel.ai',
90
'Referrer': 'https://sdk.vercel.ai',
91
'Sec-Fetch-Dest': 'empty',
92
'Sec-Fetch-Mode': 'cors',
93
'Sec-Fetch-Site': 'same-origin',
94
}
95
96
chunks_queue = queue.Queue()
97
error = None
98
response = None
99
100
def callback(data):
101
chunks_queue.put(data.decode())
102
103
def request_thread():
104
nonlocal response, error
105
for _ in range(3):
106
try:
107
response = self.session.post('https://sdk.vercel.ai/api/generate',
108
json=payload, headers=headers, content_callback=callback)
109
response.raise_for_status()
110
111
except Exception as e:
112
if _ == 2:
113
error = e
114
115
else:
116
continue
117
118
thread = threading.Thread(target=request_thread, daemon=True)
119
thread.start()
120
121
text = ''
122
index = 0
123
while True:
124
try:
125
chunk = chunks_queue.get(block=True, timeout=0.1)
126
127
except queue.Empty:
128
if error:
129
raise error
130
131
elif response:
132
break
133
134
else:
135
continue
136
137
text += chunk
138
lines = text.split('\n')
139
140
if len(lines) - 1 > index:
141
new = lines[index:-1]
142
for word in new:
143
yield json.loads(word)
144
index = len(lines) - 1
145
146
45
def _create_completion(model: str, messages: list, stream: bool, **kwargs):
46
return
47
# conversation = 'This is a conversation between a human and a language model, respond to the last message accordingly, referring to the past history of messages if needed.\n'
147
48
148
conversation = 'This is a conversation between a human and a language model, respond to the last message accordingly, referring to the past history of messages if needed.\n'
149
150
for message in messages:
151
conversation += '%s: %s\n' % (message['role'], message['content'])
49
# for message in messages:
50
# conversation += '%s: %s\n' % (message['role'], message['content'])
152
51
153
conversation += 'assistant: '
52
# conversation += 'assistant: '
154
53
155
completion = Client().generate(model, conversation)
54
# completion = Client().generate(model, conversation)
156
55
157
for token in completion:
158
yield token
56
# for token in completion:
57
# yield token
159
58
160
59
params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \
161
60
'(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])