wan2-api / app.py
abrahamdw882's picture
Update app.py
fe737ff verified
raw
history blame
2.66 kB
# app.py
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
import uvicorn
import os
import uuid
# GGUF & video libraries
from gguf_runtime import GGUFModel # Make sure gguf-runtime is installed
from moviepy.editor import ImageSequenceClip
app = FastAPI(title="WAN2 GGUF API", version="1.0")
# -------------------- Directories --------------------
MODEL_REPO = "calcuis/wan2-gguf"
MODEL_FILE = "wan2.2-animate-14b-q4_0.gguf"
MODEL_DIR = "models"
OUTPUT_DIR = "outputs"
os.makedirs(MODEL_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)
# -------------------- Download model --------------------
from huggingface_hub import hf_hub_download
model_path = hf_hub_download(
repo_id=MODEL_REPO,
filename=MODEL_FILE,
local_dir=MODEL_DIR
)
print("✅ Model downloaded to:", model_path)
# -------------------- Load GGUF model --------------------
print("Loading WAN2 GGUF model...")
wan2_model = GGUFModel(model_path)
print("✅ WAN2 model loaded")
# -------------------- Request schema --------------------
class PromptRequest(BaseModel):
prompt: str
steps: int = 20
# -------------------- Routes --------------------
@app.get("/")
def root():
return {"message": "WAN2 GGUF API is running!"}
@app.get("/generate")
def generate_video_get(q: str, steps: int = 20):
"""Allows GET requests with ?q=... for browser testing"""
return generate_video(PromptRequest(prompt=q, steps=steps))
@app.post("/generate")
def generate_video(request: PromptRequest):
"""Generates video from prompt using WAN2 GGUF"""
# Unique filename
file_id = str(uuid.uuid4())
file_path = os.path.join(OUTPUT_DIR, f"{file_id}.mp4")
# ---- WAN2 inference ----
# This generates frames from prompt
frames = wan2_model.generate_video(
prompt=request.prompt,
steps=request.steps
)
# ---- Save frames as MP4 ----
clip = ImageSequenceClip(frames, fps=12)
clip.write_videofile(file_path, codec="libx264", audio=False, verbose=False, logger=None)
# Build full URL for Hugging Face Space
base_url = "https://abrahamdw882-wan2-api.hf.space"
video_url = f"{base_url}/file/{file_id}.mp4"
return {
"status": "success",
"model_file": MODEL_FILE,
"prompt": request.prompt,
"steps": request.steps,
"video_url": video_url
}
# -------------------- Serve output videos --------------------
app.mount("/file", StaticFiles(directory=OUTPUT_DIR), name="file")
# -------------------- Run server --------------------
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)