MCPcopy Create free account
hub / github.com/nlweb-ai/NLWeb / GenerateAnswer

Class GenerateAnswer

AskAgent/python/methods/generate_answer.py:31–236  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

29
30
31class GenerateAnswer(NLWebHandler):
32
33 GATHER_ITEMS_THRESHOLD = 55
34
35 RANKING_PROMPT_NAME = "RankingPromptForGenerate"
36 SYNTHESIZE_PROMPT_NAME = "SynthesizePromptForGenerate"
37 DESCRIPTION_PROMPT_NAME = "DescriptionPromptForGenerate"
38
39 def __init__(self, query_params, handler):
40 super().__init__(query_params, handler)
41 self.items = []
42 self._results_lock = asyncio.Lock() # Add lock for thread-safe operations
43 logger.info(f"GenerateAnswer initialized with query_params: {query_params}")
44 log(f"GenerateAnswer query_params: {query_params}")
45
46 async def runQuery(self):
47 try:
48 logger.info(f"Starting query execution for conversation_id: {self.conversation_id}")
49 await self.prepare()
50 if (self.query_done):
51 logger.info("Query done prematurely")
52 return self.return_value
53 await self.get_ranked_answers()
54 self.return_value["conversation_id"] = self.conversation_id
55 logger.info(f"Query execution completed for conversation_id: {self.conversation_id}")
56 return self.return_value
57 except Exception as e:
58 logger.exception(f"Error in runQuery: {e}")
59 traceback.print_exc()
60 raise
61
62 async def prepare(self):
63 # runs the tasks that need to be done before retrieval, ranking, etc.
64 logger.info("Starting preparation phase")
65 tasks = []
66
67 # Adding all necessary preparation tasks
68 tasks.append(asyncio.create_task(analyze_query.DetectItemType(self).do()))
69 tasks.append(asyncio.create_task(self.decontextualizeQuery().do()))
70 tasks.append(asyncio.create_task(relevance_detection.RelevanceDetection(self).do()))
71 tasks.append(asyncio.create_task(memory.Memory(self).do()))
72 tasks.append(asyncio.create_task(required_info.RequiredInfo(self).do()))
73
74 try:
75 logger.debug(f"Running {len(tasks)} preparation tasks concurrently")
76 await asyncio.gather(*tasks, return_exceptions=True)
77 except Exception as e:
78 logger.exception(f"Error during preparation tasks: {e}")
79 finally:
80 self.pre_checks_done_event.set() # Signal completion regardless of errors
81 self.state.set_pre_checks_done()
82
83 logger.info("Preparation phase completed")
84
85 async def rankItem(self, url, json_str, name, site):
86 if not self.connection_alive_event.is_set():
87 logger.warning("Connection lost, skipping item ranking")
88 return

Callers 2

handle_streaming_askFunction · 0.90
handle_regular_askFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected