107 lines
2.9 KiB
Python
107 lines
2.9 KiB
Python
"""
|
|
AZA Runtime-Konfiguration fuer den OpenAI API Key.
|
|
Laedt den Key sicher aus Prozessumgebung oder lokaler Konfigurationsdatei.
|
|
Gibt niemals den Key-Wert in Logs oder Fehlermeldungen aus.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
_CONFIG_DIR_NAME = "config"
|
|
_CONFIG_FILE_NAME = "aza_runtime.env"
|
|
|
|
_TEMPLATE_CONTENT = """\
|
|
# AZA Runtime-Konfiguration
|
|
# Tragen Sie hier Ihren OpenAI API-Schluessel ein.
|
|
# Diese Datei wird bei Updates NICHT ueberschrieben.
|
|
#
|
|
# Beispiel:
|
|
# OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
#
|
|
OPENAI_API_KEY=
|
|
"""
|
|
|
|
|
|
def get_runtime_base_dir() -> str:
|
|
if getattr(sys, "frozen", False):
|
|
return str(Path(sys.executable).resolve().parent)
|
|
return str(Path(__file__).resolve().parent)
|
|
|
|
|
|
def get_runtime_config_dir() -> str:
|
|
return str(Path(get_runtime_base_dir()) / _CONFIG_DIR_NAME)
|
|
|
|
|
|
def get_runtime_env_file_path() -> str:
|
|
return str(Path(get_runtime_config_dir()) / _CONFIG_FILE_NAME)
|
|
|
|
|
|
def _parse_env_file(path: str) -> dict:
|
|
result = {}
|
|
try:
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
for line in f:
|
|
line = line.strip()
|
|
if not line or line.startswith("#"):
|
|
continue
|
|
if "=" not in line:
|
|
continue
|
|
key, _, value = line.partition("=")
|
|
key = key.strip()
|
|
value = value.strip()
|
|
if len(value) >= 2 and value[0] == value[-1] and value[0] in ('"', "'"):
|
|
value = value[1:-1]
|
|
if key:
|
|
result[key] = value
|
|
except Exception:
|
|
pass
|
|
return result
|
|
|
|
|
|
def get_openai_api_key():
|
|
"""Liefert den OpenAI API Key oder None. Prueft Umgebung, dann lokale Config."""
|
|
val = os.environ.get("OPENAI_API_KEY", "").strip()
|
|
if val:
|
|
return val
|
|
env_path = get_runtime_env_file_path()
|
|
parsed = _parse_env_file(env_path)
|
|
val = parsed.get("OPENAI_API_KEY", "").strip()
|
|
if val:
|
|
return val
|
|
return None
|
|
|
|
|
|
def has_openai_api_key() -> bool:
|
|
return get_openai_api_key() is not None
|
|
|
|
|
|
def is_openai_configured() -> bool:
|
|
return has_openai_api_key()
|
|
|
|
|
|
def ensure_runtime_config_template_exists() -> str:
|
|
"""Erstellt config-Ordner und Template-Datei, falls nicht vorhanden. Ueberschreibt nie."""
|
|
config_dir = Path(get_runtime_config_dir())
|
|
env_file = config_dir / _CONFIG_FILE_NAME
|
|
try:
|
|
config_dir.mkdir(parents=True, exist_ok=True)
|
|
except Exception:
|
|
pass
|
|
if not env_file.exists():
|
|
try:
|
|
env_file.write_text(_TEMPLATE_CONTENT, encoding="utf-8")
|
|
except Exception:
|
|
pass
|
|
return str(env_file)
|
|
|
|
|
|
def open_runtime_config_in_editor():
|
|
"""Oeffnet die Runtime-Config im Standard-Texteditor (nur Windows)."""
|
|
path = ensure_runtime_config_template_exists()
|
|
try:
|
|
if os.name == "nt":
|
|
os.startfile(path)
|
|
except Exception:
|
|
pass
|