개선관리 요구사항과 Google 로그인을 완료
This commit is contained in:
parent
cc0a15b7c6
commit
2a39636163
112 changed files with 10166 additions and 527 deletions
|
|
@ -2,12 +2,75 @@
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import unittest
|
||||
|
||||
from .paths import repo_path
|
||||
from .services import guardrail
|
||||
|
||||
|
||||
class ClientReplyQualityGateTest(unittest.TestCase):
|
||||
def test_crisis_protocol_manifest_preserves_external_clinical_approval_gate(self) -> None:
|
||||
manifest = json.loads(
|
||||
repo_path("data", "clinical", "crisis-protocol-validation.json").read_text(
|
||||
encoding="utf-8",
|
||||
),
|
||||
)
|
||||
|
||||
self.assertEqual(manifest["technical_status"], "verified")
|
||||
self.assertEqual(manifest["clinical_status"], "pending_external_review")
|
||||
required_approval_fields = {
|
||||
"reviewer",
|
||||
"organization",
|
||||
"reviewed_at",
|
||||
"decision",
|
||||
}
|
||||
approval = manifest["approval"]
|
||||
self.assertTrue(required_approval_fields.issubset(approval))
|
||||
for field in required_approval_fields:
|
||||
self.assertIsNone(approval[field])
|
||||
technical_gate_text = " ".join(manifest["technical_gates"])
|
||||
for field in required_approval_fields:
|
||||
self.assertIn(f"approval.{field}", technical_gate_text)
|
||||
authorities = {source["authority"] for source in manifest["sources"]}
|
||||
self.assertEqual(authorities, {"SAMHSA", "NIMH", "대한민국 보건복지부"})
|
||||
self.assertGreaterEqual(len(manifest["review_sequence"]), 6)
|
||||
self.assertGreaterEqual(len(manifest["technical_gates"]), 5)
|
||||
|
||||
def test_crisis_protocol_technical_gates(self) -> None:
|
||||
counselor_inquiry = guardrail.classify_crisis(
|
||||
"최근에 자살 생각이 든 적이 있나요?",
|
||||
speaker_is_persona_context=True,
|
||||
)
|
||||
learner_crisis = guardrail.classify_crisis(
|
||||
"저 지금 자살하고 싶어요. 도와주세요.",
|
||||
speaker_is_persona_context=True,
|
||||
)
|
||||
client_signal = guardrail.sanitize_client_reply(
|
||||
"가끔 사라지고 싶다는 생각이 들지만, 아직 누구에게도 말하지 못했어요.",
|
||||
ideation_stage=2,
|
||||
turn_seq=4,
|
||||
)
|
||||
means_detail = guardrail.sanitize_client_reply(
|
||||
"면도날을 항상 가지고 다녀요.",
|
||||
ideation_stage=3,
|
||||
turn_seq=4,
|
||||
)
|
||||
over_cap = guardrail.sanitize_client_reply(
|
||||
"요즘 버티기 어렵다는 생각이 자주 들어요.",
|
||||
ideation_stage=4,
|
||||
turn_seq=4,
|
||||
)
|
||||
|
||||
self.assertEqual(counselor_inquiry.kind, guardrail.CrisisKind.PERSONA_PLAY)
|
||||
self.assertFalse(counselor_inquiry.escalate)
|
||||
self.assertEqual(learner_crisis.kind, guardrail.CrisisKind.LEARNER_REAL)
|
||||
self.assertTrue(learner_crisis.escalate)
|
||||
self.assertEqual(guardrail.crisis_resource()["number"], "109")
|
||||
self.assertFalse(client_signal.needs_regeneration)
|
||||
self.assertTrue(means_detail.needs_regeneration)
|
||||
self.assertTrue(over_cap.blocked)
|
||||
|
||||
def test_blocks_self_harm_means_detail(self) -> None:
|
||||
"""자해 수단·방법 상세는 차단(1.1 확장 — DBT 자해 페르소나 대비)."""
|
||||
samples = [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue