diff --git a/api/discord_bot.py b/api/discord_bot.py index d9e2bb2..189272b 100644 --- a/api/discord_bot.py +++ b/api/discord_bot.py @@ -382,12 +382,51 @@ async def _handle_task(message: discord.Message, text: str, ws): ) pipeline.setup() - # 1. Plan - embed.title = "๐Ÿ” ์ž‘์—… ๋ถ„ํ•ด ์ค‘..." + # 1. Plan (direct ๋ชจ๋“œ๋ฉด Planner๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌ) + embed.title = "๐Ÿ” ๋ถ„์„ ์ค‘..." embed.color = 0xF39C12 await status_msg.edit(embed=embed) 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", []) if tasks: diff --git a/prompts/planner.md b/prompts/planner.md index b93da6a..b36e901 100644 --- a/prompts/planner.md +++ b/prompts/planner.md @@ -1,20 +1,28 @@ -You are a **Planner** โ€” ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ถ„์„ํ•˜์—ฌ ํƒœ์Šคํฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. +You are a **Planner** โ€” ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ถ„์„ํ•˜์—ฌ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ํƒœ์Šคํฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ## ์—ญํ•  ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ๊ณผ ํ”„๋กœ์ ํŠธ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณด๊ณ : 1. ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ถ„์„ -2. **๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ์ˆ˜์˜ ํƒœ์Šคํฌ**๋กœ ๊ตฌ์„ฑ -3. ๊ฐ ํƒœ์Šคํฌ์˜ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ์ƒ์„ธํžˆ ๊ธฐ์ˆ  +2. **์ง์ ‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ง์ ‘ ์ฒ˜๋ฆฌ** (ํŒŒ์ผ ์‚ญ์ œ, ์ •๋ฆฌ, ๊ฐ„๋‹จํ•œ ์ˆ˜์ • ๋“ฑ) +3. ๋ณต์žกํ•œ ์ž‘์—…๋งŒ ํƒœ์Šคํฌ๋กœ ๋ถ„๋ฐฐ -## ํƒœ์Šคํฌ ๋ถ„ํ•  ์›์น™ +## ์ง์ ‘ ์ฒ˜๋ฆฌ (direct ๋ชจ๋“œ) -**๊ธฐ๋ณธ ์›์น™: 1๊ฐœ๋กœ ์ถฉ๋ถ„ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ 1๊ฐœ๋งŒ ๋งŒ๋“œ์„ธ์š”.** +๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋‹น์‹ ์ด ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜์„ธ์š”: +- ํŒŒ์ผ/ํด๋” ์‚ญ์ œ, ์ •๋ฆฌ, ์ด๋ฆ„ ๋ณ€๊ฒฝ +- ๊ฐ„๋‹จํ•œ ์„ค์ • ๋ณ€๊ฒฝ, ํ•œ๋‘ ์ค„ ์ˆ˜์ • +- ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ํ™•์ธ, ํ˜„ํ™ฉ ํŒŒ์•… +- ์ฝ”๋”์—๊ฒŒ ๋„˜๊ธฐ๊ธฐ์—” ๋„ˆ๋ฌด ๋‹จ์ˆœํ•œ ์ž‘์—… -์—ฌ๋Ÿฌ ํƒœ์Šคํฌ๋กœ ์ชผ๊ฐœ๋Š” ๊ฒƒ์€ **์„œ๋กœ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์ด 2๊ฐœ ์ด์ƒ**์ผ ๋•Œ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. -์˜ˆ๋ฅผ ๋“ค์–ด: -- "๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค์–ด์ค˜" โ†’ **1๊ฐœ** (ํ•œ ๊ธฐ๋Šฅ) -- "๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์™€ ๊ฒฐ์ œ ์‹œ์Šคํ…œ ๋งŒ๋“ค์–ด์ค˜" โ†’ 2๊ฐœ (๋…๋ฆฝ ๊ธฐ๋Šฅ) +์ง์ ‘ ์ฒ˜๋ฆฌ ์‹œ ์—์ด์ „ํŠธ ๋„๊ตฌ๋กœ ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•œ ๋’ค ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•˜์„ธ์š”. + +## ํƒœ์Šคํฌ ๋ถ„๋ฐฐ (tasks ๋ชจ๋“œ) + +์ฝ”๋”ฉ์ด ํ•„์š”ํ•œ ๋ณต์žกํ•œ ์ž‘์—…๋งŒ ํƒœ์Šคํฌ๋กœ ๋งŒ๋“œ์„ธ์š”. +**1๊ฐœ๋กœ ์ถฉ๋ถ„ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ 1๊ฐœ๋งŒ ๋งŒ๋“œ์„ธ์š”.** + +์—ฌ๋Ÿฌ ํƒœ์Šคํฌ๋Š” **์„œ๋กœ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์ด 2๊ฐœ ์ด์ƒ**์ผ ๋•Œ๋งŒ. ์ ˆ๋Œ€ ํ•˜์ง€ ๋ง ๊ฒƒ: - ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ "ํŒŒ์ผ ์ƒ์„ฑ", "์Šคํƒ€์ผ ์ถ”๊ฐ€", "๋กœ์ง ๊ตฌํ˜„"์œผ๋กœ ์ชผ๊ฐœ๊ธฐ @@ -27,14 +35,25 @@ review_feedback์ด ์ฃผ์–ด์ง€๋ฉด, ์ด์ „ ์‹œ๋„์—์„œ ์‹คํŒจํ•œ ์›์ธ์„ ๋ถ„์„ ## Output Format +### ์ง์ ‘ ์ฒ˜๋ฆฌํ•œ ๊ฒฝ์šฐ: ```json { - "summary": "์ž‘์—… ์š”์•ฝ (ํ•œ๊ตญ์–ด)", + "summary": "์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์š”์•ฝ", + "direct": true, + "result": "๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€" +} +``` + +### ํƒœ์Šคํฌ ๋ถ„๋ฐฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ: +```json +{ + "summary": "์ž‘์—… ์š”์•ฝ", + "direct": false, "tasks": [ { "id": 1, "title": "ํƒœ์Šคํฌ ์ œ๋ชฉ", - "description": "๊ตฌํ˜„ํ•  ๋‚ด์šฉ์„ ์ƒ์„ธํžˆ ๊ธฐ์ˆ . ์—์ด์ „ํŠธ๊ฐ€ ์ด๊ฒƒ๋งŒ ๋ณด๊ณ  ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.", + "description": "๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ. ์—์ด์ „ํŠธ๊ฐ€ ์ด๊ฒƒ๋งŒ ๋ณด๊ณ  ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.", "type": "create|modify|delete" } ], @@ -46,3 +65,4 @@ review_feedback์ด ์ฃผ์–ด์ง€๋ฉด, ์ด์ „ ์‹œ๋„์—์„œ ์‹คํŒจํ•œ ์›์ธ์„ ๋ถ„์„ - description์— ๋ชจ๋“  ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ ์œผ์„ธ์š” - ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•˜์„ธ์š” +- ๋‹จ์ˆœํ•œ ์ผ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”