| import asyncio |
| import logging |
| import os |
| import time |
|
|
| from dotenv import load_dotenv |
|
|
| from src.agents.workflow.engine import WorkflowEngine |
| from src.agents.workflow.engine_beta_graph import BetaState, beta_graph |
|
|
| logging.basicConfig(level=logging.WARNING, format="%(message)s") |
| logger = logging.getLogger("comparison") |
| logger.setLevel(logging.INFO) |
|
|
| async def test_linear_engine(prompt: str): |
| logger.info("=== Starting Linear Engine Test ===") |
| start_time = time.time() |
|
|
| os.environ["SUPERVISOR_AGENT_MODEL"] = "gemini-3.1-flash-lite" |
| os.environ["WORKER_AGENT_MODEL"] = "gemini-3.1-flash-lite" |
|
|
| engine = WorkflowEngine() |
| result = await engine.run_workflow(initial_prompt=prompt, task_type="Marketing Data Deep Dive") |
|
|
| end_time = time.time() |
|
|
| logger.info(f"Linear Engine finished in {end_time - start_time:.2f} seconds") |
| logger.info(f"Linear Engine Steps: {result.get('step_count')}") |
| return end_time - start_time, result.get("step_count") |
|
|
| async def test_fanout_engine(prompt: str): |
| logger.info("=== Starting Fan-out Beta Engine Test ===") |
| start_time = time.time() |
|
|
| state = BetaState() |
| state.shared.messages = [{"role": "user", "content": prompt}] |
|
|
| try: |
| run_result = await beta_graph.run(deps=None, state=state) |
| |
| final_state = run_result.state |
|
|
| end_time = time.time() |
|
|
| logger.info(f"Fan-out Engine finished in {end_time - start_time:.2f} seconds") |
| logger.info(f"Fan-out Token ROI: Input: {final_state.shared.input_tokens}, Output: {final_state.shared.output_tokens}") |
| return end_time - start_time, final_state.shared.input_tokens, final_state.shared.output_tokens |
| except Exception as e: |
| logger.error(f"Fan-out Engine failed: {e}") |
| return 0, 0, 0 |
|
|
| async def main(): |
| load_dotenv() |
|
|
| prompt = "Please analyze the Q3 campaign results. We spent $50k on ads, got 10k clicks, but only 50 conversions. Also the backend API crashed 5 times yesterday. I need insights on sales, marketing, and system stability." |
|
|
| linear_time, linear_steps = await test_linear_engine(prompt) |
| fanout_time, fanout_in, fanout_out = await test_fanout_engine(prompt) |
|
|
| logger.info("\n\n" + "="*50) |
| logger.info("📊 ARCHON WORKFLOW ENGINE COMPARISON") |
| logger.info("="*50) |
| logger.info("【架構差異】") |
| logger.info("- Linear (v1) : 迴圈決策 (Supervisor -> Worker -> Supervisor -> ...)") |
| logger.info("- Fan-out (v2): Map-Reduce (發散 -> 並行執行 -> Join Barrier -> 聚合)") |
| logger.info("") |
| logger.info("【效能數據】") |
| logger.info(f"- Linear Engine Time : {linear_time:.2f} seconds ({linear_steps} 狀態機躍遷)") |
| logger.info(f"- Fan-out Engine Time: {fanout_time:.2f} seconds (3 Worker 並發 + 1 Supervisor)") |
| logger.info(f"- Token 總消耗 (v2) : Input {fanout_in}, Output {fanout_out}") |
| if linear_time > 0 and fanout_time > 0: |
| if linear_time > fanout_time: |
| speedup = ((linear_time - fanout_time) / linear_time) * 100 |
| logger.info(f"🚀 速度提升: 快了 {speedup:.1f}%") |
| else: |
| overhead = ((fanout_time - linear_time) / linear_time) * 100 |
| logger.info(f"⏱️ 延遲增加: 慢了 {overhead:.1f}%") |
| logger.info("="*50) |
|
|
| if __name__ == "__main__": |
| asyncio.run(main()) |
|
|