knowledge.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. from django.utils.translation import gettext_lazy as _
  2. from drf_spectacular.utils import extend_schema
  3. from rest_framework.parsers import MultiPartParser
  4. from rest_framework.request import Request
  5. from rest_framework.views import APIView
  6. from common.auth import TokenAuth
  7. from common.auth.authentication import has_permissions, check_batch_permissions, get_is_permissions
  8. from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
  9. from common.log.log import log
  10. from common import result
  11. from knowledge.api.knowledge import KnowledgeBaseCreateAPI, KnowledgeWebCreateAPI, KnowledgeTreeReadAPI, \
  12. KnowledgeEditAPI, KnowledgeReadAPI, KnowledgePageAPI, SyncWebAPI, GenerateRelatedAPI, HitTestAPI, EmbeddingAPI, \
  13. GetModelAPI, KnowledgeExportAPI, KnowledgeBatchOperateAPI, KnowledgeImportAPI
  14. from knowledge.models import KnowledgeScope
  15. from knowledge.serializers.common import get_knowledge_operation_object
  16. from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeBatchOperateSerializer
  17. from models_provider.serializers.model_serializer import ModelSerializer
  18. from tools.api.tool import GetInternalToolAPI
  19. from django.db.models import QuerySet
  20. from knowledge.models import Knowledge
  21. def get_knowledge_operation_object_batch(knowledge_id_list):
  22. knowledge_model_list = QuerySet(model=Knowledge).filter(id__in=knowledge_id_list)
  23. if knowledge_model_list is not None:
  24. return {
  25. "name": f'[{",".join([app.name for app in knowledge_model_list])}]',
  26. 'knowledge_list': [{'name': app.name} for app in knowledge_model_list]
  27. }
  28. return {}
  29. class KnowledgeView(APIView):
  30. authentication_classes = [TokenAuth]
  31. @extend_schema(
  32. methods=['GET'],
  33. description=_('Get knowledge by folder'),
  34. summary=_('Get knowledge by folder'),
  35. operation_id=_('Get knowledge by folder'), # type: ignore
  36. parameters=KnowledgeTreeReadAPI.get_parameters(),
  37. responses=KnowledgeTreeReadAPI.get_response(),
  38. tags=[_('Knowledge Base')] # type: ignore
  39. )
  40. @has_permissions(
  41. PermissionConstants.KNOWLEDGE_READ.get_workspace_permission(),
  42. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  43. )
  44. def get(self, request: Request, workspace_id: str):
  45. return result.success(KnowledgeSerializer.Query(
  46. data={
  47. 'workspace_id': workspace_id,
  48. 'folder_id': request.query_params.get('folder_id'),
  49. 'name': request.query_params.get('name'),
  50. 'desc': request.query_params.get("desc"),
  51. 'scope': KnowledgeScope.WORKSPACE,
  52. 'user_id': request.user.id
  53. }
  54. ).list())
  55. class Operate(APIView):
  56. authentication_classes = [TokenAuth]
  57. @extend_schema(
  58. methods=['PUT'],
  59. description=_('Edit knowledge'),
  60. summary=_('Edit knowledge'),
  61. operation_id=_('Edit knowledge'), # type: ignore
  62. parameters=KnowledgeEditAPI.get_parameters(),
  63. request=KnowledgeEditAPI.get_request(),
  64. responses=KnowledgeEditAPI.get_response(),
  65. tags=[_('Knowledge Base')] # type: ignore
  66. )
  67. @has_permissions(
  68. PermissionConstants.KNOWLEDGE_EDIT.get_workspace_knowledge_permission(),
  69. PermissionConstants.KNOWLEDGE_EDIT.get_workspace_permission_workspace_manage_role(),
  70. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  71. ViewPermission([RoleConstants.USER.get_workspace_role()],
  72. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  73. )
  74. @log(
  75. menu='Knowledge Base', operate="Modify knowledge base information",
  76. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  77. )
  78. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  79. return result.success(KnowledgeSerializer.Operate(
  80. data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  81. ).edit(request.data))
  82. @extend_schema(
  83. methods=['DELETE'],
  84. description=_('Delete knowledge'),
  85. summary=_('Delete knowledge'),
  86. operation_id=_('Delete knowledge'), # type: ignore
  87. parameters=KnowledgeBaseCreateAPI.get_parameters(),
  88. request=KnowledgeBaseCreateAPI.get_request(),
  89. responses=KnowledgeBaseCreateAPI.get_response(),
  90. tags=[_('Knowledge Base')] # type: ignore
  91. )
  92. @has_permissions(
  93. PermissionConstants.KNOWLEDGE_DELETE.get_workspace_knowledge_permission(),
  94. PermissionConstants.KNOWLEDGE_DELETE.get_workspace_permission_workspace_manage_role(),
  95. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  96. ViewPermission([RoleConstants.USER.get_workspace_role()],
  97. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  98. )
  99. @log(
  100. menu='Knowledge Base', operate="Delete knowledge base",
  101. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  102. )
  103. def delete(self, request: Request, workspace_id: str, knowledge_id: str):
  104. return result.success(KnowledgeSerializer.Operate(
  105. data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  106. ).delete())
  107. @extend_schema(
  108. methods=['GET'],
  109. description=_('Get knowledge'),
  110. summary=_('Get knowledge'),
  111. operation_id=_('Get knowledge'), # type: ignore
  112. parameters=KnowledgeReadAPI.get_parameters(),
  113. responses=KnowledgeReadAPI.get_response(),
  114. tags=[_('Knowledge Base')] # type: ignore
  115. )
  116. @has_permissions(
  117. PermissionConstants.KNOWLEDGE_READ.get_workspace_knowledge_permission(),
  118. PermissionConstants.KNOWLEDGE_READ.get_workspace_permission_workspace_manage_role(),
  119. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  120. ViewPermission([RoleConstants.USER.get_workspace_role()],
  121. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  122. )
  123. def get(self, request: Request, workspace_id: str, knowledge_id: str):
  124. return result.success(KnowledgeSerializer.Operate(
  125. data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  126. ).one())
  127. class BatchDelete(APIView):
  128. authentication_classes = [TokenAuth]
  129. @extend_schema(
  130. methods=['PUT'],
  131. description=_("Batch delete knowledge"),
  132. summary=_("Batch delete knowledge"),
  133. operation_id=_("Batch delete knowledge"),
  134. parameters=KnowledgeBatchOperateAPI.get_parameters(),
  135. request=KnowledgeBatchOperateAPI.get_request(),
  136. responses=result.DefaultResultSerializer,
  137. tags=[_('Knowledge Base')]
  138. )
  139. @has_permissions(PermissionConstants.KNOWLEDGE_BATCH_DELETE.get_workspace_permission(),
  140. RoleConstants.USER.get_workspace_role(),
  141. RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
  142. )
  143. def put(self, request: Request, workspace_id: str):
  144. id_list = request.data.get('id_list', [])
  145. permitted_ids = check_batch_permissions(
  146. request, id_list, 'knowledge_id',
  147. (PermissionConstants.KNOWLEDGE_DELETE.get_workspace_knowledge_permission(),
  148. PermissionConstants.KNOWLEDGE_DELETE.get_workspace_permission_workspace_manage_role(),
  149. ViewPermission([RoleConstants.USER.get_workspace_role()],
  150. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
  151. CompareConstants.AND),
  152. RoleConstants.WORKSPACE_MANAGE.get_workspace_role()), workspace_id=workspace_id
  153. )
  154. @log(menu='Knowledge Base', operate='Batch delete knowledge',
  155. get_operation_object=lambda r, k: get_knowledge_operation_object_batch(permitted_ids))
  156. def inner(view, r, **kwargs):
  157. return KnowledgeBatchOperateSerializer(
  158. data={'workspace_id': workspace_id, 'user_id': request.user.id}
  159. ).batch_delete({'id_list': permitted_ids})
  160. return result.success(inner(self, request, workspace_id=workspace_id))
  161. class BatchMove(APIView):
  162. authentication_classes = [TokenAuth]
  163. @extend_schema(
  164. methods=['PUT'],
  165. description=_("Batch move knowledge"),
  166. summary=_("Batch move knowledge"),
  167. operation_id=_("Batch move knowledge"),
  168. parameters=KnowledgeBatchOperateAPI.get_parameters(),
  169. request=KnowledgeBatchOperateAPI.get_move_request(),
  170. responses=result.DefaultResultSerializer,
  171. tags=[_('Knowledge Base')]
  172. )
  173. @has_permissions(PermissionConstants.KNOWLEDGE_BATCH_MOVE.get_workspace_permission(),
  174. RoleConstants.USER.get_workspace_role(),
  175. RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
  176. )
  177. def put(self, request: Request, workspace_id: str):
  178. id_list = request.data.get('id_list', [])
  179. permitted_ids = check_batch_permissions(
  180. request, id_list, 'knowledge_id',
  181. (PermissionConstants.KNOWLEDGE_EDIT.get_workspace_knowledge_permission(),
  182. PermissionConstants.KNOWLEDGE_EDIT.get_workspace_permission_workspace_manage_role(),
  183. ViewPermission([RoleConstants.USER.get_workspace_role()],
  184. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
  185. CompareConstants.AND),
  186. RoleConstants.WORKSPACE_MANAGE.get_workspace_role()),
  187. workspace_id=workspace_id
  188. )
  189. @log(menu='Knowledge Base', operate='Batch move knowledge',
  190. get_operation_object=lambda r, k: get_knowledge_operation_object_batch(permitted_ids))
  191. def inner(view, r, **kwargs):
  192. return KnowledgeBatchOperateSerializer(
  193. data={'workspace_id': workspace_id, 'user_id': request.user.id}
  194. ).batch_move({'id_list': permitted_ids, 'folder_id': request.data.get('folder_id')})
  195. return result.success(inner(self, request, workspace_id=workspace_id))
  196. class Page(APIView):
  197. authentication_classes = [TokenAuth]
  198. @extend_schema(
  199. methods=['GET'],
  200. description=_('Get the knowledge base paginated list'),
  201. summary=_('Get the knowledge base paginated list'),
  202. operation_id=_('Get the knowledge base paginated list'), # type: ignore
  203. parameters=KnowledgePageAPI.get_parameters(),
  204. responses=KnowledgePageAPI.get_response(),
  205. tags=[_('Knowledge Base')] # type: ignore
  206. )
  207. @has_permissions(
  208. PermissionConstants.KNOWLEDGE_READ.get_workspace_permission(),
  209. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  210. )
  211. def get(self, request: Request, workspace_id: str, current_page: int, page_size: int):
  212. return result.success(KnowledgeSerializer.Query(
  213. data={
  214. 'workspace_id': workspace_id,
  215. 'folder_id': request.query_params.get('folder_id'),
  216. 'name': request.query_params.get('name'),
  217. 'desc': request.query_params.get("desc"),
  218. 'scope': KnowledgeScope.WORKSPACE,
  219. 'user_id': request.user.id,
  220. 'create_user': request.query_params.get('create_user'),
  221. }
  222. ).page(current_page, page_size))
  223. class SyncWeb(APIView):
  224. authentication_classes = [TokenAuth]
  225. @extend_schema(
  226. methods=['PUT'],
  227. summary=_("Synchronize the knowledge base of the website"),
  228. description=_("Synchronize the knowledge base of the website"),
  229. operation_id=_("Synchronize the knowledge base of the website"), # type: ignore
  230. parameters=SyncWebAPI.get_parameters(),
  231. request=SyncWebAPI.get_request(),
  232. responses=SyncWebAPI.get_response(),
  233. tags=[_('Knowledge Base')] # type: ignore
  234. )
  235. @has_permissions(
  236. PermissionConstants.KNOWLEDGE_SYNC.get_workspace_knowledge_permission(),
  237. PermissionConstants.KNOWLEDGE_SYNC.get_workspace_permission_workspace_manage_role(),
  238. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  239. ViewPermission([RoleConstants.USER.get_workspace_role()],
  240. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  241. )
  242. @log(
  243. menu='Knowledge Base', operate="Synchronize the knowledge base of the website",
  244. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  245. )
  246. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  247. return result.success(KnowledgeSerializer.SyncWeb(
  248. data={
  249. 'workspace_id': workspace_id,
  250. 'sync_type': request.query_params.get('sync_type'),
  251. 'knowledge_id': knowledge_id,
  252. 'user_id': str(request.user.id)
  253. }
  254. ).sync())
  255. class HitTest(APIView):
  256. authentication_classes = [TokenAuth]
  257. @extend_schema(
  258. methods=['POST'],
  259. summary=_('Hit test list'),
  260. description=_('Hit test list'),
  261. operation_id=_('Hit test list'), # type: ignore
  262. parameters=HitTestAPI.get_parameters(),
  263. request=HitTestAPI.get_request(),
  264. responses=HitTestAPI.get_response(),
  265. tags=[_('Knowledge Base')] # type: ignore
  266. )
  267. @has_permissions(
  268. PermissionConstants.KNOWLEDGE_HIT_TEST.get_workspace_knowledge_permission(),
  269. PermissionConstants.KNOWLEDGE_HIT_TEST.get_workspace_permission_workspace_manage_role(),
  270. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  271. ViewPermission([RoleConstants.USER.get_workspace_role()],
  272. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  273. )
  274. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  275. return result.success(KnowledgeSerializer.HitTest(
  276. data={
  277. 'workspace_id': workspace_id,
  278. 'knowledge_id': knowledge_id,
  279. 'user_id': request.user.id,
  280. "query_text": request.data.get("query_text"),
  281. "top_number": request.data.get("top_number"),
  282. 'similarity': request.data.get('similarity'),
  283. 'search_mode': request.data.get('search_mode')
  284. }
  285. ).hit_test())
  286. class StoreKnowledge(APIView):
  287. authentication_classes = [TokenAuth]
  288. @extend_schema(
  289. methods=['GET'],
  290. description=_("Get Appstore tools"),
  291. summary=_("Get Appstore tools"),
  292. operation_id=_("Get Appstore tools"), # type: ignore
  293. responses=GetInternalToolAPI.get_response(),
  294. tags=[_("Tool")] # type: ignore
  295. )
  296. def get(self, request: Request):
  297. return result.success(KnowledgeSerializer.StoreKnowledge(data={
  298. 'user_id': request.user.id,
  299. 'name': request.query_params.get('name', ''),
  300. }).get_appstore_templates())
  301. class Embedding(APIView):
  302. authentication_classes = [TokenAuth]
  303. @extend_schema(
  304. methods=['PUT'],
  305. summary=_('Re-vectorize'),
  306. description=_('Re-vectorize'),
  307. operation_id=_('Re-vectorize'), # type: ignore
  308. parameters=EmbeddingAPI.get_parameters(),
  309. request=EmbeddingAPI.get_request(),
  310. responses=EmbeddingAPI.get_response(),
  311. tags=[_('Knowledge Base')] # type: ignore
  312. )
  313. @has_permissions(
  314. PermissionConstants.KNOWLEDGE_VECTOR.get_workspace_knowledge_permission(),
  315. PermissionConstants.KNOWLEDGE_VECTOR.get_workspace_permission_workspace_manage_role(),
  316. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  317. ViewPermission([RoleConstants.USER.get_workspace_role()],
  318. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  319. )
  320. @log(
  321. menu='Knowledge Base', operate='Re-vectorize',
  322. get_operation_object=lambda r, k: get_knowledge_operation_object(k.get('knowledge_id')),
  323. )
  324. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  325. return result.success(KnowledgeSerializer.Operate(
  326. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
  327. ).embedding())
  328. class Export(APIView):
  329. authentication_classes = [TokenAuth]
  330. @extend_schema(
  331. summary=_('Export knowledge base'),
  332. operation_id=_('Export knowledge base'), # type: ignore
  333. parameters=KnowledgeExportAPI.get_parameters(),
  334. responses=KnowledgeExportAPI.get_response(),
  335. tags=[_('Knowledge Base')] # type: ignore
  336. )
  337. @has_permissions(
  338. PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission(),
  339. PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_permission_workspace_manage_role(),
  340. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  341. ViewPermission([RoleConstants.USER.get_workspace_role()],
  342. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  343. )
  344. @log(
  345. menu='Knowledge Base', operate="Export knowledge base",
  346. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  347. )
  348. def get(self, request: Request, workspace_id: str, knowledge_id: str):
  349. return KnowledgeSerializer.Operate(data={
  350. 'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id
  351. }).export_excel()
  352. class ExportZip(APIView):
  353. authentication_classes = [TokenAuth]
  354. @extend_schema(
  355. summary=_('Export knowledge base containing images'),
  356. operation_id=_('Export knowledge base containing images'), # type: ignore
  357. parameters=KnowledgeExportAPI.get_parameters(),
  358. responses=KnowledgeExportAPI.get_response(),
  359. tags=[_('Knowledge Base')] # type: ignore
  360. )
  361. @has_permissions(
  362. PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission(),
  363. PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_permission_workspace_manage_role(),
  364. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  365. ViewPermission([RoleConstants.USER.get_workspace_role()],
  366. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  367. )
  368. @log(
  369. menu='Knowledge Base', operate="Export knowledge base containing images",
  370. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  371. )
  372. def get(self, request: Request, workspace_id: str, knowledge_id: str):
  373. return KnowledgeSerializer.Operate(data={
  374. 'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id
  375. }).export_zip()
  376. class ExportKnowledge(APIView):
  377. authentication_classes = [TokenAuth]
  378. @extend_schema(
  379. summary=_('Export knowledge bundle'),
  380. operation_id=_('Export knowledge bundle'), # type: ignore
  381. parameters=KnowledgeExportAPI.get_parameters(),
  382. responses=KnowledgeExportAPI.get_response(),
  383. tags=[_('Knowledge Base')] # type: ignore
  384. )
  385. @has_permissions(
  386. PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission(),
  387. PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_permission_workspace_manage_role(),
  388. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  389. ViewPermission([RoleConstants.USER.get_workspace_role()],
  390. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  391. )
  392. @log(
  393. menu='Knowledge Base', operate="Export knowledge bundle",
  394. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  395. )
  396. def get(self, request: Request, workspace_id: str, knowledge_id: str):
  397. return KnowledgeSerializer.Operate(data={
  398. 'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id
  399. }).export_knowledge()
  400. class ImportKnowledge(APIView):
  401. authentication_classes = [TokenAuth]
  402. parser_classes = [MultiPartParser]
  403. @extend_schema(
  404. methods=['POST'],
  405. description=_('Import knowledge bundle'),
  406. summary=_('Import knowledge bundle'),
  407. operation_id=_('Import knowledge bundle'),
  408. parameters=KnowledgeImportAPI.get_parameters(),
  409. request=KnowledgeImportAPI.get_request(),
  410. responses=KnowledgeImportAPI.get_response(),
  411. tags=[_('Knowledge Base')]
  412. )
  413. @has_permissions(
  414. PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission(),
  415. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  416. RoleConstants.USER.get_workspace_role()
  417. )
  418. @log(
  419. menu='Knowledge Base', operate="Import knowledge bundle",
  420. )
  421. def post(self, request: Request, workspace_id: str):
  422. is_import_tool = get_is_permissions(request, workspace_id=workspace_id)(
  423. PermissionConstants.TOOL_IMPORT.get_workspace_permission(),
  424. PermissionConstants.TOOL_IMPORT.get_workspace_permission_workspace_manage_role(),
  425. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  426. )
  427. return result.success(
  428. KnowledgeSerializer.ImportKnowledge(
  429. data={'workspace_id': workspace_id, 'user_id': request.user.id, 'folder_id': request.data.get('folder_id',workspace_id)}
  430. ).import_knowledge(request.FILES.get('file'), is_import_tool)
  431. )
  432. class GenerateRelated(APIView):
  433. authentication_classes = [TokenAuth]
  434. @extend_schema(
  435. methods=['PUT'],
  436. summary=_('Generate related'),
  437. description=_('Generate related'),
  438. operation_id=_('Generate related'), # type: ignore
  439. parameters=GenerateRelatedAPI.get_parameters(),
  440. request=GenerateRelatedAPI.get_request(),
  441. responses=GenerateRelatedAPI.get_response(),
  442. tags=[_('Knowledge Base')] # type: ignore
  443. )
  444. @has_permissions(
  445. PermissionConstants.KNOWLEDGE_GENERATE.get_workspace_knowledge_permission(),
  446. PermissionConstants.KNOWLEDGE_GENERATE.get_workspace_permission_workspace_manage_role(),
  447. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  448. ViewPermission([RoleConstants.USER.get_workspace_role()],
  449. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  450. )
  451. @log(
  452. menu='document', operate='Generate related documents',
  453. get_operation_object=lambda r, k: get_knowledge_operation_object(k.get('knowledge_id')),
  454. )
  455. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  456. return result.success(KnowledgeSerializer.Operate(
  457. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
  458. ).generate_related(request.data))
  459. class Model(APIView):
  460. authentication_classes = [TokenAuth]
  461. @extend_schema(
  462. methods=['GET'],
  463. summary=_('Get model for knowledge base'),
  464. description=_('Get model for knowledge base'),
  465. operation_id=_('Get model for knowledge base'), # type: ignore
  466. parameters=GetModelAPI.get_parameters(),
  467. responses=GetModelAPI.get_response(),
  468. tags=[_('Knowledge Base')] # type: ignore
  469. )
  470. @has_permissions(
  471. PermissionConstants.KNOWLEDGE_EDIT.get_workspace_permission(),
  472. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  473. )
  474. def get(self, request: Request, workspace_id: str):
  475. return result.success(ModelSerializer.Query(
  476. data={
  477. 'workspace_id': workspace_id,
  478. 'model_type': 'LLM'
  479. }
  480. ).list(workspace_id, True))
  481. class EmbeddingModel(APIView):
  482. authentication_classes = [TokenAuth]
  483. @has_permissions(
  484. PermissionConstants.KNOWLEDGE_EDIT.get_workspace_permission(),
  485. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  486. )
  487. def get(self, request: Request, workspace_id: str):
  488. return result.success(ModelSerializer.Query(
  489. data={
  490. 'workspace_id': workspace_id,
  491. 'model_type': 'EMBEDDING'
  492. }
  493. ).list(workspace_id, True))
  494. class TransformWorkflow(APIView):
  495. authentication_classes = [TokenAuth]
  496. @has_permissions(
  497. PermissionConstants.KNOWLEDGE_EDIT.get_workspace_knowledge_permission(),
  498. PermissionConstants.KNOWLEDGE_EDIT.get_workspace_permission_workspace_manage_role(),
  499. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  500. ViewPermission([RoleConstants.USER.get_workspace_role()],
  501. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  502. )
  503. @log(
  504. menu='Knowledge Base', operate="Modify knowledge base information",
  505. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  506. )
  507. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  508. return result.success(KnowledgeSerializer.TransformWorkflow(
  509. data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  510. ).transform(request.data))
  511. class Tags(APIView):
  512. authentication_classes = [TokenAuth]
  513. @extend_schema(
  514. methods=['GET'],
  515. description=_('Get all tags of knowledge base'),
  516. summary=_('Get all tags of knowledge base'),
  517. operation_id=_('Get all tags of knowledge base'), # type: ignore
  518. parameters=KnowledgeReadAPI.get_parameters(),
  519. responses=KnowledgeReadAPI.get_response(),
  520. tags=[_('Knowledge Base')] # type: ignore
  521. )
  522. @has_permissions(
  523. PermissionConstants.KNOWLEDGE_READ.get_workspace_permission(),
  524. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  525. )
  526. def get(self, request: Request, workspace_id: str):
  527. return result.success(KnowledgeSerializer.Tags(data={
  528. 'user_id': request.user.id,
  529. 'workspace_id': workspace_id,
  530. 'knowledge_ids': request.query_params.getlist('knowledge_ids[]')
  531. }).list())
  532. class KnowledgeBaseView(APIView):
  533. authentication_classes = [TokenAuth]
  534. @extend_schema(
  535. methods=['POST'],
  536. description=_('Create base knowledge'),
  537. summary=_('Create base knowledge'),
  538. operation_id=_('Create base knowledge'), # type: ignore
  539. parameters=KnowledgeBaseCreateAPI.get_parameters(),
  540. request=KnowledgeBaseCreateAPI.get_request(),
  541. responses=KnowledgeBaseCreateAPI.get_response(),
  542. tags=[_('Knowledge Base')] # type: ignore
  543. )
  544. @has_permissions(
  545. PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission(),
  546. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  547. )
  548. @log(
  549. menu='knowledge Base', operate='Create base knowledge',
  550. get_operation_object=lambda r, k: {'name': r.data.get('name'), 'desc': r.data.get('desc')},
  551. )
  552. def post(self, request: Request, workspace_id: str):
  553. return result.success(KnowledgeSerializer.Create(
  554. data={'user_id': request.user.id, 'workspace_id': workspace_id}
  555. ).save_base(request.data))
  556. class KnowledgeWebView(APIView):
  557. authentication_classes = [TokenAuth]
  558. @extend_schema(
  559. methods=['POST'],
  560. description=_('Create web knowledge'),
  561. summary=_('Create web knowledge'),
  562. operation_id=_('Create web knowledge'), # type: ignore
  563. parameters=KnowledgeWebCreateAPI.get_parameters(),
  564. request=KnowledgeWebCreateAPI.get_request(),
  565. responses=KnowledgeWebCreateAPI.get_response(),
  566. tags=[_('Knowledge Base')] # type: ignore
  567. )
  568. @has_permissions(
  569. PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission(),
  570. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
  571. )
  572. @log(
  573. menu='Knowledge Base', operate="Create a web site knowledge base",
  574. get_operation_object=lambda r, k: {'name': r.data.get('name'), 'desc': r.data.get('desc'),
  575. 'first_list': r.FILES.getlist('file'),
  576. 'meta': {'source_url': r.data.get('source_url'),
  577. 'selector': r.data.get('selector'),
  578. 'embedding_model_id': r.data.get('embedding_model_id')}}
  579. ,
  580. )
  581. def post(self, request: Request, workspace_id: str):
  582. return result.success(KnowledgeSerializer.Create(
  583. data={'user_id': request.user.id, 'workspace_id': workspace_id}
  584. ).save_web(request.data))