Spaces:
Paused
Paused
Update controllers/project_controller.py
Browse files- controllers/project_controller.py +118 -26
controllers/project_controller.py
CHANGED
@@ -7,6 +7,19 @@ router = APIRouter()
|
|
7 |
service_config = ServiceConfig()
|
8 |
service_config.load()
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
@router.get("/list_projects")
|
11 |
def list_projects():
|
12 |
projects = list(service_config.projects.keys())
|
@@ -29,19 +42,7 @@ async def add_project(request: Request):
|
|
29 |
"llm": {},
|
30 |
"intents": []
|
31 |
}
|
32 |
-
|
33 |
-
with open(service_config.config_path, "w", encoding="utf-8") as f:
|
34 |
-
json.dump({
|
35 |
-
"config": {
|
36 |
-
"work_mode": service_config.work_mode,
|
37 |
-
"cloud_token": service_config.cloud_token,
|
38 |
-
"system_prompt": service_config.system_prompt,
|
39 |
-
"llm_inference_service_url": service_config.llm_inference_service_url
|
40 |
-
},
|
41 |
-
"projects": service_config.projects,
|
42 |
-
"apis": service_config.apis
|
43 |
-
}, f, indent=2)
|
44 |
-
|
45 |
log(f"π Added project: {project_name}")
|
46 |
return {"message": f"Project {project_name} added."}
|
47 |
|
@@ -53,18 +54,109 @@ async def delete_project(request: Request):
|
|
53 |
return {"error": "Project not found."}
|
54 |
|
55 |
del service_config.projects[project_name]
|
56 |
-
|
57 |
-
with open(service_config.config_path, "w", encoding="utf-8") as f:
|
58 |
-
json.dump({
|
59 |
-
"config": {
|
60 |
-
"work_mode": service_config.work_mode,
|
61 |
-
"cloud_token": service_config.cloud_token,
|
62 |
-
"system_prompt": service_config.system_prompt,
|
63 |
-
"llm_inference_service_url": service_config.llm_inference_service_url
|
64 |
-
},
|
65 |
-
"projects": service_config.projects,
|
66 |
-
"apis": service_config.apis
|
67 |
-
}, f, indent=2)
|
68 |
-
|
69 |
log(f"ποΈ Deleted project: {project_name}")
|
70 |
return {"message": f"Project {project_name} deleted."}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
service_config = ServiceConfig()
|
8 |
service_config.load()
|
9 |
|
10 |
+
def save_config():
|
11 |
+
with open(service_config.config_path, "w", encoding="utf-8") as f:
|
12 |
+
json.dump({
|
13 |
+
"config": {
|
14 |
+
"work_mode": service_config.work_mode,
|
15 |
+
"cloud_token": service_config.cloud_token,
|
16 |
+
"system_prompt": service_config.system_prompt,
|
17 |
+
"llm_inference_service_url": service_config.llm_inference_service_url
|
18 |
+
},
|
19 |
+
"projects": service_config.projects,
|
20 |
+
"apis": service_config.apis
|
21 |
+
}, f, indent=2)
|
22 |
+
|
23 |
@router.get("/list_projects")
|
24 |
def list_projects():
|
25 |
projects = list(service_config.projects.keys())
|
|
|
42 |
"llm": {},
|
43 |
"intents": []
|
44 |
}
|
45 |
+
save_config()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
log(f"π Added project: {project_name}")
|
47 |
return {"message": f"Project {project_name} added."}
|
48 |
|
|
|
54 |
return {"error": "Project not found."}
|
55 |
|
56 |
del service_config.projects[project_name]
|
57 |
+
save_config()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
log(f"ποΈ Deleted project: {project_name}")
|
59 |
return {"message": f"Project {project_name} deleted."}
|
60 |
+
|
61 |
+
# === INTENT CRUD ===
|
62 |
+
|
63 |
+
@router.get("/list_intents")
|
64 |
+
def list_intents(project_name: str):
|
65 |
+
project = service_config.get_project(project_name)
|
66 |
+
if not project:
|
67 |
+
return {"error": "Project not found."}
|
68 |
+
intent_names = [intent["name"] for intent in project["intents"]]
|
69 |
+
log(f"π Listing intents for project: {project_name}")
|
70 |
+
return {"intents": intent_names}
|
71 |
+
|
72 |
+
@router.post("/add_intent")
|
73 |
+
async def add_intent(request: Request):
|
74 |
+
data = await request.json()
|
75 |
+
project_name = data.get("project_name")
|
76 |
+
intent_name = data.get("intent_name")
|
77 |
+
if not project_name or not intent_name:
|
78 |
+
return {"error": "Project name and intent name required."}
|
79 |
+
|
80 |
+
project = service_config.get_project(project_name)
|
81 |
+
if not project:
|
82 |
+
return {"error": "Project not found."}
|
83 |
+
|
84 |
+
if any(intent["name"] == intent_name for intent in project["intents"]):
|
85 |
+
return {"error": "Intent already exists."}
|
86 |
+
|
87 |
+
new_intent = {
|
88 |
+
"name": intent_name,
|
89 |
+
"examples": [],
|
90 |
+
"parameters": [],
|
91 |
+
"action": "",
|
92 |
+
"fallback_timeout_message": "",
|
93 |
+
"fallback_error_message": "",
|
94 |
+
"humanization_prompt": ""
|
95 |
+
}
|
96 |
+
project["intents"].append(new_intent)
|
97 |
+
save_config()
|
98 |
+
log(f"π Added intent: {intent_name} to project: {project_name}")
|
99 |
+
return {"message": f"Intent {intent_name} added to project {project_name}."}
|
100 |
+
|
101 |
+
@router.post("/delete_intent")
|
102 |
+
async def delete_intent(request: Request):
|
103 |
+
data = await request.json()
|
104 |
+
project_name = data.get("project_name")
|
105 |
+
intent_name = data.get("intent_name")
|
106 |
+
if not project_name or not intent_name:
|
107 |
+
return {"error": "Project name and intent name required."}
|
108 |
+
|
109 |
+
project = service_config.get_project(project_name)
|
110 |
+
if not project:
|
111 |
+
return {"error": "Project not found."}
|
112 |
+
|
113 |
+
project["intents"] = [intent for intent in project["intents"] if intent["name"] != intent_name]
|
114 |
+
save_config()
|
115 |
+
log(f"ποΈ Deleted intent: {intent_name} from project: {project_name}")
|
116 |
+
return {"message": f"Intent {intent_name} deleted from project {project_name}."}
|
117 |
+
|
118 |
+
# === PARAMETER CRUD ===
|
119 |
+
|
120 |
+
@router.post("/add_parameter")
|
121 |
+
async def add_parameter(request: Request):
|
122 |
+
data = await request.json()
|
123 |
+
project_name = data.get("project_name")
|
124 |
+
intent_name = data.get("intent_name")
|
125 |
+
parameter = data.get("parameter") # {name, type, regex, validation_message, extraction_prompt}
|
126 |
+
if not project_name or not intent_name or not parameter:
|
127 |
+
return {"error": "Project, intent, and parameter data required."}
|
128 |
+
|
129 |
+
project = service_config.get_project(project_name)
|
130 |
+
if not project:
|
131 |
+
return {"error": "Project not found."}
|
132 |
+
|
133 |
+
intent = next((i for i in project["intents"] if i["name"] == intent_name), None)
|
134 |
+
if not intent:
|
135 |
+
return {"error": "Intent not found."}
|
136 |
+
|
137 |
+
intent["parameters"].append(parameter)
|
138 |
+
save_config()
|
139 |
+
log(f"β Added parameter: {parameter['name']} to intent: {intent_name}")
|
140 |
+
return {"message": f"Parameter {parameter['name']} added to intent {intent_name}."}
|
141 |
+
|
142 |
+
@router.post("/delete_parameter")
|
143 |
+
async def delete_parameter(request: Request):
|
144 |
+
data = await request.json()
|
145 |
+
project_name = data.get("project_name")
|
146 |
+
intent_name = data.get("intent_name")
|
147 |
+
parameter_name = data.get("parameter_name")
|
148 |
+
if not project_name or not intent_name or not parameter_name:
|
149 |
+
return {"error": "Project, intent, and parameter name required."}
|
150 |
+
|
151 |
+
project = service_config.get_project(project_name)
|
152 |
+
if not project:
|
153 |
+
return {"error": "Project not found."}
|
154 |
+
|
155 |
+
intent = next((i for i in project["intents"] if i["name"] == intent_name), None)
|
156 |
+
if not intent:
|
157 |
+
return {"error": "Intent not found."}
|
158 |
+
|
159 |
+
intent["parameters"] = [p for p in intent["parameters"] if p["name"] != parameter_name]
|
160 |
+
save_config()
|
161 |
+
log(f"ποΈ Deleted parameter: {parameter_name} from intent: {intent_name}")
|
162 |
+
return {"message": f"Parameter {parameter_name} deleted from intent {intent_name}."}
|