| """ |
| 插件 API 端点。 |
| """ |
|
|
| from fastapi import APIRouter, HTTPException |
|
|
| from app.plugins.manager import get_plugin_manager |
| from app.plugins.models import PluginStatus |
| from app.plugins.model_probe import probe_all_providers, probe_cpu_only_environment |
|
|
| router = APIRouter() |
|
|
|
|
| @router.get("/") |
| async def get_plugins(): |
| """获取所有插件列表。""" |
| manager = get_plugin_manager() |
| return manager.get_plugin_list() |
|
|
|
|
| @router.get("/stats") |
| async def get_plugins_stats(): |
| """获取插件统计信息。""" |
| manager = get_plugin_manager() |
| return manager.get_system_plugin_summary() |
|
|
|
|
| @router.get("/providers/status") |
| async def get_providers_status(): |
| """获取所有模型 Provider 的 CPU-only 可用性状态。 |
| |
| 不强制加载完整模型,仅检查依赖和缓存。 |
| 用于前端展示模型可用性和部署环境信息。 |
| """ |
| result = probe_all_providers() |
| return result.model_dump(mode="json") |
|
|
|
|
| @router.get("/providers/environment") |
| async def get_provider_environment(): |
| """获取 CPU-only 环境探测信息。 |
| |
| 检查 HuggingFace 缓存目录、Hub 可用性、GPU 状态等。 |
| """ |
| return probe_cpu_only_environment() |
|
|
|
|
| @router.get("/{plugin_name}") |
| async def get_plugin(plugin_name: str): |
| """获取指定插件详情。""" |
| manager = get_plugin_manager() |
| detail = manager.get_plugin_detail(plugin_name) |
| if detail is None: |
| raise HTTPException(status_code=404, detail=f"插件 {plugin_name} 不存在") |
| return detail |
|
|
|
|
| @router.post("/{plugin_name}/enable") |
| async def enable_plugin(plugin_name: str): |
| """启用插件。""" |
| manager = get_plugin_manager() |
| result = manager.enable_plugin(plugin_name) |
| if not result.success: |
| raise HTTPException( |
| status_code=_operation_error_status(manager, plugin_name), |
| detail=result.error or result.message, |
| ) |
| return result |
|
|
|
|
| @router.post("/{plugin_name}/disable") |
| async def disable_plugin(plugin_name: str): |
| """禁用插件。""" |
| manager = get_plugin_manager() |
| result = manager.disable_plugin(plugin_name) |
| if not result.success: |
| raise HTTPException(status_code=400, detail=result.error or result.message) |
| return result |
|
|
|
|
| def _operation_error_status(manager, plugin_name: str) -> int: |
| """依赖错误按契约返回 409,其它非法状态迁移保持 400。""" |
| if manager.get_plugin_status(plugin_name) == PluginStatus.DEPENDENCY_ERROR: |
| return 409 |
| return 400 |
|
|