llama-index
73 строки · 2.3 Кб
1from typing import Any, Optional
2from llama_index.core.base.base_query_engine import BaseQueryEngine
3from llama_index.core.bridge.pydantic import Field, BaseModel
4from llama_index.networks.schema.contributor import (
5ContributorQueryRequest,
6)
7from pydantic.v1 import BaseSettings, PrivateAttr
8from fastapi import FastAPI
9
10
11class ContributorServiceSettings(BaseSettings):
12api_version: str = Field(default="v1", description="API version.")
13secret: Optional[str] = Field(
14default=None, description="JWT secret."
15) # left for future consideration.
16# or if user wants to implement their own
17
18class Config:
19env_file = ".env", ".env.contributor.service"
20
21
22class ContributorService(BaseModel):
23query_engine: Optional[BaseQueryEngine]
24config: ContributorServiceSettings
25_fastapi: FastAPI = PrivateAttr()
26
27class Config:
28arbitrary_types_allowed = True
29
30def __init__(self, query_engine, config) -> None:
31self._fastapi = FastAPI(
32version=config.api_version,
33)
34
35# routes
36self._fastapi.add_api_route(path="/api", endpoint=self.index, methods=["GET"])
37self._fastapi.add_api_route(
38path="/api/query",
39endpoint=self.query,
40methods=["POST"],
41)
42
43super().__init__(query_engine=query_engine, config=config)
44
45async def index(self):
46"""Index endpoint logic."""
47return {"message": "Hello World!"}
48
49async def query(self, request: ContributorQueryRequest):
50"""Query endpoint logic."""
51result = await self.query_engine.aquery(request.query)
52return {
53"response": result.response,
54"source_nodes": result.source_nodes,
55"metadata": result.metadata,
56}
57
58@classmethod
59def from_config_file(
60cls, env_file: str, query_engine: BaseQueryEngine
61) -> "ContributorService":
62config = ContributorServiceSettings(_env_file=env_file)
63return cls(query_engine=query_engine, config=config)
64
65def __getattr__(self, attr) -> Any:
66if hasattr(self._fastapi, attr):
67return getattr(self._fastapi, attr)
68else:
69raise AttributeError(f"{attr} not exist")
70
71@property
72def app(self):
73return self._fastapi
74