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)