File size: 4,713 Bytes
bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 e100b79 bd06cc8 fed1648 364bda2 c2b4e5c 364bda2 c2b4e5c 364bda2 fed1648 bd06cc8 bf3f697 bd06cc8 fed1648 bd06cc8 fed1648 bd06cc8 fed1648 e100b79 bd06cc8 e100b79 bd06cc8 fed1648 bd06cc8 fed1648 bd06cc8 fed1648 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 119 120 121 122 123 124 125 126 |
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
model = data.get('model', 'gpt-4o')
if model.startswith('gpt'):
endpoint = "openAI"
original_api_url = 'https://chatpro.ai-pro.org/api/ask/openAI'
elif model.startswith('claude'):
endpoint = "claude"
original_api_url = 'https://chatpro.ai-pro.org/api/ask/claude'
else:
return {"error": "Unsupported model"}, 400
headers = {
'content-type': 'application/json',
'X-Forwarded-For': generate_random_ip(),
'origin': 'https://chatpro.ai-pro.org',
'user-agent': generate_user_agent()
}
def generate():
nonlocal messages
full_response = ""
while True:
conversation = "\n".join([f"{msg['role']}: {msg['content']}" for msg in messages])
conversation += "\n请关注并回复user最近的消息并避免总结对话历史的回答"
payload = {
"text": conversation,
"endpoint": endpoint,
"model": model
}
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(full_response):]
full_response = data['text']
if new_content:
yield f"data: {json.dumps(format_openai_response(new_content))}\n\n"
elif '"final":true' in event.data:
final_data = json.loads(event.data)
finish_reason = final_data.get('responseMessage', {}).get('finish_reason', 'stop')
if finish_reason == 'length':
# 如果因为长度被截断,添加已生成的回复到消息列表,并继续生成
messages.append({"role": "assistant", "content": full_response})
messages.append({"role": "user", "content": "请继续你的输出"})
break
else:
yield f"data: {json.dumps(format_openai_response('', finish_reason))}\n\n"
yield "data: [DONE]\n\n"
return
if stream:
return Response(stream_with_context(generate()), content_type='text/event-stream')
else:
full_response = ""
finish_reason = "stop"
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']
if 'finish_reason' in delta:
finish_reason = delta['finish_reason']
return {
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"model": model,
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": full_response
},
"finish_reason": finish_reason
}],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0
}
}
if __name__ == '__main__':
app.run(debug=True, port=5000) |