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