안전 이벤트 대시보드 보강

This commit is contained in:
Yun Chan 2026-07-01 12:34:46 +09:00
parent fe2796f05a
commit 51053af536
15 changed files with 1081 additions and 423 deletions

View file

@ -1324,6 +1324,7 @@ async def stream_turn(
)
async def event_generator():
finalized_turn = False
last_beat = asyncio.get_running_loop().time()
final_reply = ""
try:
@ -1338,15 +1339,43 @@ async def stream_turn(
yield {"event": "token", "data": text}
elif ev.event == "done":
data = {**ev.data, "stage": _stage_label(ctx.state_after.stage)}
evaluation = await _evaluate_stream_turn(ctx, final_reply)
result = _stream_result_from_done(ctx, final_reply, data, evaluation)
if not finalized_turn:
evaluation = await _evaluate_stream_turn(ctx, final_reply)
result = _stream_result_from_done(ctx, final_reply, data, evaluation)
await turn_runtime.finalize_completed_turn(
sess,
ctx,
result,
context_prefix="session",
)
finalized_turn = True
yield {"event": "done", "data": json.dumps(data, ensure_ascii=False)}
elif (
ev.event == "safety"
and bool(ev.data.get("conversation_stopped"))
and ctx.crisis is not None
and ctx.crisis.escalate
and not finalized_turn
):
safety_data = {
"session_id": ctx.session_id,
"stage": _stage_label(ctx.state_after.stage),
"effective_openness": round(ctx.state_after.effective_openness, 4),
"turn_seq": ctx.state_after.turn_seq,
"safety_flagged": True,
"crisis_kind": ctx.crisis.kind.value,
"crisis_resource": ev.data.get("crisis_resource"),
"conversation_stopped": True,
}
result = _stream_result_from_done(ctx, final_reply, safety_data, None)
await turn_runtime.finalize_completed_turn(
sess,
ctx,
result,
context_prefix="session",
)
yield {"event": "done", "data": json.dumps(data, ensure_ascii=False)}
finalized_turn = True
yield {"event": ev.event, "data": json.dumps(ev.data, ensure_ascii=False)}
else:
yield {"event": ev.event, "data": json.dumps(ev.data, ensure_ascii=False)}

View file

@ -304,6 +304,8 @@ async def teacher_dashboard(principal: TeacherPrincipal) -> TeacherDashboardResp
)
for item in raw_alerts
]
else:
require_runtime_fallback_allowed("safety alert list")
if sessions:
message = "현재 기록된 실제 학습 세션만 표시합니다."