|
1 | 1 | import json |
2 | 2 | import math |
3 | 3 | import os |
| 4 | +import time |
4 | 5 | from datetime import datetime |
5 | 6 | from typing import Any, Dict, List, Tuple |
6 | 7 | from urllib.parse import urlparse |
|
57 | 58 | ) |
58 | 59 | from bisheng.knowledge.domain.repositories.interfaces.knowledge_file_repository import KnowledgeFileRepository |
59 | 60 | from bisheng.knowledge.domain.repositories.interfaces.knowledge_repository import KnowledgeRepository |
| 61 | +from bisheng.knowledge.domain.schemas.knowledge_rag_schema import Metadata |
60 | 62 | from bisheng.knowledge.domain.schemas.knowledge_schema import AddKnowledgeMetadataFieldsReq, \ |
61 | 63 | UpdateKnowledgeMetadataFieldsReq |
62 | 64 | from bisheng.knowledge.domain.services.knowledge_audit_telemetry_service import KnowledgeAuditTelemetryService |
@@ -247,6 +249,25 @@ def create_knowledge_base(cls, request, login_user: UserPayload, db_knowledge: K |
247 | 249 | vector_client = KnowledgeRag.init_knowledge_milvus_vectorstore_sync(login_user.user_id, |
248 | 250 | knowledge=db_knowledge, |
249 | 251 | metadata_schemas=KNOWLEDGE_RAG_METADATA_SCHEMA) |
| 252 | + # Init Milvus schema avoiding SchemaNotReady concurrently |
| 253 | + # Need to provide non-nullable fields to satisfy Milvus schema constraints |
| 254 | + init_ids = vector_client.add_texts( |
| 255 | + texts=["init_schema"], |
| 256 | + metadatas=[Metadata(document_id=0, |
| 257 | + knowledge_id=db_knowledge.id, |
| 258 | + abstract="", |
| 259 | + chunk_index=1, |
| 260 | + bbox="", |
| 261 | + page=0, |
| 262 | + upload_time=int(time.time()), |
| 263 | + update_time=int(time.time()), |
| 264 | + uploader="", |
| 265 | + updater="", |
| 266 | + user_metadata={}).model_dump()] |
| 267 | + ) |
| 268 | + if init_ids: |
| 269 | + vector_client.delete(ids=init_ids) |
| 270 | + |
250 | 271 | es_client = KnowledgeRag.init_knowledge_es_vectorstore_sync(knowledge=db_knowledge, |
251 | 272 | metadata_schemas=KNOWLEDGE_RAG_METADATA_SCHEMA) |
252 | 273 | es_client._store._create_index_if_not_exists() |
@@ -1260,21 +1281,20 @@ async def copy_knowledge( |
1260 | 1281 | knowldge_dict.pop("id") |
1261 | 1282 | knowldge_dict.pop("create_time") |
1262 | 1283 | knowldge_dict.pop("update_time", None) |
1263 | | - knowldge_dict["user_id"] = login_user.user_id |
1264 | | - knowldge_dict["index_name"] = generate_knowledge_index_name() |
1265 | | - knowldge_dict["collection_name"] = knowldge_dict["index_name"] |
| 1284 | + knowldge_dict.pop("collection_name", None) |
| 1285 | + knowldge_dict.pop("index_name", None) |
1266 | 1286 | knowldge_dict["name"] = f"{knowledge.name} Copy"[:200] if not knowledge_name else knowledge_name[:200] |
1267 | 1287 |
|
1268 | 1288 | knowldge_dict["state"] = KnowledgeState.UNPUBLISHED.value |
1269 | 1289 | knowledge_new = Knowledge(**knowldge_dict) |
1270 | | - target_knowlege = await KnowledgeDao.async_insert_one(knowledge_new) |
1271 | | - # celery not yetok |
| 1290 | + |
| 1291 | + target_knowlege = cls.create_knowledge_base(request, login_user, knowledge_new) |
| 1292 | + |
1272 | 1293 | params = { |
1273 | 1294 | "source_knowledge_id": knowledge.id, |
1274 | 1295 | "target_id": target_knowlege.id, |
1275 | 1296 | "login_user_id": login_user.user_id, |
1276 | 1297 | } |
1277 | | - cls.create_knowledge_hook(request, login_user, target_knowlege) |
1278 | 1298 | file_worker.file_copy_celery.delay(params) |
1279 | 1299 | return target_knowlege |
1280 | 1300 |
|
|
0 commit comments