mirror of
https://github.com/deepset-ai/haystack.git
synced 2025-07-23 17:00:41 +00:00

* Files moved, imports all broken * Fix most imports and docstrings into * Fix the paths to the modules in the API docs * Add latest docstring and tutorial changes * Add a few pipelines that were lost in the inports * Fix a bunch of mypy warnings * Add latest docstring and tutorial changes * Create a file_classifier module * Add docs for file_classifier * Fixed most circular imports, now the REST API can start * Add latest docstring and tutorial changes * Tackling more mypy issues * Reintroduce from FARM and fix last mypy issues hopefully * Re-enable old-style imports * Fix some more import from the top-level package in an attempt to sort out circular imports * Fix some imports in tests to new-style to prevent failed class equalities from breaking tests * Change document_store into document_stores * Update imports in tutorials * Add latest docstring and tutorial changes * Probably fixes summarizer tests * Improve the old-style import allowing module imports (should work) * Try to fix the docs * Remove dedicated KnowledgeGraph page from autodocs * Remove dedicated GraphRetriever page from autodocs * Fix generate_docstrings.sh with an updated list of yaml files to look for * Fix some more modules in the docs * Fix the document stores docs too * Fix a small issue on Tutorial14 * Add latest docstring and tutorial changes * Add deprecation warning to old-style imports * Remove stray folder and import Dict into dense.py * Change import path for MLFlowLogger * Add old loggers path to the import path aliases * Fix debug output of convert_ipynb.py * Fix circular import on BaseRetriever * Missed one merge block * re-run tutorial 5 * Fix imports in tutorial 5 * Re-enable squad_to_dpr CLI from the root package and move get_batches_from_generator into document_stores.base * Add latest docstring and tutorial changes * Fix typo in utils __init__ * Fix a few more imports * Fix benchmarks too * New-style imports in test_knowledge_graph * Rollback setup.py * Rollback squad_to_dpr too Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
import logging
|
|
import time
|
|
from pathlib import Path
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from haystack.pipelines.base import Pipeline
|
|
from rest_api.config import PIPELINE_YAML_PATH, QUERY_PIPELINE_NAME
|
|
from rest_api.config import LOG_LEVEL, CONCURRENT_REQUEST_PER_WORKER
|
|
from rest_api.schema import QueryRequest, QueryResponse
|
|
from rest_api.controller.utils import RequestLimiter
|
|
|
|
|
|
logging.getLogger("haystack").setLevel(LOG_LEVEL)
|
|
logger = logging.getLogger("haystack")
|
|
|
|
from pydantic import BaseConfig
|
|
|
|
BaseConfig.arbitrary_types_allowed = True
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
PIPELINE = Pipeline.load_from_yaml(Path(PIPELINE_YAML_PATH), pipeline_name=QUERY_PIPELINE_NAME)
|
|
# TODO make this generic for other pipelines with different naming
|
|
RETRIEVER = PIPELINE.get_node(name="Retriever")
|
|
DOCUMENT_STORE = RETRIEVER.document_store if RETRIEVER else None
|
|
logging.info(f"Loaded pipeline nodes: {PIPELINE.graph.nodes.keys()}")
|
|
|
|
concurrency_limiter = RequestLimiter(CONCURRENT_REQUEST_PER_WORKER)
|
|
|
|
|
|
@router.get("/initialized")
|
|
def initialized():
|
|
"""
|
|
This endpoint can be used during startup to understand if the
|
|
server is ready to take any requests, or is still loading.
|
|
|
|
The recommended approach is to call this endpoint with a short timeout,
|
|
like 500ms, and in case of no reply, consider the server busy.
|
|
"""
|
|
return True
|
|
|
|
|
|
@router.post("/query", response_model=QueryResponse)
|
|
def query(request: QueryRequest):
|
|
with concurrency_limiter.run():
|
|
result = _process_request(PIPELINE, request)
|
|
return result
|
|
|
|
|
|
def _process_request(pipeline, request) -> QueryResponse:
|
|
start_time = time.time()
|
|
|
|
params = request.params or {}
|
|
params["Retriever"] = params.get("Retriever", {})
|
|
filters = {}
|
|
if "filters" in params["Retriever"]: # put filter values into a list and remove filters with null value
|
|
for key, values in params["Retriever"]["filters"].items():
|
|
if values is None:
|
|
continue
|
|
if not isinstance(values, list):
|
|
values = [values]
|
|
filters[key] = values
|
|
params["Retriever"]["filters"] = filters
|
|
result = pipeline.run(query=request.query, params=params)
|
|
|
|
end_time = time.time()
|
|
logger.info({"request": request.dict(), "response": result, "time": f"{(end_time - start_time):.2f}"})
|
|
|
|
return result
|