SCGR's picture
fix HF register & dynamic fallback
3cf9fa0
from fastapi import APIRouter, HTTPException, Depends
from sqlalchemy.orm import Session
from .. import crud, database, schemas
from ..services.vlm_service import vlm_manager
from typing import Dict, Any
router = APIRouter()
def get_db():
db = database.SessionLocal()
try:
yield db
finally:
db.close()
@router.get("/models")
def get_available_models(db: Session = Depends(get_db)):
"""Get all available VLM models"""
try:
db_models = crud.get_models(db)
models_info = []
for model in db_models:
models_info.append({
"m_code": model.m_code,
"label": model.label,
"model_type": model.model_type,
"is_available": model.is_available,
"is_fallback": model.is_fallback,
"config": model.config,
"delete_count": model.delete_count
})
# Add debug info about registered services
registered_services = list(vlm_manager.services.keys())
return {
"models": models_info,
"debug": {
"registered_services": registered_services,
"total_services": len(registered_services),
"available_db_models": [m.m_code for m in db_models if m.is_available]
}
}
except Exception as e:
raise HTTPException(500, f"Failed to get models: {str(e)}")
@router.get("/models/{model_code}")
def get_model_info(model_code: str, db: Session = Depends(get_db)):
"""Get specific model information"""
try:
db_model = crud.get_model(db, model_code)
if not db_model:
raise HTTPException(404, "Model not found")
return {
"m_code": db_model.m_code,
"label": db_model.label,
"model_type": db_model.model_type,
"is_available": db_model.is_available,
"config": db_model.config,
"delete_count": db_model.delete_count
}
except HTTPException:
raise
except Exception as e:
raise HTTPException(500, f"Failed to get model info: {str(e)}")
@router.post("/models/{model_code}/test")
async def test_model(model_code: str, db: Session = Depends(get_db)):
"""Test a specific model with a sample image"""
try:
service = vlm_manager.services.get(model_code)
if not service:
raise HTTPException(404, "Model service not found")
test_image_bytes = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00\x00\x00\x0cIDATx\x9cc```\x00\x00\x00\x04\x00\x01\xf6\x178\x00\x00\x00\x00IEND\xaeB`\x82'
result = await service.generate_caption(test_image_bytes, "Describe this image.")
return {
"model": model_code,
"test_result": result,
"status": "success"
}
except HTTPException:
raise
except Exception as e:
raise HTTPException(500, f"Model test failed: {str(e)}")
@router.post("/models/{model_code}/toggle")
def toggle_model_availability(model_code: str, toggle_data: schemas.ModelToggleRequest, db: Session = Depends(get_db)):
"""Toggle model availability"""
try:
db_model = crud.get_model(db, model_code)
if not db_model:
raise HTTPException(404, "Model not found")
new_availability = toggle_data.is_available
db_model.is_available = new_availability
db.commit()
return {
"model_code": model_code,
"is_available": new_availability,
"message": f"Model {model_code} availability set to {new_availability}"
}
except HTTPException:
raise
except Exception as e:
db.rollback()
raise HTTPException(500, f"Failed to toggle model availability: {str(e)}")