Rifqi Hafizuddin Claude Sonnet 4.6 commited on
Commit
23eeb2d
·
1 Parent(s): 2167a5b

[NOTICKET] pass orchestrator search_query to sql executor for multi-turn context

Browse files
Files changed (1) hide show
  1. src/api/v1/chat.py +5 -7
src/api/v1/chat.py CHANGED
@@ -202,6 +202,7 @@ async def chat_stream(request: ChatRequest, db: AsyncSession = Depends(get_db)):
202
  history = await history_task # fast DB query (<100ms), done before orchestrator finishes
203
  intent_result = await orchestrator.analyze_message(request.message, history)
204
 
 
205
  if not intent_result.get("needs_search"):
206
  retrieval_task.cancel()
207
  try:
@@ -210,7 +211,6 @@ async def chat_stream(request: ChatRequest, db: AsyncSession = Depends(get_db)):
210
  pass
211
  raw_results = []
212
  else:
213
- search_query = intent_result.get("search_query", request.message)
214
  logger.info(f"Searching for: {search_query}")
215
  if search_query != request.message:
216
  retrieval_task.cancel()
@@ -233,16 +233,14 @@ async def chat_stream(request: ChatRequest, db: AsyncSession = Depends(get_db)):
233
 
234
  source_hint = intent_result.get("source_hint", "both")
235
  if source_hint in ("schema", "both"):
236
- # Pass the user's raw natural-language question to the executor.
237
- # `search_query` is the orchestrator's rewrite for retrieval
238
- # keyword-heavy, stripped of intent structure and produces
239
- # worse SQL when fed to db_executor. Smoke-test parity with
240
- # `experiments/test_db_executor.py` requires the raw message.
241
  query_results = await query_executor.execute(
242
  results=raw_results,
243
  user_id=request.user_id,
244
  db=db,
245
- question=request.message,
246
  )
247
  query_context = _format_query_results(query_results)
248
  if query_context:
 
202
  history = await history_task # fast DB query (<100ms), done before orchestrator finishes
203
  intent_result = await orchestrator.analyze_message(request.message, history)
204
 
205
+ search_query = intent_result.get("search_query", request.message) or request.message
206
  if not intent_result.get("needs_search"):
207
  retrieval_task.cancel()
208
  try:
 
211
  pass
212
  raw_results = []
213
  else:
 
214
  logger.info(f"Searching for: {search_query}")
215
  if search_query != request.message:
216
  retrieval_task.cancel()
 
233
 
234
  source_hint = intent_result.get("source_hint", "both")
235
  if source_hint in ("schema", "both"):
236
+ # Use search_query (orchestrator's standalone rewrite) so follow-up
237
+ # messages like "dive deeper" or "show me last year" resolve correctly.
238
+ # For first-turn questions search_query == request.message, so no change.
 
 
239
  query_results = await query_executor.execute(
240
  results=raw_results,
241
  user_id=request.user_id,
242
  db=db,
243
+ question=search_query,
244
  )
245
  query_context = _format_query_results(query_results)
246
  if query_context: