|
|
|
import json |
|
import uuid |
|
|
|
import requests |
|
from flask import Flask, request, Response |
|
|
|
app = Flask(__name__) |
|
|
|
user_contexts = {} |
|
MAX_HISTORY_LENGTH = 15 |
|
|
|
|
|
def get_models(): |
|
models = { |
|
"object": "list", |
|
"data": [ |
|
{"id": "Qwen2.5-72B", "object": "model", "created": 0, "owned_by": "Qwen"}, |
|
{"id": "Llama3.3-70B", "object": "model", "created": 0, "owned_by": "Nemotron"}, |
|
{"id": "Pixtral-124B", "object": "model", "created": 0, "owned_by": "Pixtral"}, |
|
{"id": "Qwen2.5-Coder-32B", "object": "model", "created": 0, "owned_by": "Qwen"}, |
|
] |
|
} |
|
return json.dumps(models) |
|
|
|
|
|
|
|
def get_model_by_id(model_id=None): |
|
|
|
models_data = json.loads(get_models())["data"] |
|
|
|
|
|
valid_ids = [model["id"] for model in models_data] |
|
|
|
|
|
if model_id not in valid_ids: |
|
model_id = "Llama3.3-70B" |
|
|
|
|
|
model_data = next((model for model in models_data if model["id"] == model_id), None) |
|
|
|
|
|
return model_data["id"] if model_data else None |
|
|
|
def chat_completion( |
|
user_prompt, user_id: str = None, system_prompt="You are a helpful assistant.", model="Llama3.3-70B", |
|
project="DecentralGPT", stream=False, temperature=0.3, max_tokens=1024, top_p=0.5, |
|
frequency_penalty=0, presence_penalty=0): |
|
"""处理用户请求并保留上下文""" |
|
url = 'https://usa-chat.degpt.ai/api/v0/chat/completion/proxy' |
|
headers = { |
|
'sec-ch-ua-platform': '"macOS"', |
|
'Referer': 'https://www.degpt.ai/', |
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', |
|
'sec-ch-ua': 'Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"', |
|
'DNT': '1', |
|
'Content-Type': 'application/json', |
|
'sec-ch-ua-mobile': '?0' |
|
} |
|
|
|
|
|
if user_id is not None: |
|
if user_id not in user_contexts: |
|
user_contexts[user_id] = [{"role": "system", "content": system_prompt}] |
|
|
|
user_contexts[user_id].append({"role": "user", "content": user_prompt}) |
|
|
|
|
|
while len(user_contexts[user_id]) > MAX_HISTORY_LENGTH: |
|
|
|
if len(user_contexts[user_id]) > 2: |
|
|
|
if user_contexts[user_id][2]["role"] == "user": |
|
user_contexts[user_id] = [user_contexts[user_id][0]] + user_contexts[user_id][2:] |
|
else: |
|
user_contexts[user_id] = [user_contexts[user_id][0]] + user_contexts[user_id][2:] |
|
else: |
|
break |
|
|
|
messages = user_contexts[user_id] |
|
else: |
|
|
|
messages = [{"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}] |
|
|
|
payload = { |
|
"model": get_model_by_id(model), |
|
"messages": messages, |
|
"project": project, |
|
"stream": stream, |
|
"temperature": temperature, |
|
"max_tokens": max_tokens, |
|
"top_p": top_p, |
|
"frequency_penalty": frequency_penalty, |
|
"presence_penalty": presence_penalty |
|
} |
|
|
|
try: |
|
response = requests.post(url, headers=headers, json=payload) |
|
response.encoding = 'utf-8' |
|
response.raise_for_status() |
|
|
|
|
|
|
|
response_content = response.json()["choices"][0]["message"]["content"] |
|
|
|
|
|
|
|
|
|
if user_id is not None: |
|
user_contexts[user_id].append({"role": "assistant", "content": response_content}) |
|
return response.text |
|
except requests.exceptions.RequestException as e: |
|
print(f"请求失败: {e}") |
|
return "请求失败,请检查网络或参数配置。" |
|
except (KeyError, IndexError) as e: |
|
print(f"解析响应时出错: {e}") |
|
return "解析响应内容失败。" |
|
return {} |
|
|
|
def chat_completion_messages( |
|
messages, user_id: str = None, system_prompt="You are a helpful assistant.", model="Qwen2.5-72B", |
|
project="DecentralGPT", stream=False, temperature=0.3, max_tokens=1024, top_p=0.5, |
|
frequency_penalty=0, presence_penalty=0): |
|
"""处理用户请求并保留上下文""" |
|
url = 'https://usa-chat.degpt.ai/api/v0/chat/completion/proxy' |
|
headers = { |
|
'sec-ch-ua-platform': '"macOS"', |
|
'Referer': 'https://www.degpt.ai/', |
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', |
|
'sec-ch-ua': 'Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"', |
|
'DNT': '1', |
|
'Content-Type': 'application/json', |
|
'sec-ch-ua-mobile': '?0' |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
payload = { |
|
"model": get_model_by_id(model), |
|
"messages": messages, |
|
"project": project, |
|
"stream": stream, |
|
"temperature": temperature, |
|
"max_tokens": max_tokens, |
|
"top_p": top_p, |
|
"frequency_penalty": frequency_penalty, |
|
"presence_penalty": presence_penalty |
|
} |
|
|
|
try: |
|
response = requests.post(url, headers=headers, json=payload) |
|
response.encoding = 'utf-8' |
|
response.raise_for_status() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return response.text |
|
except requests.exceptions.RequestException as e: |
|
print(f"请求失败: {e}") |
|
return "请求失败,请检查网络或参数配置。" |
|
except (KeyError, IndexError) as e: |
|
print(f"解析响应时出错: {e}") |
|
return "解析响应内容失败。" |
|
return {} |
|
@app.route('/api/models', methods=['GET']) |
|
@app.route('/api/v1/models', methods=['GET']) |
|
@app.route('/hf/v1/models', methods=['GET']) |
|
def models(): |
|
"""返回可用模型列表""" |
|
return get_models() |
|
|
|
|
|
@app.route('/api/chat/completion', methods=['POST']) |
|
@app.route('/api/v1/chat/completions', methods=['POST']) |
|
@app.route('/hf/v1/chat/completions', methods=['POST']) |
|
def chat_completion_api(): |
|
"""处理用户请求并保留上下文""" |
|
data = request.json |
|
|
|
user_id = data.get("user_id", str(uuid.uuid4())) |
|
model=get_model_by_id(data.get("model")) |
|
temperature=data.get("temperature", 0.3) |
|
max_tokens =data.get("max_tokens", 1024) |
|
messages = data.get("messages", []) |
|
stream = data.get("stream", False) |
|
response_content = chat_completion_messages( |
|
messages=messages, |
|
user_id=user_id, |
|
temperature=temperature, |
|
max_tokens=max_tokens, |
|
stream=stream, |
|
model=model |
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if isinstance(response_content, str): |
|
return Response(response_content, content_type="application/json; charset=utf-8") |
|
|
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860) |
|
|