|
# retoor <retoor@molodetz.nl>
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import logging
|
|
from typing import Any
|
|
|
|
from ..config import Settings
|
|
from ..errors import ToolInputError
|
|
|
|
logger = logging.getLogger("devii.docs")
|
|
|
|
DEFAULT_MAX_RESULTS = 5
|
|
CONTENT_CHARS = 2400
|
|
|
|
|
|
class DocsController:
|
|
def __init__(self, settings: Settings, is_admin: bool = False) -> None:
|
|
self._settings = settings
|
|
self._is_admin = is_admin
|
|
|
|
async def dispatch(self, name: str, arguments: dict[str, Any]) -> str:
|
|
if name != "search_docs":
|
|
raise ToolInputError(f"Unknown docs tool: {name}")
|
|
return await self._search(arguments)
|
|
|
|
async def _search(self, arguments: dict[str, Any]) -> str:
|
|
from devplacepy import docs_search
|
|
|
|
query = str(arguments.get("query", "")).strip()
|
|
if not query:
|
|
raise ToolInputError("search_docs requires a query.")
|
|
max_results = int(
|
|
arguments.get("max_results", DEFAULT_MAX_RESULTS) or DEFAULT_MAX_RESULTS
|
|
)
|
|
max_results = max(1, min(max_results, 10))
|
|
|
|
results = docs_search.search_pages(
|
|
query,
|
|
user=None,
|
|
is_admin=self._is_admin,
|
|
limit=max_results,
|
|
content_chars=CONTENT_CHARS,
|
|
)
|
|
return json.dumps(
|
|
{
|
|
"status": "success",
|
|
"query": query,
|
|
"count": len(results),
|
|
"results": results,
|
|
},
|
|
ensure_ascii=False,
|
|
)
|