moonlantern1 commited on
Commit
f5186ef
·
verified ·
1 Parent(s): 0997589

Add OpenRouter backup key failover

Browse files
Files changed (1) hide show
  1. 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
- resolve_openrouter_api_key,
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
- client = OpenAI(
1013
- api_key=resolve_openrouter_api_key(),
1014
- base_url=OPENROUTER_BASE_URL,
1015
- default_headers=openrouter_default_headers(),
1016
- )
1017
- response = client.chat.completions.create(
1018
- model=model_name,
1019
- messages=[
1020
- {"role": "system", "content": system},
1021
- {"role": "user", "content": user_text},
1022
- ],
1023
- temperature=0.2,
1024
- response_format={"type": "json_object"},
1025
- )
1026
- text = _openai_message_text(response.choices[0].message.content)
1027
- if not text:
1028
- raise RuntimeError("OpenRouter returned empty response text for content pruning")
1029
- return text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)