BUG: MemoryInterface.get_request_from_response fails with IndexError for non-zero starting sequence or sequence gaps
Les mainteneurs répondent en général sous 2 jours
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 25/100
Piste de recherche
The bug is in _execute_get_request_from_response in pyrit/memory/memory_interface.py, which indexes the conversation list by response.sequence - 1. Read _execute_get_conversation_messages to see how messages are ordered, then reproduce with the SQLite script in the issue. Pull request #3190 is already open against this issue, so check it before starting a new fix. Done means the method returns the message with the closest lower sequence, or raises a clear error when none exists.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
In pyrit/memory/memory_interface.py, MemoryInterface._execute_get_request_from_response retrieves the request that produced a given assistant response:
def _execute_get_request_from_response(self, *, response: Message) -> Message:
if response.api_role != "assistant":
raise ValueError("The provided request is not a response (role must be 'assistant').")
if response.sequence < 1:
raise ValueError("The provided request does not have a preceding request (sequence < 1).")
conversation = self._dispatch_memory_operation(
"get_conversation_messages",
self._execute_get_conversation_messages,
conversation_id=response.conversation_id,
)
return conversation[response.sequence - 1]
The method treats response.sequence - 1 as a 0-based list index into conversation. However, get_conversation_messages returns messages ordered by sequence (sorted(conversation_by_sequence.keys())), where list index corresponds to sequence number only if the conversation started at sequence 0 and contains no sequence gaps.
Whenever:
- A conversation starts at a non-zero sequence (e.g. using
starting_sequenceinSeedPrompt.from_messagesorSimulatedConversationAttack), or - A conversation contains sequence gaps (e.g. after pruning or retries where pieces were deleted),
calling get_request_from_response (or get_request_from_response_async, or DecodingScorer which invokes this method) raises:
IndexError: list index out of range (or returns the wrong message if the index exists but does not align).
Steps/Code to Reproduce
import asyncio
from uuid import uuid4
from pyrit.memory import SQLiteMemory
from pyrit.models import MessagePiece
async def test_reproduce():
memory = SQLiteMemory(db_path=":memory:")
conversation_id = str(uuid4())
# Create a conversation with starting_sequence=10
pieces = [
MessagePiece(
role="user",
original_value="What is the capital of France?",
conversation_id=conversation_id,
sequence=10,
),
MessagePiece(
role="assistant",
original_value="Paris.",
conversation_id=conversation_id,
sequence=11,
),
]
await memory.add_message_pieces_to_memory_async(message_pieces=pieces)
conversation = await memory.get_conversation_messages_async(conversation_id=conversation_id)
response = conversation[1] # sequence=11
# Attempt to retrieve the request that produced the response
await memory.get_request_from_response_async(response=response)
asyncio.run(test_reproduce())
Expected Results
get_request_from_response_async returns the message immediately preceding the response in the conversation timeline (Message(role='user', sequence=10, ...)).
Actual Results
Traceback (most recent call last):
...
File "pyrit/memory/memory_interface.py", line 3041, in _execute_get_request_from_response
return conversation[response.sequence - 1]
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
IndexError: list index out of range
Suggested Fix
Instead of assuming conversation index equals sequence - 1, locate the preceding message in conversation with sequence < response.sequence:
conversation = self._dispatch_memory_operation(
"get_conversation_messages",
self._execute_get_conversation_messages,
conversation_id=response.conversation_id,
)
preceding_messages = [msg for msg in conversation if msg.sequence < response.sequence]
if not preceding_messages:
raise ValueError(
f"The provided request does not have a preceding request in conversation '{response.conversation_id}'."
)
return preceding_messages[-1]
- Langage dominant
- Python
- Étoiles
- 4.6k
- Forks
- 944
- Merge moyen
- 2 j 17 h
- PR mergées (30 j)
- 328
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Aucun guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de microsoft/PyRIT
-
BUG UnicodeReplacementConverter writes characters outside the BMP as invalid five-digit \u escapesPeut-être pris @ShivamSharma43 l’a pris il y a 2 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
microsoft/PyRIT#3095 · 3 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
BUG Configuration keeps runtime-status errors after polling recoversPeut-être pris @joeyvictorino l’a pris il y a 3 jours. OuverteBug: triage GUI help wanted
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
microsoft/PyRIT#2868 · 4 commentaires · 1 personne assignée ·
Les mainteneurs répondent en général sous 2 jours
-
Conversation editor never revokes blob URLs of removed attachmentsPeut-être pris @ManoharPaturi l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 25/100
Les mainteneurs répondent en général sous 2 jours
-
Scenario progress double-counts an attack result after its timestamp is bumpedPeut-être pris @ManoharPaturi l’a pris aujourd’hui. Ouverte
Difficulté 3/5 Une demi-journée Accessibilité débutants 25/100
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de microsoft/PyRIT
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
onyx-dot-app/onyx#16016 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
black --check exits 0 and prints All done when a multi file run is interruptedPeut-être pris @jiteshgulati l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 2 jours
-
Non-positive worker counts wait for results without starting workersPeut-être pris @IlyaKhalafi l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour