File size: 6,777 Bytes
fb5b6b9
 
9508bbf
f04c960
fb5b6b9
 
 
 
 
9508bbf
 
 
f04c960
 
 
 
fb5b6b9
 
 
 
cf590c1
 
fb5b6b9
 
cf590c1
fb5b6b9
 
9508bbf
 
fb5b6b9
 
 
 
 
9508bbf
 
 
 
 
 
 
 
 
 
 
 
 
f04c960
 
9508bbf
 
 
 
 
 
cf590c1
 
fb5b6b9
 
9508bbf
 
cf590c1
 
fb5b6b9
 
9508bbf
 
 
cf590c1
 
 
fb5b6b9
cf590c1
 
 
 
 
 
9508bbf
 
 
 
 
 
 
 
f04c960
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
from fastapi import APIRouter, Request, HTTPException
from service_config import ServiceConfig
import datetime
import json

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.post("/add")
async def add_project(request: Request):
    data = await request.json()
    project_name = data.get("project_name")
    if not project_name:
        raise HTTPException(status_code=400, detail="project_name cannot be empty")
    if project_name in service_config.projects:
        raise HTTPException(status_code=400, detail="Project already exists")

    service_config.projects[project_name] = {
        "enabled": False,
        "versions": [],
        "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} added"}

@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")

    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="This record has been updated by another user. Please reload.")

    # örnek update: sadece enable/disable flag güncelliyoruz
    project["enabled"] = data.get("enabled", project["enabled"])

    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="This record has been updated by another user. Please reload.")

    latest_version = project["versions"][-1] if project["versions"] else None
    if not latest_version:
        raise HTTPException(status_code=400, detail="No version exists to publish")

    llm = latest_version.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_version["published"] = True
    latest_version["last_updated"] = get_utc_now()
    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"}

@router.post("/add_intent")
async def add_intent(request: Request):
    data = await request.json()
    project_name = data.get("project_name")
    version_number = data.get("version_number")
    intent = data.get("intent")
    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="This record has been updated by another user. Please reload.")

    version = next((v for v in project["versions"] if v["version_number"] == version_number), None)
    if not version:
        raise HTTPException(status_code=404, detail="Version not found")

    if any(i["name"] == intent["name"] for i in version.get("intents", [])):
        raise HTTPException(status_code=400, detail="Intent already exists")

    version.setdefault("intents", []).append(intent)
    version["last_updated"] = get_utc_now()
    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"Intent {intent['name']} added to project {project_name}, version {version_number}"}

@router.post("/delete_intent")
async def delete_intent(request: Request):
    data = await request.json()
    project_name = data.get("project_name")
    version_number = data.get("version_number")
    intent_name = data.get("intent_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="This record has been updated by another user. Please reload.")

    version = next((v for v in project["versions"] if v["version_number"] == version_number), None)
    if not version:
        raise HTTPException(status_code=404, detail="Version not found")

    version["intents"] = [i for i in version.get("intents", []) if i["name"] != intent_name]
    version["last_updated"] = get_utc_now()
    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"Intent {intent_name} deleted from project {project_name}, version {version_number}"}

@router.post("/add_api")
async def add_api(request: Request):
    data = await request.json()
    api_name = data.get("api_name")
    api_def = data.get("api_def")

    if api_name in service_config.apis:
        raise HTTPException(status_code=400, detail="API already exists")

    service_config.apis[api_name] = api_def

    with open(service_config.config_path, "w", encoding="utf-8") as f:
        json.dump(service_config, f, indent=2)

    return {"message": f"API {api_name} added"}

@router.post("/delete_api")
async def delete_api(request: Request):
    data = await request.json()
    api_name = data.get("api_name")
    if api_name not in service_config.apis:
        raise HTTPException(status_code=404, detail="API not found")

    del service_config.apis[api_name]

    with open(service_config.config_path, "w", encoding="utf-8") as f:
        json.dump(service_config, f, indent=2)

    return {"message": f"API {api_name} deleted"}