Files
wehub-resource-sync 0d3cb498a3
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Has been cancelled
Test and Publish Multi-arch Docker Image / test (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Has been cancelled
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Has been cancelled
Validate Renovate Config / Validate Renovate Configuration (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:24:08 +08:00

200 lines
8.2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { getGraderById } from '../../../src/redteam/graders';
import { FinancialCalculationErrorPluginGrader } from '../../../src/redteam/plugins/financial/financialCalculationError';
import { FinancialComplianceViolationPluginGrader } from '../../../src/redteam/plugins/financial/financialComplianceViolation';
import { FinancialDataLeakagePluginGrader } from '../../../src/redteam/plugins/financial/financialDataLeakage';
import { FinancialHallucinationPluginGrader } from '../../../src/redteam/plugins/financial/financialHallucination';
import { FinancialJapanFieaSuitabilityPluginGrader } from '../../../src/redteam/plugins/financial/financialJapanFieaSuitability';
import { FinancialSycophancyPluginGrader } from '../../../src/redteam/plugins/financial/financialSycophancy';
import { InsuranceCoverageDiscriminationPluginGrader } from '../../../src/redteam/plugins/insurance/coverageDiscrimination';
import { InsuranceDataDisclosurePluginGrader } from '../../../src/redteam/plugins/insurance/dataDisclosure';
import { InsuranceNetworkMisinformationPluginGrader } from '../../../src/redteam/plugins/insurance/networkMisinformation';
import { InsurancePhiDisclosurePluginGrader } from '../../../src/redteam/plugins/insurance/phiDisclosure';
import { MedicalAnchoringBiasPluginGrader } from '../../../src/redteam/plugins/medical/medicalAnchoringBias';
import { MedicalHallucinationPluginGrader } from '../../../src/redteam/plugins/medical/medicalHallucination';
import { MedicalIncorrectKnowledgePluginGrader } from '../../../src/redteam/plugins/medical/medicalIncorrectKnowledge';
import { MedicalPrioritizationErrorPluginGrader } from '../../../src/redteam/plugins/medical/medicalPrioritizationError';
import { MedicalSycophancyPluginGrader } from '../../../src/redteam/plugins/medical/medicalSycophancy';
import { OffTopicPluginGrader } from '../../../src/redteam/plugins/offTopic';
import { PharmacyControlledSubstanceCompliancePluginGrader } from '../../../src/redteam/plugins/pharmacy/controlledSubstanceCompliance';
import { PharmacyDosageCalculationPluginGrader } from '../../../src/redteam/plugins/pharmacy/dosageCalculation';
import { PharmacyDrugInteractionPluginGrader } from '../../../src/redteam/plugins/pharmacy/drugInteraction';
import { RealEstateAccessibilityDiscriminationPluginGrader } from '../../../src/redteam/plugins/realestate/accessibilityDiscrimination';
import { RealEstateAdvertisingDiscriminationPluginGrader } from '../../../src/redteam/plugins/realestate/advertisingDiscrimination';
import { RealEstateDiscriminatoryListingsPluginGrader } from '../../../src/redteam/plugins/realestate/discriminatoryListings';
import { RealEstateFairHousingDiscriminationPluginGrader } from '../../../src/redteam/plugins/realestate/fairHousingDiscrimination';
import { RealEstateLendingDiscriminationPluginGrader } from '../../../src/redteam/plugins/realestate/lendingDiscrimination';
import { RealEstateSourceOfIncomePluginGrader } from '../../../src/redteam/plugins/realestate/sourceOfIncome';
import { RealEstateSteeringPluginGrader } from '../../../src/redteam/plugins/realestate/steering';
import { RealEstateValuationBiasPluginGrader } from '../../../src/redteam/plugins/realestate/valuationBias';
type RubricVars = {
purpose: string;
prompt: string;
output: string;
};
type RenderingGrader = {
id: string;
renderRubric: (vars: RubricVars) => string;
};
const RENDERING_GRADERS: [string, string, new () => RenderingGrader][] = [
[
'financial calculation error',
'promptfoo:redteam:financial:calculation-error',
FinancialCalculationErrorPluginGrader,
],
[
'financial compliance violation',
'promptfoo:redteam:financial:compliance-violation',
FinancialComplianceViolationPluginGrader,
],
[
'financial data leakage',
'promptfoo:redteam:financial:data-leakage',
FinancialDataLeakagePluginGrader,
],
[
'financial hallucination',
'promptfoo:redteam:financial:hallucination',
FinancialHallucinationPluginGrader,
],
[
'financial japan fiea suitability',
'promptfoo:redteam:financial:japan-fiea-suitability',
FinancialJapanFieaSuitabilityPluginGrader,
],
[
'financial sycophancy',
'promptfoo:redteam:financial:sycophancy',
FinancialSycophancyPluginGrader,
],
[
'insurance coverage discrimination',
'promptfoo:redteam:insurance:coverage-discrimination',
InsuranceCoverageDiscriminationPluginGrader,
],
[
'insurance data disclosure',
'promptfoo:redteam:insurance:data-disclosure',
InsuranceDataDisclosurePluginGrader,
],
[
'insurance network misinformation',
'promptfoo:redteam:insurance:network-misinformation',
InsuranceNetworkMisinformationPluginGrader,
],
[
'insurance phi disclosure',
'promptfoo:redteam:insurance:phi-disclosure',
InsurancePhiDisclosurePluginGrader,
],
[
'medical anchoring bias',
'promptfoo:redteam:medical:anchoring-bias',
MedicalAnchoringBiasPluginGrader,
],
[
'medical hallucination',
'promptfoo:redteam:medical:hallucination',
MedicalHallucinationPluginGrader,
],
[
'medical incorrect knowledge',
'promptfoo:redteam:medical:incorrect-knowledge',
MedicalIncorrectKnowledgePluginGrader,
],
[
'medical prioritization error',
'promptfoo:redteam:medical:prioritization-error',
MedicalPrioritizationErrorPluginGrader,
],
['medical sycophancy', 'promptfoo:redteam:medical:sycophancy', MedicalSycophancyPluginGrader],
['off topic', 'promptfoo:redteam:off-topic', OffTopicPluginGrader],
[
'pharmacy controlled substance compliance',
'promptfoo:redteam:pharmacy:controlled-substance-compliance',
PharmacyControlledSubstanceCompliancePluginGrader,
],
[
'pharmacy dosage calculation',
'promptfoo:redteam:pharmacy:dosage-calculation',
PharmacyDosageCalculationPluginGrader,
],
[
'pharmacy drug interaction',
'promptfoo:redteam:pharmacy:drug-interaction',
PharmacyDrugInteractionPluginGrader,
],
[
'real estate accessibility discrimination',
'promptfoo:redteam:realestate:accessibility-discrimination',
RealEstateAccessibilityDiscriminationPluginGrader,
],
[
'real estate advertising discrimination',
'promptfoo:redteam:realestate:advertising-discrimination',
RealEstateAdvertisingDiscriminationPluginGrader,
],
[
'real estate discriminatory listings',
'promptfoo:redteam:realestate:discriminatory-listings',
RealEstateDiscriminatoryListingsPluginGrader,
],
[
'real estate fair housing discrimination',
'promptfoo:redteam:realestate:fair-housing-discrimination',
RealEstateFairHousingDiscriminationPluginGrader,
],
[
'real estate lending discrimination',
'promptfoo:redteam:realestate:lending-discrimination',
RealEstateLendingDiscriminationPluginGrader,
],
[
'real estate source of income',
'promptfoo:redteam:realestate:source-of-income',
RealEstateSourceOfIncomePluginGrader,
],
['real estate steering', 'promptfoo:redteam:realestate:steering', RealEstateSteeringPluginGrader],
[
'real estate valuation bias',
'promptfoo:redteam:realestate:valuation-bias',
RealEstateValuationBiasPluginGrader,
],
];
describe('domain-specific grader rendering', () => {
const vars = {
purpose: 'Sentinel purpose for rubric interpolation',
prompt: 'Sentinel attack prompt for rubric interpolation',
output: 'Sentinel model output for rubric interpolation',
};
it.each(
RENDERING_GRADERS,
)('%s is registered under its canonical grader id', (_, expectedId, GraderClass) => {
const grader = new GraderClass();
expect(grader.id).toBe(expectedId);
expect(getGraderById(expectedId)).toBeInstanceOf(GraderClass);
});
it.each(
RENDERING_GRADERS,
)('%s renders runtime context and decision fields', (_, __, GraderClass) => {
const rubric = new GraderClass().renderRubric(vars);
expect(rubric).toContain(vars.purpose);
expect(rubric).toContain(vars.prompt);
expect(rubric).toContain(vars.output);
expect(rubric).toContain('# Goal');
expect(rubric).toContain('# Instructions');
expect(rubric).toContain('# Output Format');
expect(rubric).toContain('"reason":');
expect(rubric).toContain('"score":');
expect(rubric).toContain('"pass":');
});
});