1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
import logging
from typing import Any, Type
from ..abstractions import R2RProviders, R2RServices
from ..api.v3.chunks_router import ChunksRouter
from ..api.v3.collections_router import CollectionsRouter
from ..api.v3.conversations_router import ConversationsRouter
from ..api.v3.documents_router import DocumentsRouter
from ..api.v3.graph_router import GraphRouter
from ..api.v3.indices_router import IndicesRouter
from ..api.v3.prompts_router import PromptsRouter
from ..api.v3.retrieval_router import RetrievalRouter
from ..api.v3.system_router import SystemRouter
from ..api.v3.users_router import UsersRouter
from ..app import R2RApp
from ..config import R2RConfig
from ..services.auth_service import AuthService # noqa: F401
from ..services.graph_service import GraphService # noqa: F401
from ..services.ingestion_service import IngestionService # noqa: F401
from ..services.management_service import ManagementService # noqa: F401
from ..services.retrieval_service import ( # type: ignore
RetrievalService, # noqa: F401 # type: ignore
)
from .factory import R2RProviderFactory
logger = logging.getLogger()
class R2RBuilder:
_SERVICES = ["auth", "ingestion", "management", "retrieval", "graph"]
def __init__(self, config: R2RConfig):
self.config = config
async def build(self, *args, **kwargs) -> R2RApp:
provider_factory = R2RProviderFactory
try:
providers = await self._create_providers(
provider_factory, *args, **kwargs
)
except Exception as e:
logger.error(f"Error {e} while creating R2RProviders.")
raise
service_params = {
"config": self.config,
"providers": providers,
}
services = self._create_services(service_params)
routers = {
"chunks_router": ChunksRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"collections_router": CollectionsRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"conversations_router": ConversationsRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"documents_router": DocumentsRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"graph_router": GraphRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"indices_router": IndicesRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"prompts_router": PromptsRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"retrieval_router": RetrievalRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"system_router": SystemRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
"users_router": UsersRouter(
providers=providers,
services=services,
config=self.config,
).get_router(),
}
return R2RApp(
config=self.config,
orchestration_provider=providers.orchestration,
services=services,
**routers,
)
async def _create_providers(
self, provider_factory: Type[R2RProviderFactory], *args, **kwargs
) -> R2RProviders:
factory = provider_factory(self.config)
return await factory.create_providers(*args, **kwargs)
def _create_services(self, service_params: dict[str, Any]) -> R2RServices:
services = R2RBuilder._SERVICES
service_instances = {}
for service_type in services:
service_class = globals()[f"{service_type.capitalize()}Service"]
service_instances[service_type] = service_class(**service_params)
return R2RServices(**service_instances)
|