Source code for labelbox.schema.tool_building.prompt_issue_tool

from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional

from labelbox.schema.tool_building.classification import (
    Classification,
    Option,
)
from labelbox.schema.tool_building.tool_type import ToolType


def _supported_classifications() -> List[Classification]:
    option_1_text = "This prompt cannot be rated (eg. contains PII, a nonsense prompt, a foreign language, or other scenario that makes the responses impossible to assess reliably). However, if you simply do not have expertise to tackle this prompt, please skip the task; do not mark it as not rateable."
    option_2_text = "This prompt contains a false, offensive, or controversial premise (eg. “why does 1+1=3”?)"
    option_3_text = "This prompt is not self-contained, i.e. the prompt cannot be understood without additional context about previous turns, account information or images."
    options = [
        Option(label=option_1_text, value="not_rateable"),
        Option(label=option_2_text, value="false_offensive_controversial"),
        Option(label=option_3_text, value="not_self_contained"),
    ]
    return [
        Classification(
            class_type=Classification.Type.CHECKLIST,
            name="prompt_issue",
            options=options,
        ),
    ]


[docs]@dataclass class PromptIssueTool: """ Use this class in OntologyBuilder to create a tool for prompt rating It comes with a prebuild checklist of options, which a user can modify or override So essentially this is a tool with a prebuilt checklist classification """ name: str type: ToolType = field(default=ToolType.PROMPT_ISSUE, init=False) required: bool = False # This attribute is for consistency with other tools and backend, default is False schema_id: Optional[str] = None feature_schema_id: Optional[str] = None color: Optional[str] = None classifications: List[Classification] = field( default_factory=_supported_classifications ) def __post_init__(self): if self.name.strip() == "": raise ValueError("Name cannot be empty") if not self._validate_classifications(self.classifications): raise ValueError("Only one checklist classification is supported") def __setattr__(self, name, value): if name == "classifications" and not self._validate_classifications( value ): raise ValueError("Classifications are immutable") object.__setattr__(self, name, value) def _validate_classifications( self, classifications: List[Classification] ) -> bool: if ( len(classifications) != 1 or classifications[0].class_type != Classification.Type.CHECKLIST or len(classifications[0].options) < 1 ): return False return True def asdict(self) -> Dict[str, Any]: classifications_valid = self._validate_classifications( self.classifications ) if not classifications_valid: raise ValueError( "Classifications for Prompt Issue Tool are invalid" ) return { "tool": self.type.value, "name": self.name, "required": self.required, "schemaNodeId": self.schema_id, "featureSchemaId": self.feature_schema_id, "classifications": [ classification.asdict() for classification in self.classifications ], "color": self.color, } @classmethod def from_dict(cls, dictionary: Dict[str, Any]) -> "PromptIssueTool": return cls( name=dictionary["name"], schema_id=dictionary.get("schemaNodeId", None), feature_schema_id=dictionary.get("featureSchemaId", None), required=dictionary.get("required", False), classifications=[ Classification.from_dict(classification) for classification in dictionary["classifications"] ], color=dictionary.get("color", None), )