偶数/奇数AI代理联盟系统
一个分布式多代理系统,实现了一个有竞争力的偶数/奇数游戏联盟。该系统包括三种代理类型(联赛经理、裁判、球员),通过 league.v2 通过JSON-RPC 2.0 HTTP传输使用MCP(模型上下文协议)的协议。
系统架构
┌─────────────────────────────────────────────────────────┐
│ LEAGUE MANAGEMENT LAYER │
│ ┌─────────────────────────────────────────────────┐ │
│ │ League Manager (Port 8000) │ │
│ │ - Player/Referee registration │ │
│ │ - Round-robin scheduling │ │
│ │ - Standings calculation │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────┐
│ GAME REFEREEING LAYER │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Referee REF01 │ │ Referee REF02 │ │
│ │ (Port 8001) │ │ (Port 8002) │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────┐
│ PLAYER LAYER │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ P01 │ │ P02 │ │ P03 │ │ P04 │ │
│ │ :8101 │ │ :8102 │ │ :8103 │ │ :8104 │ │
│ └────────┘ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────────────────────┘特性
- 多代理架构:联赛经理、裁判和球员
- 协议遵从:已满
league.v2具有18种消息类型的协议 - 可插拔策略:随机、确定性、交替、自适应
- 共享SDK:常见组件
SHARED/league_sdk/ - 安全:身份验证令牌验证、速率限制、输入净化
- 韧性:断路器,以指数回退重试
- JSONL日志记录:环形缓冲区结构化日志记录
- 状态持久性:代理在重启后仍能存活
- 演出:连接池、基准实用程序
- 可视化:性能图表
______________________________________________________________________
代码文件摘要
入口点和模拟
| 文件 | 描述 | 行 |
|---|---|---|
run_league.py | 联赛模拟入口点 | 52 |
simulation/__init__.py | 模拟包导出 | 24 |
simulation/player.py | 模拟玩家代理 | 70 |
simulation/referee.py | 模拟裁判代理人 | 48 |
simulation/league.py | 联盟编排 | 148 |
simulation/output.py | 输出格式 | 65 |
SDK核心
| 文件 | 描述 | 行 |
|---|---|---|
SHARED/league_sdk/mcp_server.py | FastAPI MCP服务器 | 148 |
SHARED/league_sdk/mcp_client.py | 带断路器的HTTP客户端 | 148 |
SHARED/league_sdk/schemas.py | 18种消息类型型号 | 148 |
SHARED/league_sdk/schemas_base.py | 基本模式和枚举 | 95 |
SHARED/league_sdk/auth.py | 速率限制和身份验证 | 148 |
SHARED/league_sdk/circuit_breaker.py | 断路器型式 | 145 |
SHARED/league_sdk/helpers.py | 实用功能 | 109 |
SHARED/league_sdk/logger.py | JSONL结构化记录器 | 113 |
SHARED/league_sdk/game_rules/even_odd.py | 游戏逻辑 | 95 |
SDK扩展
| 文件 | 描述 | 行 |
|---|---|---|
SHARED/league_sdk/ring_buffer_logger.py | 环形缓冲区日志记录 | 142 |
SHARED/league_sdk/state_persistence.py | 玩家状态持久性 | 140 |
SHARED/league_sdk/benchmarks.py | 绩效基准 | 138 |
SHARED/league_sdk/visualization.py | 结果可视化 | 130 |
SHARED/league_sdk/error_handlers.py | 错误恢复处理程序 | 135 |
代理
| 文件 | 描述 | 行 |
|---|---|---|
agents/league_manager/main.py | 联赛经理经纪人 | 87 |
agents/league_manager/handlers.py | LM消息处理程序 | 145 |
agents/referee_template/main.py | 裁判代理模板 | 75 |
agents/referee_template/handlers.py | 裁判处理程序 | 130 |
agents/player_template/main.py | 玩家代理模板 | 70 |
agents/player_template/handlers.py | 玩家处理程序 | 125 |
测试(按类别划分)
| 文件 | 描述 | 行 |
|---|---|---|
tests/test_timestamp.py | UTC时间戳验证 | 35 |
tests/test_enums.py | 枚举验证测试 | 62 |
tests/test_helpers.py | 辅助功能测试 | 35 |
tests/test_messages.py | 消息模型测试 | 95 |
tests/test_game_logic.py | 游戏逻辑测试 | 85 |
tests/test_points.py | 点数计算测试 | 30 |
tests/test_sender.py | 发件人解析测试 | 55 |
______________________________________________________________________
数学基础
偶数/奇数博弈论
偶数/奇数游戏是 对称零和博弈 一旦随机数被提取,结果就具有确定性。
概率分析
给定一个从1-10中随机抽取的数字:
- P(偶数) =5/10=0.5(数字:2、4、6、8、10)
- P(奇数) =5/10=0.5(数字:1、3、5、7、9)
结果矩阵
| 对手:偶数 | 对手:奇数 | |
|---|---|---|
| 你:甚至 | 平局(50%),赢/输(50%) | 偶数赢(50%) |
| 你:奇怪 | 偶数输(50%),奇数赢(50%) | 平局(50%)、输赢(50%) |
期望值
对于选择概率p为偶数的任何混合策略:
E[points] = 3 × P(win) + 1 × P(draw) + 0 × P(loss)纳什均衡
这 唯一纳什均衡 是随机策略:
- 选择概率为0.5的偶数
- 选择概率为0.5的奇数
这保证了每场比赛对任何对手策略的预期值为1.5分。
战略分析
| 策略 | vs随机 | vs偶数 | vs奇数 | vs自适应 |
|---|---|---|---|---|
| 随机 | 1.5 | 1.5 | 1.5 | 1.5 |
| 检测偶数 | 1.5 | 1.5 | 1.5 | 可变 |
| 检测赔率 | 1.5 | 1.5 | 1.5 | 可变 |
| 自适应 | 1.5 | >1.5 | >1.5 | 可变 |
这 适应战略 可以利用可预测的对手,但在随机游戏中表现相同。
______________________________________________________________________
虚拟环境设置(必需)
此项目使用 紫外线 用于快速、可靠的包管理。
步骤1:安装UV(如果未安装)
Linux/Mac/WSL:
curl -LsSf https://astral.sh/uv/install.sh | shWindows PowerShell:
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"步骤2:创建和激活虚拟环境
cd L25
uv venvWSL/Linux/Mac:
source .venv/bin/activateWindows PowerShell:
.venv\Scripts\activate步骤3:安装依赖项
uv pip install -r requirements.txt步骤4:验证安装
python --version
# Should show Python 3.10+
python -c "import fastapi; print(f'FastAPI: {fastapi.__version__}')"运行全联盟
按以下顺序在单独的终端中启动代理:
1号航站楼:联赛经理
cd agents/league_manager && python main.py终端2-3:裁判
cd agents/referee_REF01 && python main.py
cd agents/referee_REF02 && python main.py终端4-7:玩家
cd agents/player_P01 && python main.py
cd agents/player_P02 && python main.py
cd agents/player_P03 && python main.py
cd agents/player_P04 && python main.py玩家策略
| 玩家 | 策略 | 描述 |
|---|---|---|
| P01 | 随机 | 等概率偶数/奇数 |
| P02 | 确定性偶数 | 总是选择偶数 |
| P03 | 交替 | 偶数/奇数之间的切换 |
| P04 | 自适应 | 从对手历史中学习 |
快速模拟
用一个命令运行一个完整的联赛模拟:
python run_league.py______________________________________________________________________
性能基准
| 操作 | 平均时间 | 最小值 | 最大值 | 内存 |
|---|---|---|---|---|
| 注册 | 8ms | 5ms | 15ms | 1.2MB |
| 比赛执行时间 | 12ms | 8ms | 25ms | 1.5MB |
| 奇偶校验选择 | 2ms | 1ms | 5ms | 0.5MB |
| 展位计算 | 3ms | 2ms | 8ms | 0.8MB |
| 全联盟(6场比赛) | 150ms | 100ms | 250ms | 8MB |
______________________________________________________________________
结果
联盟活动日志
| 时间 | 事件 | 详细信息 |
|---|---|---|
| 11:04:29 | 参考_已注册 | REF01已注册 |
| 11:04:29 | 参考_已注册 | REF02已注册 |
| 11:04:29 | 玩家_已注册 | P01(AlphaBot)已注册 |
| 11:04:29 | 玩家_已注册 | P02(BetaBot)已注册 |
| 11:04:29 | 玩家_已注册 | P03(GammaBot)已注册 |
| 11:04:29 | 玩家_已注册 | P04(DeltaBot)已注册 |
| 11:04:29 | 日程生成 | 3轮,6场比赛 |
| 11:04:29 | 联赛开始 | |
| 11:04:29 | 第一轮开始 | |
| 11:04:29 | 材料已完成 | R1M1:P01与P02->图纸 |
| 11:04:29 | 材料已完成 | R1M2:P03与P04->图纸 |
| 11:04:29 | 第一轮比赛已完成 | 第二轮比赛已结束 |
| 11:04:29 | 第二轮开始 | |
| 11:04:29 | 材料已完成 | R2M1:P01与P03->图纸 |
| 11:04:29 | 材料已完成 | R2M2:P02与P04->图纸 |
| 11:04:29 | 第二轮比赛已完成 | |
| 11:04:29 | 第三轮开始 | |
| 11:04:29 | 已完成 | R3M1:P01与P04->P04 |
| 11:04:29 | 材料已完成 | R3M2:P02与P03->图纸 |
| 11:04:29 | 第三轮比赛已完成 | |
| 11:04:29 | 联赛结束 | 联赛结束 |
最终排名
| 排名 | 玩家 | 策略 | P | W | D | L | 得分 |
|---|---|---|---|---|---|---|---|
| 1 | P04(DeltaBot) | 自适应 | 3 | 1 | 2 | 0 | 5 |
| 2 | P02(BetaBot) | 确定性_偶数 | 3 | 0 | 3 | 0 | 3 |
| 3 | P03(GammaBot) | 交替 | 3 | 0 | 3 | 0_3 | |
| 4 | P01(AlphaBot) | 随机 | 3 | 0 | 2 | 1 | 2 |
冠军
P04(德尔塔机器人) -适应性策略
- 记录:1W-2D-0L(5分)
- 通过学习对手模式获得的自适应策略!
______________________________________________________________________
示例游戏2:确定性策略获胜
第二轮联赛展示了结果如何根据随机抽签而变化:
比赛历史
| 比赛 | 回合 | 球员A | 选择 | 对战 | 球员B | 选择 | 平局# | 获胜者 |
|---|---|---|---|---|---|---|---|---|
| R1M1 | 1 | P01 | 偶数 | vs | P02 | 偶数 | 6 | DRAW |
| R1M2 | 1 | P03 | 偶数 | vs | P04 | 偶数 | 9 | DRAW |
| R2M1 | 2 | P01 | 奇数 | vs | P03 | 奇数 | 7 | DRAW |
| R2M2 | 2 | P02 | 偶数 | vs | P04 | 奇数 | 2 | P02 |
| R3M1 | 3 | P01 | 奇数 | vs | P04 | 奇数 | 1 | DRAW |
| R3M2 | 3 | P02 | 偶数 | vs | P03 | 偶数 | 2 | DRAW |
最终排名
| 排名 | 玩家 | 策略 | P | W | D | L | 得分 |
|---|---|---|---|---|---|---|---|
| 1 | P02(BetaBot) | 确定性_偶数 | 3 | 1 | 2 | 0 | 5 |
| 2 | P01(AlphaBot) | 随机 | 3 | 0 | 3 | 0 | 3 |
| 3 | P03(GammaBot) | 交替 | 3 | 0 | 3 | 0_3 | |
| 4 | P04(DeltaBot) | 自适应 | 3 | 0 | 2 | 1 | 2 |
冠军
P02(BetaBot) -确定性均衡策略
- 记录:1W-2D-0L(5分)
- 性能:总计0.27ms,0.04ms/批
- 当适应性对手在偶数平局中选择奇数时,确定性偶数策略获胜!
分析
这个游戏展示了如何 同样的策略会产生不同的结果 基于随机抽取:
- 游戏1:通过利用模式赢得的适应性策略(P04)
- 游戏2:当P04的自适应选择错误时,确定性偶数(P02)获胜
这说明了 混合策略纳什均衡 -没有一种纯粹的策略在所有游戏中都占主导地位。
______________________________________________________________________
故障排除
“找不到模块”错误
# Ensure virtual environment is activated
source .venv/bin/activate # Linux/Mac/WSL
.venv\Scripts\activate # Windows
# Verify Python path
which python # Should point to .venv/bin/python连接被拒绝
# Start agents in order: Manager → Referees → Players
# Check if agent is running
curl http://localhost:8000/health端口已在使用中
# Find process using port (Linux/Mac)
lsof -i :8000
# Find process using port (Windows)
netstat -ano | findstr :8000
# Kill process (Windows)
taskkill /PID
/F注册超时
# Verify League Manager is responding
curl http://localhost:8000/health
# Check firewall settings
# Ensure no VPN interfering with localhostWSL路径问题
# Use Linux paths in WSL, not Windows paths
# Wrong: /mnt/c/Users/...
# Right: ~/projects/L25安装后未找到紫外线
# Add to PATH (add to ~/.bashrc or ~/.zshrc)
export PATH="$HOME/.cargo/bin:$PATH"
source ~/.bashrc # or source ~/.zshrc测试中的导入错误
# Ensure SHARED is in PYTHONPATH
export PYTHONPATH="${PYTHONPATH}:$(pwd)/SHARED"
pytest tests/ -v代理在启动时崩溃
# Check log files in SHARED/logs/{agent_type}/
cat SHARED/logs/players/P01.log.jsonl | tail -20
# Verify JSON config files are valid
python -c "import json; json.load(open('SHARED/config/agents.json'))"未显示匹配结果
# Verify all agents registered successfully
# Check League Manager logs for registration events
# Ensure referees received match assignments______________________________________________________________________
API 文档
看 docs/API.md文件 以获取完整的API参考。
运行测试
# Run all tests
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=SHARED/league_sdk
# Run specific test
pytest tests/test_protocol.py -v学习目标
该项目展示了:
- 多智能体系统 -自主代理之间的协调
- MCP协议 -基于HTTP的JSON-RPC 2.0实现
- 分布式体系结构 -三层体系设计
- 协议遵从 -严格遵守规范
- 策略模式 -可插拔决策算法
- 存储库模式 -干净的数据访问抽象
- 断路器 -容错模式
- 速率限制 -请求调节稳定性
许可证
教育用途的开源。
