test: Full E2E Pipeline 성공 (Plan→Code→Review) — 3호출 219초 #task-190
This commit is contained in:
@@ -36,7 +36,7 @@ class TaskPipeline:
|
|||||||
f"Decompose this request into concrete tasks."
|
f"Decompose this request into concrete tasks."
|
||||||
)
|
)
|
||||||
|
|
||||||
response = await self.gemini.call("planner", prompt, timeout=90)
|
response = await self.gemini.call("planner", prompt, timeout=180)
|
||||||
self._log("plan", user_request, response)
|
self._log("plan", user_request, response)
|
||||||
|
|
||||||
# JSON 추출
|
# JSON 추출
|
||||||
@@ -54,7 +54,7 @@ class TaskPipeline:
|
|||||||
f"Implement the changes described in the task."
|
f"Implement the changes described in the task."
|
||||||
)
|
)
|
||||||
|
|
||||||
response = await self.gemini.call("coder", prompt, timeout=120)
|
response = await self.gemini.call("coder", prompt, timeout=180)
|
||||||
self._log("code", task.get("title", ""), response)
|
self._log("code", task.get("title", ""), response)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ class TaskPipeline:
|
|||||||
f"Review the code changes."
|
f"Review the code changes."
|
||||||
)
|
)
|
||||||
|
|
||||||
response = await self.gemini.call("reviewer", prompt, timeout=90)
|
response = await self.gemini.call("reviewer", prompt, timeout=180)
|
||||||
self._log("review", task.get("title", ""), response)
|
self._log("review", task.get("title", ""), response)
|
||||||
|
|
||||||
review = self._extract_json(response)
|
review = self._extract_json(response)
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
"""E2E Test: Task Pipeline with real Gemini CLI.
|
"""Full E2E Test: Plan → Code → Review with real Gemini CLI.
|
||||||
|
|
||||||
Tests Planner phase against the variet-agent project.
|
Tests the complete pipeline against a concrete improvement task.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import io
|
import io
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
|
import time
|
||||||
|
|
||||||
if sys.stdout.encoding != "utf-8":
|
if sys.stdout.encoding != "utf-8":
|
||||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
|
||||||
@@ -16,40 +17,71 @@ from core.task_pipeline import TaskPipeline
|
|||||||
|
|
||||||
PROJECT = r"C:\Users\CafeVariet-GL552VW\Desktop\source_diff\variet-agent"
|
PROJECT = r"C:\Users\CafeVariet-GL552VW\Desktop\source_diff\variet-agent"
|
||||||
|
|
||||||
|
USER_REQUEST = (
|
||||||
async def test_planner():
|
"project_indexer.py의 find_relevant 함수가 공백이 포함된 쿼리를 처리하지 못합니다. "
|
||||||
print("=" * 60)
|
"'gemini caller'로 검색하면 gemini_caller.py를 찾지 못합니다. "
|
||||||
print("E2E TEST: Planner")
|
"밑줄과 공백을 동일하게 처리하도록 개선해주세요."
|
||||||
print("=" * 60)
|
)
|
||||||
|
|
||||||
pipeline = TaskPipeline(PROJECT, token_budget=30_000)
|
|
||||||
pipeline.setup()
|
|
||||||
|
|
||||||
plan = await pipeline.plan(
|
|
||||||
"project_indexer.py의 find_relevant 함수가 공백이 포함된 쿼리를 처리하지 못합니다. "
|
|
||||||
"'gemini caller'로 검색하면 gemini_caller.py를 찾지 못합니다. "
|
|
||||||
"밑줄과 공백을 동일하게 처리하도록 개선해주세요."
|
|
||||||
)
|
|
||||||
|
|
||||||
print(f"\n📋 Plan result:")
|
|
||||||
print(json.dumps(plan, ensure_ascii=False, indent=2))
|
|
||||||
|
|
||||||
if plan.get("tasks"):
|
|
||||||
print(f"\n✅ Planner returned {len(plan['tasks'])} tasks")
|
|
||||||
for t in plan["tasks"]:
|
|
||||||
print(f" - {t.get('title', t.get('id', '?'))}: {t.get('description', '')[:80]}")
|
|
||||||
else:
|
|
||||||
print(f"\n⚠️ No structured tasks, raw response:")
|
|
||||||
print(plan.get("raw", plan.get("summary", ""))[:500])
|
|
||||||
|
|
||||||
return plan
|
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
plan = await test_planner()
|
start = time.time()
|
||||||
|
pipeline = TaskPipeline(PROJECT, token_budget=15_000)
|
||||||
|
pipeline.setup()
|
||||||
|
|
||||||
|
# === PHASE 1: Plan ===
|
||||||
|
print("=" * 60)
|
||||||
|
print("PHASE 1: PLANNER")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
plan = await pipeline.plan(USER_REQUEST)
|
||||||
|
tasks = plan.get("tasks", [])
|
||||||
|
|
||||||
|
print(f"Summary: {plan.get('summary', 'N/A')}")
|
||||||
|
print(f"Tasks: {len(tasks)}")
|
||||||
|
for t in tasks:
|
||||||
|
print(f" [{t.get('id')}] {t.get('title')}")
|
||||||
|
print(f" Files: {t.get('files')}")
|
||||||
|
print(f" Risk: {plan.get('risk', 'N/A')}")
|
||||||
|
|
||||||
|
if not tasks:
|
||||||
|
print("❌ No tasks returned, stopping.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# === PHASE 2: Code (first task only) ===
|
||||||
print(f"\n{'=' * 60}")
|
print(f"\n{'=' * 60}")
|
||||||
print(f"Gemini calls: {1}")
|
print("PHASE 2: CODER (Task 1 only)")
|
||||||
print(f"✅ E2E Planner test complete!")
|
print("=" * 60)
|
||||||
|
|
||||||
|
first_task = tasks[0]
|
||||||
|
code_output = await pipeline.code(first_task)
|
||||||
|
|
||||||
|
print(f"Output length: {len(code_output)} chars")
|
||||||
|
print(f"First 800 chars:")
|
||||||
|
print(code_output[:800])
|
||||||
|
print("...")
|
||||||
|
|
||||||
|
# === PHASE 3: Review ===
|
||||||
|
print(f"\n{'=' * 60}")
|
||||||
|
print("PHASE 3: REVIEWER")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
review = await pipeline.review(first_task, code_output)
|
||||||
|
|
||||||
|
print(f"Passed: {review.get('passed', 'N/A')}")
|
||||||
|
if review.get("issues"):
|
||||||
|
for issue in review["issues"]:
|
||||||
|
print(f" [{issue.get('severity')}] {issue.get('description', '')[:80]}")
|
||||||
|
print(f"Summary: {review.get('summary', 'N/A')[:200]}")
|
||||||
|
|
||||||
|
# === Results ===
|
||||||
|
elapsed = time.time() - start
|
||||||
|
print(f"\n{'=' * 60}")
|
||||||
|
print(f"RESULTS")
|
||||||
|
print(f" Gemini calls: {pipeline.gemini.call_count}")
|
||||||
|
print(f" Total time: {elapsed:.1f}s")
|
||||||
|
print(f" Pipeline log entries: {len(pipeline.log)}")
|
||||||
|
print(f"✅ Full E2E test complete!")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user