Spaces:
Sleeping
Sleeping
Add OpenRouter backup key failover
Browse files- src/humeo/content_pruning.py +40 -23
src/humeo/content_pruning.py
CHANGED
|
@@ -49,11 +49,11 @@ from humeo.env import (
|
|
| 49 |
OPENROUTER_BASE_URL,
|
| 50 |
current_llm_provider,
|
| 51 |
model_name_for_provider,
|
| 52 |
-
openrouter_default_headers,
|
| 53 |
-
resolve_gemini_api_key,
|
| 54 |
-
resolve_llm_provider,
|
| 55 |
-
|
| 56 |
-
)
|
| 57 |
from humeo.gemini_generate import gemini_generate_config
|
| 58 |
from humeo.prompt_loader import content_pruning_system_prompt
|
| 59 |
|
|
@@ -1009,24 +1009,41 @@ def request_prune_decisions(
|
|
| 1009 |
raise RuntimeError("Gemini returned empty response text for content pruning")
|
| 1010 |
return response.text
|
| 1011 |
|
| 1012 |
-
|
| 1013 |
-
|
| 1014 |
-
|
| 1015 |
-
|
| 1016 |
-
|
| 1017 |
-
|
| 1018 |
-
|
| 1019 |
-
|
| 1020 |
-
|
| 1021 |
-
|
| 1022 |
-
|
| 1023 |
-
|
| 1024 |
-
|
| 1025 |
-
|
| 1026 |
-
|
| 1027 |
-
|
| 1028 |
-
|
| 1029 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1030 |
|
| 1031 |
raw = _retry_llm("Gemini content pruning", _call)
|
| 1032 |
decisions = _parse_decisions(raw)
|
|
|
|
| 49 |
OPENROUTER_BASE_URL,
|
| 50 |
current_llm_provider,
|
| 51 |
model_name_for_provider,
|
| 52 |
+
openrouter_default_headers,
|
| 53 |
+
resolve_gemini_api_key,
|
| 54 |
+
resolve_llm_provider,
|
| 55 |
+
resolve_openrouter_api_keys,
|
| 56 |
+
)
|
| 57 |
from humeo.gemini_generate import gemini_generate_config
|
| 58 |
from humeo.prompt_loader import content_pruning_system_prompt
|
| 59 |
|
|
|
|
| 1009 |
raise RuntimeError("Gemini returned empty response text for content pruning")
|
| 1010 |
return response.text
|
| 1011 |
|
| 1012 |
+
keys = resolve_openrouter_api_keys()
|
| 1013 |
+
last_error: Exception | None = None
|
| 1014 |
+
for key_idx, api_key in enumerate(keys, start=1):
|
| 1015 |
+
try:
|
| 1016 |
+
client = OpenAI(
|
| 1017 |
+
api_key=api_key,
|
| 1018 |
+
base_url=OPENROUTER_BASE_URL,
|
| 1019 |
+
default_headers=openrouter_default_headers(),
|
| 1020 |
+
)
|
| 1021 |
+
response = client.chat.completions.create(
|
| 1022 |
+
model=model_name,
|
| 1023 |
+
messages=[
|
| 1024 |
+
{"role": "system", "content": system},
|
| 1025 |
+
{"role": "user", "content": user_text},
|
| 1026 |
+
],
|
| 1027 |
+
temperature=0.2,
|
| 1028 |
+
response_format={"type": "json_object"},
|
| 1029 |
+
)
|
| 1030 |
+
text = _openai_message_text(response.choices[0].message.content)
|
| 1031 |
+
if not text:
|
| 1032 |
+
raise RuntimeError("OpenRouter returned empty response text for content pruning")
|
| 1033 |
+
if key_idx > 1:
|
| 1034 |
+
logger.info("OpenRouter content pruning succeeded with fallback key %d/%d", key_idx, len(keys))
|
| 1035 |
+
return text
|
| 1036 |
+
except Exception as exc:
|
| 1037 |
+
last_error = exc
|
| 1038 |
+
if key_idx < len(keys):
|
| 1039 |
+
logger.warning(
|
| 1040 |
+
"OpenRouter content pruning failed with key %d/%d: %s; trying fallback",
|
| 1041 |
+
key_idx,
|
| 1042 |
+
len(keys),
|
| 1043 |
+
exc,
|
| 1044 |
+
)
|
| 1045 |
+
assert last_error is not None
|
| 1046 |
+
raise last_error
|
| 1047 |
|
| 1048 |
raw = _retry_llm("Gemini content pruning", _call)
|
| 1049 |
decisions = _parse_decisions(raw)
|