forked from cardosofelipe/fast-next-template
refactor(knowledge-base mcp server): adjust formatting for consistency and readability
Improved code formatting, line breaks, and indentation across chunking logic and multiple test modules to enhance code clarity and maintain consistent style. No functional changes made.
This commit is contained in:
@@ -93,6 +93,7 @@ def _validate_source_path(value: str | None) -> str | None:
|
||||
|
||||
return None
|
||||
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
@@ -213,7 +214,9 @@ async def health_check() -> dict[str, Any]:
|
||||
if response.status_code == 200:
|
||||
status["dependencies"]["llm_gateway"] = "connected"
|
||||
else:
|
||||
status["dependencies"]["llm_gateway"] = f"unhealthy (status {response.status_code})"
|
||||
status["dependencies"]["llm_gateway"] = (
|
||||
f"unhealthy (status {response.status_code})"
|
||||
)
|
||||
is_degraded = True
|
||||
else:
|
||||
status["dependencies"]["llm_gateway"] = "not initialized"
|
||||
@@ -328,7 +331,9 @@ def _get_tool_schema(func: Any) -> dict[str, Any]:
|
||||
}
|
||||
|
||||
|
||||
def _register_tool(name: str, tool_or_func: Any, description: str | None = None) -> None:
|
||||
def _register_tool(
|
||||
name: str, tool_or_func: Any, description: str | None = None
|
||||
) -> None:
|
||||
"""Register a tool in the registry.
|
||||
|
||||
Handles both raw functions and FastMCP FunctionTool objects.
|
||||
@@ -337,7 +342,11 @@ def _register_tool(name: str, tool_or_func: Any, description: str | None = None)
|
||||
if hasattr(tool_or_func, "fn"):
|
||||
func = tool_or_func.fn
|
||||
# Use FunctionTool's description if available
|
||||
if not description and hasattr(tool_or_func, "description") and tool_or_func.description:
|
||||
if (
|
||||
not description
|
||||
and hasattr(tool_or_func, "description")
|
||||
and tool_or_func.description
|
||||
):
|
||||
description = tool_or_func.description
|
||||
else:
|
||||
func = tool_or_func
|
||||
@@ -358,11 +367,13 @@ async def list_mcp_tools() -> dict[str, Any]:
|
||||
"""
|
||||
tools = []
|
||||
for name, info in _tool_registry.items():
|
||||
tools.append({
|
||||
"name": name,
|
||||
"description": info["description"],
|
||||
"inputSchema": info["schema"],
|
||||
})
|
||||
tools.append(
|
||||
{
|
||||
"name": name,
|
||||
"description": info["description"],
|
||||
"inputSchema": info["schema"],
|
||||
}
|
||||
)
|
||||
|
||||
return {"tools": tools}
|
||||
|
||||
@@ -410,7 +421,10 @@ async def mcp_rpc(request: Request) -> JSONResponse:
|
||||
status_code=400,
|
||||
content={
|
||||
"jsonrpc": "2.0",
|
||||
"error": {"code": -32600, "message": "Invalid Request: jsonrpc must be '2.0'"},
|
||||
"error": {
|
||||
"code": -32600,
|
||||
"message": "Invalid Request: jsonrpc must be '2.0'",
|
||||
},
|
||||
"id": request_id,
|
||||
},
|
||||
)
|
||||
@@ -420,7 +434,10 @@ async def mcp_rpc(request: Request) -> JSONResponse:
|
||||
status_code=400,
|
||||
content={
|
||||
"jsonrpc": "2.0",
|
||||
"error": {"code": -32600, "message": "Invalid Request: method is required"},
|
||||
"error": {
|
||||
"code": -32600,
|
||||
"message": "Invalid Request: method is required",
|
||||
},
|
||||
"id": request_id,
|
||||
},
|
||||
)
|
||||
@@ -528,11 +545,23 @@ async def search_knowledge(
|
||||
try:
|
||||
# Validate inputs
|
||||
if error := _validate_id(project_id, "project_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_id(agent_id, "agent_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if collection and (error := _validate_collection(collection)):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
|
||||
# Parse search type
|
||||
try:
|
||||
@@ -644,13 +673,29 @@ async def ingest_content(
|
||||
try:
|
||||
# Validate inputs
|
||||
if error := _validate_id(project_id, "project_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_id(agent_id, "agent_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_collection(collection):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_source_path(source_path):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
|
||||
# Validate content size to prevent DoS
|
||||
settings = get_settings()
|
||||
@@ -750,13 +795,29 @@ async def delete_content(
|
||||
try:
|
||||
# Validate inputs
|
||||
if error := _validate_id(project_id, "project_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_id(agent_id, "agent_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if collection and (error := _validate_collection(collection)):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_source_path(source_path):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
|
||||
request = DeleteRequest(
|
||||
project_id=project_id,
|
||||
@@ -803,9 +864,17 @@ async def list_collections(
|
||||
try:
|
||||
# Validate inputs
|
||||
if error := _validate_id(project_id, "project_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_id(agent_id, "agent_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
|
||||
result = await _collections.list_collections(project_id) # type: ignore[union-attr]
|
||||
|
||||
@@ -856,11 +925,23 @@ async def get_collection_stats(
|
||||
try:
|
||||
# Validate inputs
|
||||
if error := _validate_id(project_id, "project_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_id(agent_id, "agent_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_collection(collection):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
|
||||
stats = await _collections.get_collection_stats(project_id, collection) # type: ignore[union-attr]
|
||||
|
||||
@@ -874,8 +955,12 @@ async def get_collection_stats(
|
||||
"avg_chunk_size": stats.avg_chunk_size,
|
||||
"chunk_types": stats.chunk_types,
|
||||
"file_types": stats.file_types,
|
||||
"oldest_chunk": stats.oldest_chunk.isoformat() if stats.oldest_chunk else None,
|
||||
"newest_chunk": stats.newest_chunk.isoformat() if stats.newest_chunk else None,
|
||||
"oldest_chunk": stats.oldest_chunk.isoformat()
|
||||
if stats.oldest_chunk
|
||||
else None,
|
||||
"newest_chunk": stats.newest_chunk.isoformat()
|
||||
if stats.newest_chunk
|
||||
else None,
|
||||
}
|
||||
|
||||
except KnowledgeBaseError as e:
|
||||
@@ -925,13 +1010,29 @@ async def update_document(
|
||||
try:
|
||||
# Validate inputs
|
||||
if error := _validate_id(project_id, "project_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_id(agent_id, "agent_id"):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_collection(collection):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
if error := _validate_source_path(source_path):
|
||||
return {"success": False, "error": error, "code": ErrorCode.INVALID_REQUEST.value}
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": ErrorCode.INVALID_REQUEST.value,
|
||||
}
|
||||
|
||||
# Validate content size to prevent DoS
|
||||
settings = get_settings()
|
||||
|
||||
Reference in New Issue
Block a user