Skip to content

Commit 016323a

Browse files
rlundeen2Copilot
andauthored
MAINT: Minor pyrit.model module reorganization (#1999)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 43a38e5 commit 016323a

39 files changed

Lines changed: 189 additions & 239 deletions

pyrit/backend/routes/scenarios.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
)
2525
from pyrit.backend.services.scenario_run_service import get_scenario_run_service
2626
from pyrit.backend.services.scenario_service import get_scenario_service
27-
from pyrit.models.scenario_result import ScenarioResult
27+
from pyrit.models import ScenarioResult
2828

2929
router = APIRouter(prefix="/scenarios", tags=["scenarios"])
3030

pyrit/cli/_output.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ async def print_scenario_result_async(*, result_dict: dict[str, Any]) -> None:
284284
Args:
285285
result_dict: ``ScenarioResult.model_dump(mode="json", by_alias=True)`` payload from the REST API.
286286
"""
287-
from pyrit.models.scenario_result import ScenarioResult
287+
from pyrit.models import ScenarioResult
288288
from pyrit.output.scenario_result.pretty import PrettyScenarioResultMemoryPrinter
289289

290290
scenario_result = ScenarioResult.model_validate(result_dict)

pyrit/memory/memory_models.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
SeedSimulatedConversation,
5757
SeedType,
5858
)
59-
from pyrit.models.scenario_result import ScenarioRunState
6059

6160
logger = logging.getLogger(__name__)
6261

pyrit/models/__init__.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,6 @@
2121
from typing import Any
2222

2323
from pyrit.common.deprecation import print_deprecation_message
24-
from pyrit.models.chat_message import (
25-
ALLOWED_CHAT_MESSAGE_ROLES,
26-
ChatMessage,
27-
ChatMessagesDataset,
28-
)
29-
from pyrit.models.conversation_reference import ConversationReference, ConversationType
3024
from pyrit.models.conversation_stats import ConversationStats
3125
from pyrit.models.embeddings import EmbeddingData, EmbeddingResponse, EmbeddingSupport, EmbeddingUsageInformation
3226
from pyrit.models.harm_definition import HarmDefinition, ScaleDescription, get_all_harm_definitions
@@ -85,11 +79,18 @@
8579
group_message_pieces_into_conversations,
8680
sort_message_pieces,
8781
)
82+
from pyrit.models.messages.chat_message import (
83+
ALLOWED_CHAT_MESSAGE_ROLES,
84+
ChatMessage,
85+
ChatMessagesDataset,
86+
ToolCall,
87+
)
88+
from pyrit.models.messages.conversation_reference import ConversationReference, ConversationType
8889
from pyrit.models.question_answering import QuestionAnsweringDataset, QuestionAnsweringEntry, QuestionChoice
8990
from pyrit.models.results.attack_result import AttackOutcome, AttackResult, AttackResultT
91+
from pyrit.models.results.scenario_result import ScenarioIdentifier, ScenarioResult, ScenarioRunState
9092
from pyrit.models.results.strategy_result import StrategyResult, StrategyResultT
9193
from pyrit.models.retry_event import RetryEvent
92-
from pyrit.models.scenario_result import ScenarioIdentifier, ScenarioResult, ScenarioRunState
9394
from pyrit.models.score import Score, ScoreType, UnvalidatedScore
9495

9596
# Seeds - import from new seeds submodule for forward compatibility
@@ -206,6 +207,7 @@
206207
"TargetCapabilities",
207208
"TargetIdentifier",
208209
"TextDataTypeSerializer",
210+
"ToolCall",
209211
"UnvalidatedScore",
210212
"validate_registry_name",
211213
"VideoPathDataTypeSerializer",

pyrit/models/attack_result.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

pyrit/models/message.py

Lines changed: 0 additions & 37 deletions
This file was deleted.

pyrit/models/message_piece.py

Lines changed: 0 additions & 22 deletions
This file was deleted.

pyrit/models/messages/__init__.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,21 @@
66
77
- MessagePiece: A single piece of a message exchanged with a target.
88
- Message: One request/response to a target, made up of one or more pieces.
9+
- ChatMessage: OpenAI-style wire shape consumed/emitted by prompt targets.
10+
- Conversation: Conversation-scoped metadata shared by every piece.
11+
- ConversationReference: Immutable reference to a conversation in an attack.
912
- conversations: Free functions that operate on collections of messages/pieces.
1013
"""
1114

12-
from pyrit.models.messages.conversation import Conversation
15+
from pyrit.models.messages.chat_message import (
16+
ALLOWED_CHAT_MESSAGE_ROLES,
17+
ChatMessage,
18+
ChatMessagesDataset,
19+
ToolCall,
20+
)
21+
from pyrit.models.messages.conversation_reference import ConversationReference, ConversationType
1322
from pyrit.models.messages.conversations import (
23+
Conversation,
1424
construct_response_from_request,
1525
flatten_to_message_pieces,
1626
get_all_values,
@@ -21,9 +31,15 @@
2131
from pyrit.models.messages.message_piece import MessagePiece, sort_message_pieces
2232

2333
__all__ = [
34+
"ALLOWED_CHAT_MESSAGE_ROLES",
35+
"ChatMessage",
36+
"ChatMessagesDataset",
2437
"Conversation",
38+
"ConversationReference",
39+
"ConversationType",
2540
"Message",
2641
"MessagePiece",
42+
"ToolCall",
2743
"construct_response_from_request",
2844
"flatten_to_message_pieces",
2945
"get_all_values",
Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
# Copyright (c) Microsoft Corporation.
22
# Licensed under the MIT license.
33

4+
"""
5+
OpenAI-format chat message types.
6+
7+
``ChatMessage`` is the OpenAI Chat Completions wire shape — a ``role`` plus a
8+
string-or-multipart ``content``, with the OpenAI ``name`` / ``tool_calls`` /
9+
``tool_call_id`` fields. Prompt targets that speak the OpenAI API (and the many
10+
providers that mirror it) consume and emit these objects directly.
11+
12+
It is intentionally distinct from the PyRIT domain ``Message`` / ``MessagePiece``
13+
types in this same package: those model a persisted request/response exchange,
14+
whereas ``ChatMessage`` is the lightweight OpenAI-shaped transport representation
15+
handed to a model API.
16+
"""
17+
418
from typing import Any
519

620
from pydantic import BaseModel, ConfigDict
@@ -21,9 +35,9 @@ class ToolCall(BaseModel):
2135

2236
class ChatMessage(BaseModel):
2337
"""
24-
Represents a chat message for API consumption.
38+
Represents a single OpenAI Chat Completions message.
2539
26-
The content field can be:
40+
Mirrors the OpenAI message schema. The content field can be:
2741
- A simple string for single-part text messages
2842
- A list of dicts for multipart messages (e.g., text + images)
2943
"""

pyrit/models/messages/conversation.py

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)