Skip to content

Commit a11ba2a

Browse files
authored
Merge pull request #98 from Team-StackUp/fix/feedback-end-reason-parse
fix(ai): 피드백 endReason 파싱 실패로 점수 미생성 버그 수정
2 parents 7f52972 + 805b255 commit a11ba2a

3 files changed

Lines changed: 26 additions & 3 deletions

File tree

ai/src/ai_server/model/messages/feedback.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ class GenerateFeedbackRequest(BaseModel):
5454
mode: InterviewMode
5555
job_category: Literal["FRONTEND", "BACKEND", "INFRA", "DBA"]
5656
total_question_count: int | None = None
57-
end_reason: Literal["USER_REQUEST", "MAX_QUESTIONS_REACHED"] | None = None
57+
# 종료 사유(USER_REQUEST/MAX_QUESTIONS_REACHED/POOL_EXHAUSTED 등). 프롬프트 컨텍스트로만
58+
# 쓰이므로 자유 문자열로 둬 Core 가 사유를 추가해도 피드백 파싱이 깨지지 않게 한다.
59+
end_reason: str | None = None
5860
messages: list[FeedbackMessageItem] = Field(default_factory=list)
5961
context_document_ids: list[int] = Field(default_factory=list)
6062
voice_analysis_summary: VoiceAnalysisSummary | None = None

ai/tests/test_feedback_consumer.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def _envelope(
5252
*,
5353
context_documents: list[int] | None = None,
5454
voice_analysis_summary: dict | None = None,
55+
end_reason: str = "MAX_QUESTIONS_REACHED",
5556
) -> bytes:
5657
env = {
5758
"messageId": "fb-1",
@@ -65,7 +66,7 @@ def _envelope(
6566
"mode": "TECHNICAL",
6667
"jobCategory": "BACKEND",
6768
"totalQuestionCount": 2,
68-
"endReason": "MAX_QUESTIONS_REACHED",
69+
"endReason": end_reason,
6970
"messages": [
7071
{
7172
"id": 100,
@@ -131,6 +132,26 @@ async def test_consumer_generates_feedback_and_publishes_callback():
131132
assert publisher.publish.await_args.kwargs["message_type"] == "callback.feedback"
132133

133134

135+
@pytest.mark.asyncio
136+
async def test_consumer_accepts_pool_exhausted_end_reason():
137+
# 회귀: Core 가 POOL_EXHAUSTED 로 종료해도 파싱 실패(DLQ) 없이 피드백 생성돼야 한다.
138+
generator = _generator()
139+
publisher = MagicMock()
140+
publisher.publish = AsyncMock()
141+
consumer = FeedbackConsumer(
142+
generator=generator,
143+
publisher=publisher,
144+
idempotency=LruIdempotencyStore(max_size=10),
145+
callback_routing_key="callback.feedback",
146+
core_client=MagicMock(),
147+
embedder=None,
148+
)
149+
await consumer.handle(_StubMessage(_envelope(end_reason="POOL_EXHAUSTED")))
150+
151+
generator.generate.assert_awaited_once()
152+
publisher.publish.assert_awaited_once()
153+
154+
134155
@pytest.mark.asyncio
135156
async def test_consumer_calls_rag_when_documents_and_embedder_present():
136157
generator = _generator()

backend/src/main/java/com/stackup/stackup/session/application/event/SessionEndedEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.stackup.stackup.session.application.event;
22

33
// 세션 종료(COMPLETED 전이) commit 후 발화. FeedbackRequester 가 수신.
4-
// 사유: USER_REQUEST | MAX_QUESTIONS_REACHED
4+
// 사유: USER_REQUEST | MAX_QUESTIONS_REACHED | POOL_EXHAUSTED
55
public record SessionEndedEvent(
66
Long userId,
77
Long sessionId,

0 commit comments

Comments
 (0)