1import requests
2import time
3from typing import Optional
4
5class ModelsLabClient:
6 """Production-ready ModelsLab API client with retry logic."""
7
8 def __init__(self, api_key: str, max_retries: int = 3):
9 self.api_key = api_key
10 self.base_url = "https://modelslab.com/api/v7"
11 self.max_retries = max_retries
12
13 def generate_image(self, prompt: str, model: str = "flux", **kwargs) -> Optional[list]:
14 payload = {
15 "key": self.api_key,
16 "model_id": model,
17 "prompt": prompt,
18 "width": kwargs.get("width", 1024),
19 "height": kwargs.get("height", 1024),
20 "samples": kwargs.get("samples", 1),
21 }
22
23 for attempt in range(self.max_retries):
24 try:
25 response = requests.post(
26 f"{self.base_url}/images/text-to-image",
27 json=payload,
28 timeout=30
29 )
30
31 if response.status_code == 429:
32 retry_after = int(response.headers.get("Retry-After", 5))
33 time.sleep(retry_after)
34 continue
35
36 response.raise_for_status()
37 data = response.json()
38
39 if data.get("status") == "success":
40 return data["output"]
41 elif data.get("status") == "processing":
42 return self._poll_result(data["fetch_result"])
43
44 except requests.exceptions.Timeout:
45 if attempt < self.max_retries - 1:
46 time.sleep(2 ** attempt)
47 continue
48 raise
49
50 return None
51
52
53client = ModelsLabClient("YOUR_API_KEY")
54images = client.generate_image("professional product photo, studio lighting")