mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
complete implementation of dataset SDK (#2147)
### What problem does this PR solve? Complete implementation of dataset SDK. #1102 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --------- Co-authored-by: Feiue <10215101452@stu.ecun.edu.cn> Co-authored-by: Kevin Hu <kevinhu.sh@gmail.com>
This commit is contained in:
@ -18,13 +18,17 @@ class Base(object):
|
||||
pr[name] = value
|
||||
return pr
|
||||
|
||||
|
||||
def post(self, path, param):
|
||||
res = self.rag.post(path,param)
|
||||
res = self.rag.post(path, param)
|
||||
return res
|
||||
|
||||
def get(self, path, params=''):
|
||||
res = self.rag.get(path,params)
|
||||
def get(self, path, params):
|
||||
res = self.rag.get(path, params)
|
||||
return res
|
||||
|
||||
def rm(self, path, params):
|
||||
res = self.rag.delete(path, params)
|
||||
return res
|
||||
|
||||
def __str__(self):
|
||||
return str(self.to_json())
|
||||
|
||||
@ -21,18 +21,36 @@ class DataSet(Base):
|
||||
self.permission = "me"
|
||||
self.document_count = 0
|
||||
self.chunk_count = 0
|
||||
self.parser_method = "naive"
|
||||
self.parse_method = "naive"
|
||||
self.parser_config = None
|
||||
for k in list(res_dict.keys()):
|
||||
if k == "embd_id":
|
||||
res_dict["embedding_model"] = res_dict[k]
|
||||
if k == "parser_id":
|
||||
res_dict['parse_method'] = res_dict[k]
|
||||
if k == "doc_num":
|
||||
res_dict["document_count"] = res_dict[k]
|
||||
if k == "chunk_num":
|
||||
res_dict["chunk_count"] = res_dict[k]
|
||||
if k not in self.__dict__:
|
||||
res_dict.pop(k)
|
||||
super().__init__(rag, res_dict)
|
||||
|
||||
def save(self):
|
||||
def save(self) -> bool:
|
||||
res = self.post('/dataset/save',
|
||||
{"id": self.id, "name": self.name, "avatar": self.avatar, "tenant_id": self.tenant_id,
|
||||
"description": self.description, "language": self.language, "embd_id": self.embedding_model,
|
||||
"permission": self.permission,
|
||||
"doc_num": self.document_count, "chunk_num": self.chunk_count, "parser_id": self.parser_method,
|
||||
"doc_num": self.document_count, "chunk_num": self.chunk_count, "parser_id": self.parse_method,
|
||||
"parser_config": self.parser_config.to_json()
|
||||
})
|
||||
res = res.json()
|
||||
if not res.get("retmsg"): return True
|
||||
raise Exception(res["retmsg"])
|
||||
if res.get("retmsg") == "success": return True
|
||||
raise Exception(res["retmsg"])
|
||||
|
||||
def delete(self) -> bool:
|
||||
res = self.rm('/dataset/delete',
|
||||
{"id": self.id})
|
||||
res = res.json()
|
||||
if res.get("retmsg") == "success": return True
|
||||
raise Exception(res["retmsg"])
|
||||
|
||||
@ -13,6 +13,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from typing import List
|
||||
|
||||
import requests
|
||||
|
||||
from .modules.dataset import DataSet
|
||||
@ -25,30 +27,54 @@ class RAGFlow:
|
||||
"""
|
||||
self.user_key = user_key
|
||||
self.api_url = f"{base_url}/api/{version}"
|
||||
self.authorization_header = {"Authorization": "{} {}".format("Bearer",self.user_key)}
|
||||
self.authorization_header = {"Authorization": "{} {}".format("Bearer", self.user_key)}
|
||||
|
||||
def post(self, path, param):
|
||||
res = requests.post(url=self.api_url + path, json=param, headers=self.authorization_header)
|
||||
return res
|
||||
|
||||
def get(self, path, params=''):
|
||||
res = requests.get(self.api_url + path, params=params, headers=self.authorization_header)
|
||||
def get(self, path, params=None):
|
||||
res = requests.get(url=self.api_url + path, params=params, headers=self.authorization_header)
|
||||
return res
|
||||
|
||||
def create_dataset(self, name:str,avatar:str="",description:str="",language:str="English",permission:str="me",
|
||||
document_count:int=0,chunk_count:int=0,parser_method:str="naive",
|
||||
parser_config:DataSet.ParserConfig=None):
|
||||
def delete(self, path, params):
|
||||
res = requests.delete(url=self.api_url + path, params=params, headers=self.authorization_header)
|
||||
return res
|
||||
|
||||
def create_dataset(self, name: str, avatar: str = "", description: str = "", language: str = "English",
|
||||
permission: str = "me",
|
||||
document_count: int = 0, chunk_count: int = 0, parse_method: str = "naive",
|
||||
parser_config: DataSet.ParserConfig = None) -> DataSet:
|
||||
if parser_config is None:
|
||||
parser_config = DataSet.ParserConfig(self, {"chunk_token_count":128,"layout_recognize": True, "delimiter":"\n!?。;!?","task_page_size":12})
|
||||
parser_config=parser_config.to_json()
|
||||
res=self.post("/dataset/save",{"name":name,"avatar":avatar,"description":description,"language":language,"permission":permission,
|
||||
"doc_num": document_count,"chunk_num":chunk_count,"parser_id":parser_method,
|
||||
"parser_config":parser_config
|
||||
}
|
||||
)
|
||||
parser_config = DataSet.ParserConfig(self, {"chunk_token_count": 128, "layout_recognize": True,
|
||||
"delimiter": "\n!?。;!?", "task_page_size": 12})
|
||||
parser_config = parser_config.to_json()
|
||||
res = self.post("/dataset/save",
|
||||
{"name": name, "avatar": avatar, "description": description, "language": language,
|
||||
"permission": permission,
|
||||
"doc_num": document_count, "chunk_num": chunk_count, "parser_id": parse_method,
|
||||
"parser_config": parser_config
|
||||
}
|
||||
)
|
||||
res = res.json()
|
||||
if not res.get("retmsg"):
|
||||
if res.get("retmsg") == "success":
|
||||
return DataSet(self, res["data"])
|
||||
raise Exception(res["retmsg"])
|
||||
|
||||
def list_datasets(self, page: int = 1, page_size: int = 150, orderby: str = "create_time", desc: bool = True) -> \
|
||||
List[DataSet]:
|
||||
res = self.get("/dataset/list", {"page": page, "page_size": page_size, "orderby": orderby, "desc": desc})
|
||||
res = res.json()
|
||||
result_list = []
|
||||
if res.get("retmsg") == "success":
|
||||
for data in res['data']:
|
||||
result_list.append(DataSet(self, data))
|
||||
return result_list
|
||||
raise Exception(res["retmsg"])
|
||||
|
||||
def get_dataset(self, id: str = None, name: str = None) -> DataSet:
|
||||
res = self.get("/dataset/detail", {"id": id, "name": name})
|
||||
res = res.json()
|
||||
if res.get("retmsg") == "success":
|
||||
return DataSet(self, res['data'])
|
||||
raise Exception(res["retmsg"])
|
||||
|
||||
@ -7,7 +7,7 @@ from test_sdkbase import TestSdk
|
||||
class TestDataset(TestSdk):
|
||||
def test_create_dataset_with_success(self):
|
||||
"""
|
||||
Test creating dataset with success
|
||||
Test creating a dataset with success
|
||||
"""
|
||||
rag = RAGFlow(API_KEY, HOST_ADDRESS)
|
||||
ds = rag.create_dataset("God")
|
||||
@ -18,15 +18,46 @@ class TestDataset(TestSdk):
|
||||
|
||||
def test_update_dataset_with_success(self):
|
||||
"""
|
||||
Test updating dataset with success.
|
||||
Test updating a dataset with success.
|
||||
"""
|
||||
rag = RAGFlow(API_KEY, HOST_ADDRESS)
|
||||
ds = rag.create_dataset("ABC")
|
||||
if isinstance(ds, DataSet):
|
||||
assert ds.name == "ABC", "Name does not match."
|
||||
assert ds.name == "ABC", "Name does not match."
|
||||
ds.name = 'DEF'
|
||||
res = ds.save()
|
||||
assert res is True, f"Failed to update dataset, error: {res}"
|
||||
|
||||
assert res is True, f"Failed to update dataset, error: {res}"
|
||||
else:
|
||||
assert False, f"Failed to create dataset, error: {ds}"
|
||||
assert False, f"Failed to create dataset, error: {ds}"
|
||||
|
||||
def test_delete_dataset_with_success(self):
|
||||
"""
|
||||
Test deleting a dataset with success
|
||||
"""
|
||||
rag = RAGFlow(API_KEY, HOST_ADDRESS)
|
||||
ds = rag.create_dataset("MA")
|
||||
if isinstance(ds, DataSet):
|
||||
assert ds.name == "MA", "Name does not match."
|
||||
res = ds.delete()
|
||||
assert res is True, f"Failed to delete dataset, error: {res}"
|
||||
else:
|
||||
assert False, f"Failed to create dataset, error: {ds}"
|
||||
|
||||
def test_list_datasets_with_success(self):
|
||||
"""
|
||||
Test listing datasets with success
|
||||
"""
|
||||
rag = RAGFlow(API_KEY, HOST_ADDRESS)
|
||||
list_datasets = rag.list_datasets()
|
||||
assert len(list_datasets) > 0, "Do not exist any dataset"
|
||||
for ds in list_datasets:
|
||||
assert isinstance(ds, DataSet), "Existence type is not dataset."
|
||||
|
||||
def test_get_detail_dataset_with_success(self):
|
||||
"""
|
||||
Test getting a dataset's detail with success
|
||||
"""
|
||||
rag = RAGFlow(API_KEY, HOST_ADDRESS)
|
||||
ds = rag.get_dataset(name="God")
|
||||
assert isinstance(ds, DataSet), f"Failed to get dataset, error: {ds}."
|
||||
assert ds.name == "God", "Name does not match"
|
||||
|
||||
Reference in New Issue
Block a user