CoolFace
Apppublic

Fullcd/gemini-rproxy

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
func.py108 linesDownload Raw Back to root
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