5
5
import json
6
6
import os
7
7
import re
8
+ from typing import Dict , List , Union
8
9
9
- from typing import List , Dict , Union
10
10
from edgecraftrag .api .v1 .data import add_data
11
- from edgecraftrag .api_schema import DataIn , KnowledgeBaseCreateIn , ExperienceIn
11
+ from edgecraftrag .api_schema import DataIn , ExperienceIn , KnowledgeBaseCreateIn
12
12
from edgecraftrag .base import IndexerType
13
13
from edgecraftrag .context import ctx
14
14
from edgecraftrag .utils import compare_mappings
@@ -50,7 +50,7 @@ async def create_knowledge_base(knowledge: KnowledgeBaseCreateIn):
50
50
detail = "Knowledge base names must begin with a letter or underscore" ,
51
51
)
52
52
kb = ctx .knowledgemgr .create_knowledge_base (knowledge )
53
- if kb .active and kb .comp_type == "knowledge" :
53
+ if kb .active and kb .comp_type == "knowledge" :
54
54
active_pl .indexer .reinitialize_indexer (kb .name )
55
55
active_pl .update_indexer_to_retriever ()
56
56
await save_knowledge_to_file ()
@@ -68,9 +68,14 @@ async def delete_knowledge_base(knowledge_name: str):
68
68
active_pl = ctx .get_pipeline_mgr ().get_active_pipeline ()
69
69
if rm_kb .comp_type == "knowledge" :
70
70
if not active_kb :
71
- raise HTTPException (status_code = status .HTTP_500_INTERNAL_SERVER_ERROR , detail = "Please activate a knowledge base before proceeding." )
71
+ raise HTTPException (
72
+ status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
73
+ detail = "Please activate a knowledge base before proceeding." ,
74
+ )
72
75
if active_kb .name == knowledge_name or active_kb .idx == knowledge_name :
73
- raise HTTPException (status_code = status .HTTP_500_INTERNAL_SERVER_ERROR , detail = "Cannot delete a running knowledge base." )
76
+ raise HTTPException (
77
+ status_code = status .HTTP_500_INTERNAL_SERVER_ERROR , detail = "Cannot delete a running knowledge base."
78
+ )
74
79
kb_file_path = rm_kb .get_file_paths ()
75
80
if kb_file_path :
76
81
if active_pl .indexer .comp_subtype == "milvus_vector" :
@@ -80,7 +85,10 @@ async def delete_knowledge_base(knowledge_name: str):
80
85
active_pl .update_indexer_to_retriever ()
81
86
if rm_kb .comp_type == "experience" :
82
87
if rm_kb .experience_active :
83
- raise HTTPException (status_code = status .HTTP_500_INTERNAL_SERVER_ERROR , detail = "Cannot delete a running experience knowledge base." )
88
+ raise HTTPException (
89
+ status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
90
+ detail = "Cannot delete a running experience knowledge base." ,
91
+ )
84
92
else :
85
93
rm_kb .clear_experiences ()
86
94
result = ctx .knowledgemgr .delete_knowledge_base (knowledge_name )
@@ -130,8 +138,10 @@ async def add_file_to_knowledge_base(knowledge_name, file_path: DataIn):
130
138
try :
131
139
active_pl = ctx .get_pipeline_mgr ().get_active_pipeline ()
132
140
kb = ctx .knowledgemgr .get_knowledge_base_by_name_or_id (knowledge_name )
133
- if kb .comp_type == "experience" :
134
- raise HTTPException (status_code = status .HTTP_404_NOT_FOUND , detail = "The experience type cannot perform file operations." )
141
+ if kb .comp_type == "experience" :
142
+ raise HTTPException (
143
+ status_code = status .HTTP_404_NOT_FOUND , detail = "The experience type cannot perform file operations."
144
+ )
135
145
# Validate and normalize the user-provided path
136
146
user_path = file_path .local_path
137
147
normalized_path = os .path .normpath (os .path .join (KNOWLEDGE_BASE_ROOT , user_path ))
@@ -183,8 +193,10 @@ async def remove_file_from_knowledge_base(knowledge_name, file_path: DataIn):
183
193
try :
184
194
active_pl = ctx .get_pipeline_mgr ().get_active_pipeline ()
185
195
kb = ctx .knowledgemgr .get_knowledge_base_by_name_or_id (knowledge_name )
186
- if kb .comp_type == "experience" :
187
- raise HTTPException (status_code = status .HTTP_404_NOT_FOUND , detail = "The experience type cannot perform file operations." )
196
+ if kb .comp_type == "experience" :
197
+ raise HTTPException (
198
+ status_code = status .HTTP_404_NOT_FOUND , detail = "The experience type cannot perform file operations."
199
+ )
188
200
active_kb = ctx .knowledgemgr .get_active_knowledge_base ()
189
201
if file_path .local_path in kb .get_file_paths ():
190
202
kb .remove_file_path (file_path .local_path )
@@ -212,14 +224,16 @@ async def remove_file_from_knowledge_base(knowledge_name, file_path: DataIn):
212
224
except ValueError as e :
213
225
raise HTTPException (status_code = status .HTTP_404_NOT_FOUND , detail = str (e ))
214
226
227
+
215
228
@kb_app .post ("/v1/experience" )
216
229
def get_experience_by_question (req : ExperienceIn ):
217
- kb = ctx .knowledgemgr .get_experience_kb ()
230
+ kb = ctx .knowledgemgr .get_experience_kb ()
218
231
result = kb .get_experience_by_question (req .question )
219
232
if not result :
220
233
raise HTTPException (404 , detail = "Experience not found" )
221
234
return result
222
235
236
+
223
237
@kb_app .get ("/v1/experiences" )
224
238
def get_all_experience ():
225
239
kb = ctx .knowledgemgr .get_experience_kb ()
@@ -228,48 +242,53 @@ def get_all_experience():
228
242
else :
229
243
return kb
230
244
245
+
231
246
@kb_app .patch ("/v1/experiences" )
232
247
def update_experience (experience : ExperienceIn ):
233
248
kb = ctx .knowledgemgr .get_experience_kb ()
234
249
result = kb .update_experience (experience .question , experience .content )
235
250
if not result :
236
- raise HTTPException (404 , detail = f "Question not found" )
251
+ raise HTTPException (404 , detail = "Question not found" )
237
252
return result
238
253
254
+
239
255
@kb_app .delete ("/v1/experiences" )
240
- def delete_experience (req : ExperienceIn ):
256
+ def delete_experience (req : ExperienceIn ):
241
257
kb = ctx .knowledgemgr .get_experience_kb ()
242
258
success = kb .delete_experience (req .question )
243
259
if not success :
244
260
raise HTTPException (404 , detail = f"Question { req .question } not found" )
245
- return {"message" : f"Question deleted" }
261
+ return {"message" : "Question deleted" }
262
+
246
263
247
264
@kb_app .post ("/v1/multiple_experiences/check" )
248
265
def check_duplicate_multiple_experiences (experiences : List [Dict [str , Union [str , List [str ]]]]):
249
266
kb = ctx .knowledgemgr .get_experience_kb ()
250
267
if not kb :
251
- raise HTTPException (404 , detail = f "No active experience type knowledge base" )
268
+ raise HTTPException (404 , detail = "No active experience type knowledge base" )
252
269
all_existing = kb .get_all_experience ()
253
270
existing_questions = {item ["question" ] for item in all_existing }
254
271
new_questions = [exp ["question" ] for exp in experiences if "question" in exp ]
255
272
duplicate_questions = [q for q in new_questions if q in existing_questions ]
256
273
if duplicate_questions :
257
274
return {"code" : 2001 , "detail" : "Duplicate experiences are appended OR overwritten!" }
258
275
else :
259
- kb .add_multiple_experiences (experiences = experiences , flag = True )
260
- return {"status" : "success" ,"detail" : "No duplicate experiences, added successfully" }
276
+ kb .add_multiple_experiences (experiences = experiences , flag = True )
277
+ return {"status" : "success" , "detail" : "No duplicate experiences, added successfully" }
278
+
261
279
262
280
@kb_app .post ("/v1/multiple_experiences/confirm" )
263
- def confirm_multiple_experiences (experiences : List [Dict [str , Union [str , List [str ]]]],flag : bool ):
281
+ def confirm_multiple_experiences (experiences : List [Dict [str , Union [str , List [str ]]]], flag : bool ):
264
282
kb = ctx .knowledgemgr .get_experience_kb ()
265
283
try :
266
284
if not kb :
267
- raise HTTPException (404 , detail = f "No active experience type knowledge base" )
285
+ raise HTTPException (404 , detail = "No active experience type knowledge base" )
268
286
kb .add_multiple_experiences (experiences = experiences , flag = flag )
269
287
return {"status" : "success" , "detail" : "Experiences added successfully" }
270
288
except Exception as e :
271
289
raise HTTPException (status_code = 500 , detail = f"Add Failure:{ str (e )} " )
272
290
291
+
273
292
@kb_app .post ("/v1/experiences/files" )
274
293
def add_experiences_from_file (req : DataIn ):
275
294
kb = ctx .knowledgemgr .get_experience_kb ()
@@ -279,6 +298,7 @@ def add_experiences_from_file(req: DataIn):
279
298
except Exception as e :
280
299
raise HTTPException (status_code = 400 , detail = str (e ))
281
300
301
+
282
302
# Update knowledge base data
283
303
async def update_knowledge_base_handler (file_path = None , knowledge_name : str = "default_kb" , add_file : bool = False ):
284
304
if ctx .get_pipeline_mgr ().get_active_pipeline () is None :
@@ -334,7 +354,7 @@ async def load_knowledge_from_file():
334
354
for Knowledgebase_data in all_data :
335
355
pipeline_req = KnowledgeBaseCreateIn (** Knowledgebase_data )
336
356
kb = ctx .knowledgemgr .create_knowledge_base (pipeline_req )
337
- if kb .comp_type == "knowledge" :
357
+ if kb .comp_type == "knowledge" :
338
358
if Knowledgebase_data ["file_map" ]:
339
359
if active_pl .indexer .comp_subtype != "milvus_vector" and Knowledgebase_data ["active" ]:
340
360
for file_path in Knowledgebase_data ["file_map" ].values ():
@@ -364,7 +384,14 @@ async def save_knowledge_to_file():
364
384
kb_base = ctx .knowledgemgr .get_all_knowledge_bases ()
365
385
knowledgebases_data = []
366
386
for kb in kb_base :
367
- kb_json = {"name" : kb .name , "description" : kb .description , "active" : kb .active , "file_map" : kb .file_map , "comp_type" : kb .comp_type , "experience_active" : kb .experience_active }
387
+ kb_json = {
388
+ "name" : kb .name ,
389
+ "description" : kb .description ,
390
+ "active" : kb .active ,
391
+ "file_map" : kb .file_map ,
392
+ "comp_type" : kb .comp_type ,
393
+ "experience_active" : kb .experience_active ,
394
+ }
368
395
knowledgebases_data .append (kb_json )
369
396
json_str = json .dumps (knowledgebases_data , indent = 2 , ensure_ascii = False )
370
397
with open (KNOWLEDGEBASE_FILE , "w" , encoding = "utf-8" ) as f :
@@ -375,15 +402,18 @@ async def save_knowledge_to_file():
375
402
376
403
all_pipeline_milvus_maps = {}
377
404
current_pipeline_kb_map = {}
405
+
406
+
378
407
async def refresh_milvus_map (milvus_name ):
379
408
current_pipeline_kb_map .clear ()
380
409
knowledge_bases_list = await get_all_knowledge_bases ()
381
410
for kb in knowledge_bases_list :
382
411
if kb .comp_type == "experience" :
383
- continue
412
+ continue
384
413
current_pipeline_kb_map [kb .name ] = kb .file_map
385
414
all_pipeline_milvus_maps [milvus_name ] = copy .deepcopy (current_pipeline_kb_map )
386
415
416
+
387
417
async def Synchronizing_vector_data (old_active_pl , new_active_pl ):
388
418
try :
389
419
active_kb = ctx .knowledgemgr .get_active_knowledge_base ()
0 commit comments