-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgemini_service.py
More file actions
90 lines (76 loc) · 4.14 KB
/
gemini_service.py
File metadata and controls
90 lines (76 loc) · 4.14 KB
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
import os
import logging
from google import genai
from google.genai import types
# Using Google Gemini API for text translation
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
gemini_client = genai.Client(api_key=GEMINI_API_KEY)
def translate_to_leichte_sprache(text):
"""
Translate German medical text to Leichte Sprache using Google Gemini API
"""
try:
# Detailed prompt for Leichte Sprache conversion following all rules
system_prompt = """Du bist ein Experte für Leichte Sprache und hilfst dabei, komplexe deutsche Texte in einfache, verständliche Sprache zu übersetzen. Du folgst strikt allen Regeln der Leichten Sprache."""
prompt = f"""
Du bist ein Experte für Leichte Sprache. Übersetze den folgenden deutschen medizinischen Text in Leichte Sprache.
WICHTIGE REGELN FÜR LEICHTE SPRACHE:
1. Verwende nur Aktiv-Formen, keine Passiv-Formen
2. Verwende nur alltägliche Wörter
3. Vermeide Fremd-Wörter und Fach-Wörter. Wenn nötig, erkläre sie kurz
4. Vermeide Bilder in der Sprache und Rede-Wendungen
5. Vermeide Abkürzungen. Schreibe sie vollständig aus
6. Teile zusammen-gesetzte Wörter mit Bindestrich (z.B. "Kranken-Haus", "Trink-Wasser")
7. Füge Beispiele hinzu um den Text zu erklären
8. Beginne jeden neuen Satz in einer neuen Zeile
9. Halte Sätze kurz (maximal 10 Wörter)
10. Strukturiere den Text in logische Absätze
11. Verwende Überschriften und Unter-Überschriften
12. Verwende Aufzählungs-Zeichen für Listen
13. Schreibe auf Deutsch CEFR Niveau A1-A2
ORIGINALTEXT:
{text}
Übersetze diesen Text jetzt in Leichte Sprache. Achte besonders darauf, dass medizinische Begriffe erklärt werden und der Text für Menschen mit Lern-Schwierigkeiten verständlich ist.
"""
response = gemini_client.models.generate_content(
model="gemini-2.5-flash",
contents=[
types.Content(role="user", parts=[types.Part(text=prompt)])
],
config=types.GenerateContentConfig(
system_instruction=system_prompt,
temperature=0.3,
max_output_tokens=4000
)
)
if response.text:
return response.text.strip()
elif response.candidates and len(response.candidates) > 0:
# Try to get content from candidates
candidate = response.candidates[0]
if candidate.content and candidate.content.parts:
for part in candidate.content.parts:
if hasattr(part, 'text') and part.text:
return part.text.strip()
# Check finish reason for better error messages
if hasattr(candidate, 'finish_reason'):
if candidate.finish_reason.name == 'MAX_TOKENS':
logging.error("Gemini response was cut off due to max tokens")
return "Der Text war zu lang für die Übersetzung. Bitte verwenden Sie einen kürzeren Text."
elif candidate.finish_reason.name == 'SAFETY':
logging.error("Gemini blocked response for safety reasons")
return "Der Text konnte aus Sicherheitsgründen nicht übersetzt werden."
logging.error("No text in Gemini response")
return "Fehler: Keine Antwort vom AI-Service erhalten."
except Exception as e:
logging.error(f"Gemini API error: {str(e)}")
error_msg = str(e)
# Provide user-friendly error messages
if "429" in error_msg or "quota" in error_msg.lower():
raise Exception("Das Gemini API-Kontingent ist aufgebraucht. Bitte warten Sie einen Moment und versuchen Sie es erneut.")
elif "401" in error_msg or "unauthorized" in error_msg.lower() or "api_key" in error_msg.lower():
raise Exception("Der Gemini API-Schlüssel ist ungültig oder fehlt. Bitte überprüfen Sie die Konfiguration.")
elif "timeout" in error_msg.lower():
raise Exception("Die Anfrage ist abgelaufen. Bitte versuchen Sie es erneut.")
else:
raise Exception(f"Übersetzung fehlgeschlagen: Ein unerwarteter Fehler ist aufgetreten.")