Source code for pyrit.identifiers.scorer_identifier
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Type, cast
from pyrit.identifiers.identifier import _MAX_STORAGE_LENGTH, Identifier
from pyrit.models.score import ScoreType
[docs]
@dataclass(frozen=True)
class ScorerIdentifier(Identifier):
"""
Identifier for Scorer instances.
This frozen dataclass extends Identifier with scorer-specific fields.
Long prompt templates are automatically truncated for storage display.
"""
scorer_type: ScoreType = "unknown"
"""The type of scorer ("true_false", "float_scale", or "unknown")."""
system_prompt_template: Optional[str] = field(default=None, metadata={_MAX_STORAGE_LENGTH: 100})
"""The system prompt template used by the scorer. Truncated for storage if > 100 characters."""
user_prompt_template: Optional[str] = field(default=None, metadata={_MAX_STORAGE_LENGTH: 100})
"""The user prompt template used by the scorer. Truncated for storage if > 100 characters."""
sub_identifier: Optional[List["ScorerIdentifier"]] = None
"""List of sub-scorer identifiers for composite scorers."""
target_info: Optional[Dict[str, Any]] = None
"""Information about the prompt target used by the scorer."""
score_aggregator: Optional[str] = None
"""The name of the score aggregator function."""
scorer_specific_params: Optional[Dict[str, Any]] = None
"""Additional scorer-specific parameters."""
[docs]
@classmethod
def from_dict(cls: Type["ScorerIdentifier"], data: dict[str, Any]) -> "ScorerIdentifier":
"""
Create a ScorerIdentifier from a dictionary (e.g., retrieved from database).
Extends the base Identifier.from_dict() to recursively reconstruct
nested ScorerIdentifier objects in sub_identifier.
Args:
data: The dictionary representation.
Returns:
ScorerIdentifier: A new ScorerIdentifier instance.
"""
# Create a mutable copy
data = dict(data)
# Recursively reconstruct sub_identifier if present
if "sub_identifier" in data and data["sub_identifier"] is not None:
data["sub_identifier"] = [
ScorerIdentifier.from_dict(sub) if isinstance(sub, dict) else sub for sub in data["sub_identifier"]
]
# Delegate to parent class for standard processing
result = Identifier.from_dict.__func__(cls, data) # type: ignore[attr-defined]
return cast(ScorerIdentifier, result)