diff --git a/app/app.py b/app/app.py index 150add8..a1afd69 100644 --- a/app/app.py +++ b/app/app.py @@ -17,7 +17,7 @@ # Configure logging logging.basicConfig( - level=logging.INFO, + level=logging.DEBUG if os.getenv('DEBUG') else logging.INFO, format="%(asctime)s %(levelname)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) diff --git a/app/rag_system.py b/app/rag_system.py index 52a3a69..32f2900 100644 --- a/app/rag_system.py +++ b/app/rag_system.py @@ -146,6 +146,7 @@ def answer_query_stream(self, query): messages.extend(self.conversation_history) try: + logging.debug(f"Sending query to LLM: {normalized_query}") stream = openai.ChatCompletion.create( model=os.getenv("MODEL"), messages=messages, @@ -159,15 +160,30 @@ def answer_query_stream(self, query): collected_messages = [] for chunk in stream: - logging.info(f"Received chunk: {chunk}") - content = chunk['choices'][0]['delta'].get('content', '') - collected_messages.append(content) - yield content - if chunk['choices'][0].get('finish_reason') is not None: + try: + logging.debug(f"Received chunk: {chunk}") + content = chunk['choices'][0]['delta'].get('content', '') + collected_messages.append(content) + yield content + if chunk['choices'][0].get('finish_reason') is not None: + break + except (BrokenPipeError, OSError) as e: + # Client disconnected, stop streaming + logging.warning(f"Client disconnected during streaming: {e}") + traceback.print_exc(file=sys.stderr) break + + logging.debug(f"Finished receiving response: {normalized_query}") + if len(citations) > 0: - yield "\n\nReferences:\n" + "\n".join(citations) + try: + yield "\n\nReferences:\n" + "\n".join(citations) + except (BrokenPipeError, OSError) as e: + # Client disconnected, stop streaming + logging.warning(f"Client disconnected during citations streaming: {e}") + traceback.print_exc(file=sys.stderr) + full_response = ''.join(collected_messages).strip() self.conversation_history.append({"role": "assistant", "content": full_response}) @@ -175,7 +191,11 @@ def answer_query_stream(self, query): except Exception as e: print(f"Error in answer_query_stream: {e}", file=sys.stderr) traceback.print_exc(file=sys.stderr) - yield "An error occurred while generating the response." + try: + yield "An error occurred while generating the response." + except (BrokenPipeError, OSError): + # Client disconnected, can't send error message + logging.warning("Client disconnected before error message could be sent") def clear_conversation_history(self): self.conversation_history = []