File size: 3,956 Bytes
bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 364bda2 bd06cc8 e100b79 ce0c73c bd06cc8 ce0c73c e100b79 bd06cc8 364bda2 bd06cc8 364bda2 bd06cc8 364bda2 bd06cc8 e100b79 364bda2 e100b79 364bda2 bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 |
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 |
import json
import sseclient
import requests
from flask import Flask, request, Response, stream_with_context
import random
app = Flask(__name__)
def generate_random_ip():
return f"{random.randint(1,255)}.{random.randint(0,255)}.{random.randint(0,255)}.{random.randint(0,255)}"
def format_openai_response(content, finish_reason=None):
return {
"id": "chatcmpl-123",
"object": "chat.completion.chunk",
"created": 1677652288,
"model": "gpt-4o",
"choices": [{
"delta": {"content": content} if content else {"finish_reason": finish_reason},
"index": 0,
"finish_reason": finish_reason
}]
}
@app.route('/hf/v1/chat/completions', methods=['POST'])
def chat_completions():
data = request.json
messages = data.get('messages', [])
stream = data.get('stream', False)
if not messages:
return {"error": "No messages provided"}, 400
# 将消息列表转换为单个字符串,保留对话历史
conversation = "\n".join([f"{msg['role']}: {msg['content']}" for msg in messages])
# 添加指导语
conversation += "\n请关注并回复user最近的消息并避免总结对话历史的回答"
model = data.get('model', 'gpt-4o')
# 根据模型名称设置endpoint
if model.startswith('gpt'):
endpoint = "openAI"
elif model.startswith('claude'):
endpoint = "claude"
else:
return {"error": "Unsupported model"}, 400
original_api_url = 'https://chatpro.ai-pro.org/api/ask/openAI'
headers = {
'content-type': 'application/json',
'X-Forwarded-For': generate_random_ip(),
'origin': 'https://chatpro.ai-pro.org',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}
payload = {
"text": conversation,
"endpoint": endpoint,
"model": model
}
def generate():
last_content = ""
response = requests.post(original_api_url, headers=headers, json=payload, stream=True)
client = sseclient.SSEClient(response)
for event in client.events():
if event.data.startswith('{"text":'):
data = json.loads(event.data)
new_content = data['text'][len(last_content):]
last_content = data['text']
if new_content:
yield f"data: {json.dumps(format_openai_response(new_content))}\n\n"
elif '"final":true' in event.data:
yield f"data: {json.dumps(format_openai_response('', 'stop'))}\n\n"
yield "data: [DONE]\n\n"
break
if stream:
return Response(stream_with_context(generate()), content_type='text/event-stream')
else:
full_response = ""
for chunk in generate():
if chunk.startswith("data: ") and not chunk.strip() == "data: [DONE]":
response_data = json.loads(chunk[6:])
if 'choices' in response_data and response_data['choices']:
delta = response_data['choices'][0].get('delta', {})
if 'content' in delta:
full_response += delta['content']
return {
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"model": model,
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": full_response
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0
}
}
if __name__ == '__main__':
app.run(debug=True, port=5000) |