Spaces:
Running
Running
File size: 5,156 Bytes
fb5b6b9 9508bbf f04c960 5b88843 fb5b6b9 9508bbf f04c960 75195a9 5b88843 75195a9 fb5b6b9 9508bbf 75195a9 9508bbf 75195a9 9508bbf 75195a9 9508bbf 75195a9 9508bbf 75195a9 9508bbf 75195a9 9508bbf cf590c1 fb5b6b9 9508bbf cf590c1 fb5b6b9 9508bbf 75195a9 9508bbf 75195a9 fb5b6b9 75195a9 cf590c1 75195a9 5b88843 da0a0a8 5b88843 9508bbf 5b88843 da0a0a8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
from fastapi import APIRouter, Request, HTTPException
from service_config import ServiceConfig
import datetime
import json
import copy
router = APIRouter()
service_config = ServiceConfig()
service_config.load()
def get_utc_now():
return datetime.datetime.utcnow().isoformat()
@router.get("/list")
def list_projects():
return service_config.projects
@router.get("/{project_name}/latest")
def get_latest_project_version(project_name: str):
project = service_config.projects.get(project_name)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
if not project["versions"]:
raise HTTPException(status_code=404, detail="No versions found")
latest = max(project["versions"], key=lambda v: v["version_number"])
return {
"version_number": latest["version_number"],
"published": latest.get("published", False),
"intents": latest.get("intents", []),
"llm": latest.get("llm", {}),
"last_updated": project["last_updated"]
}
@router.post("/update")
async def update_project(request: Request):
data = await request.json()
project_name = data.get("project_name")
client_last_updated = data.get("client_last_updated")
new_data = data.get("new_data")
project = service_config.projects.get(project_name)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
if project["last_updated"] != client_last_updated:
raise HTTPException(status_code=409, detail="Record updated by another user. Please reload.")
latest = max(project["versions"], key=lambda v: v["version_number"])
if latest.get("published"):
raise HTTPException(status_code=400, detail="Cannot edit a published version.")
latest.update(new_data)
project["last_updated"] = get_utc_now()
with open(service_config.config_path, "w", encoding="utf-8") as f:
json.dump(service_config, f, indent=2)
return {"message": f"Project {project_name} updated"}
@router.post("/publish")
async def publish_project(request: Request):
data = await request.json()
project_name = data.get("project_name")
client_last_updated = data.get("client_last_updated")
project = service_config.projects.get(project_name)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
if project["last_updated"] != client_last_updated:
raise HTTPException(status_code=409, detail="Record updated by another user. Please reload.")
latest = max(project["versions"], key=lambda v: v["version_number"])
if latest.get("published"):
raise HTTPException(status_code=400, detail="Version already published.")
llm = latest.get("llm", {})
if not llm.get("repo_id"):
raise HTTPException(status_code=400, detail="repo_id is required")
if llm.get("use_fine_tune") and not llm.get("fine_tune_zip"):
raise HTTPException(status_code=400, detail="fine_tune_zip is required when use_fine_tune is true")
latest["published"] = True
latest["last_updated"] = get_utc_now()
new_version_number = latest["version_number"] + 1
new_version = copy.deepcopy(latest)
new_version["version_number"] = new_version_number
new_version["published"] = False
new_version["last_updated"] = get_utc_now()
new_version["intents"] = []
new_version["llm"] = copy.deepcopy(llm)
project["versions"].append(new_version)
project["last_updated"] = get_utc_now()
with open(service_config.config_path, "w", encoding="utf-8") as f:
json.dump(service_config, f, indent=2)
return {"message": f"Project {project_name} version published and new draft version {new_version_number} created"}
@router.post("/seed/test_data")
def seed_test_data():
service_config.projects = {
"demo-project": {
"enabled": True,
"last_updated": get_utc_now(),
"versions": [
{
"version_number": 1,
"published": True,
"last_updated": get_utc_now(),
"intents": [{"name": "weather-intent"}, {"name": "currency-intent"}],
"llm": {
"repo_id": "demo/repo",
"use_fine_tune": False
}
},
{
"version_number": 2,
"published": False,
"last_updated": get_utc_now(),
"intents": [],
"llm": {
"repo_id": "demo/repo",
"use_fine_tune": False
}
}
]
}
}
with open(service_config.config_path, "w", encoding="utf-8") as f:
json.dump(service_config, f, indent=2)
return {"message": "Test data seeded"}
@router.post("/clear/all")
def clear_all():
service_config.projects = {}
with open(service_config.config_path, "w", encoding="utf-8") as f:
json.dump(service_config, f, indent=2)
return {"message": "All projects cleared"}
|