Spaces:
Running
Running
import os | |
import uvicorn | |
import torch | |
from fastapi import FastAPI, HTTPException | |
from fastapi.responses import JSONResponse, Response | |
from pydantic import BaseModel | |
from transformers import pipeline | |
# Utw贸rz instancj臋 FastAPI | |
app = FastAPI( | |
title="Bielik Text Generation API", | |
description="API do generowania tekstu za pomoc膮 modelu Bielik-1.5B-v3.0-Instruct", | |
version="1.0.0" | |
) | |
# 艢cie偶ka do modelu - Hugging Face automatycznie pobierze model | |
MODEL_NAME = "speakleash/Bielik-1.5B-v3.0-Instruct" | |
generator = None # Zostanie za艂adowany p贸藕niej | |
# Model wej艣ciowy dla POST request | |
class GenerationRequest(BaseModel): | |
prompt: str | |
max_new_tokens: int = 50 | |
temperature: float = 0.7 | |
top_p: float = 0.9 | |
async def startup_event(): | |
""" | |
艁adowanie modelu podczas uruchamiania aplikacji. | |
To zajmie troch臋 czasu, ale dzieje si臋 tylko raz. | |
""" | |
global generator | |
print(f"艁adowanie modelu: {MODEL_NAME}...") | |
try: | |
# Mo偶esz dostosowa膰 device=0 (GPU) lub device=-1 (CPU) w zale偶no艣ci od wybranej maszyny Space | |
# Free tier spaces usually run on CPU, unless you explicitly select a GPU. | |
# It's safer to not specify device if you want it to auto-detect or default to CPU. | |
generator = pipeline( | |
"text-generation", | |
model=MODEL_NAME, | |
# device=0 if torch.cuda.is_available() else -1 # Odkomentuj dla detekcji GPU | |
) | |
print("Model za艂adowany pomy艣lnie!") | |
except Exception as e: | |
print(f"B艂膮d 艂adowania modelu: {e}") | |
# Mo偶esz zdecydowa膰, czy aplikacja ma zako艅czy膰 dzia艂anie, czy kontynuowa膰 bez modelu | |
# W przypadku b艂臋du 艂adowania modelu, endpoint generacji tekstu b臋dzie zwraca艂 b艂膮d | |
generator = None # Ustaw na None, aby sygnalizowa膰 problem | |
async def root(): | |
""" | |
G艂贸wny endpoint (health check). | |
""" | |
return {"message": "Bielik Text Generation API is running!"} | |
async def generate_text(request: GenerationRequest): | |
""" | |
Endpoint do generowania tekstu na podstawie promptu. | |
""" | |
if generator is None: | |
raise HTTPException(status_code=503, detail="Model nie zosta艂 za艂adowany lub wyst膮pi艂 b艂膮d.") | |
try: | |
generated_text = generator( | |
request.prompt, | |
max_new_tokens=request.max_new_tokens, | |
temperature=request.temperature, | |
top_p=request.top_p, | |
do_sample=True, # Wa偶ne dla generowania z temperatur膮 | |
return_full_text=False # Dodaj ten parametr, aby model nie zwraca艂 od razu promptu | |
) | |
# Pipeline zwraca list臋 s艂ownik贸w, bierzemy pierwszy wynik | |
#gen_text = {"generated_text": generated_text[0]["generated_text"]} | |
response_data = {"generated_text": generated_text[0]["generated_text"]} | |
return JSONResponse( | |
content=response_data, | |
media_type="application/json; charset=utf-8" | |
) | |
#return Response(content=generated_text[0]["generated_text"], media_type="text/plain; charset=utf-8") | |
# return {"generated_text": generated_text[0]["generated_text"]} | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=f"B艂膮d podczas generowania tekstu: {e}") | |
# Uruchamianie serwera Uvicorn bezpo艣rednio (dla Dockera) | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=int(os.getenv("PORT", 7860))) | |