72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
# Adapted from SGLang
|
|
# (https://github.com/sgl-project/sglang/blob/main/python/sglang/multimodal_gen/runtime/entrypoints/openai/common_api.py)
|
|
|
|
import time
|
|
|
|
from fastapi import APIRouter
|
|
from fastapi.responses import ORJSONResponse
|
|
from pydantic import BaseModel, Field
|
|
|
|
from fastvideo.entrypoints.openai.state import get_served_model_name, get_server_args
|
|
from fastvideo.logger import init_logger
|
|
|
|
router = APIRouter(prefix="/v1")
|
|
logger = init_logger(__name__)
|
|
|
|
|
|
class ModelCard(BaseModel):
|
|
"""OpenAI-compatible model card"""
|
|
|
|
id: str
|
|
object: str = "model"
|
|
created: int = Field(default_factory=lambda: int(time.time()))
|
|
owned_by: str = "fastvideo"
|
|
root: str | None = None
|
|
|
|
|
|
@router.get("/models", response_class=ORJSONResponse)
|
|
async def available_models():
|
|
"""Show available models"""
|
|
args = get_server_args()
|
|
cards = [ModelCard(id=get_served_model_name(), root=args.model_path)]
|
|
return {"object": "list", "data": [card.model_dump() for card in cards]}
|
|
|
|
|
|
@router.get("/models/{model:path}", response_class=ORJSONResponse)
|
|
async def retrieve_model(model: str):
|
|
"""Retrieve a model by name"""
|
|
args = get_server_args()
|
|
served_model_name = get_served_model_name()
|
|
available = {served_model_name}
|
|
if model not in available:
|
|
return ORJSONResponse(
|
|
status_code=404,
|
|
content={
|
|
"error": {
|
|
"message": f"The model '{model}' does not exist",
|
|
"type": "invalid_request_error",
|
|
"param": "model",
|
|
"code": "model_not_found",
|
|
}
|
|
},
|
|
)
|
|
card = ModelCard(id=model, root=args.model_path)
|
|
return card.model_dump()
|
|
|
|
|
|
@router.get("/model_info")
|
|
async def model_info():
|
|
"""Get basic model information"""
|
|
args = get_server_args()
|
|
return {
|
|
"model_path":
|
|
args.model_path,
|
|
"served_model_name":
|
|
get_served_model_name(),
|
|
"lora": ({
|
|
"name": args.lora_nickname,
|
|
"path": args.lora_path,
|
|
"scale": args.lora_strength,
|
|
} if args.lora_path else None),
|
|
}
|