Dm327hp/gemini-rproxy
0
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