Refactor quick_search to support SSE response streaming.

Updated `quick_search` to return an `AsyncGenerator` for streaming server-sent events (SSE) during quick research execution. Enhanced error handling to provide detailed feedback and upgraded `gpt-researcher` dependency to version 0.13.3 for compatibility.
This commit is contained in:
ThomasTaroni 2025-06-01 12:56:34 +02:00
parent d66bb1cd7a
commit 1b60eb0ae6
2 changed files with 24 additions and 6 deletions

View file

@ -1,5 +1,5 @@
# GPT Researcher dependencies
gpt-researcher>=0.12.16
gpt-researcher>=0.13.3
python-dotenv~=1.1.0
# MCP dependencies

View file

@ -162,7 +162,7 @@ async def deep_research(query: str) -> AsyncGenerator[str, None]:
"status": "Research completed successfully",
"source_count": len(sources),
"context": context,
"sources": format_sources_for_response(sources), # Nutze deine Formatierungsfunktion
"sources": format_sources_for_response(sources),
"source_urls": source_urls
}
@ -185,7 +185,7 @@ async def deep_research(query: str) -> AsyncGenerator[str, None]:
# oder die Exception weiter werfen, wenn FastMCP das besser handhabt.
@mcp.tool()
async def quick_search(query: str) -> Dict[str, Any]:
async def quick_search(query: str) -> AsyncGenerator[str, None]:
"""
Perform a quick web search on a given query and return search results with snippets.
This optimizes for speed over quality and is useful when an LLM doesn't need in-depth
@ -206,19 +206,37 @@ async def quick_search(query: str) -> Dict[str, Any]:
researcher = GPTResearcher(query)
try:
yield format_sse_event(
"message",
{"research_id": search_id, "query": query, "status": "Research initiated"}
)
# Perform quick search
search_results = await researcher.quick_search(query=query)
mcp.researchers[search_id] = researcher
logger.info(f"Quick search completed for ID: {search_id}")
return create_success_response({
final_data_payload = {
"search_id": search_id,
"query": query,
"result_count": len(search_results) if search_results else 0,
"search_results": search_results
})
}
# Sende das finale Ergebnis als 'tool_result' Event
yield format_sse_event("message", final_data_payload)
logger.info(f"Sent final research result for ID: {search_id}")
except Exception as e:
return handle_exception(e, "Quick search")
logger.error(f"Error during deep_research for query '{query}': {e}", exc_info=True)
# Sende ein Fehler-Event an den Client
error_payload = {
"research_id": search_id, # Kann None sein, wenn Fehler sehr früh auftritt
"query": query,
"status": "Error occurred",
"error_message": str(e),
"error_details": "Check server logs for more information."
}
yield format_sse_event("message", error_payload)
@mcp.tool()