sharedkernel 1.0.0__tar.gz → 1.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/PKG-INFO +3 -1
  2. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/setup.py +3 -3
  3. sharedkernel-1.1.1/sharedkernel/database/__init__.py +2 -0
  4. sharedkernel-1.1.1/sharedkernel/database/mongo_generic_repository.py +50 -0
  5. sharedkernel-1.1.1/sharedkernel/database/vector_database_repository/__init__.py +3 -0
  6. sharedkernel-1.1.1/sharedkernel/database/vector_database_repository/chroma_startegy.py +39 -0
  7. sharedkernel-1.1.1/sharedkernel/database/vector_database_repository/milvus_strategy.py +50 -0
  8. sharedkernel-1.1.1/sharedkernel/database/vector_database_repository/vector_database_repository.py +28 -0
  9. sharedkernel-1.1.1/sharedkernel/database/vector_database_repository/vector_database_strategy.py +22 -0
  10. sharedkernel-1.1.1/sharedkernel/enum/__init__.py +2 -0
  11. sharedkernel-1.1.1/sharedkernel/enum/vector_database_type.py +5 -0
  12. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel.egg-info/PKG-INFO +3 -1
  13. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel.egg-info/SOURCES.txt +10 -4
  14. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel.egg-info/requires.txt +2 -0
  15. sharedkernel-1.0.0/sharedkernel/database/adapter.py +0 -6
  16. sharedkernel-1.0.0/sharedkernel/database/repository_base.py +0 -82
  17. sharedkernel-1.0.0/test/test.py +0 -12
  18. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/README.md +0 -0
  19. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/setup.cfg +0 -0
  20. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/common.py +0 -0
  21. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/config.py +0 -0
  22. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/enum/error_code.py +0 -0
  23. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/exception/__init__.py +0 -0
  24. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/exception/exception.py +0 -0
  25. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/exception/exception_handlers.py +0 -0
  26. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/jwt_service.py +0 -0
  27. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/objects/__init__.py +0 -0
  28. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/objects/base_document.py +0 -0
  29. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/objects/jwt_model.py +0 -0
  30. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/objects/result.py +0 -0
  31. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel/string_extentions.py +0 -0
  32. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel.egg-info/dependency_links.txt +0 -0
  33. {sharedkernel-1.0.0 → sharedkernel-1.1.1}/sharedkernel.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sharedkernel
3
- Version: 1.0.0
3
+ Version: 1.1.1
4
4
  Summary: sharekernel is an shared package between all python projects
5
5
  Author: Smilinno
6
6
  Requires-Dist: numpy
@@ -8,3 +8,5 @@ Requires-Dist: requests
8
8
  Requires-Dist: pymongo
9
9
  Requires-Dist: fastapi==0.89.1
10
10
  Requires-Dist: PyJWT
11
+ Requires-Dist: pymilvus
12
+ Requires-Dist: chromadb
@@ -4,10 +4,10 @@ setup(
4
4
  # Needed to silence warnings (and to be a worthwhile package)
5
5
  name='sharedkernel',
6
6
  author='Smilinno',
7
- packages=['sharedkernel','sharedkernel.database','sharedkernel.enum','sharedkernel.exception','sharedkernel.objects'],
7
+ packages=['sharedkernel','sharedkernel.database','sharedkernel.database.vector_database_repository','sharedkernel.enum','sharedkernel.exception','sharedkernel.objects'],
8
8
  # Needed for dependencies
9
- install_requires=['numpy','requests','pymongo','fastapi==0.89.1','PyJWT'],
9
+ install_requires=['numpy','requests','pymongo','fastapi==0.89.1','PyJWT','pymilvus','chromadb'],
10
10
  # *strongly* suggested for sharing
11
- version='1.0.0',
11
+ version='1.1.1',
12
12
  description='sharekernel is an shared package between all python projects',
13
13
  )
@@ -0,0 +1,2 @@
1
+ from .vector_database_repository import VectorRepository
2
+ # from .mongo_repository_base import MongoRepositoryBase
@@ -0,0 +1,50 @@
1
+ from pymongo import MongoClient
2
+ from bson import ObjectId
3
+ from typing import Generic, TypeVar, List, Type
4
+ from pydantic import BaseModel
5
+ from sharedkernel.string_extentions import camel_to_snake
6
+
7
+ T = TypeVar("T", bound=BaseModel)
8
+
9
+
10
+ class MongoGenericRepository(Generic[T]):
11
+ def __init__(self, database: MongoClient, model: Type[T]):
12
+ self.database = database
13
+ self.__collection_name = camel_to_snake(model.__name__)
14
+ self.__collection = self.database[self.__collection_name]
15
+ self.model = model
16
+
17
+ def _map_to_model(self, document: dict) -> T:
18
+ document["id"] = str(document.pop("_id"))
19
+ return self.model.parse_obj(document)
20
+
21
+ def find_one(self, id: str) -> T:
22
+ query = {"_id": ObjectId(id), "is_deleted": False}
23
+ result = self.__collection.find_one(query)
24
+ return self._map_to_model(result) if result else None
25
+
26
+ def insert_one(self, data: T) -> str:
27
+ delattr(data, "id")
28
+ result = self.__collection.insert_one(data.dict())
29
+ return str(result.inserted_id)
30
+
31
+ def insert_many(self, data: List[T]) -> List[str]:
32
+ data_list = [delattr(d.dict(), "id") for d in data]
33
+ result = self.__collection.insert_many(data_list)
34
+ return [str(id_) for id_ in result.inserted_ids]
35
+
36
+ def update_one(self, id: str, data: T) -> int:
37
+ delattr(data, "id")
38
+ query = {"_id": ObjectId(id)}
39
+ result = self.__collection.update_one(query, {"$set": data.dict()})
40
+ return result.modified_count
41
+
42
+ def delete_one(self, id: str) -> int:
43
+ query = {"_id": ObjectId(id)}
44
+ result = self.__collection.delete_one(query)
45
+ return result.deleted_count
46
+
47
+ def get_all(self, page_number=1, page_size=10) -> List[T]:
48
+ skip_count = (page_number - 1) * page_size
49
+ result = self.__collection.find().skip(skip_count).limit(page_size)
50
+ return [self._map_to_model(doc) for doc in result]
@@ -0,0 +1,3 @@
1
+ from .chroma_startegy import ChromaStrategy
2
+ from .milvus_strategy import MilvusStrategy
3
+ from .vector_database_repository import VectorRepository
@@ -0,0 +1,39 @@
1
+ import chromadb
2
+ import numpy as np
3
+ from chromadb.config import Settings
4
+ from .vector_database_strategy import VectorDatabaseStrategy
5
+ import uuid
6
+
7
+
8
+ class ChromaStrategy(VectorDatabaseStrategy):
9
+ def __init__(self, collection_name: str):
10
+ self.collection_name = collection_name
11
+ self.collection = None
12
+
13
+ def connect(self, host: str = "localhost", port: int = 8000):
14
+ client = chromadb.Client(
15
+ Settings(
16
+ chroma_api_impl="rest",
17
+ chroma_server_host=host,
18
+ chroma_server_http_port=port,
19
+ )
20
+ )
21
+ self.collection = client.get_or_create_collection(self.collection_name)
22
+
23
+ def insert_vector(self, vector: np.ndarray, metadata: dict) -> str:
24
+ id = str(uuid.uuid4())
25
+ self.collection.upsert(ids=id, embeddings=vector.tolist(), metadatas=[metadata])
26
+
27
+ return id
28
+
29
+ def search_vector(self, vector: np.ndarray, top_k: int):
30
+ results = self.collection.query(vectors=[vector.tolist()], n_results=top_k)
31
+ return results
32
+
33
+ def get_vector_by_id(self, id: str):
34
+ result = self.collection.get(ids=id)
35
+
36
+ return result
37
+
38
+ def delete_vector(self, id: str):
39
+ self.collection.delete(ids=id)
@@ -0,0 +1,50 @@
1
+ import numpy as np
2
+ from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
3
+
4
+ from .vector_database_strategy import VectorDatabaseStrategy
5
+ import uuid
6
+
7
+
8
+ class MilvusStrategy(VectorDatabaseStrategy):
9
+ def __init__(self, collection_name: str):
10
+ self.collection_name = collection_name
11
+ self.collection = None
12
+
13
+ def connect(self, host: str = "localhost", port: str = "19530"):
14
+ connections.connect(alias="default", host=host, port=port)
15
+ # Define fields
16
+ fields = [
17
+ FieldSchema(
18
+ name="id", dtype=DataType.VARCHAR, max_length=36, is_primary=True
19
+ ),
20
+ FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128),
21
+ ]
22
+ schema = CollectionSchema(
23
+ fields, description="Vector collection", enable_dynamic_field=True
24
+ )
25
+ self.collection = Collection(name=self.collection_name, schema=schema)
26
+
27
+ if not self.collection.has_index():
28
+ self.collection.create_index(field_name="vector", index_params={"index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 128}})
29
+
30
+ self.collection.load()
31
+
32
+ def insert_vector(self, vector: np.ndarray, metadata: dict) -> str:
33
+ id = str(uuid.uuid4())
34
+ self.collection.insert(data={"id": id, "vector": vector.tolist()})
35
+
36
+ return id
37
+
38
+ def search_vector(self, vector: np.ndarray, top_k: int):
39
+ search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
40
+ results = self.collection.search(
41
+ [vector.tolist()], "vector", search_params, top_k
42
+ )
43
+ return results
44
+
45
+ def get_vector_by_id(self, id: str):
46
+ result = self.collection.query(expr=f"id=='{id}'",output_fields=["vector"])
47
+ return result
48
+
49
+ def delete_vector(self, id: str):
50
+ self.collection.delete(expr=f"id=='{id}'")
@@ -0,0 +1,28 @@
1
+ import numpy as np
2
+ from .vector_database_strategy import VectorDatabaseStrategy
3
+ from .milvus_strategy import MilvusStrategy
4
+ from .chroma_startegy import ChromaStrategy
5
+ from sharedkernel.enum.vector_database_type import VectorDatabaseType
6
+
7
+ class VectorRepository:
8
+ def __init__(self, database_type: VectorDatabaseType, collection_name: str, **connection_params):
9
+ self.strategy = self._get_strategy(database_type, collection_name)
10
+ self.strategy.connect(**connection_params)
11
+
12
+ def _get_strategy(self, database_type: VectorDatabaseType, collection_name: str) -> VectorDatabaseStrategy:
13
+ if database_type == VectorDatabaseType.MILVUS:
14
+ return MilvusStrategy(collection_name)
15
+ else:
16
+ return ChromaStrategy(collection_name)
17
+
18
+ def add_vector(self, vector: np.ndarray, metadata: dict) -> str:
19
+ return self.strategy.insert_vector(vector, metadata)
20
+
21
+ def find_similar_vectors(self, vector: np.ndarray, top_k: int):
22
+ return self.strategy.search_vector(vector, top_k)
23
+
24
+ def remove_vector(self, id: str):
25
+ self.strategy.delete_vector(id)
26
+
27
+ def get_vector_by_id(self, id: str):
28
+ return self.strategy.get_vector_by_id(id)
@@ -0,0 +1,22 @@
1
+ from abc import ABC, abstractmethod
2
+ import numpy as np
3
+
4
+ class VectorDatabaseStrategy(ABC):
5
+ @abstractmethod
6
+ def connect(self, **kwargs):
7
+ pass
8
+ @abstractmethod
9
+ def insert_vector(self, vector: np.ndarray, metadata: dict) -> str:
10
+ pass
11
+
12
+ @abstractmethod
13
+ def search_vector(self, vector: np.ndarray, top_k: int):
14
+ pass
15
+
16
+ @abstractmethod
17
+ def delete_vector(self, id: str):
18
+ pass
19
+
20
+ @abstractmethod
21
+ def get_vector_by_id(self, id: str):
22
+ pass
@@ -0,0 +1,2 @@
1
+ from .error_code import ErrorCode
2
+ from .vector_database_type import VectorDatabaseType
@@ -0,0 +1,5 @@
1
+ from enum import Enum
2
+
3
+ class VectorDatabaseType(Enum):
4
+ MILVUS = "milvus"
5
+ CHROMA = "chroma"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sharedkernel
3
- Version: 1.0.0
3
+ Version: 1.1.1
4
4
  Summary: sharekernel is an shared package between all python projects
5
5
  Author: Smilinno
6
6
  Requires-Dist: numpy
@@ -8,3 +8,5 @@ Requires-Dist: requests
8
8
  Requires-Dist: pymongo
9
9
  Requires-Dist: fastapi==0.89.1
10
10
  Requires-Dist: PyJWT
11
+ Requires-Dist: pymilvus
12
+ Requires-Dist: chromadb
@@ -9,14 +9,20 @@ sharedkernel.egg-info/SOURCES.txt
9
9
  sharedkernel.egg-info/dependency_links.txt
10
10
  sharedkernel.egg-info/requires.txt
11
11
  sharedkernel.egg-info/top_level.txt
12
- sharedkernel/database/adapter.py
13
- sharedkernel/database/repository_base.py
12
+ sharedkernel/database/__init__.py
13
+ sharedkernel/database/mongo_generic_repository.py
14
+ sharedkernel/database/vector_database_repository/__init__.py
15
+ sharedkernel/database/vector_database_repository/chroma_startegy.py
16
+ sharedkernel/database/vector_database_repository/milvus_strategy.py
17
+ sharedkernel/database/vector_database_repository/vector_database_repository.py
18
+ sharedkernel/database/vector_database_repository/vector_database_strategy.py
19
+ sharedkernel/enum/__init__.py
14
20
  sharedkernel/enum/error_code.py
21
+ sharedkernel/enum/vector_database_type.py
15
22
  sharedkernel/exception/__init__.py
16
23
  sharedkernel/exception/exception.py
17
24
  sharedkernel/exception/exception_handlers.py
18
25
  sharedkernel/objects/__init__.py
19
26
  sharedkernel/objects/base_document.py
20
27
  sharedkernel/objects/jwt_model.py
21
- sharedkernel/objects/result.py
22
- test/test.py
28
+ sharedkernel/objects/result.py
@@ -3,3 +3,5 @@ requests
3
3
  pymongo
4
4
  fastapi==0.89.1
5
5
  PyJWT
6
+ pymilvus
7
+ chromadb
@@ -1,6 +0,0 @@
1
- from pymongo import MongoClient
2
-
3
- class MongoDBClient:
4
- def __init__(self,connection_string):
5
- self.client = MongoClient(connection_string)
6
- self.domain = self.client.domain
@@ -1,82 +0,0 @@
1
- from typing import (Optional,
2
- List
3
- )
4
- from bson.objectid import ObjectId
5
- from typing import Generic, TypeVar
6
- from pydantic import BaseModel
7
- from pydantic import parse_obj_as
8
-
9
- from sharedkernel.string_extentions import camel_to_snake
10
- from .adapter import MongoDBClient
11
-
12
-
13
- from sharedkernel.exception.exception import BusinessException
14
- from sharedkernel.enum.error_code import ErrorCode
15
-
16
- mongo_client= MongoDBClient()
17
-
18
- ResultT = TypeVar("ResultT")
19
-
20
- T = TypeVar("T", bound=BaseModel)
21
-
22
- class RepositoryBase(Generic[T]):
23
-
24
- def __init__(self,model):
25
- self.model = model
26
- self.model_name= camel_to_snake(self.model.__name__)
27
-
28
-
29
- def find(self,id: str) -> T:
30
- if (not ObjectId.is_valid(id)):
31
- raise BusinessException(ErrorCode.Item_NotFound)
32
-
33
- query = {"_id": ObjectId(id),"is_deleted":False}
34
-
35
- item = mongo_client.domain[self.model_name].find_one(query)
36
-
37
- if (not item):
38
- raise BusinessException(ErrorCode.Item_NotFound)
39
-
40
- item['_id']=str(item['_id'])
41
- item['id']= item['_id']
42
- item.pop('_id')
43
-
44
- return self.model.parse_obj(item) if item else None
45
-
46
-
47
- def get_all(self,query:dict = None) -> Optional[List]:
48
- if query:
49
- query["is_deleted"]= False
50
- else:
51
- query= {"is_deleted":False}
52
- items = list(mongo_client.domain[self.model_name].find(query))
53
-
54
- for item in items:
55
- item['_id'] = str(item['_id'])
56
- item['id']= item['_id']
57
- item.pop('_id')
58
-
59
- return parse_obj_as(List[self.model],items)
60
-
61
-
62
- def insert(self, insert_data: T) -> str:
63
- delattr(insert_data, "id")
64
- inserted_data= mongo_client.domain[self.model_name].insert_one(insert_data.dict())
65
-
66
- return str(inserted_data.inserted_id)
67
-
68
- def bulk_insert(self, insert_data: List[T]):
69
- insert_data=[delattr(data, "id") for data in insert_data]
70
- mongo_client.domain[self.model_name].insert_many(insert_data)
71
-
72
-
73
-
74
- def update(self,id:str,update_data: T):
75
- query = {"_id": ObjectId(id)}
76
- delattr(update_data, "id")
77
- mongo_client.domain[self.model_name].update_one(query, {"$set": update_data.dict()}, upsert=False)
78
-
79
-
80
- def query(self):
81
- return mongo_client.domain[self.model_name]
82
-
@@ -1,12 +0,0 @@
1
- from fastapi import FastAPI,Depends
2
-
3
- from sharedkernel import jwt_service
4
- from sharedkernel.objects import JwtModel
5
- from sharedkernel import config
6
- app = FastAPI(title="Domain Apis",dependencies=[Depends(jwt_service.JWTBearer(JwtModel(secret_key=config.JWT_SECRETKEY,
7
- algorithms=config.JWT_ALGORITHM,
8
- audience=config.JWT_AUDIENCE,
9
- issuer=config.JWT_ISSURE)))])
10
-
11
- # history = api_client.bots()
12
- # print("Chat history:", history)
File without changes
File without changes