From 173e1a6a54efa035ecff1e2165f0020e6a6b3cce Mon Sep 17 00:00:00 2001 From: CD Date: Fri, 6 Mar 2026 22:32:22 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20AI=20=ED=94=8C=EB=A1=9C=EC=9A=B0=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20truncation=20=EC=A0=9C=EA=B1=B0=20+=20Disc?= =?UTF-8?q?ord=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=B6=84=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - task_pipeline.py: summarize()에서 리뷰/코딩 결과 자르기 제거 - discord_bot.py: safe_send_embed() 추가 (4096자 초과 시 분할 전송) - 리뷰 피드백 자르기 제거 (재시도 시 전체 피드백 전달) --- api/discord_bot.py | 27 +++++++++++++++++++++++++-- core/task_pipeline.py | 4 ++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/api/discord_bot.py b/api/discord_bot.py index f6e4834..5104aae 100644 --- a/api/discord_bot.py +++ b/api/discord_bot.py @@ -19,6 +19,29 @@ from core.gemini_caller import GeminiCaller, GeminiCallError logger = logging.getLogger("variet.discord") +EMBED_DESC_LIMIT = 4096 +EMBED_FIELD_LIMIT = 1024 + + +async def safe_send_embed(channel, embed: discord.Embed): + """Embed가 Discord 제한을 초과하면 나눠서 전송.""" + # description이 길면 분할 + desc = embed.description or "" + if len(desc) <= EMBED_DESC_LIMIT: + await channel.send(embed=embed) + return + + # 첫 번째: 원래 embed + 잘린 description + chunks = [desc[i:i+EMBED_DESC_LIMIT] for i in range(0, len(desc), EMBED_DESC_LIMIT)] + embed.description = chunks[0] + await channel.send(embed=embed) + + # 나머지: 연속 embed + for chunk in chunks[1:]: + cont = discord.Embed(description=chunk, color=embed.color) + await channel.send(embed=cont) + + # Bot 설정 intents = discord.Intents.default() intents.message_content = True @@ -381,7 +404,7 @@ async def _handle_task(message: discord.Message, text: str, ws): color=0xF39C12, ) ) - feedback = review.get("summary", str(review))[:500] + feedback = review.get("summary", str(review)) for task in tasks: task["review_feedback"] = ( f"이전 시도에서 다음 리뷰 피드백을 받았습니다. " @@ -413,7 +436,7 @@ async def _handle_task(message: discord.Message, text: str, ws): summary_embed.add_field(name=field_name, value=val[:1000], inline=False) summary_embed.set_footer(text=f"ID: {task_id} | {ws.name}") - await message.channel.send(embed=summary_embed) + await safe_send_embed(message.channel, summary_embed) # 기록 pipeline.docs.record_session(text, summary, plan) diff --git a/core/task_pipeline.py b/core/task_pipeline.py index 2dc4506..5a03ca1 100644 --- a/core/task_pipeline.py +++ b/core/task_pipeline.py @@ -189,9 +189,9 @@ class TaskPipeline: prompt = ( f"## 원래 요청\n{user_request}\n\n" f"## 태스크 수\n{len(plan.get('tasks', []))}개\n\n" - f"## 리뷰 결과\n{review.get('summary', str(review))[:500]}\n\n" + f"## 리뷰 결과\n{review.get('summary', str(review))}\n\n" f"## 코딩 결과 요약\n" - f"{chr(10).join(o[:200] for o in code_outputs)}\n\n" + f"{chr(10).join(code_outputs)}\n\n" f"위 정보를 바탕으로 총평을 작성하세요." )