Add CI
All checks were successful
CI / lint (pull_request) Successful in 10s
CI / typecheck (pull_request) Successful in 11s
CI / test (pull_request) Successful in 25s

This commit is contained in:
2026-03-05 21:43:15 +00:00
parent 86ed34887b
commit d39b8a6ea7
17 changed files with 337 additions and 210 deletions

View File

@@ -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: