Agnuxo commited on
Commit
adfeea3
Β·
verified Β·
1 Parent(s): c199cb8

Upload llm.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. llm.py +47 -14
llm.py CHANGED
@@ -1,12 +1,13 @@
1
  """
2
  Multi-provider LLM Client for DS Theorist β€” rotating keys, OpenAI-compatible.
3
 
4
- Provider chain (tested 2026-03-31):
5
- 1. Groq β€” llama-3.3-70b-versatile (4 working keys, free)
6
- 2. Cerebras β€” qwen-3-235b-a22b-instruct-2507 (2 keys, free, great for math)
7
- 3. NVIDIA β€” meta/llama-3.3-70b-instruct (3 keys, free credits)
8
- 4. Mistral β€” mistral-small-latest (1 key, free tier)
9
- 5. Inception β€” mercury-2 (6 keys, free tier)
 
10
 
11
  Optimized for mathematical reasoning and formal proofs.
12
  """
@@ -20,11 +21,27 @@ import httpx
20
  def _load_keys(prefix: str, count: int) -> list[str]:
21
  return [k for k in [os.getenv(f"{prefix}_{i}") for i in range(1, count + 1)] if k]
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  PROVIDERS = []
25
 
26
- # 1. Groq (primary β€” fast, free)
27
- _groq_keys = _load_keys("GROQ_KEY", 8)
28
  if _groq_keys:
29
  PROVIDERS.append({
30
  "name": "Groq",
@@ -37,8 +54,8 @@ if _groq_keys:
37
  "max_tokens_cap": 4096,
38
  })
39
 
40
- # 2. Cerebras (best for math β€” qwen-3-235b)
41
- _cerebras_keys = _load_keys("CEREBRAS_KEY", 4)
42
  if _cerebras_keys:
43
  PROVIDERS.append({
44
  "name": "Cerebras",
@@ -51,7 +68,21 @@ if _cerebras_keys:
51
  "max_tokens_cap": 4096,
52
  })
53
 
54
- # 3. NVIDIA (free credits)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  _nvidia_keys = _load_keys("NVAPI_KEY", 4)
56
  if _nvidia_keys:
57
  PROVIDERS.append({
@@ -65,7 +96,7 @@ if _nvidia_keys:
65
  "max_tokens_cap": 4096,
66
  })
67
 
68
- # 4. Mistral (solid quality)
69
  _mistral_keys = _load_keys("MISTRAL_KEY", 4)
70
  if _mistral_keys:
71
  PROVIDERS.append({
@@ -79,7 +110,7 @@ if _mistral_keys:
79
  "max_tokens_cap": 4096,
80
  })
81
 
82
- # 5. Inception (mercury-2)
83
  _inception_keys = _load_keys("INCEPTION_KEY", 8)
84
  if _inception_keys:
85
  PROVIDERS.append({
@@ -125,7 +156,7 @@ def complete(
125
  Optimized for mathematical reasoning and formal proofs.
126
  """
127
  if not PROVIDERS:
128
- raise RuntimeError("LLM: no providers configured β€” set GROQ_KEY_1 or CEREBRAS_KEY_1 in env")
129
 
130
  last_error = "no providers"
131
  for provider in PROVIDERS:
@@ -134,6 +165,8 @@ def complete(
134
  capped_tokens = min(max_tokens, cap)
135
  if fast:
136
  capped_tokens = min(capped_tokens, 300)
 
 
137
 
138
  payload = {
139
  "model": model,
 
1
  """
2
  Multi-provider LLM Client for DS Theorist β€” rotating keys, OpenAI-compatible.
3
 
4
+ Provider chain (updated 2026-04-03):
5
+ 1. Groq β€” llama-3.3-70b-versatile (PRIMARY β€” GROQ_API_KEY or GROQ_KEY_1..8)
6
+ 2. Cerebras β€” qwen-3-235b-a22b-instruct-2507 (FALLBACK β€” CEREBRAS_API_KEY or CEREBRAS_KEY_1..4)
7
+ 3. Sarvam β€” sarvam-m (SECOND FALLBACK β€” SARVAM_API_KEY)
8
+ 4. NVIDIA β€” meta/llama-3.3-70b-instruct (legacy keys)
9
+ 5. Mistral β€” mistral-small-latest (legacy keys)
10
+ 6. Inception β€” mercury-2 (legacy keys)
11
 
12
  Optimized for mathematical reasoning and formal proofs.
13
  """
 
21
  def _load_keys(prefix: str, count: int) -> list[str]:
22
  return [k for k in [os.getenv(f"{prefix}_{i}") for i in range(1, count + 1)] if k]
23
 
24
+ def _load_single_or_multi(single_env: str, multi_prefix: str, count: int) -> list[str]:
25
+ """Load a single env var key first, then fall back to numbered keys."""
26
+ keys = []
27
+ single = os.getenv(single_env)
28
+ if single:
29
+ keys.append(single)
30
+ keys += _load_keys(multi_prefix, count)
31
+ # deduplicate while preserving order
32
+ seen = set()
33
+ result = []
34
+ for k in keys:
35
+ if k not in seen:
36
+ seen.add(k)
37
+ result.append(k)
38
+ return result
39
+
40
 
41
  PROVIDERS = []
42
 
43
+ # 1. Groq (PRIMARY β€” fast, free)
44
+ _groq_keys = _load_single_or_multi("GROQ_API_KEY", "GROQ_KEY", 8)
45
  if _groq_keys:
46
  PROVIDERS.append({
47
  "name": "Groq",
 
54
  "max_tokens_cap": 4096,
55
  })
56
 
57
+ # 2. Cerebras (FALLBACK β€” best for math, qwen-3-235b)
58
+ _cerebras_keys = _load_single_or_multi("CEREBRAS_API_KEY", "CEREBRAS_KEY", 4)
59
  if _cerebras_keys:
60
  PROVIDERS.append({
61
  "name": "Cerebras",
 
68
  "max_tokens_cap": 4096,
69
  })
70
 
71
+ # 3. Sarvam (SECOND FALLBACK)
72
+ _sarvam_keys = [k for k in [os.getenv("SARVAM_API_KEY")] if k]
73
+ if _sarvam_keys:
74
+ PROVIDERS.append({
75
+ "name": "Sarvam",
76
+ "base": "https://api.sarvam.ai/v1/chat/completions",
77
+ "model": "sarvam-m",
78
+ "model_fast": "sarvam-m",
79
+ "keys": _sarvam_keys,
80
+ "auth": "Bearer",
81
+ "timeout": 120.0,
82
+ "max_tokens_cap": 4096,
83
+ })
84
+
85
+ # 4. NVIDIA (legacy free credits)
86
  _nvidia_keys = _load_keys("NVAPI_KEY", 4)
87
  if _nvidia_keys:
88
  PROVIDERS.append({
 
96
  "max_tokens_cap": 4096,
97
  })
98
 
99
+ # 5. Mistral (legacy β€” solid quality)
100
  _mistral_keys = _load_keys("MISTRAL_KEY", 4)
101
  if _mistral_keys:
102
  PROVIDERS.append({
 
110
  "max_tokens_cap": 4096,
111
  })
112
 
113
+ # 6. Inception (legacy β€” mercury-2)
114
  _inception_keys = _load_keys("INCEPTION_KEY", 8)
115
  if _inception_keys:
116
  PROVIDERS.append({
 
156
  Optimized for mathematical reasoning and formal proofs.
157
  """
158
  if not PROVIDERS:
159
+ raise RuntimeError("LLM: no providers configured β€” set GROQ_API_KEY, CEREBRAS_API_KEY, or SARVAM_API_KEY in env")
160
 
161
  last_error = "no providers"
162
  for provider in PROVIDERS:
 
165
  capped_tokens = min(max_tokens, cap)
166
  if fast:
167
  capped_tokens = min(capped_tokens, 300)
168
+ min_tok = provider.get("min_tokens", 1)
169
+ capped_tokens = max(capped_tokens, min_tok)
170
 
171
  payload = {
172
  "model": model,