RAHULSR2806/devos-module2
0
1"""2DevOS Shared Backend Utilities3Supabase client, Groq client, embeddings, auth middleware4"""5 6import os7from functools import lru_cache8from typing import Optional9import httpx10from supabase import create_client, Client11from groq import Groq12from sentence_transformers import SentenceTransformer13from dotenv import load_dotenv14 15load_dotenv()16 17# ─────────────────────────────────────────18# Supabase Client19# ─────────────────────────────────────────20@lru_cache(maxsize=1)21def get_supabase() -> Client:22 url = os.environ["SUPABASE_URL"]23 key = os.environ["SUPABASE_SERVICE_KEY"]24 return create_client(url, key)25 26# ─────────────────────────────────────────27# Groq Client28# ─────────────────────────────────────────29@lru_cache(maxsize=1)30def get_groq() -> Groq:31 return Groq(api_key=os.environ["GROQ_API_KEY"])32 33# ─────────────────────────────────────────34# Embedding Model (384-dim, fast, free)35# ─────────────────────────────────────────36@lru_cache(maxsize=1)37def get_embedding_model() -> SentenceTransformer:38 return SentenceTransformer("all-MiniLM-L6-v2")39 40def embed_text(text: str) -> list[float]:41 model = get_embedding_model()42 embedding = model.encode(text, normalize_embeddings=True)43 return embedding.tolist()44 45def embed_texts(texts: list[str]) -> list[list[float]]:46 model = get_embedding_model()47 embeddings = model.encode(texts, normalize_embeddings=True, batch_size=32)48 return embeddings.tolist()49 50# ─────────────────────────────────────────51# Groq Chat Helper52# ─────────────────────────────────────────53def groq_chat(54 messages: list[dict],55 model: str = "llama-3.3-70b-versatile",56 temperature: float = 0.3,57 max_tokens: int = 2048,58 system: Optional[str] = None,59) -> str:60 client = get_groq()61 full_messages = []62 if system:63 full_messages.append({"role": "system", "content": system})64 full_messages.extend(messages)65 66 response = client.chat.completions.create(67 model=model,68 messages=full_messages,69 temperature=temperature,70 max_tokens=max_tokens,71 )72 return response.choices[0].message.content73 74def groq_vision(75 image_base64: str,76 prompt: str,77 media_type: str = "image/png",78 model: str = "meta-llama/llama-4-scout-17b-16e-instruct",79) -> str:80 client = get_groq()81 response = client.chat.completions.create(82 model=model,83 messages=[84 {85 "role": "user",86 "content": [87 {88 "type": "image_url",89 "image_url": {90 "url": f"data:{media_type};base64,{image_base64}"91 },92 },93 {"type": "text", "text": prompt},94 ],95 }96 ],97 max_tokens=2048,98 )99 return response.choices[0].message.content100 101# ─────────────────────────────────────────102# Health Check Response103# ─────────────────────────────────────────104def health_response(module: str) -> dict:105 return {"status": "healthy", "module": module, "version": "1.0.0"}106 