r2r.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. class R2R:
  7. client: R2RAsyncClient
  8. def __init__(self):
  9. self.auth_enabled = tool_settings.R2R_USERNAME and tool_settings.R2R_PASSWORD
  10. self.client = None
  11. async def init(self):
  12. if not self.auth_enabled:
  13. return
  14. if not self.client:
  15. self.client = R2RAsyncClient(tool_settings.R2R_BASE_URL, "/v3")
  16. print(
  17. "1111111111111111111111111111111122222vvdgdfdf" + tool_settings.R2R_USERNAME
  18. )
  19. print(tool_settings.R2R_USERNAME)
  20. print(tool_settings.R2R_PASSWORD)
  21. await self.client.users.login(
  22. tool_settings.R2R_USERNAME, tool_settings.R2R_PASSWORD
  23. )
  24. print(self.client.access_token)
  25. async def ingest_file(self, file_path: str, metadata: Optional[dict]):
  26. await self._check_login()
  27. return await self.client.documents.create(
  28. file_path=file_path,
  29. metadata=metadata if metadata else None,
  30. id=None,
  31. )
  32. async def ingest_fileinfo(self, file: UploadFile, metadata: Optional[dict]):
  33. await self._check_login()
  34. return await self.client.documents.create(
  35. file=file,
  36. metadata=metadata if metadata else None,
  37. id=None,
  38. )
  39. async def search(self, query: str, filters: dict[str, Any]):
  40. await self._check_login()
  41. print(
  42. "aaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssssssssssssssssssssssssssssssssssssgggggggggggggggggggg"
  43. )
  44. search_response = await self.client.retrieval.search(
  45. query=query,
  46. search_settings={
  47. "filters": filters,
  48. "limit": tool_settings.R2R_SEARCH_LIMIT,
  49. },
  50. )
  51. print("vvvvvvvvvvvvvvvvvvmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm")
  52. print(search_response.get("results"))
  53. return search_response.get("results").get("chunk_search_results")
  54. async def list(
  55. self,
  56. ids: Optional[list[str]] = None,
  57. offset: Optional[int] = 0,
  58. limit: Optional[int] = 100,
  59. ):
  60. await self._check_login()
  61. """
  62. listed = mutable_client.documents.list(limit=2, offset=0)
  63. results = listed.results
  64. assert len(results) == 2, "Expected 2 results for paginated listing"
  65. """
  66. print("listlistlistlistlistlistlistlistlistlistlistlistlistlistlistlistlist")
  67. if len(ids) > 0:
  68. listed = await self.client.documents.list(
  69. ids=ids, limit=limit, offset=offset
  70. )
  71. print(listed.get("results"))
  72. return listed.get("results")
  73. else:
  74. return []
  75. async def list_documents(
  76. self,
  77. id: Optional[str] = "",
  78. offset: Optional[int] = 0,
  79. limit: Optional[int] = 100,
  80. ):
  81. await self._check_login()
  82. """
  83. docs = client.collections.list_documents(empty_coll_id).results
  84. assert len(docs) == 0, "Expected no documents in a new empty collection"
  85. """
  86. print(
  87. "collectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollectionscollections"
  88. )
  89. if id != "":
  90. listed = await self.client.collections.list_documents(
  91. ids=id, limit=limit, offset=offset
  92. )
  93. print(listed.get("results"))
  94. return listed.get("results")
  95. else:
  96. return []
  97. async def _check_login(self):
  98. if not self.auth_enabled:
  99. return
  100. if not self.client.access_token and verify_jwt_expiration(
  101. self.client.access_token
  102. ):
  103. return
  104. else:
  105. await self.init()
  106. # 创建 R2R 实例
  107. r2r = R2R()
  108. # 在您的应用程序启动时调用 initialize_r2r()
  109. async def initialize_r2r():
  110. await r2r.init()