1+ import httpx
2+ from typing import Dict , Any , Optional , Union
3+ import asyncio
4+
5+ class Genstack :
6+ def __init__ (self , api_key : str , base_url : Optional [str ] = None ):
7+ if not api_key .startswith ("gen-" ) or any (c .isspace () for c in api_key ):
8+ raise ValueError ("API key must start with 'gen-' and contain no spaces or line breaks." )
9+ self .api_key : str = api_key
10+ self .base_url : str = base_url or "http://localhost:8000"
11+ async def __call (self , payload : Dict [str , Any ]) -> Dict [str , Any ]:
12+ async with httpx .AsyncClient (timeout = httpx .Timeout (30.0 )) as client :
13+ try :
14+ response = await client .post (
15+ url = f"{ self .base_url } /api/v1/sdk/generate" ,
16+ headers = {
17+ "x-api-key" : f"{ self .api_key } "
18+ },
19+ json = payload
20+ )
21+ response .raise_for_status ()
22+ return response .json ()
23+ except httpx .HTTPStatusError as e :
24+ return e .response .json ()
25+ except Exception as e :
26+ return {"error" : str (e )}
27+ async def __generate_async (self , payload : Dict [str , Any ]) -> Dict [str , Any ]:
28+ return await self .__call (payload = payload )
29+ def generate (self , input : Union [str , Dict [str , Any ]], model : Optional [str ] = "auto" , track : Optional [str ] = None ) -> Dict [str , Any ]:
30+ if not track :
31+ raise ValueError ("Track is required." )
32+ if not isinstance (input , (str , dict )):
33+ raise TypeError ("Payload must be a string or a dictionary." )
34+ if isinstance (input , str ):
35+ inner_payload = {"input" : input }
36+ else :
37+ inner_payload = input
38+
39+ payload = {
40+ "payload" : inner_payload ,
41+ "model" : model ,
42+ "track" : track
43+ }
44+ return asyncio .run (self .__generate_async (payload = payload ))
0 commit comments