|
@@ -131,25 +131,45 @@ def _get_base_model_id(adapter_path: str) -> str | None:
|
|
|
|
|
|
|
|
|
|
|
|
|
async def get_available_adapters() -> list[dict[str, Any]]:
|
|
async def get_available_adapters() -> list[dict[str, Any]]:
|
|
|
- """列出所有已训练的 adapter。"""
|
|
|
|
|
|
|
+ """列出所有已训练完成的 adapter(仅显示 status=completed 的任务)。"""
|
|
|
|
|
+ from app.core.db import async_session, TrainingJobModel
|
|
|
|
|
+ from sqlalchemy import select
|
|
|
|
|
+
|
|
|
|
|
+ # 查询数据库中训练完成的任务
|
|
|
|
|
+ async with async_session() as session:
|
|
|
|
|
+ result = await session.execute(
|
|
|
|
|
+ select(TrainingJobModel).where(TrainingJobModel.status == "completed")
|
|
|
|
|
+ )
|
|
|
|
|
+ completed_jobs = {job.id: job for job in result.scalars().all()}
|
|
|
|
|
+
|
|
|
|
|
+ if not completed_jobs:
|
|
|
|
|
+ return []
|
|
|
|
|
+
|
|
|
adapters_dir = settings.adapters_dir
|
|
adapters_dir = settings.adapters_dir
|
|
|
if not adapters_dir.exists():
|
|
if not adapters_dir.exists():
|
|
|
return []
|
|
return []
|
|
|
|
|
|
|
|
result = []
|
|
result = []
|
|
|
- for d in sorted(adapters_dir.iterdir()):
|
|
|
|
|
- if not d.is_dir():
|
|
|
|
|
|
|
+ for job_id, job in sorted(completed_jobs.items(), key=lambda x: x[1].created_at, reverse=True):
|
|
|
|
|
+ adapter_dir = adapters_dir / job_id
|
|
|
|
|
+ if not adapter_dir.is_dir():
|
|
|
continue
|
|
continue
|
|
|
- adapter_config = d / "adapter_config.json"
|
|
|
|
|
- if adapter_config.exists():
|
|
|
|
|
- with open(adapter_config) as f:
|
|
|
|
|
- cfg = json.load(f)
|
|
|
|
|
- result.append({
|
|
|
|
|
- "id": d.name,
|
|
|
|
|
- "path": str(d),
|
|
|
|
|
- "base_model": cfg.get("base_model_name_or_path", "unknown"),
|
|
|
|
|
- "peft_type": cfg.get("peft_type", "unknown"),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ adapter_config = adapter_dir / "adapter_config.json"
|
|
|
|
|
+ if not adapter_config.exists():
|
|
|
|
|
+ continue
|
|
|
|
|
+
|
|
|
|
|
+ with open(adapter_config) as f:
|
|
|
|
|
+ cfg = json.load(f)
|
|
|
|
|
+ result.append({
|
|
|
|
|
+ "id": job_id,
|
|
|
|
|
+ "path": str(adapter_dir),
|
|
|
|
|
+ "base_model": cfg.get("base_model_name_or_path", "unknown"),
|
|
|
|
|
+ "peft_type": cfg.get("peft_type", "unknown"),
|
|
|
|
|
+ "model_id": job.model_id,
|
|
|
|
|
+ "peft_method": job.peft_method,
|
|
|
|
|
+ "task_type": job.task_type,
|
|
|
|
|
+ "created_at": job.created_at.isoformat() if job.created_at else None,
|
|
|
|
|
+ })
|
|
|
return result
|
|
return result
|
|
|
|
|
|
|
|
|
|
|