admin-api-lib 3.4.0__py3-none-any.whl → 4.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- admin_api_lib/dependency_container.py +1 -1
- admin_api_lib/impl/api_endpoints/default_source_uploader.py +5 -1
- admin_api_lib/impl/chunker/text_chunker.py +1 -1
- admin_api_lib/impl/information_enhancer/page_summary_enhancer.py +72 -21
- admin_api_lib/impl/key_db/file_status_key_value_store.py +48 -2
- admin_api_lib/impl/settings/key_value_settings.py +24 -0
- admin_api_lib/impl/summarizer/langchain_summarizer.py +49 -4
- {admin_api_lib-3.4.0.dist-info → admin_api_lib-4.0.0.dist-info}/METADATA +10 -8
- {admin_api_lib-3.4.0.dist-info → admin_api_lib-4.0.0.dist-info}/RECORD +10 -10
- {admin_api_lib-3.4.0.dist-info → admin_api_lib-4.0.0.dist-info}/WHEEL +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from admin_api_lib.impl.api_endpoints.default_file_uploader import DefaultFileUploader
|
|
4
4
|
from dependency_injector.containers import DeclarativeContainer
|
|
5
5
|
from dependency_injector.providers import Configuration, List, Selector, Singleton
|
|
6
|
-
from
|
|
6
|
+
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
|
7
7
|
from langchain_community.embeddings import OllamaEmbeddings
|
|
8
8
|
from langfuse import Langfuse
|
|
9
9
|
|
|
@@ -149,7 +149,11 @@ class DefaultSourceUploader(SourceUploader):
|
|
|
149
149
|
)
|
|
150
150
|
)
|
|
151
151
|
except asyncio.TimeoutError:
|
|
152
|
-
logger.error(
|
|
152
|
+
logger.error(
|
|
153
|
+
"Upload of %s timed out after %s seconds (increase SOURCE_UPLOADER_TIMEOUT to allow longer ingestions)",
|
|
154
|
+
source_name,
|
|
155
|
+
timeout,
|
|
156
|
+
)
|
|
153
157
|
self._key_value_store.upsert(source_name, Status.ERROR)
|
|
154
158
|
except Exception:
|
|
155
159
|
logger.exception("Error while uploading %s", source_name)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Module containing the TextChunker class."""
|
|
2
2
|
|
|
3
|
-
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
4
3
|
from langchain_core.documents import Document
|
|
4
|
+
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
|
5
5
|
|
|
6
6
|
from admin_api_lib.chunker.chunker import Chunker
|
|
7
7
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"""Module for enhancing the summary of pages by grouping information by page and summarizing each page."""
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import asyncio
|
|
4
4
|
from hashlib import sha256
|
|
5
5
|
from typing import Optional
|
|
6
|
+
from typing import Any
|
|
6
7
|
|
|
7
8
|
from langchain_core.documents import Document
|
|
8
9
|
from langchain_core.runnables import RunnableConfig
|
|
@@ -25,8 +26,36 @@ class PageSummaryEnhancer(SummaryEnhancer):
|
|
|
25
26
|
"""
|
|
26
27
|
|
|
27
28
|
BASE64_IMAGE_KEY = "base64_image"
|
|
29
|
+
DOCUMENT_URL_KEY = "document_url"
|
|
28
30
|
DEFAULT_PAGE_NR = 1
|
|
29
31
|
|
|
32
|
+
@staticmethod
|
|
33
|
+
def _parse_max_concurrency(config: Optional[RunnableConfig]) -> int:
|
|
34
|
+
if not config:
|
|
35
|
+
return 1
|
|
36
|
+
raw = config.get("max_concurrency")
|
|
37
|
+
if raw is None:
|
|
38
|
+
return 1
|
|
39
|
+
try:
|
|
40
|
+
return max(1, int(raw))
|
|
41
|
+
except (TypeError, ValueError):
|
|
42
|
+
return 1
|
|
43
|
+
|
|
44
|
+
def _group_key(self, piece: Document) -> tuple[Any, ...]:
|
|
45
|
+
document_url = piece.metadata.get(self.DOCUMENT_URL_KEY)
|
|
46
|
+
page = piece.metadata.get("page", self.DEFAULT_PAGE_NR)
|
|
47
|
+
|
|
48
|
+
# For paged documents (PDF/docling/etc.) keep per-page summaries even if a shared document URL exists.
|
|
49
|
+
if isinstance(page, int) or (isinstance(page, str) and page != "Unknown Title"):
|
|
50
|
+
return ("page_number", document_url, page)
|
|
51
|
+
|
|
52
|
+
# For sources like sitemaps/confluence, `page` can be a non-unique title (or missing),
|
|
53
|
+
# so group by the page URL when available to ensure one summary per page.
|
|
54
|
+
if document_url:
|
|
55
|
+
return ("document_url", document_url)
|
|
56
|
+
|
|
57
|
+
return ("page", page)
|
|
58
|
+
|
|
30
59
|
async def _asummarize_page(self, page_pieces: list[Document], config: Optional[RunnableConfig]) -> Document:
|
|
31
60
|
full_page_content = " ".join([piece.page_content for piece in page_pieces])
|
|
32
61
|
summary = await self._summarizer.ainvoke(full_page_content, config)
|
|
@@ -39,24 +68,46 @@ class PageSummaryEnhancer(SummaryEnhancer):
|
|
|
39
68
|
return Document(metadata=meta, page_content=summary)
|
|
40
69
|
|
|
41
70
|
async def _acreate_summary(self, information: list[Document], config: Optional[RunnableConfig]) -> list[Document]:
|
|
42
|
-
|
|
71
|
+
grouped = self._group_information(information)
|
|
72
|
+
max_concurrency = self._parse_max_concurrency(config)
|
|
73
|
+
return await self._summarize_groups(grouped, config, max_concurrency=max_concurrency)
|
|
74
|
+
|
|
75
|
+
def _group_information(self, information: list[Document]) -> list[list[Document]]:
|
|
76
|
+
ordered_keys: list[tuple[Any, ...]] = []
|
|
77
|
+
groups: dict[tuple[Any, ...], list[Document]] = {}
|
|
43
78
|
for info in information:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
79
|
+
key = self._group_key(info)
|
|
80
|
+
if key not in groups:
|
|
81
|
+
ordered_keys.append(key)
|
|
82
|
+
groups[key] = []
|
|
83
|
+
groups[key].append(info)
|
|
84
|
+
return [groups[key] for key in ordered_keys]
|
|
85
|
+
|
|
86
|
+
async def _summarize_groups(
|
|
87
|
+
self,
|
|
88
|
+
grouped: list[list[Document]],
|
|
89
|
+
config: Optional[RunnableConfig],
|
|
90
|
+
*,
|
|
91
|
+
max_concurrency: int,
|
|
92
|
+
) -> list[Document]:
|
|
93
|
+
if max_concurrency == 1:
|
|
94
|
+
summaries: list[Document] = []
|
|
95
|
+
for info_group in tqdm(grouped):
|
|
96
|
+
summaries.append(await self._asummarize_page(info_group, config))
|
|
97
|
+
return summaries
|
|
98
|
+
|
|
99
|
+
semaphore = asyncio.Semaphore(max_concurrency)
|
|
100
|
+
results: list[Document | None] = [None] * len(grouped)
|
|
101
|
+
|
|
102
|
+
async def _run(idx: int, info_group: list[Document]) -> tuple[int, Document]:
|
|
103
|
+
async with semaphore:
|
|
104
|
+
return idx, await self._asummarize_page(info_group, config)
|
|
105
|
+
|
|
106
|
+
tasks = [asyncio.create_task(_run(idx, info_group)) for idx, info_group in enumerate(grouped)]
|
|
107
|
+
with tqdm(total=len(tasks)) as pbar:
|
|
108
|
+
for task in asyncio.as_completed(tasks):
|
|
109
|
+
idx, summary = await task
|
|
110
|
+
results[idx] = summary
|
|
111
|
+
pbar.update(1)
|
|
112
|
+
|
|
113
|
+
return [summary for summary in results if summary is not None]
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"""Module containing the FileStatusKeyValueStore class."""
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
import ssl
|
|
5
|
+
from typing import Any
|
|
4
6
|
|
|
5
7
|
from redis import Redis
|
|
6
8
|
|
|
@@ -37,9 +39,53 @@ class FileStatusKeyValueStore:
|
|
|
37
39
|
Parameters
|
|
38
40
|
----------
|
|
39
41
|
settings : KeyValueSettings
|
|
40
|
-
The settings object containing the
|
|
42
|
+
The settings object containing the connection information for the Redis connection.
|
|
41
43
|
"""
|
|
42
|
-
|
|
44
|
+
redis_kwargs: dict[str, Any] = {
|
|
45
|
+
"host": settings.host,
|
|
46
|
+
"port": settings.port,
|
|
47
|
+
"decode_responses": True,
|
|
48
|
+
**self._build_ssl_kwargs(settings),
|
|
49
|
+
}
|
|
50
|
+
if settings.username:
|
|
51
|
+
redis_kwargs["username"] = settings.username
|
|
52
|
+
if settings.password:
|
|
53
|
+
redis_kwargs["password"] = settings.password
|
|
54
|
+
|
|
55
|
+
self._redis = Redis(**redis_kwargs)
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def _build_ssl_kwargs(settings: KeyValueSettings) -> dict[str, Any]:
|
|
59
|
+
"""Build Redis SSL settings from configuration, mapping string values to ssl constants."""
|
|
60
|
+
if not settings.use_ssl:
|
|
61
|
+
return {}
|
|
62
|
+
|
|
63
|
+
cert_reqs_map = {
|
|
64
|
+
"required": ssl.CERT_REQUIRED,
|
|
65
|
+
"optional": ssl.CERT_OPTIONAL,
|
|
66
|
+
"none": ssl.CERT_NONE,
|
|
67
|
+
"cert_required": ssl.CERT_REQUIRED,
|
|
68
|
+
"cert_optional": ssl.CERT_OPTIONAL,
|
|
69
|
+
"cert_none": ssl.CERT_NONE,
|
|
70
|
+
}
|
|
71
|
+
ssl_cert_reqs = None
|
|
72
|
+
if settings.ssl_cert_reqs:
|
|
73
|
+
ssl_cert_reqs = cert_reqs_map.get(settings.ssl_cert_reqs.lower(), settings.ssl_cert_reqs)
|
|
74
|
+
|
|
75
|
+
ssl_kwargs: dict[str, Any] = {
|
|
76
|
+
"ssl": settings.use_ssl,
|
|
77
|
+
"ssl_check_hostname": settings.ssl_check_hostname,
|
|
78
|
+
}
|
|
79
|
+
if ssl_cert_reqs is not None:
|
|
80
|
+
ssl_kwargs["ssl_cert_reqs"] = ssl_cert_reqs
|
|
81
|
+
if settings.ssl_ca_certs:
|
|
82
|
+
ssl_kwargs["ssl_ca_certs"] = settings.ssl_ca_certs
|
|
83
|
+
if settings.ssl_certfile:
|
|
84
|
+
ssl_kwargs["ssl_certfile"] = settings.ssl_certfile
|
|
85
|
+
if settings.ssl_keyfile:
|
|
86
|
+
ssl_kwargs["ssl_keyfile"] = settings.ssl_keyfile
|
|
87
|
+
|
|
88
|
+
return ssl_kwargs
|
|
43
89
|
|
|
44
90
|
@staticmethod
|
|
45
91
|
def _to_str(file_name: str, file_status: Status) -> str:
|
|
@@ -14,6 +14,22 @@ class KeyValueSettings(BaseSettings):
|
|
|
14
14
|
The hostname of the key value store.
|
|
15
15
|
port : int
|
|
16
16
|
The port number of the key value store.
|
|
17
|
+
username : str | None
|
|
18
|
+
Optional username for authenticating with the key value store.
|
|
19
|
+
password : str | None
|
|
20
|
+
Optional password for authenticating with the key value store.
|
|
21
|
+
use_ssl : bool
|
|
22
|
+
Whether to use SSL/TLS when connecting to the key value store.
|
|
23
|
+
ssl_cert_reqs : str | None
|
|
24
|
+
SSL certificate requirement level (e.g., 'required', 'optional', 'none').
|
|
25
|
+
ssl_ca_certs : str | None
|
|
26
|
+
Path to a CA bundle file for verifying the server certificate.
|
|
27
|
+
ssl_certfile : str | None
|
|
28
|
+
Path to the client SSL certificate file (if mutual TLS is required).
|
|
29
|
+
ssl_keyfile : str | None
|
|
30
|
+
Path to the client SSL private key file (if mutual TLS is required).
|
|
31
|
+
ssl_check_hostname : bool
|
|
32
|
+
Whether to verify the server hostname against the certificate.
|
|
17
33
|
"""
|
|
18
34
|
|
|
19
35
|
class Config:
|
|
@@ -24,3 +40,11 @@ class KeyValueSettings(BaseSettings):
|
|
|
24
40
|
|
|
25
41
|
host: str = Field()
|
|
26
42
|
port: int = Field()
|
|
43
|
+
username: str | None = Field(default=None)
|
|
44
|
+
password: str | None = Field(default=None)
|
|
45
|
+
use_ssl: bool = Field(default=False)
|
|
46
|
+
ssl_cert_reqs: str | None = Field(default=None)
|
|
47
|
+
ssl_ca_certs: str | None = Field(default=None)
|
|
48
|
+
ssl_certfile: str | None = Field(default=None)
|
|
49
|
+
ssl_keyfile: str | None = Field(default=None)
|
|
50
|
+
ssl_check_hostname: bool = Field(default=True)
|
|
@@ -4,9 +4,9 @@ import asyncio
|
|
|
4
4
|
import logging
|
|
5
5
|
from typing import Optional
|
|
6
6
|
|
|
7
|
-
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
8
7
|
from langchain_core.documents import Document
|
|
9
8
|
from langchain_core.runnables import Runnable, RunnableConfig, ensure_config
|
|
9
|
+
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
|
10
10
|
from openai import APIConnectionError, APIError, APITimeoutError, RateLimitError
|
|
11
11
|
|
|
12
12
|
from admin_api_lib.impl.settings.summarizer_settings import SummarizerSettings
|
|
@@ -44,6 +44,24 @@ class LangchainSummarizer(Summarizer):
|
|
|
44
44
|
self._semaphore = semaphore
|
|
45
45
|
self._retry_decorator_settings = create_retry_decorator_settings(summarizer_settings, retry_decorator_settings)
|
|
46
46
|
|
|
47
|
+
@staticmethod
|
|
48
|
+
def _parse_max_concurrency(config: RunnableConfig) -> Optional[int]:
|
|
49
|
+
"""Parse max concurrency from a RunnableConfig.
|
|
50
|
+
|
|
51
|
+
Returns
|
|
52
|
+
-------
|
|
53
|
+
Optional[int]
|
|
54
|
+
An integer >= 1 if configured and valid, otherwise None.
|
|
55
|
+
"""
|
|
56
|
+
max_concurrency = config.get("max_concurrency")
|
|
57
|
+
if max_concurrency is None:
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
return max(1, int(max_concurrency))
|
|
62
|
+
except (TypeError, ValueError):
|
|
63
|
+
return None
|
|
64
|
+
|
|
47
65
|
async def ainvoke(self, query: SummarizerInput, config: Optional[RunnableConfig] = None) -> SummarizerOutput:
|
|
48
66
|
"""
|
|
49
67
|
Asynchronously invokes the summarization process on the given query.
|
|
@@ -77,9 +95,8 @@ class LangchainSummarizer(Summarizer):
|
|
|
77
95
|
langchain_documents = self._chunker.split_documents([document])
|
|
78
96
|
logger.debug("Summarizing %d chunk(s)...", len(langchain_documents))
|
|
79
97
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
outputs = await asyncio.gather(*tasks)
|
|
98
|
+
max_concurrency = self._parse_max_concurrency(config)
|
|
99
|
+
outputs = await self._summarize_documents(langchain_documents, config, max_concurrency=max_concurrency)
|
|
83
100
|
|
|
84
101
|
if len(outputs) == 1:
|
|
85
102
|
return outputs[0]
|
|
@@ -93,6 +110,34 @@ class LangchainSummarizer(Summarizer):
|
|
|
93
110
|
)
|
|
94
111
|
return await self._summarize_chunk(merged, config)
|
|
95
112
|
|
|
113
|
+
async def _summarize_documents(
|
|
114
|
+
self,
|
|
115
|
+
documents: list[Document],
|
|
116
|
+
config: RunnableConfig,
|
|
117
|
+
*,
|
|
118
|
+
max_concurrency: Optional[int],
|
|
119
|
+
) -> list[SummarizerOutput]:
|
|
120
|
+
"""Summarize a set of already-chunked documents.
|
|
121
|
+
|
|
122
|
+
Notes
|
|
123
|
+
-----
|
|
124
|
+
This optionally limits task fan-out using a per-call semaphore (max_concurrency).
|
|
125
|
+
The actual LLM call concurrency is always bounded by the instance semaphore held
|
|
126
|
+
inside `_summarize_chunk`.
|
|
127
|
+
"""
|
|
128
|
+
if max_concurrency == 1:
|
|
129
|
+
return [await self._summarize_chunk(doc.page_content, config) for doc in documents]
|
|
130
|
+
|
|
131
|
+
limiter: asyncio.Semaphore | None = asyncio.Semaphore(max_concurrency) if max_concurrency is not None else None
|
|
132
|
+
|
|
133
|
+
async def _run(doc: Document) -> SummarizerOutput:
|
|
134
|
+
if limiter is None:
|
|
135
|
+
return await self._summarize_chunk(doc.page_content, config)
|
|
136
|
+
async with limiter:
|
|
137
|
+
return await self._summarize_chunk(doc.page_content, config)
|
|
138
|
+
|
|
139
|
+
return await asyncio.gather(*(_run(doc) for doc in documents))
|
|
140
|
+
|
|
96
141
|
def _create_chain(self) -> Runnable:
|
|
97
142
|
return self._langfuse_manager.get_base_prompt(self.__class__.__name__) | self._langfuse_manager.get_base_llm(
|
|
98
143
|
self.__class__.__name__
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: admin-api-lib
|
|
3
|
-
Version:
|
|
3
|
+
Version: 4.0.0
|
|
4
4
|
Summary: The admin backend is responsible for the document management. This includes deletion, upload and returning the source document.
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Author: STACKIT GmbH & Co. KG
|
|
@@ -11,19 +11,19 @@ Requires-Python: >=3.13,<4.0
|
|
|
11
11
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
15
14
|
Requires-Dist: boto3 (>=1.38.10,<2.0.0)
|
|
16
15
|
Requires-Dist: dependency-injector (>=4.46.0,<5.0.0)
|
|
17
|
-
Requires-Dist: fastapi (>=0.
|
|
18
|
-
Requires-Dist: langchain-experimental (>=0.
|
|
19
|
-
Requires-Dist: langfuse (
|
|
16
|
+
Requires-Dist: fastapi (>=0.121.2,<0.122.0)
|
|
17
|
+
Requires-Dist: langchain-experimental (>=0.4.0,<0.5.0)
|
|
18
|
+
Requires-Dist: langfuse (>=3.10.1,<4.0.0)
|
|
19
|
+
Requires-Dist: langgraph-checkpoint (>=3.0.0,<4.0.0)
|
|
20
20
|
Requires-Dist: nltk (>=3.9.2,<4.0.0)
|
|
21
21
|
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
22
22
|
Requires-Dist: python-multipart (>=0.0.20,<0.0.21)
|
|
23
23
|
Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
24
|
-
Requires-Dist: rag-core-lib (==
|
|
24
|
+
Requires-Dist: rag-core-lib (==4.0.0)
|
|
25
25
|
Requires-Dist: redis (>=6.0.0,<7.0.0)
|
|
26
|
-
Requires-Dist: starlette (>=0.
|
|
26
|
+
Requires-Dist: starlette (>=0.49.1)
|
|
27
27
|
Requires-Dist: tenacity (==9.1.2)
|
|
28
28
|
Requires-Dist: tqdm (>=4.67.1,<5.0.0)
|
|
29
29
|
Requires-Dist: uvicorn (>=0.37.0,<0.38.0)
|
|
@@ -100,6 +100,8 @@ All settings are powered by `pydantic-settings`, so you can use environment vari
|
|
|
100
100
|
- `SUMMARIZER_MAXIMUM_INPUT_SIZE`, `SUMMARIZER_MAXIMUM_CONCURRENCY`, `SUMMARIZER_MAX_RETRIES`, etc. – tune summariser limits and retry behaviour.
|
|
101
101
|
- `SOURCE_UPLOADER_TIMEOUT` – adjust how long non-file source ingestions wait before timing out.
|
|
102
102
|
- `USECASE_KEYVALUE_HOST` / `USECASE_KEYVALUE_PORT` – configure the KeyDB/Redis instance that persists document status.
|
|
103
|
+
- `USECASE_KEYVALUE_USERNAME` / `USECASE_KEYVALUE_PASSWORD` – optional credentials for authenticating against KeyDB/Redis.
|
|
104
|
+
- `USECASE_KEYVALUE_USE_SSL`, `USECASE_KEYVALUE_SSL_CERT_REQS`, `USECASE_KEYVALUE_SSL_CA_CERTS`, `USECASE_KEYVALUE_SSL_CERTFILE`, `USECASE_KEYVALUE_SSL_KEYFILE`, `USECASE_KEYVALUE_SSL_CHECK_HOSTNAME` – optional TLS settings for managed Redis deployments (e.g., STACKIT Redis or other SSL-only endpoints).
|
|
103
105
|
|
|
104
106
|
The Helm chart forwards these values through `adminBackend.envs.*`, keeping deployments declarative. Local development can rely on `.env` as described in the repository root README.
|
|
105
107
|
|
|
@@ -10,7 +10,7 @@ admin_api_lib/apis/admin_api.py,sha256=RaeVO7A-IW_1kntw19RVUbKAI_BDIQExmgzAAZ5T3
|
|
|
10
10
|
admin_api_lib/apis/admin_api_base.py,sha256=20M8U8dM91pJa2Wqx_UZTjpU0XCHIffVRac-_KJRMmk,3094
|
|
11
11
|
admin_api_lib/chunker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
admin_api_lib/chunker/chunker.py,sha256=R2mxwmvz8o3iNzGHaLoMERcsIh82x88ZkKndbRNU-7U,627
|
|
13
|
-
admin_api_lib/dependency_container.py,sha256=
|
|
13
|
+
admin_api_lib/dependency_container.py,sha256=E4iupfqq3B60edfOTi-YqkvbSD4ARXmJGLAHXFuZspg,10127
|
|
14
14
|
admin_api_lib/extractor_api_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
admin_api_lib/extractor_api_client/openapi_client/__init__.py,sha256=ha9QCyCZq3PJKz7pQpTtI0bBypqj6E3Bg1pi7vBIazo,1823
|
|
16
16
|
admin_api_lib/extractor_api_client/openapi_client/api/__init__.py,sha256=6THi7hHMLnN46_cLbVVamrTv-Ab_Wsn4b5YBkhrk65U,140
|
|
@@ -40,31 +40,31 @@ admin_api_lib/impl/api_endpoints/default_document_deleter.py,sha256=iKqBnk6bFRsZ
|
|
|
40
40
|
admin_api_lib/impl/api_endpoints/default_document_reference_retriever.py,sha256=H3bQvpMLMjsyUzZMfTziPW7qU3N9D5s6DMKEA4fMITM,2642
|
|
41
41
|
admin_api_lib/impl/api_endpoints/default_documents_status_retriever.py,sha256=ZtLNgmFWGcfU4jNhVPiAKIJT701Z4wVwQAWpPbegxfc,1419
|
|
42
42
|
admin_api_lib/impl/api_endpoints/default_file_uploader.py,sha256=hfBPI1dgY-KUk_7dZU6yU04bbAMxn4hPKOQtxBBg5Ts,9613
|
|
43
|
-
admin_api_lib/impl/api_endpoints/default_source_uploader.py,sha256
|
|
43
|
+
admin_api_lib/impl/api_endpoints/default_source_uploader.py,sha256=-K78-jkKSCrQDhBOMc3Y_qEXVRdM0IpRY_Gf8ad1-W4,8708
|
|
44
44
|
admin_api_lib/impl/chunker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
45
|
admin_api_lib/impl/chunker/chunker_type.py,sha256=ArEAmQ9OWe3ek7FMb2auFvGk4UXsOr3xzjyB5TXI2i8,247
|
|
46
46
|
admin_api_lib/impl/chunker/semantic_text_chunker.py,sha256=VrbHpY867gQPtMhz6HjqstdBQ-e74kwce_Ma-9LVsJo,10605
|
|
47
|
-
admin_api_lib/impl/chunker/text_chunker.py,sha256=
|
|
47
|
+
admin_api_lib/impl/chunker/text_chunker.py,sha256=0WC1EsvkqHI16IeopTvrx0Y2XQmXscUFCT8-z6h5nOY,1076
|
|
48
48
|
admin_api_lib/impl/file_services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
49
|
admin_api_lib/impl/file_services/s3_service.py,sha256=IB68Av69mkkcf4KuXpxnbaJVJuMKHL82zIwuBw94pXg,4428
|
|
50
50
|
admin_api_lib/impl/information_enhancer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
51
|
admin_api_lib/impl/information_enhancer/general_enhancer.py,sha256=H4mVxYEGW2owdCcUwbh7z132PTxa3dZssRL0MDJg56Q,1889
|
|
52
|
-
admin_api_lib/impl/information_enhancer/page_summary_enhancer.py,sha256=
|
|
52
|
+
admin_api_lib/impl/information_enhancer/page_summary_enhancer.py,sha256=Ve0KjQMdxESLi2K3-fgZcHf2xMWNeJkfxvcbJCajWJo,4652
|
|
53
53
|
admin_api_lib/impl/information_enhancer/summary_enhancer.py,sha256=CdsE4KGTfui6nBBABwBcEQJ-1SBrPwN7Pk77zPUxGBk,2704
|
|
54
54
|
admin_api_lib/impl/key_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
|
-
admin_api_lib/impl/key_db/file_status_key_value_store.py,sha256=
|
|
55
|
+
admin_api_lib/impl/key_db/file_status_key_value_store.py,sha256=FSmenxyJx7hMWY9rNocAF7zf4zU_iowR3T-JjGyhjNU,5328
|
|
56
56
|
admin_api_lib/impl/mapper/informationpiece2document.py,sha256=dMngfdjBV2JkUtamypwmBvJVWdWcZhXn_XnBmGQLCxg,3924
|
|
57
57
|
admin_api_lib/impl/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
58
58
|
admin_api_lib/impl/settings/chunker_class_type_settings.py,sha256=w7cgOB2hBattRqIbrQLMBXsPX2UZpmzxnI6n5DrcO2k,541
|
|
59
59
|
admin_api_lib/impl/settings/chunker_settings.py,sha256=TLBPY-PLmCuly8mMgGIlm3gU9FzzyhCgmLdTcfV3vAg,814
|
|
60
60
|
admin_api_lib/impl/settings/document_extractor_settings.py,sha256=gYbdk6M4dwTL9esWfemGGHEJYOdV9BT7c8zGBKLbjlU,520
|
|
61
|
-
admin_api_lib/impl/settings/key_value_settings.py,sha256=
|
|
61
|
+
admin_api_lib/impl/settings/key_value_settings.py,sha256=jokWtwXLwN4_yPaWwmVxJOSKwyR43hzQtQhKqAnIBrw,1789
|
|
62
62
|
admin_api_lib/impl/settings/rag_api_settings.py,sha256=YMxnsiMLjZBQZ2a6C3kZuVgqd42_w4JUC9dTkHnwuaU,484
|
|
63
63
|
admin_api_lib/impl/settings/s3_settings.py,sha256=e5vOOfJRp_22gtG13vf4iXedHXm3E1egLq8t_Ix_AYg,666
|
|
64
64
|
admin_api_lib/impl/settings/source_uploader_settings.py,sha256=ZCVFI3TgSZpVjBVTcJw9QSyTBLvqzYsJ41vpihtI7pY,582
|
|
65
65
|
admin_api_lib/impl/settings/summarizer_settings.py,sha256=NGZ0o25dp7GkfOSAzcoCDSQrpUqiGe28Oi05ho2MAZ8,2895
|
|
66
66
|
admin_api_lib/impl/summarizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
67
|
-
admin_api_lib/impl/summarizer/langchain_summarizer.py,sha256=
|
|
67
|
+
admin_api_lib/impl/summarizer/langchain_summarizer.py,sha256=VIsUo4dI3Ebil5lnX4uY6Rdqs8CKlxk9Vvmb9Lx1K5Y,6264
|
|
68
68
|
admin_api_lib/information_enhancer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
69
69
|
admin_api_lib/information_enhancer/information_enhancer.py,sha256=Bp2fQ3lvOmj192QmSH5NItseyDhWczzCHoeABVx4D3w,1155
|
|
70
70
|
admin_api_lib/main.py,sha256=33fiCU05aKAxz9zaO0YtM2dynLxvJxMJn_4Cf6zk4q8,1582
|
|
@@ -101,6 +101,6 @@ admin_api_lib/summarizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
101
101
|
admin_api_lib/summarizer/summarizer.py,sha256=D0rkW0iZSys-68LcO1-PIkE0Faf2Grg-_9wu75Rc1OY,966
|
|
102
102
|
admin_api_lib/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
103
103
|
admin_api_lib/utils/utils.py,sha256=eaNQ_NzUEp4hwhCU9EEsUXvbRH_ekVariF7tTsO9Sco,834
|
|
104
|
-
admin_api_lib-
|
|
105
|
-
admin_api_lib-
|
|
106
|
-
admin_api_lib-
|
|
104
|
+
admin_api_lib-4.0.0.dist-info/METADATA,sha256=EcuMQqTXIsCgk8U-lesJoznxJR3cTKFEbiegdyIns80,7900
|
|
105
|
+
admin_api_lib-4.0.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
106
|
+
admin_api_lib-4.0.0.dist-info/RECORD,,
|