r2r.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. from typing import Optional, Any
  2. from r2r import R2RAsyncClient
  3. from fastapi import UploadFile
  4. from app.libs.util import verify_jwt_expiration
  5. from config.llm import tool_settings
  6. import nest_asyncio
  7. # 使得异步代码可以在已运行的事件循环中嵌套
  8. nest_asyncio.apply()
  9. class R2R:
  10. client: R2RAsyncClient
  11. def __init__(self):
  12. self.auth_enabled = tool_settings.R2R_USERNAME and tool_settings.R2R_PASSWORD
  13. self.client = None
  14. async def init(self):
  15. if not self.auth_enabled:
  16. return
  17. if not self.client:
  18. self.client = R2RAsyncClient(tool_settings.R2R_BASE_URL, "/v3")
  19. print(
  20. "1111111111111111111111111111111122222vvdgdfdf" + tool_settings.R2R_USERNAME
  21. )
  22. print(tool_settings.R2R_USERNAME)
  23. print(tool_settings.R2R_PASSWORD)
  24. await self.client.users.login(
  25. tool_settings.R2R_USERNAME, tool_settings.R2R_PASSWORD
  26. )
  27. print(self.client.access_token)
  28. async def ingest_file(self, file_path: str, metadata: Optional[dict]):
  29. await self._check_login()
  30. return await self.client.documents.create(
  31. file_path=file_path,
  32. metadata=metadata if metadata else None,
  33. id=None,
  34. )
  35. async def ingest_fileinfo(self, file: UploadFile, metadata: Optional[dict]):
  36. await self._check_login()
  37. return await self.client.documents.create(
  38. file=file,
  39. metadata=metadata if metadata else None,
  40. id=None,
  41. )
  42. async def search(self, query: str, filters: dict[str, Any]):
  43. await self._check_login()
  44. print(
  45. "aaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssssssssssssssssssssssssssssssssssssgggggggggggggggggggg"
  46. )
  47. search_response = await self.client.retrieval.search(
  48. query=query,
  49. search_settings={
  50. "filters": filters,
  51. "limit": tool_settings.R2R_SEARCH_LIMIT,
  52. },
  53. )
  54. print("vvvvvvvvvvvvvvvvvvmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm")
  55. print(search_response.get("results"))
  56. return search_response.get("results").get("chunk_search_results")
  57. async def list(
  58. self,
  59. ids: Optional[list[str]] = None,
  60. offset: Optional[int] = 0,
  61. limit: Optional[int] = 100,
  62. ):
  63. await self._check_login()
  64. print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaassssssssssssssssssssssssssssssssssss")
  65. print(ids)
  66. """
  67. listed = mutable_client.documents.list(limit=2, offset=0)
  68. results = listed.results
  69. assert len(results) == 2, "Expected 2 results for paginated listing"
  70. """
  71. print("listlistlistlistlistlistlistlistlistlistlistlistlistlistlistlistlist")
  72. if len(ids) > 0:
  73. listed = await self.client.documents.list(
  74. ids=ids, limit=limit, offset=offset
  75. )
  76. print(listed.get("results"))
  77. return listed.get("results")
  78. else:
  79. return []
  80. async def list_documents(
  81. self,
  82. id: Optional[str] = "",
  83. offset: Optional[int] = 0,
  84. limit: Optional[int] = 100,
  85. ):
  86. await self._check_login()
  87. """
  88. docs = client.collections.list_documents(empty_coll_id).results
  89. assert len(docs) == 0, "Expected no documents in a new empty collection"
  90. """
  91. print(
  92. "collectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollections"
  93. )
  94. if id != "":
  95. try:
  96. listed = await self.client.collections.list_documents(
  97. id=id, limit=limit, offset=offset
  98. )
  99. print(listed.get("results"))
  100. return listed.get("results")
  101. except Exception as e:
  102. print(e)
  103. listed = []
  104. return listed
  105. else:
  106. return []
  107. async def _check_login(self):
  108. if not self.auth_enabled:
  109. return
  110. if not self.client.access_token and verify_jwt_expiration(
  111. self.client.access_token
  112. ):
  113. return
  114. else:
  115. await self.init()
  116. # 创建 R2R 实例
  117. r2r = R2R()
  118. # 在您的应用程序启动时调用 initialize_r2r()
  119. async def initialize_r2r():
  120. await r2r.init()