Skip to content

Commit 0e42f5b

Browse files
romanlutzSarayu Poddutoori
authored andcommitted
MAINT improved error messages for target validation (Azure#984)
1 parent e5417ad commit 0e42f5b

18 files changed

+116
-73
lines changed

doc/code/orchestrators/xpia_helpers.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,21 @@ async def send_prompt_async(self, *, prompt_request: PromptRequestResponse) -> P
170170
return response
171171

172172
def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
173-
if len(prompt_request.request_pieces) != 1:
174-
raise ValueError("This target only supports a single prompt request piece.")
173+
n_pieces = len(prompt_request.request_pieces)
174+
if n_pieces != 1:
175+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")
175176

176-
if prompt_request.request_pieces[0].converted_value_data_type != "text":
177-
raise ValueError("This target only supports text prompt input.")
177+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
178+
if piece_type != "text":
179+
raise ValueError(f"This target only supports text prompt input. Received: {piece_type}.")
178180

179181
request = prompt_request.request_pieces[0]
180182
messages = self._memory.get_chat_messages_with_conversation_id(conversation_id=request.conversation_id)
181-
182-
if len(messages) > 0:
183-
raise ValueError("This target only supports a single turn conversation.")
183+
n_messages = len(messages)
184+
if n_messages > 0:
185+
raise ValueError(
186+
f"This target only supports a single turn conversation. Received {n_messages} messages which indicates a prior turn."
187+
)
184188

185189
def is_json_response_supported(self):
186190
"""Returns bool if JSON response is supported"""

pyrit/prompt_target/azure_blob_storage_target.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,13 @@ async def send_prompt_async(self, *, prompt_request: PromptRequestResponse) -> P
157157
return response
158158

159159
def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
160-
if len(prompt_request.request_pieces) != 1:
161-
raise ValueError("This target only supports a single prompt request piece.")
160+
n_pieces = len(prompt_request.request_pieces)
161+
if n_pieces != 1:
162+
raise ValueError(f"This target only supports a single prompt request piece. Received {n_pieces} pieces")
162163

163-
if prompt_request.request_pieces[0].converted_value_data_type not in ["text", "url"]:
164-
raise ValueError("This target only supports text and url prompt input.")
164+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
165+
if piece_type not in ["text", "url"]:
166+
raise ValueError(f"This target only supports text and url prompt input. Received: {piece_type}.")
165167

166168
request = prompt_request.request_pieces[0]
167169
messages = self._memory.get_chat_messages_with_conversation_id(conversation_id=request.conversation_id)

pyrit/prompt_target/azure_ml_chat_target.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,11 +265,13 @@ def _get_headers(self) -> dict:
265265
return headers
266266

267267
def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
268-
if len(prompt_request.request_pieces) != 1:
269-
raise ValueError("This target only supports a single prompt request piece.")
268+
n_pieces = len(prompt_request.request_pieces)
269+
if n_pieces != 1:
270+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")
270271

271-
if prompt_request.request_pieces[0].converted_value_data_type != "text":
272-
raise ValueError("This target only supports text prompt input.")
272+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
273+
if piece_type != "text":
274+
raise ValueError(f"This target only supports text prompt input. Received: {piece_type}.")
273275

274276
def is_json_response_supported(self) -> bool:
275277
"""Indicates that this target supports JSON response format."""

pyrit/prompt_target/crucible_target.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ async def send_prompt_async(self, *, prompt_request: PromptRequestResponse) -> P
5656
return response_entry
5757

5858
def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
59-
if len(prompt_request.request_pieces) != 1:
60-
raise ValueError("This target only supports a single prompt request piece.")
59+
n_pieces = len(prompt_request.request_pieces)
60+
if n_pieces != 1:
61+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")
6162

62-
if prompt_request.request_pieces[0].converted_value_data_type != "text":
63-
raise ValueError("This target only supports text prompt input.")
63+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
64+
if piece_type != "text":
65+
raise ValueError(f"This target only supports text prompt input. Received: {piece_type}.")
6466

6567
@pyrit_target_retry
6668
async def _complete_text_async(self, text: str) -> str:

pyrit/prompt_target/gandalf_target.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,13 @@ async def send_prompt_async(self, *, prompt_request: PromptRequestResponse) -> P
5353
return response_entry
5454

5555
def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
56-
if len(prompt_request.request_pieces) != 1:
57-
raise ValueError("This target only supports a single prompt request piece.")
56+
n_pieces = len(prompt_request.request_pieces)
57+
if n_pieces != 1:
58+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")
5859

59-
if prompt_request.request_pieces[0].converted_value_data_type != "text":
60-
raise ValueError("This target only supports text prompt input.")
60+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
61+
if piece_type != "text":
62+
raise ValueError(f"This target only supports text prompt input. Received: {piece_type}.")
6163

6264
async def check_password(self, password: str) -> bool:
6365
"""

pyrit/prompt_target/http_target/http_target.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,5 +231,6 @@ def _infer_full_url_from_host(
231231
def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
232232
request_pieces: Sequence[PromptRequestPiece] = prompt_request.request_pieces
233233

234-
if len(request_pieces) != 1:
235-
raise ValueError("This target only supports a single prompt request piece.")
234+
n_pieces = len(request_pieces)
235+
if n_pieces != 1:
236+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")

pyrit/prompt_target/hugging_face/hugging_face_chat_target.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,13 @@ def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
309309
"""
310310
Validates the provided prompt request response.
311311
"""
312-
if len(prompt_request.request_pieces) != 1:
313-
raise ValueError("This target only supports a single prompt request piece.")
312+
n_pieces = len(prompt_request.request_pieces)
313+
if n_pieces != 1:
314+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")
314315

315-
if prompt_request.request_pieces[0].converted_value_data_type != "text":
316-
raise ValueError("This target only supports text prompt input.")
316+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
317+
if piece_type != "text":
318+
raise ValueError(f"This target only supports text prompt input. Received: {piece_type}.")
317319

318320
def is_json_response_supported(self) -> bool:
319321
"""Indicates that this target supports JSON response format."""

pyrit/prompt_target/hugging_face/hugging_face_endpoint_target.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,13 @@ def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
120120
Raises:
121121
ValueError: If the request is not valid for this target.
122122
"""
123-
if len(prompt_request.request_pieces) != 1:
124-
raise ValueError("This target only supports a single prompt request piece.")
123+
n_pieces = len(prompt_request.request_pieces)
124+
if n_pieces != 1:
125+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")
125126

126-
if prompt_request.request_pieces[0].converted_value_data_type != "text":
127-
raise ValueError("This target only supports text prompt input.")
127+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
128+
if piece_type != "text":
129+
raise ValueError(f"This target only supports text prompt input. Received: {piece_type}.")
128130

129131
def is_json_response_supported(self) -> bool:
130132
"""Indicates that this target supports JSON response format."""

pyrit/prompt_target/openai/openai_chat_target.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
393393
# Some models may not support all of these
394394
for prompt_data_type in converted_prompt_data_types:
395395
if prompt_data_type not in ["text", "image_path"]:
396-
raise ValueError("This target only supports text and image_path.")
396+
raise ValueError(f"This target only supports text and image_path. Received: {prompt_data_type}.")
397397

398398
def is_json_response_supported(self) -> bool:
399399
"""Indicates that this target supports JSON response format."""

pyrit/prompt_target/openai/openai_completion_target.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,22 @@ def _construct_prompt_response_from_openai_json(
160160
return construct_response_from_request(request=request_piece, response_text_pieces=extracted_response)
161161

162162
def _validate_request(self, *, prompt_request: PromptRequestResponse) -> None:
163-
if len(prompt_request.request_pieces) != 1:
164-
raise ValueError("This target only supports a single prompt request piece.")
163+
n_pieces = len(prompt_request.request_pieces)
164+
if n_pieces != 1:
165+
raise ValueError(f"This target only supports a single prompt request piece. Received: {n_pieces} pieces.")
165166

166-
if prompt_request.request_pieces[0].converted_value_data_type != "text":
167-
raise ValueError("This target only supports text prompt input.")
167+
piece_type = prompt_request.request_pieces[0].converted_value_data_type
168+
if piece_type != "text":
169+
raise ValueError(f"This target only supports text prompt input. Received: {piece_type}.")
168170

169171
request = prompt_request.request_pieces[0]
170172
messages = self._memory.get_chat_messages_with_conversation_id(conversation_id=request.conversation_id)
171-
172-
if len(messages) > 0:
173-
raise ValueError("This target only supports a single turn conversation.")
173+
n_messages = len(messages)
174+
if n_messages > 0:
175+
raise ValueError(
176+
"This target only supports a single turn conversation. "
177+
f"Received: {n_messages} messages which indicates a prior turn."
178+
)
174179

175180
def is_json_response_supported(self) -> bool:
176181
"""Indicates that this target supports JSON response format."""

0 commit comments

Comments
 (0)