CoolFace
Apppublic

Dm327hp/gemini-rproxy

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
func.py113 linesDownload Raw Back to root
1from flask import jsonify
2import logging
3import os
4logger = logging.getLogger(__name__)
5
6
7request_counts = {}
8
9password = os.environ['password']
10
11def authenticate_request(request):
12    auth_header = request.headers.get('Authorization')
13
14    if not auth_header:
15        return False, jsonify({'error': '缺少Authorization请求头'}), 401
16
17    try:
18        auth_type, pass_word = auth_header.split(' ', 1)
19    except ValueError:
20        return False, jsonify({'error': 'Authorization请求头格式错误'}), 401
21
22    if auth_type.lower() != 'bearer':
23        return False, jsonify({'error': 'Authorization类型必须为Bearer'}), 401
24
25    if pass_word != password:
26        return False, jsonify({'error': '未授权'}), 401
27
28    return True, None, None
29
30def process_messages_for_gemini(messages, use_system_prompt=False):
31    gemini_history = []
32    errors = []
33    system_instruction_text = ""
34    is_system_phase = use_system_prompt
35    for i, message in enumerate(messages):
36        role = message.get('role')
37        content = message.get('content')
38
39        if isinstance(content, str):
40            if is_system_phase and role == 'system':
41                if system_instruction_text:
42                    system_instruction_text += "\n" + content
43                else:
44                    system_instruction_text = content
45            else:
46                is_system_phase = False
47
48                if role in ['user', 'system']:
49                    role_to_use = 'user'
50                elif role == 'assistant':
51                    role_to_use = 'model'
52                else:
53                    errors.append(f"Invalid role: {role}")
54                    continue
55
56                if gemini_history and gemini_history[-1]['role'] == role_to_use:
57                    gemini_history[-1]['parts'].append({"text": content})
58                else:
59                    gemini_history.append({"role": role_to_use, "parts": [{"text": content}]})
60
61        elif isinstance(content, list):
62            parts = []
63            for item in content:
64                if item.get('type') == 'text':
65                    parts.append({"text": item.get('text')})
66                elif item.get('type') == 'image_url':
67                    image_data = item.get('image_url', {}).get('url', '')
68                    if image_data.startswith('data:image/'):
69                        try:
70                            mime_type, base64_data = image_data.split(';')[0].split(':')[1], image_data.split(',')[1]
71                            parts.append({
72                                "inline_data": {
73                                    "mime_type": mime_type,
74                                    "data": base64_data
75                                }
76                            })
77                        except (IndexError, ValueError):
78                            errors.append(f"Invalid data URI for image: {image_data}")
79                    else:
80                        errors.append(f"Invalid image URL format for item: {item}")
81                elif item.get('type') == 'file_url':
82                    file_data = item.get('file_url', {}).get('url', '')
83                    if file_data.startswith('data:'):
84                        try:
85                            mime_type, base64_data = file_data.split(';')[0].split(':')[1], file_data.split(',')[1]
86                            parts.append({
87                                "inline_data": {
88                                    "mime_type": mime_type,
89                                    "data": base64_data
90                                }
91                            })
92                        except (IndexError, ValueError):
93                            errors.append(f"Invalid data URI for file: {file_data}")
94                    else:
95                        errors.append(f"Invalid file URL format for item: {item}")
96
97            if parts:
98                if role in ['user', 'system']:
99                    role_to_use = 'user'
100                elif role == 'assistant':
101                    role_to_use = 'model'
102                else:
103                    errors.append(f"Invalid role: {role}")
104                    continue
105                if gemini_history and gemini_history[-1]['role'] == role_to_use:
106                    gemini_history[-1]['parts'].extend(parts) 
107                else:
108                    gemini_history.append({"role": role_to_use, "parts": parts})
109
110    if errors:
111        return gemini_history, {"parts": [{"text": system_instruction_text}]}, (jsonify({'error': errors}), 400)
112    else:
113        return gemini_history, {"parts": [{"text": system_instruction_text}]}, None