Spaces:
Runtime error
Runtime error
| from fastapi import FastAPI, HTTPException, Depends, Header | |
| from fastapi.middleware.cors import CORSMiddleware | |
| import uvicorn | |
| import os | |
| import logging | |
| import httpx | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| app = FastAPI(title="FreeLLMAPI") | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # ไป็ฏๅขๅ้่ฏปๅๆๆ้ ็ฝฎ๏ผ้ๅฏๆฐธไธไธขๅคฑ๏ผ | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| def load_config(): | |
| """ | |
| Secrets ๆ ผๅผ็บฆๅฎ๏ผ | |
| API Keys๏ผๅ ่ฎธ่ฎฟ้ฎ็็จๆท๏ผ: | |
| API_KEYS = "key1,key2,key3" | |
| Providers๏ผไธๆธธ LLM ๆๅก๏ผ: | |
| PROVIDER_1_NAME = "openai" | |
| PROVIDER_1_APIKEY = "sk-xxxx" | |
| PROVIDER_1_BASEURL = "https://api.openai.com/v1" | |
| PROVIDER_1_MODELS = "gpt-4o,gpt-4o-mini" | |
| PROVIDER_2_NAME = "deepseek" | |
| PROVIDER_2_APIKEY = "sk-yyyy" | |
| PROVIDER_2_BASEURL = "https://api.deepseek.com/v1" | |
| PROVIDER_2_MODELS = "deepseek-chat,deepseek-coder" | |
| # ๆๅคๆฏๆ 20 ไธช Provider | |
| """ | |
| # โโ ่ฏปๅ API Keys โโ | |
| raw_keys = os.getenv("API_KEYS", "") | |
| api_keys = set( | |
| k.strip() for k in raw_keys.split(",") if k.strip() | |
| ) | |
| # โโ ่ฏปๅ Providers โโ | |
| providers = {} | |
| for i in range(1, 21): | |
| name = os.getenv(f"PROVIDER_{i}_NAME") | |
| api_key = os.getenv(f"PROVIDER_{i}_APIKEY") | |
| baseurl = os.getenv(f"PROVIDER_{i}_BASEURL") | |
| models = os.getenv(f"PROVIDER_{i}_MODELS", "") | |
| if not name or not api_key or not baseurl: | |
| continue # ่ฏฅ็ผๅทๆช้ ็ฝฎ๏ผ่ทณ่ฟ | |
| providers[name] = { | |
| "api_key": api_key, | |
| "base_url": baseurl.rstrip("/"), | |
| "models": [m.strip() for m in models.split(",") if m.strip()], | |
| } | |
| logger.info(f"โ ๅ ่ฝฝไบ {len(api_keys)} ไธช API Key") | |
| logger.info(f"โ ๅ ่ฝฝไบ {len(providers)} ไธช Provider: {list(providers.keys())}") | |
| return api_keys, providers | |
| # ๅฏๅจๆถๅ ่ฝฝไธๆฌก | |
| API_KEYS, PROVIDERS = load_config() | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # ้ดๆ | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| def verify_api_key(authorization: str = Header(...)): | |
| token = authorization.removeprefix("Bearer ").strip() | |
| if token not in API_KEYS: | |
| raise HTTPException(status_code=401, detail="Invalid API key") | |
| return token | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # ่ทฏ็ฑ | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| async def health(): | |
| return { | |
| "status": "ok", | |
| "keys": len(API_KEYS), | |
| "providers": list(PROVIDERS.keys()), | |
| } | |
| async def list_models(_: str = Depends(verify_api_key)): | |
| data = [] | |
| for p_cfg in PROVIDERS.values(): | |
| for m in p_cfg["models"]: | |
| data.append({"id": m, "object": "model"}) | |
| return {"object": "list", "data": data} | |
| async def chat_completions( | |
| body: dict, | |
| _: str = Depends(verify_api_key) | |
| ): | |
| model = body.get("model", "") | |
| provider = None | |
| # ๆพๅฐๆฏๆ่ฏฅ model ็ provider | |
| for p_cfg in PROVIDERS.values(): | |
| if model in p_cfg["models"]: | |
| provider = p_cfg | |
| break | |
| if not provider: | |
| raise HTTPException( | |
| status_code=404, | |
| detail=f"ๆฒกๆ Provider ๆฏๆๆจกๅ: {model}" | |
| ) | |
| # ่ฝฌๅๅฐไธๆธธ | |
| async with httpx.AsyncClient(timeout=60) as client: | |
| resp = await client.post( | |
| f"{provider['base_url']}/chat/completions", | |
| headers={"Authorization": f"Bearer {provider['api_key']}"}, | |
| json=body, | |
| ) | |
| return resp.json() | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # ๅ ฅๅฃ | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="0.0.0.0", port=7860) |