Add CI
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
# ruff: noqa: INP001
|
||||
"""MCP server for semantic search over Vertex AI Vector Search."""
|
||||
|
||||
import time
|
||||
@@ -9,7 +8,11 @@ from .config import _args
|
||||
from .logging import log_structured_entry
|
||||
from .models import AppContext, SourceNamespace
|
||||
from .server import lifespan
|
||||
from .services.search import filter_search_results, format_search_results, generate_query_embedding
|
||||
from .services.search import (
|
||||
filter_search_results,
|
||||
format_search_results,
|
||||
generate_query_embedding,
|
||||
)
|
||||
|
||||
mcp = FastMCP(
|
||||
"knowledge-search",
|
||||
@@ -44,7 +47,7 @@ async def knowledge_search(
|
||||
log_structured_entry(
|
||||
"knowledge_search request received",
|
||||
"INFO",
|
||||
{"query": query[:100]} # Log first 100 chars of query
|
||||
{"query": query[:100]}, # Log first 100 chars of query
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -61,7 +64,7 @@ async def knowledge_search(
|
||||
log_structured_entry(
|
||||
"Query embedding generated successfully",
|
||||
"INFO",
|
||||
{"time_ms": round((t_embed - t0) * 1000, 1)}
|
||||
{"time_ms": round((t_embed - t0) * 1000, 1)},
|
||||
)
|
||||
|
||||
# Perform vector search
|
||||
@@ -74,17 +77,13 @@ async def knowledge_search(
|
||||
source=source,
|
||||
)
|
||||
t_search = time.perf_counter()
|
||||
except Exception as e:
|
||||
except Exception as e: # noqa: BLE001
|
||||
log_structured_entry(
|
||||
"Vector search failed",
|
||||
"ERROR",
|
||||
{
|
||||
"error": str(e),
|
||||
"error_type": type(e).__name__,
|
||||
"query": query[:100]
|
||||
}
|
||||
{"error": str(e), "error_type": type(e).__name__, "query": query[:100]},
|
||||
)
|
||||
return f"Error performing vector search: {str(e)}"
|
||||
return f"Error performing vector search: {e!s}"
|
||||
|
||||
# Apply similarity filtering
|
||||
filtered_results = filter_search_results(search_results)
|
||||
@@ -98,32 +97,26 @@ async def knowledge_search(
|
||||
"total_ms": f"{round((t_search - t0) * 1000, 1)}ms",
|
||||
"source_filter": source.value if source is not None else None,
|
||||
"results_count": len(filtered_results),
|
||||
"chunks": [s["id"] for s in filtered_results]
|
||||
}
|
||||
"chunks": [s["id"] for s in filtered_results],
|
||||
},
|
||||
)
|
||||
|
||||
# Format and return results
|
||||
if not filtered_results:
|
||||
log_structured_entry(
|
||||
"No results found for query",
|
||||
"INFO",
|
||||
{"query": query[:100]}
|
||||
"No results found for query", "INFO", {"query": query[:100]}
|
||||
)
|
||||
|
||||
return format_search_results(filtered_results)
|
||||
|
||||
except Exception as e:
|
||||
except Exception as e: # noqa: BLE001
|
||||
# Catch-all for any unexpected errors
|
||||
log_structured_entry(
|
||||
"Unexpected error in knowledge_search",
|
||||
"ERROR",
|
||||
{
|
||||
"error": str(e),
|
||||
"error_type": type(e).__name__,
|
||||
"query": query[:100]
|
||||
}
|
||||
{"error": str(e), "error_type": type(e).__name__, "query": query[:100]},
|
||||
)
|
||||
return f"Unexpected error during search: {str(e)}"
|
||||
return f"Unexpected error during search: {e!s}"
|
||||
|
||||
|
||||
def main() -> None:
|
||||
|
||||
Reference in New Issue
Block a user