From cc820fa1804ea5781e14f679405fe4208b54cf1f Mon Sep 17 00:00:00 2001 From: Variet Agent Date: Fri, 20 Mar 2026 07:26:27 +0900 Subject: [PATCH] =?UTF-8?q?fix(debate):=20=EA=B2=80=EC=A6=9D=205=EA=B1=B4?= =?UTF-8?q?=20=EC=9D=BC=EA=B4=84=20=EC=88=98=EC=A0=95=20=E2=80=94=20WD=20?= =?UTF-8?q?=EB=8D=AE=EC=96=B4=EC=93=B0=EA=B8=B0=20=EB=B0=A9=EC=A7=80,=20Co?= =?UTF-8?q?nclusion=20Wiki=20=EC=97=85=EB=A1=9C=EB=93=9C,=20=EC=A0=84?= =?UTF-8?q?=EB=AC=B8=20=EC=BD=94=EB=93=9C=EC=82=BD=EC=9E=85,=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EC=88=98=EC=A0=95,=20participant=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=EA=B7=9C=EC=B9=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/debate_handler.py | 71 +++++++++++++++++++++++------- prompts/debate/participant_base.md | 11 ++--- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/handlers/debate_handler.py b/handlers/debate_handler.py index d90b150..36fcb27 100644 --- a/handlers/debate_handler.py +++ b/handlers/debate_handler.py @@ -222,13 +222,13 @@ class DebateHandler: # ⑥ Working Document 통합 편집 (Flash + Wiki.js) await self._update_working_document(speaker, response) - # ⑥ 양쪽 wiki/ 동기화 + # ⑦ 양쪽 wiki/ 동기화 self._sync_wiki() - # ⑦ #debate에 요약 게시 + # ⑧ #debate에 요약 게시 await self._post_summary(speaker, response) - # ⑧ 합의 판정 + # ⑨ 합의 판정 decision = await self._judge_consensus(speaker, response) if decision == "conclude": @@ -274,21 +274,35 @@ class DebateHandler: async def _prepare_input(self, speaker: str): """사회자가 input.md + wiki/ 작성.""" - # 사회자(Flash) 프롬프트 생성 - moderated_prompt = await self._build_moderator_prompt(speaker) + # 사회자(Flash) 해설 생성 + moderator_commentary = await self._build_moderator_prompt(speaker) - # input.md 작성 + # 상대방 전문을 코드에서 직접 삽입 (Flash의 요약에 의존하지 않음) + prev = [h for h in self.session.history if h["speaker"] != "user"] + opponent_section = "" + if prev: + last = prev[-1] + opponent_section = ( + f"\n\n---\n\n" + f"## 상대방({last['speaker']})의 발언 원본 (전문)\n\n" + f"{last['content']}\n\n" + f"---\n" + ) + + # input.md = 사회자 해설 + 상대방 전문 (코드가 보장) + full_input = moderator_commentary + opponent_section input_path = AGENT_PATHS[speaker] / "input.md" - input_path.write_text(moderated_prompt, encoding="utf-8") + input_path.write_text(full_input, encoding="utf-8") - # wiki/ 동기화 (TODO: Wiki.js에서 가져와서 로컬에 쓰기) - # 현재는 히스토리 기반으로 working_document 생성 + # wiki/ — 기존 working_document.md가 있으면 그대로 유지 wiki_dir = AGENT_PATHS[speaker] / "wiki" wiki_dir.mkdir(exist_ok=True) - working_doc = self._build_working_document() - (wiki_dir / "working_document.md").write_text( - working_doc, encoding="utf-8", - ) + wd_path = wiki_dir / "working_document.md" + if not wd_path.exists(): + # 첫 라운드에만 초기 스텁 생성 + wd_path.write_text( + self._build_working_document(), encoding="utf-8", + ) async def _send_signal(self, speaker: str): """AG에게 Discord 시그널.""" @@ -365,11 +379,12 @@ class DebateHandler: meta += f""" ## 지시 -발언자({speaker})에게 보낼 메시지를 작성하세요. +발언자({speaker})에게 보낼 **사회자 해설/방향 지시**를 작성하세요. +(상대방 발언 전문은 시스템이 별도로 `input.md`에 포함합니다 — 여기서 복사할 필요 없음) 1. 사용자의 판단이 있으면 맥락 설명 -2. 상대방의 최근 발언이 있다면 **반드시 원본 전문을 그대로 포함** (절대 요약 금지) -3. 상대방의 발언 전문을 바탕으로, 현재 `wiki/working_document.md`에 사회자가 내용을 올바르게 취합/합의했는지 검증하라고 지시 +2. 상대방 발언의 핵심 포인트 정리 및 검증 방향 안내 +3. 현재 `wiki/working_document.md`에 사회자가 내용을 올바르게 취합/합의했는지 검증하라고 지시 4. 상대방 주장의 오류/허점 확인 + 개선 방향 지시 5. 핵심 쟁점 방향 제시 6. 첫 발언이면 주제 설명 + 자유 의견 안내 @@ -458,8 +473,16 @@ class DebateHandler: await ctrl.send(embed=embed) async def _post_conclusion(self, channel): - """토론 종료.""" + """토론 종료 — Discord + Wiki.js에 결론 기록.""" self.session.active = False + + # Working Document 최종본 읽기 + wd_path = AGENT_PATHS["gemini"] / "wiki" / "working_document.md" + final_doc = "" + if wd_path.exists(): + final_doc = wd_path.read_text(encoding="utf-8").strip() + + # Discord에 요약 게시 parts = [] for h in self.session.history[-8:]: emoji = AGENT_EMOJI.get(h["speaker"], "👤") @@ -476,6 +499,20 @@ class DebateHandler: ) await channel.send(embed=embed) + # Wiki.js에 Conclusion 페이지 업로드 + conclusion_content = ( + f"# {self.session.topic} — 결론\n\n" + f"**총 라운드**: {self.session.round}\n\n" + f"---\n\n" + f"## 최종 Working Document\n\n" + f"{final_doc if final_doc else '(문서 없음)'}\n" + ) + await self._wiki_upsert( + f"debates/{self.session.topic_slug}/conclusion", + f"{self.session.wiki_title} — Conclusion", + conclusion_content, + ) + # ═══════════════════════════════════════════ # 유틸 # ═══════════════════════════════════════════ diff --git a/prompts/debate/participant_base.md b/prompts/debate/participant_base.md index 4293ac9..8ae366b 100644 --- a/prompts/debate/participant_base.md +++ b/prompts/debate/participant_base.md @@ -15,13 +15,14 @@ ## 행동 규칙 -1. **input.md 먼저 읽기** — 사회자의 지시, 상대 의견, 방향이 담겨 있음 +1. **input.md 먼저 읽기** — 사회자의 지시, 상대 의견 전문, 방향이 담겨 있음 2. **전문으로 답변** — 요약하지 마세요. 논거를 구체적으로 전개하세요 3. **상대 의견 검증** — 오류·누락·논리적 허점을 확인하세요 -4. **개선안 제시** — 단순 반론이 아니라 대안/보강을 함께 제시하세요 -5. **근거 명시** — 기술적 근거, 사례, 레퍼런스를 포함하세요 -6. **합의 가능 시 인정** — 상대 의견이 맞으면 솔직히 인정하고 발전시키세요 -7. **wiki/ 참고** — 이전에 합의된 사항과 모순되지 않게 답변하세요 +4. **사회자 취합 검증** — `wiki/working_document.md`에 사회자가 양측 의견을 올바르게 반영했는지 확인하고, 누락/오류가 있으면 지적하세요 +5. **개선안 제시** — 단순 반론이 아니라 대안/보강을 함께 제시하세요 +6. **근거 명시** — 기술적 근거, 사례, 레퍼런스를 포함하세요 +7. **합의 가능 시 인정** — 상대 의견이 맞으면 솔직히 인정하고 발전시키세요 +8. **wiki/ 참고** — 이전에 합의된 사항과 모순되지 않게 답변하세요 ## 금지 사항