diff --git a/requirements.txt b/requirements.txt index 65bcfd1..bf0dfdc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # GPT Researcher dependencies -gpt-researcher>=0.12.16 +gpt-researcher>=0.13.3 python-dotenv~=1.1.0 # MCP dependencies diff --git a/src/phoenix_technologies/gpt_researcher/server.py b/src/phoenix_technologies/gpt_researcher/server.py index 9c87921..2589571 100644 --- a/src/phoenix_technologies/gpt_researcher/server.py +++ b/src/phoenix_technologies/gpt_researcher/server.py @@ -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()