Implement recursion check in response generation

Added a safety check to prevent infinite recursion within the response generation function. When `use_tools` is active, the code now inspects the call stack and terminates the process if a certain recursion depth is exceeded. This ensures that the code is robust against potential infinite loops that could block or crash the service. A default threshold is set with a TODO for revisiting the hard-coded limit, and the recursion detection logs the occurrence for easier debugging and maintenance.

Note: Recursion limit handling may require future adjustments to the `allow_override` parameter based on real-world feedback or testing.
This commit is contained in:
Kumi 2023-12-29 22:56:22 +01:00
parent 0acc1456f9
commit e6bc23e564
Signed by: kumi
GPG key ID: ECBCC9082395383F

View file

@ -5,6 +5,7 @@ import tiktoken
import asyncio import asyncio
import json import json
import base64 import base64
import inspect
from functools import partial from functools import partial
from contextlib import closing from contextlib import closing
@ -140,6 +141,24 @@ class OpenAI:
f"Generating response to {len(messages)} messages for user {user} in room {room}..." f"Generating response to {len(messages)} messages for user {user} in room {room}..."
) )
# Check current recursion depth to prevent infinite loops
if use_tools:
frames = inspect.stack()
current_function = inspect.getframeinfo(frames[0][0]).function
count = sum(1 for frame in frames if inspect.getframeinfo(frame[0]).function == current_function)
self.logger.log(f"{current_function} appears {count} times in the call stack")
if count > 5:
self.logger.log(f"Recursion depth exceeded, aborting.")
return self.generate_chat_response(
messages,
user=user,
room=room,
allow_override=False, # TODO: Could this be a problem?
use_tools=False,
)
tools = [ tools = [
{ {
"type": "function", "type": "function",