| from typing import Literal |
|
|
| from pydantic import BaseModel, ConfigDict, Field |
|
|
|
|
| CategoryName = Literal[ |
| "pii", |
| "prompt_injection", |
| "toxicity", |
| "bias", |
| "sentiment", |
| "topic_ban", |
| "competitor", |
| "malicious_url", |
| "secret", |
| "code", |
| "language_violation", |
| "no_refusal", |
| "factual", |
| "relevance", |
| "substring", |
| "gibberish", |
| ] |
|
|
| Severity = Literal["safe", "low", "medium", "high", "critical"] |
| SupportedLanguage = Literal["en", "hi", "ko", "ja", "ar", "mixed", "unknown"] |
| ScriptName = Literal[ |
| "latin", |
| "devanagari", |
| "hangul", |
| "japanese", |
| "arabic", |
| "mixed", |
| "other", |
| ] |
| ScenarioName = Literal[ |
| "general", |
| "finance", |
| "banking", |
| "insurance", |
| "healthcare", |
| "retail", |
| "telecom", |
| "government", |
| "developer", |
| "customer_support", |
| ] |
|
|
|
|
| class Match(BaseModel): |
| model_config = ConfigDict(extra="forbid") |
|
|
| text: str = Field( |
| description="Verbatim evidence copied from the source-language input or response." |
| ) |
| kind: str = Field(default="", description="English subtype label for the match.") |
|
|
|
|
| class Category(BaseModel): |
| model_config = ConfigDict(extra="forbid") |
|
|
| name: CategoryName |
| matched: bool |
| matches: list[Match] = Field(default_factory=list) |
|
|
|
|
| class LanguageMetadata(BaseModel): |
| model_config = ConfigDict(extra="forbid") |
|
|
| dominant: SupportedLanguage = Field( |
| description="Primary language of the analyzed text." |
| ) |
| alternates: list[SupportedLanguage] = Field( |
| default_factory=list, |
| description="Secondary language signals for code-mixed or transliterated text.", |
| ) |
| script: ScriptName = Field(description="Primary script used by the text.") |
| code_mixed: bool = Field( |
| default=False, |
| description="True when multiple languages or script systems are materially present.", |
| ) |
|
|
|
|
| class ScenarioMetadata(BaseModel): |
| model_config = ConfigDict(extra="forbid") |
|
|
| name: ScenarioName = Field( |
| default="general", |
| description="High-level scenario pack that guided the analysis.", |
| ) |
| profile: str = Field( |
| default="general", |
| description="English scenario profile identifier, such as retail_banking_kyc.", |
| ) |
|
|
|
|
| class Verdict(BaseModel): |
| model_config = ConfigDict(extra="forbid") |
|
|
| overall_blocked: bool |
| severity: Severity |
| language: LanguageMetadata |
| scenario: ScenarioMetadata = Field(default_factory=ScenarioMetadata) |
| categories: list[Category] |
| reason: str |
|
|