관리자 감정 관측 기록과 조회 API 추가

This commit is contained in:
Yun Chan 2026-09-23 04:45:50 +09:00
parent d22cd9883d
commit acb0d26338
16 changed files with 1445 additions and 18 deletions

View file

@ -23,6 +23,7 @@ import time
from dataclasses import dataclass, field, replace
from typing import Any, AsyncIterator, Awaitable, Callable, Optional
from ..contracts.client_affect import ClientAffectTraceV1
from ..config import settings
from ..engine_client import (
EngineClient,
@ -94,6 +95,8 @@ class TurnContext:
scenario_directive: Optional[rupture_scenario_director.ScenarioDirective] = None
# 외부 감정 평가의 안전한 provenance. 원문·점수·확률은 넣지 않는다.
client_affect_metadata: Optional[dict[str, Any]] = None
# 관리자 관측 전용 Jev 전이 trace. 공개 결과나 provider event에는 넣지 않는다.
client_affect_trace: ClientAffectTraceV1 | None = None
def to_state_context(self) -> PersonaStateContext:
st = self.state_after or self.state_before
@ -378,13 +381,27 @@ async def _apply_client_affect(
client_identity=ctx.client_identity,
)
appraisal = await jev_client.appraise(state)
state_before_transition = ctx.state_after
transition = client_affect.transition_emotions(
ctx.state_after.affect_state,
state_before_transition.affect_state,
ctx.persona.affect_baseline,
appraisal,
min_confidence=settings.jev_min_confidence,
)
ctx.state_after = replace(ctx.state_after, affect_state=transition.affect_state)
ctx.client_affect_trace = client_affect.build_client_affect_trace(
affect_state_before=state_before_transition.affect_state,
affect_baseline=ctx.persona.affect_baseline,
affect_state_after=ctx.state_after.affect_state,
appraisal=appraisal,
transition=transition,
turn_seq=ctx.state_after.turn_seq,
stage=ctx.state_after.stage.value,
resistance=ctx.state_after.resistance,
effective_openness=ctx.state_after.effective_openness,
rapport_credit=ctx.state_after.rapport_credit,
min_confidence=settings.jev_min_confidence,
)
ctx.client_affect_metadata = {
"provider": appraisal.provider,
"model": appraisal.model,