fed8b2eed7
Backend release / release (push) Waiting to run
Bandit Security Scan / bandit_scan (push) Waiting to run
Build and push multi-arch DocsGPT Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Waiting to run
Build and push multi-arch DocsGPT Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Waiting to run
Build and push multi-arch DocsGPT Docker image / manifest (push) Blocked by required conditions
Build and push DocsGPT FE Docker image for development / build (linux/amd64, ubuntu-latest, amd64) (push) Waiting to run
Build and push DocsGPT FE Docker image for development / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Waiting to run
Build and push DocsGPT FE Docker image for development / manifest (push) Blocked by required conditions
Python linting / ruff (push) Waiting to run
Run python tests with pytest / Run tests and count coverage (3.12) (push) Waiting to run
React Widget Build / build (push) Waiting to run
56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
import logging
|
|
|
|
from flask import make_response, request
|
|
from flask_restx import fields, Resource
|
|
|
|
from application.api.answer.routes.base import answer_ns
|
|
from application.services.search_service import (
|
|
InvalidAPIKey,
|
|
SearchFailed,
|
|
search,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@answer_ns.route("/api/search")
|
|
class SearchResource(Resource):
|
|
"""Fast search endpoint for retrieving relevant documents."""
|
|
|
|
search_model = answer_ns.model(
|
|
"SearchModel",
|
|
{
|
|
"question": fields.String(
|
|
required=True, description="Search query"
|
|
),
|
|
"api_key": fields.String(
|
|
required=True, description="API key for authentication"
|
|
),
|
|
"chunks": fields.Integer(
|
|
required=False, default=5, description="Number of results to return"
|
|
),
|
|
},
|
|
)
|
|
|
|
@answer_ns.expect(search_model)
|
|
@answer_ns.doc(description="Search for relevant documents based on query")
|
|
def post(self):
|
|
data = request.get_json() or {}
|
|
|
|
question = data.get("question")
|
|
api_key = data.get("api_key")
|
|
chunks = data.get("chunks", 5)
|
|
|
|
if not question:
|
|
return make_response({"error": "question is required"}, 400)
|
|
if not api_key:
|
|
return make_response({"error": "api_key is required"}, 400)
|
|
|
|
try:
|
|
return make_response(search(api_key, question, chunks), 200)
|
|
except InvalidAPIKey:
|
|
return make_response({"error": "Invalid API key"}, 401)
|
|
except SearchFailed:
|
|
logger.exception("/api/search failed")
|
|
return make_response({"error": "Search failed"}, 500)
|