현재 작업 전체 반영

This commit is contained in:
Yun Chan 2026-06-27 16:08:41 +09:00
parent 5560638e54
commit c0dddab594
85 changed files with 11322 additions and 539 deletions

View file

@ -145,11 +145,34 @@ class OrchestratorMaskingGateTest(unittest.IsolatedAsyncioTestCase):
for masked in MASK_VALUES:
self.assertIn(masked, blob)
def test_prepare_turn_threads_theory_mode_into_engine_messages(self) -> None:
ctx = orchestrator.prepare_turn(
session_id="theory-session",
case_id="theory-case",
card=persona.P2,
state=_initial_state(),
learner_text="그냥 아무것도 하기 싫어요.",
theory_mode="cbt",
)
blob = _message_blob(ctx.messages)
self.assertIn("[L3-T 이론모드: CBT]", blob)
self.assertIn("자동적 사고", blob)
self.assertIn("행동활성화", blob)
async def test_run_turn_generate_sends_only_masked_engine_payload(self) -> None:
ctx = _prepare_context()
engine = CaptureGenerateEngine()
audit_payloads: list[dict[str, Any]] = []
await orchestrator.run_turn_generate(ctx, engine) # type: ignore[arg-type]
async def audit_hook(payload: dict[str, Any]) -> None:
audit_payloads.append(payload)
await orchestrator.run_turn_generate(
ctx,
engine, # type: ignore[arg-type]
audit_hook=audit_hook,
)
self.assertIsNotNone(engine.request)
self.assertIsNotNone(engine.payload)
@ -158,14 +181,28 @@ class OrchestratorMaskingGateTest(unittest.IsolatedAsyncioTestCase):
_assert_masked_pii_present(self, engine.request.messages)
_assert_masked_pii_present(self, engine.payload)
self.assertEqual(ctx.learner_text_raw, RAW_TEXT)
self.assertEqual(len(audit_payloads), 1)
self.assertEqual(audit_payloads[0]["provider"], "fake-provider")
self.assertEqual(audit_payloads[0]["model"], "fake-model")
_assert_no_raw_pii(self, audit_payloads)
for key in ("messages", "prompt", "text"):
self.assertNotIn(key, audit_payloads[0])
async def test_run_turn_stream_sends_only_masked_engine_payload(self) -> None:
ctx = _prepare_context()
engine = CaptureStreamEngine()
audit_payloads: list[dict[str, Any]] = []
async def audit_hook(payload: dict[str, Any]) -> None:
audit_payloads.append(payload)
events = [
event
async for event in orchestrator.run_turn_stream(ctx, engine) # type: ignore[arg-type]
async for event in orchestrator.run_turn_stream(
ctx,
engine, # type: ignore[arg-type]
audit_hook=audit_hook,
)
]
self.assertEqual([event.event for event in events], ["token", "done"])
@ -176,6 +213,12 @@ class OrchestratorMaskingGateTest(unittest.IsolatedAsyncioTestCase):
_assert_masked_pii_present(self, engine.request.messages)
_assert_masked_pii_present(self, engine.payload)
self.assertEqual(ctx.learner_text_raw, RAW_TEXT)
self.assertEqual(len(audit_payloads), 1)
self.assertEqual(audit_payloads[0]["tokens_in"], 5)
self.assertEqual(audit_payloads[0]["tokens_out"], 6)
_assert_no_raw_pii(self, audit_payloads)
for key in ("messages", "prompt", "text"):
self.assertNotIn(key, audit_payloads[0])
if __name__ == "__main__":