ecommerceaiagents / app /utils.py
thundarstrom's picture
Update fallback model from decommissioned llama3-8b-8192 to llama-3.1-8b-instant
7802686
Raw
History Blame Contribute Delete
2.4 kB
import os
import random
from dotenv import load_dotenv
from langchain_groq import ChatGroq
load_dotenv()
def get_groq_api_key():
"""
Returns a random Groq API key from the available pool in .env
to distribute Token Per Minute (TPM) load and avoid 429 errors.
"""
keys = [
(os.getenv("GROQ_API_KEY") or "").strip().strip('"').strip("'"),
(os.getenv("GROQ_API_KEY_2") or "").strip().strip('"').strip("'"),
(os.getenv("GROQ_API_KEY_3") or "").strip().strip('"').strip("'")
]
# Filter out None/Empty keys and placeholders
valid_keys = [k for k in keys if k and len(k) > 20 and "from screenshot" not in k]
if not valid_keys:
# Fallback to the first key if everything fails, but try to be safe
first_key = os.getenv("GROQ_API_KEY")
if first_key: return first_key
raise ValueError("No valid GROQ_API_KEY found in .env")
return random.choice(valid_keys)
class FallbackChatGroq:
def __init__(self, primary: ChatGroq, fallback: ChatGroq):
self.primary = primary
self.fallback = fallback
def bind_tools(self, tools, **kwargs):
bound_primary = self.primary.bind_tools(tools, **kwargs)
bound_fallback = self.fallback.bind_tools(tools, **kwargs)
return bound_primary.with_fallbacks([bound_fallback])
def with_structured_output(self, schema, **kwargs):
struct_primary = self.primary.with_structured_output(schema, **kwargs)
struct_fallback = self.fallback.with_structured_output(schema, **kwargs)
return struct_primary.with_fallbacks([struct_fallback])
def with_config(self, config=None, **kwargs):
conf = config or {}
conf.update(kwargs)
cfg_primary = self.primary.with_config(conf)
cfg_fallback = self.fallback.with_config(conf)
return FallbackChatGroq(cfg_primary, cfg_fallback)
def invoke(self, messages, **kwargs):
return self.primary.with_fallbacks([self.fallback]).invoke(messages, **kwargs)
def get_fallback_llm(api_key: str = None, temperature: float = 0.0) -> FallbackChatGroq:
key = api_key or get_groq_api_key()
primary = ChatGroq(api_key=key, model="llama-3.3-70b-versatile", temperature=temperature)
fallback = ChatGroq(api_key=key, model="llama-3.1-8b-instant", temperature=temperature)
return FallbackChatGroq(primary, fallback)