from typing import Any, Literal
from pydantic import BaseModel, Field
class ChatRequest(BaseModel):
message: str
scenario_id: str = "prompt_injection"
sample_id: str | None = None
mode: Literal["vulnerable", "secure"] = "secure"
task: str | None = None
class SecurityPipelineStep(BaseModel):
id: str
name: str
status: Literal["passed", "blocked", "skipped", "warning"]
enabled: bool
summary: str
detail: str | None = None
class ChatResult(BaseModel):
output: str
attack_success: bool
consequences: list[str] = Field(default_factory=list)
blocked_by: str | None = None
defense_explanation: str | None = None
risk_level: Literal["low", "medium", "high", "critical"] = "low"
audit_entries: list[dict[str, Any]] = Field(default_factory=list)
security_pipeline: list[SecurityPipelineStep] = Field(default_factory=list)
class AttackMeta(BaseModel):
scenario: str
scenario_name: str
sample_id: str | None = None
sample_name: str | None = None
intent: str | None = None
expected_consequences: list[str] = Field(default_factory=list)
class CompareResponse(BaseModel):
attack_meta: AttackMeta
vulnerable: ChatResult
secure: ChatResult
class SecurityConfigUpdate(BaseModel):
enable_input_isolation: bool | None = None
enable_injection_detection: bool | None = None
enable_jailbreak_detection: bool | None = None
enable_output_filter: bool | None = None
task_whitelist: list[str] | None = None
refusal_message: str | None = None
audit_enabled: bool | None = None
llm_provider: str | None = None
class AuditLogEntry(BaseModel):
timestamp: str
scenario: str
mode: str
message_preview: str
attack_success: bool
blocked_by: str | None = None
consequences: list[str] = Field(default_factory=list)