feat: Planner direct 모드 + Reviewer 검증

- direct 모드: Planner 직접 처리 → Reviewer 검증 → 완료 (2단계)
- tasks 모드: 기존대로 full pipeline (5단계)
- 대화 히스토리 embed 내용 포함 (clarify 맥락 유지)
This commit is contained in:
2026-03-07 01:26:32 +09:00
parent 80a5560134
commit e65e2250a3
2 changed files with 72 additions and 13 deletions

View File

@@ -382,12 +382,51 @@ async def _handle_task(message: discord.Message, text: str, ws):
) )
pipeline.setup() pipeline.setup()
# 1. Plan # 1. Plan (direct 모드면 Planner가 직접 처리)
embed.title = "🔍 작업 분해 중..." embed.title = "🔍 분석 중..."
embed.color = 0xF39C12 embed.color = 0xF39C12
await status_msg.edit(embed=embed) await status_msg.edit(embed=embed)
plan = await pipeline.plan(text) plan = await pipeline.plan(text)
# ── Direct 모드: Planner가 직접 처리 완료 ──
is_direct = plan.get("direct", False)
if isinstance(is_direct, str):
is_direct = is_direct.lower() in ("true", "yes")
if is_direct:
result_text = plan.get("result", plan.get("summary", "완료"))
direct_embed = discord.Embed(
title="" + plan.get("summary", "처리 완료"),
description=result_text[:2000],
color=0x2ECC71,
)
await safe_send_embed(message.channel, direct_embed)
# Reviewer 검증
review_embed = discord.Embed(
title="🔍 리뷰어 검토 중...",
color=0xF39C12,
)
review_msg = await message.channel.send(embed=review_embed)
direct_tasks = [{"title": plan.get("summary", "직접 처리"), "description": result_text}]
review = await pipeline.batch_review(direct_tasks, [result_text])
passed = review.get("passed", True)
if isinstance(passed, str):
passed = passed.lower() in ("true", "yes", "pass")
review_embed.title = f"{'' if passed else '⚠️'} 리뷰 결과"
review_embed.description = review.get("summary", str(review))[:500]
review_embed.color = 0x2ECC71 if passed else 0xE74C3C
review_embed.set_footer(text=f"ID: {task_id} | {ws.name} | direct")
await review_msg.edit(embed=review_embed)
pipeline.docs.record_session(text, {"summary": result_text}, plan)
return
# ── Tasks 모드: Coder에게 분배 ──
tasks = plan.get("tasks", []) tasks = plan.get("tasks", [])
if tasks: if tasks:

View File

@@ -1,20 +1,28 @@
You are a **Planner** — 사용자 요청을 분석하여 태스크로 변환합니다. You are a **Planner** — 사용자 요청을 분석하여 직접 처리하거나 태스크로 변환합니다.
## 역할 ## 역할
사용자의 요청과 프로젝트 컨텍스트를 보고: 사용자의 요청과 프로젝트 컨텍스트를 보고:
1. 무엇을 해야 하는지 분석 1. 무엇을 해야 하는지 분석
2. **가능한 한 적은 수의 태스크**로 구성 2. **직접 처리할 수 있으면 직접 처리** (파일 삭제, 정리, 간단한 수정 등)
3. 각 태스크의 구현 내용을 상세히 기술 3. 복잡한 작업만 태스크로 분배
## 태스크 분할 원칙 ## 직접 처리 (direct 모드)
**기본 원칙: 1개로 충분하면 반드시 1개만 만드세요.** 다음과 같은 경우 당신이 직접 처리하세요:
- 파일/폴더 삭제, 정리, 이름 변경
- 간단한 설정 변경, 한두 줄 수정
- 프로젝트 구조 확인, 현황 파악
- 코더에게 넘기기엔 너무 단순한 작업
여러 태스크로 쪼개는 것은 **서로 독립적인 기능이 2개 이상**일 때만 합니다. 직접 처리 시 에이전트 도구로 파일을 직접 수정한 뒤 결과를 보고하세요.
예를 들어:
- "로그인 페이지 만들어줘" → **1개** (한 기능) ## 태스크 분배 (tasks 모드)
- "로그인 페이지와 결제 시스템 만들어줘" → 2개 (독립 기능)
코딩이 필요한 복잡한 작업만 태스크로 만드세요.
**1개로 충분하면 반드시 1개만 만드세요.**
여러 태스크는 **서로 독립적인 기능이 2개 이상**일 때만.
절대 하지 말 것: 절대 하지 말 것:
- 하나의 기능을 "파일 생성", "스타일 추가", "로직 구현"으로 쪼개기 - 하나의 기능을 "파일 생성", "스타일 추가", "로직 구현"으로 쪼개기
@@ -27,14 +35,25 @@ review_feedback이 주어지면, 이전 시도에서 실패한 원인을 분석
## Output Format ## Output Format
### 직접 처리한 경우:
```json ```json
{ {
"summary": "작업 요약 (한국어)", "summary": "처리 결과 요약",
"direct": true,
"result": "구체적으로 무엇을 했는지"
}
```
### 태스크 분배가 필요한 경우:
```json
{
"summary": "작업 요약",
"direct": false,
"tasks": [ "tasks": [
{ {
"id": 1, "id": 1,
"title": "태스크 제목", "title": "태스크 제목",
"description": "구현할 내용을 상세히 기술. 에이전트가 이것만 보고 작업합니다.", "description": "구현 세부사항. 에이전트가 이것만 보고 작업합니다.",
"type": "create|modify|delete" "type": "create|modify|delete"
} }
], ],
@@ -46,3 +65,4 @@ review_feedback이 주어지면, 이전 시도에서 실패한 원인을 분석
- description에 모든 구현 세부사항을 적으세요 - description에 모든 구현 세부사항을 적으세요
- 한국어로 작성하세요 - 한국어로 작성하세요
- 단순한 일을 복잡하게 만들지 마세요