95 lines
4.1 KiB
Python
95 lines
4.1 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""Agent 蜂群 - 端到端测试"""
|
|||
|
|
import sys, os, io, json, requests
|
|||
|
|
|
|||
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
|
|||
|
|
|
|||
|
|
BASE = "http://localhost:8038/api/v1"
|
|||
|
|
|
|||
|
|
def login():
|
|||
|
|
r = requests.post(f"{BASE}/auth/login", data={"username": "admin", "password": "123456"})
|
|||
|
|
r.raise_for_status()
|
|||
|
|
return r.json()["access_token"]
|
|||
|
|
|
|||
|
|
def test_swarm():
|
|||
|
|
token = login()
|
|||
|
|
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
|
|||
|
|
print("=== Agent 蜂群测试 ===\n")
|
|||
|
|
|
|||
|
|
# Test 1: Simple swarm - leader decides no decomposition needed
|
|||
|
|
print("1. 简单问题(Leader 自行处理)…")
|
|||
|
|
r1 = requests.post(f"{BASE}/swarm/run", headers=headers,
|
|||
|
|
json={"message": "1+1等于几?", "max_teammates": 3}, timeout=120)
|
|||
|
|
r1.raise_for_status()
|
|||
|
|
d1 = r1.json()
|
|||
|
|
print(f" 模式: {d1['mode']}")
|
|||
|
|
print(f" 任务数: {len(d1['tasks'])}")
|
|||
|
|
print(f" 回答: {d1['final_answer'][:200]}…")
|
|||
|
|
ok1 = d1["success"] and len(d1["final_answer"]) > 0
|
|||
|
|
print(f" {'✓ 通过' if ok1 else '✗ 失败'}\n")
|
|||
|
|
|
|||
|
|
# Test 2: Complex problem that needs decomposition
|
|||
|
|
print("2. 复杂问题(Leader 分解 + Teammates 并行)…")
|
|||
|
|
r2 = requests.post(f"{BASE}/swarm/run", headers=headers,
|
|||
|
|
json={
|
|||
|
|
"message": "请帮我同时做三件事:1) 生成一个斐波那契数列前10项 2) 列出Python的5个主要特性 3) 解释什么是REST API",
|
|||
|
|
"max_teammates": 3,
|
|||
|
|
"mode": "parallel",
|
|||
|
|
}, timeout=300)
|
|||
|
|
r2.raise_for_status()
|
|||
|
|
d2 = r2.json()
|
|||
|
|
print(f" 模式: {d2['mode']}")
|
|||
|
|
print(f" 任务数: {len(d2['tasks'])}")
|
|||
|
|
print(f" Teammate结果数: {len(d2['teammate_results'])}")
|
|||
|
|
for tr in d2['teammate_results']:
|
|||
|
|
print(f" - {tr['agent_name']}: {'✓' if tr['success'] else '✗'} ({tr['duration_ms']}ms)")
|
|||
|
|
print(f" 总耗时: {d2['total_duration_ms']}ms")
|
|||
|
|
print(f" 总工具调用: {d2['total_tool_calls']}")
|
|||
|
|
print(f" 汇总回答: {d2['final_answer'][:300]}…")
|
|||
|
|
ok2 = d2["success"]
|
|||
|
|
print(f" {'✓ 通过' if ok2 else '✗ 失败'}\n")
|
|||
|
|
|
|||
|
|
# Test 3: Swarm with specific agents as teammates
|
|||
|
|
print("3. 指定 Agent 作为 Teammate…")
|
|||
|
|
r_agents = requests.get(f"{BASE}/agents", headers=headers, params={"limit": 5}, timeout=10)
|
|||
|
|
r_agents.raise_for_status()
|
|||
|
|
agents_data = r_agents.json()
|
|||
|
|
agents = agents_data if isinstance(agents_data, list) else agents_data.get("items", [])
|
|||
|
|
if len(agents) >= 2:
|
|||
|
|
agent_ids = [agents[0]["id"], agents[1]["id"]]
|
|||
|
|
r3 = requests.post(f"{BASE}/swarm/run", headers=headers,
|
|||
|
|
json={
|
|||
|
|
"message": "请从两个角度分析Python的优势:技术角度和生态角度",
|
|||
|
|
"max_teammates": 2,
|
|||
|
|
"agent_ids": agent_ids,
|
|||
|
|
"mode": "parallel",
|
|||
|
|
}, timeout=300)
|
|||
|
|
r3.raise_for_status()
|
|||
|
|
d3 = r3.json()
|
|||
|
|
print(f" 任务数: {len(d3['tasks'])}")
|
|||
|
|
print(f" Teammate结果数: {len(d3['teammate_results'])}")
|
|||
|
|
for tr in d3['teammate_results']:
|
|||
|
|
print(f" - {tr['agent_name']}: {'✓' if tr['success'] else '✗'} ({tr['duration_ms']}ms)")
|
|||
|
|
print(f" 汇总回答: {d3['final_answer'][:200]}…")
|
|||
|
|
ok3 = d3["success"]
|
|||
|
|
else:
|
|||
|
|
print(" ⚠ 跳过(Agent 不足)")
|
|||
|
|
ok3 = True
|
|||
|
|
print(f" {'✓ 通过' if ok3 else '✗ 失败'}\n")
|
|||
|
|
|
|||
|
|
# Test 4: Health check
|
|||
|
|
print("4. 健康检查…")
|
|||
|
|
r4 = requests.get(f"http://localhost:8038/health", timeout=10)
|
|||
|
|
r4.raise_for_status()
|
|||
|
|
d4 = r4.json()
|
|||
|
|
print(f" 状态: {d4['status']}")
|
|||
|
|
ok4 = d4["status"] == "healthy"
|
|||
|
|
print(f" {'✓ 通过' if ok4 else '✗ 失败'}\n")
|
|||
|
|
|
|||
|
|
all_ok = ok1 and ok2 and ok3 and ok4
|
|||
|
|
print(f"=== {'全部测试通过' if all_ok else '部分测试失败'} ===")
|
|||
|
|
return all_ok
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
test_swarm()
|