File size: 4,088 Bytes
4db98df
52f607b
e45ad65
4db98df
 
52f607b
4db98df
 
 
 
 
 
 
 
 
e45ad65
52f607b
 
 
 
 
4db98df
 
52f607b
 
e45ad65
52f607b
 
 
 
 
 
 
 
4db98df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7aed529
29dfbd3
e45ad65
 
52f607b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4db98df
 
 
 
52f607b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4db98df
 
 
 
29dfbd3
4db98df
 
 
 
 
52f607b
 
4db98df
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
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
from datetime import datetime
import urllib.request
import ssl

class ChatCompletionsHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        if self.path != '/ai/v1/chat/completions':
            self.send_error(404, "Not Found")
            return

        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        body = json.loads(post_data.decode('utf-8'))

        model = body.get('model')
        messages = body.get('messages')
        stream = body.get('stream', False)

        if not model or not messages or len(messages) == 0:
            self.send_error(400, "Bad Request: Missing required fields")
            return

        prompt = messages[-1]['content']
        new_url = f"https://api.siliconflow.cn/v1/{model}/text-to-image"
        new_request_body = {
            "prompt": prompt,
            "image_size": "1024x1024",
            "batch_size": 1,
            "num_inference_steps": 4,
            "guidance_scale": 1
        }

        req = urllib.request.Request(new_url, 
                                     data=json.dumps(new_request_body).encode('utf-8'), 
                                     headers={
                                         'accept': 'application/json',
                                         'content-type': 'application/json',
                                         'Authorization': self.headers.get('Authorization')
                                     },
                                     method='POST')

        ctx = ssl.create_default_context()
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE

        with urllib.request.urlopen(req, context=ctx) as response:
            response_body = json.loads(response.read().decode('utf-8'))

        image_url = response_body['images'][0]['url']
        unique_id = int(datetime.now().timestamp() * 1000)
        current_timestamp = int(unique_id / 1000)

        if stream:
            response_payload = {
                "id": unique_id,
                "object": "chat.completion.chunk",
                "created": current_timestamp,
                "model": model,
                "choices": [
                    {
                        "index": 0,
                        "delta": {
                            "content": f"![]({image_url})"
                        },
                        "finish_reason": "stop"
                    }
                ]
            }
            self.send_response(200)
            self.send_header('Content-Type', 'text/event-stream')
            self.end_headers()
            self.wfile.write(f"data: {json.dumps(response_payload)}\n\n".encode('utf-8'))
        else:
            response_payload = {
                "id": unique_id,
                "object": "chat.completion",
                "created": current_timestamp,
                "model": model,
                "choices": [
                    {
                        "index": 0,
                        "message": {
                            "role": "assistant",
                            "content": f"![]({image_url})"
                        },
                        "logprobs": None,
                        "finish_reason": "length"
                    }
                ],
                "usage": {
                    "prompt_tokens": len(prompt),
                    "completion_tokens": len(image_url),
                    "total_tokens": len(prompt) + len(image_url)
                }
            }
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.end_headers()
            self.wfile.write(json.dumps(response_payload).encode('utf-8'))

def run(server_class=HTTPServer, handler_class=ChatCompletionsHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting server on port {port}")
    httpd.serve_forever()

if __name__ == '__main__':
    run()