llama-index
69 строк · 2.3 Кб
1from typing import Any, Dict, List, Optional2
3from llama_index.legacy.readers.base import BaseReader4from llama_index.legacy.schema import Document5
6
7class MetalReader(BaseReader):8"""Metal reader.9
10Args:
11api_key (str): Metal API key.
12client_id (str): Metal client ID.
13index_id (str): Metal index ID.
14"""
15
16def __init__(self, api_key: str, client_id: str, index_id: str):17import_err_msg = (18"`metal_sdk` package not found, please run `pip install metal_sdk`"19)20try:21import metal_sdk # noqa22except ImportError:23raise ImportError(import_err_msg)24from metal_sdk.metal import Metal25
26"""Initialize with parameters."""27self._api_key = api_key28self._client_id = client_id29self._index_id = index_id30self.metal_client = Metal(api_key, client_id, index_id)31
32def load_data(33self,34limit: int,35query_embedding: Optional[List[float]] = None,36filters: Optional[Dict[str, Any]] = None,37separate_documents: bool = True,38**query_kwargs: Any39) -> List[Document]:40"""Load data from Metal.41
42Args:
43query_embedding (Optional[List[float]]): Query embedding for search.
44limit (int): Number of results to return.
45filters (Optional[Dict[str, Any]]): Filters to apply to the search.
46separate_documents (Optional[bool]): Whether to return separate
47documents per retrieved entry. Defaults to True.
48**query_kwargs: Keyword arguments to pass to the search.
49
50Returns:
51List[Document]: A list of documents.
52"""
53payload = {54"embedding": query_embedding,55"filters": filters,56}57response = self.metal_client.search(payload, limit=limit, **query_kwargs)58
59documents = []60for item in response["data"]:61text = item["text"] or (item["metadata"] and item["metadata"]["text"])62documents.append(Document(text=text))63
64if not separate_documents:65text_list = [doc.get_content() for doc in documents]66text = "\n\n".join(text_list)67documents = [Document(text=text)]68
69return documents70