Spaces:
Running
Running
key-pool rotation: per-session OpenAI key assignment from OPENAI_KEY_01..10 (core/config_loader.py)
Browse files- core/config_loader.py +38 -1
core/config_loader.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
| 2 |
|
| 3 |
import os
|
| 4 |
import platform
|
|
|
|
| 5 |
import yaml
|
| 6 |
from openai import OpenAI
|
| 7 |
from dotenv import load_dotenv
|
|
@@ -23,7 +24,43 @@ env_path = BASE_DIR / PATHS["env_file"]
|
|
| 23 |
if env_path.exists():
|
| 24 |
load_dotenv(env_path)
|
| 25 |
|
| 26 |
-
client
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
# HuggingFace logging setup. RUN_MODE env var picks the bucket
|
| 29 |
# (test|pilot|prod) appended to mode_prefix to form the final HF dataset path.
|
|
|
|
| 2 |
|
| 3 |
import os
|
| 4 |
import platform
|
| 5 |
+
import threading
|
| 6 |
import yaml
|
| 7 |
from openai import OpenAI
|
| 8 |
from dotenv import load_dotenv
|
|
|
|
| 24 |
if env_path.exists():
|
| 25 |
load_dotenv(env_path)
|
| 26 |
|
| 27 |
+
# OpenAI client pool for round-robin per-session key assignment.
|
| 28 |
+
# Loads OPENAI_KEY_01 .. OPENAI_KEY_10 from environment. Falls back to API_KEY
|
| 29 |
+
# (single client, no rotation) if no pool keys are present.
|
| 30 |
+
_pool_pairs = []
|
| 31 |
+
for _i in range(1, 11):
|
| 32 |
+
_k = os.getenv(f"OPENAI_KEY_{_i:02d}")
|
| 33 |
+
if _k:
|
| 34 |
+
_pool_pairs.append((_i, _k))
|
| 35 |
+
|
| 36 |
+
KEY_POOL = []
|
| 37 |
+
if _pool_pairs:
|
| 38 |
+
KEY_POOL = [(idx, OpenAI(api_key=k, max_retries=5)) for idx, k in _pool_pairs]
|
| 39 |
+
print(f"[key_pool] loaded {len(KEY_POOL)} OPENAI_KEY_NN secrets for per-session rotation", flush=True)
|
| 40 |
+
else:
|
| 41 |
+
_fallback = os.getenv("API_KEY")
|
| 42 |
+
if _fallback:
|
| 43 |
+
KEY_POOL = [(0, OpenAI(api_key=_fallback, max_retries=5))]
|
| 44 |
+
print("[key_pool] no OPENAI_KEY_NN secrets found; using single API_KEY (no rotation)", flush=True)
|
| 45 |
+
else:
|
| 46 |
+
print("[key_pool] WARNING: no OpenAI key configured", flush=True)
|
| 47 |
+
|
| 48 |
+
_counter = 0
|
| 49 |
+
_counter_lock = threading.Lock()
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
def get_next_client():
|
| 53 |
+
"""Round-robin OpenAI client picker. Returns (key_idx, client)."""
|
| 54 |
+
global _counter
|
| 55 |
+
if not KEY_POOL:
|
| 56 |
+
raise RuntimeError("no OpenAI client configured (set OPENAI_KEY_01..10 or API_KEY)")
|
| 57 |
+
with _counter_lock:
|
| 58 |
+
idx_in_pool = _counter % len(KEY_POOL)
|
| 59 |
+
_counter += 1
|
| 60 |
+
return KEY_POOL[idx_in_pool]
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
client = KEY_POOL[0][1] if KEY_POOL else None
|
| 64 |
|
| 65 |
# HuggingFace logging setup. RUN_MODE env var picks the bucket
|
| 66 |
# (test|pilot|prod) appended to mode_prefix to form the final HF dataset path.
|