AI_Diplomacy
AI_Diplomacy 是一个让大语言模型(LLM)自主游玩经典策略桌游《外交》(Diplomacy)的开源项目。在《外交》这款游戏中,玩家不仅需要通过军事移动争夺领土,更核心的是要进行复杂的人际谈判、结盟与背叛。传统 AI 往往难以处理这种高度依赖自然语言沟通和心理博弈的场景,而 AI_Diplomacy 正是为了解决这一难题而生。
该项目为游戏中的每个势力赋予了独立的智能体,它们不仅能根据战局动态调整战略目标,还拥有独特的“记忆系统”。通过私人的日记记录、关系追踪以及年度总结机制,这些智能体能够像人类一样记住过往的承诺与背叛,从而制定长期的外交策略。此外,它支持多种主流大模型后端,并集成了路径规划算法来辅助军事决策,实现了从私下谈判到公开指令生成的全流程自动化。
AI_Diplomacy 特别适合人工智能研究人员、游戏开发者以及对多智能体协作感兴趣的技术爱好者使用。其独特的技术亮点在于构建了双层记忆架构和状态感知能力,使得智能体不再是简单的指令执行者,而是具备个性、能进行深度推理和情感计算的虚拟外交官,为研究大模型在复杂博弈环境中的表现提供了极佳的实验平台。
使用场景
某高校博弈论研究团队正在利用《外交》(Diplomacy)棋盘游戏模拟多智能体间的复杂谈判与背叛行为,以测试大语言模型在动态战略环境下的决策能力。
没有 AI_Diplomacy 时
- 状态维护困难:研究人员需手动记录每个势力的目标变化和与其他玩家的关系(敌对/盟友),极易出现数据遗漏或逻辑矛盾。
- 谈判深度不足:传统脚本只能基于固定规则回复,无法进行多轮次、带有情感色彩和策略欺骗的深度私下协商。
- 背叛检测滞后:难以实时对比“口头承诺”与“实际指令”,往往要在游戏结束后通过人工复盘才能发现谁背叛了谁。
- 上下文记忆受限:随着游戏年份增加,历史对话和战局细节超出模型窗口限制,导致 AI 遗忘关键前情,决策变得短视且不合理。
使用 AI_Diplomacy 后
- 自主状态管理:AI_Diplomacy 为每个势力配备独立的智能体,自动追踪动态目标并实时更新关系图谱,确保战略逻辑始终连贯。
- 拟人化深度博弈:智能体能根据性格设定发起多轮私密谈判,精准识别被忽略的信息,甚至主动实施或识破复杂的欺诈策略。
- 实时背信分析:系统自动比对谈判记录与最终下达的军事指令,即时标记背叛行为并生成分析报告,让研究者能直观看到信任崩塌的瞬间。
- 智能记忆压缩:通过双层记忆系统(私人日记 + 年度总结),自动提炼关键历史事件,既防止上下文溢出,又确保 AI 拥有长期的战略视野。
AI_Diplomacy 将原本枯燥的规则执行转化为充满心理博弈的动态实验场,让研究者能以前所未有的粒度观察大模型在复杂社交环境中的进化过程。
运行环境要求
- 未说明
非必需(基于云端 LLM API,如 OpenAI、Claude、Gemini 等,无需本地 GPU 推理)
未说明

快速开始
AI 外交:由大语言模型驱动的战略游戏
由 Alex Duffy @Alx-Ai 和 Tyler Marques @Tylermarques 创建
概述
此仓库在原始 Diplomacy 项目的基础上进行了扩展,引入了由大型语言模型(LLM)驱动的高级 AI 代理。游戏中每个大国均由一个自主代理控制,该代理能够维护自身状态、建立关系、开展谈判并作出战略决策。
核心特性
🤖 带状态的 AI 代理
每个大国由一个 DiplomacyAgent 表示,具备以下功能:
- 动态目标:根据游戏事件不断调整的战略目标
- 关系追踪:与其他大国保持敌对、不友好、中立、友好或同盟等关系
- 记忆系统:双层记忆结构,包括结构化的日记条目和整合机制
- 个性设定:基于大国特性的系统提示塑造每个代理的外交风格
💬 丰富的谈判机制
- 多轮消息交互(私密与全局)
- 关系感知的沟通策略
- 消息历史追踪与分析
- 能够检测被忽略的消息及无响应的大国
🎯 战略指令生成
- 使用广度优先搜索进行移动路径分析
- 结合上下文选择最近的威胁或机会对应的指令
- 提供后备逻辑以增强鲁棒性
- 支持多种 LLM 服务提供商(OpenAI、Claude、Gemini、DeepSeek、OpenRouter)
📊 高级游戏分析
- 自定义回合总结,按成功/失败分类
- 通过比较指令与谈判内容检测背叛行为
- 针对高层指令的战略规划阶段
- 全面记录所有 LLM 的交互过程
🧠 记忆管理
- 私人日记:按回合编号的结构化条目,用于提供给 LLM 的上下文
- 包含关系更新的谈判摘要
- 指令推理与战略理由
- 反应背叛行为的回合结果分析
- 年度整合:自动汇总旧条目,防止上下文过载
- 智能上下文构建:仅向 LLM 提供相关的历史记录
AI 代理的工作原理
下图展示了每个 AI 代理的完整信息流与决策流程:
graph TB
%% 游戏状态来源
subgraph "游戏状态信息"
GS[游戏状态<br/>- 单位位置<br/>- 补给中心<br/>- 各国状态]
GH[游戏历史<br/>- 历史指令<br/>- 历史消息<br/>- 回合结果]
PS[回合总结<br/>- 成功行动<br/>- 失败行动<br/>- 棋盘变化]
end
%% 代理内部状态
subgraph "代理状态 (DiplomacyAgent)"
GOALS[动态目标<br/>- 扩张目标<br/>- 联盟优先级<br/>- 防御需求]
REL[关系<br/>从敌对到同盟的等级]
subgraph "记忆系统"
DIARY[私人日记<br/>按回合编号的条目]
ND[谈判日记<br/>- 消息分析<br/>- 信任评估<br/>- 关系变化]
OD[指令日记<br/>- 战略推理<br/>- 风险收益分析]
PRD[回合结果日记<br/>- 结果分析<br/>- 背叛检测<br/>- 成功评价]
CONS[日记整合<br/>每年使用 Gemini Flash 生成摘要]
end
JOURNAL[私人日志<br/>仅用于调试]
end
%% 上下文构建
subgraph "上下文构建"
POC[Possible Order Context<br/>- BFS 路径搜索<br/>- 最近的敌人<br/>- 未控制的补给中心<br/>- 相邻领土]
BCP[build_context_prompt<br/>整合所有信息]
RECENT[近期上下文<br/>- 最近 40 条日记条目<br/>- 当前关系<br/>- 当前目标]
end
%% LLM 决策点
subgraph "LLM 决策点"
INIT_LLM[初始化<br/>设定初始目标与关系]
NEG_LLM[谈判<br/>生成消息<br/>更新关系]
PLAN_LLM[规划<br/>制定战略指令]
ORD_LLM[指令生成<br/>选择具体行动]
STATE_LLM[状态更新<br/>调整目标与关系]
end
%% 提示模板
subgraph "提示模板"
PROMPTS[大国专属提示<br/>+ 指令模板<br/>+ 上下文模板]
end
%% 信息流动
GS --> BCP
GH --> BCP
PS --> STATE_LLM
GOALS --> BCP
REL --> BCP
DIARY --> RECENT
RECENT --> BCP
POC --> BCP
BCP --> NEG_LLM
BCP --> ORD_LLM
BCP --> PLAN_LLM
PROMPTS --> INIT_LLM
PROMPTS --> NEG_LLM
PROMPTS --> PLAN_LLM
PROMPTS --> ORD_LLM
PROMPTS --> STATE_LLM
%% 日记更新
NEG_LLM --> ND
ORD_LLM --> OD
PS --> PRD
ND --> DIARY
OD --> DIARY
PRD --> DIARY
%% 状态更新
INIT_LLM --> GOALS
INIT_LLM --> REL
NEG_LLM --> REL
STATE_LLM --> GOALS
STATE_LLM --> REL
%% 整合
DIARY -->|每两年一次| CONS
CONS -->|汇总后| DIARY
%% 样式
classDef gameState fill:#e74c3c,stroke:#333,stroke-width:2px,color:#fff
classDef agentState fill:#3498db,stroke:#333,stroke-width:2px,color:#fff
classDef context fill:#2ecc71,stroke:#333,stroke-width:2px,color:#fff
classDef llm fill:#f39c12,stroke:#333,stroke-width:2px,color:#fff
classDef memory fill:#9b59b6,stroke:#333,stroke-width:2px,color:#fff
class GS,GH,PS gameState
class GOALS,REL,JOURNAL agentState
class POC,BCP,RECENT context
class INIT_LLM,NEG_LLM,PLAN_LLM,ORD_LLM,STATE_LLM llm
class DIARY,ND,OD,PRD,CONS memory
关键组件详解
信息来源
- 游戏状态:当前棋盘布局、单位位置及补给中心归属
- 游戏历史:过去的所有指令、消息及结果记录
- 回合总结:对每回合成功与失败情况的分类分析
代理记忆架构
- 私人日记:主要的记忆系统,按回合进行结构化记录
- 日记类型:三种专门的日记类型分别记录游戏的不同方面
- 整合机制:每年自动汇总日记内容,防止上下文过载
- 日志:非结构化的调试日志(不用于 LLM)
上下文构建
- 战略分析:利用广度优先搜索识别潜在的威胁与机遇
- 关系上下文:当前的外交关系影响所有决策
- 历史上下文:近期的日记条目为决策提供连续性
LLM 决策点
- 初始化:设定初始性格特征与目标
- 谈判:基于关系生成符合情境的消息
- 规划:制定高层次的战略指令
- 指令:结合全面的战略上下文选择具体行动
- 状态更新:根据游戏结果调整目标与关系
实现细节
核心文件
lm_game.py- 主游戏调度器- 管理智能体的生命周期和游戏阶段
- 协调异步LLM调用以实现最大性能
- 处理错误跟踪与恢复
- 保存包含阶段摘要和智能体关系的游戏状态
ai_diplomacy/agent.py- 带状态的智能体实现DiplomacyAgent类,包含目标、关系和记忆- 强健的JSON解析功能,适用于多种LLM响应格式
- 每次游戏事件生成日记条目
- 基于游戏结果的状态更新逻辑
ai_diplomacy/clients.py- LLM抽象层BaseModelClient接口,用于所有LLM提供商- 提供OpenAI、Claude、Gemini、DeepSeek、OpenRouter等实现
- 构建提示并解析响应
- 具备重试逻辑和错误处理机制
ai_diplomacy/possible_order_context.py- 战略分析- 在游戏地图上进行广度优先搜索路径规划
- 识别最近的威胁或机会
- 分析相邻领土
- 为指令生成丰富的XML上下文
ai_diplomacy/prompt_constructor.py- 集中式提示构建- 整合游戏状态、智能体状态和战略上下文
- 格式化不同LLM任务的提示
- 与模板系统集成
ai_diplomacy/game_history.py- 游戏各阶段追踪- 存储消息、指令及结果
- 为智能体提供历史背景
- 跟踪被忽略的消息,用于关系分析
提示模板
ai_diplomacy/prompts/目录下包含可定制的模板:
- 针对各强国的系统提示(如
france_system_prompt.txt) - 针对特定任务的指令(
order_instructions.txt、conversation_instructions.txt) - 针对不同游戏事件的日记生成提示
- 状态更新与规划模板
运行AI游戏
# 基本谈判游戏
python lm_game.py --max_year 1910 --num_negotiation_rounds 3
# 包含战略规划阶段
python lm_game.py --max_year 1910 --planning_phase --num_negotiation_rounds 2
# 自定义模型分配(顺序:奥地利、英格兰、法国、德国、意大利、俄罗斯、土耳其)
python lm_game.py --models "claude-3-5-sonnet-20241022,gpt-4o,claude-3-5-sonnet-20241022,gpt-4o,claude-3-5-sonnet-20241022,gpt-4o,claude-3-5-sonnet-20241022"
# 直到游戏结束或特定年份
python lm_game.py --num_negotiation_rounds 2 --planning_phase
# 将所有数据输出到指定目录(若目录已存在则自动续跑)
python lm_game.py --run_dir results/game_run_001
# 从特定阶段恢复中断的游戏
python lm_game.py --run_dir results/game_run_001 --resume_from_phase S1902M
# 关键状态分析:从现有运行中恢复,但将新结果保存到其他位置
python lm_game.py \
--run_dir results/game_run_001 \
--critical_state_analysis_dir results/critical_analysis_001 \
--resume_from_phase F1903M
# 在特定阶段后结束模拟,无论剩余年份多少
python lm_game.py --run_dir results/game_run_002 --end_at_phase F1905M
# 设置全局最大token生成限制
python lm_game.py --run_dir results/game_run_003 --max_tokens 8000
# 按模型设置token限制(AU,EN,FR,GE,IT,RU,TR)
python lm_game.py --run_dir results/game_run_004 \
--max_tokens_per_model "8000,8000,16000,8000,8000,16000,8000"
# 使用自定义提示目录
python lm_game.py --run_dir results/game_run_005 --prompts_dir ./prompts/my_variants
设置--models(快速指南)
请按固定顺序传递一个由最多七个模型ID组成的逗号分隔列表:奥地利、英格兰、法国、德国、意大利、俄罗斯、土耳其。
模型ID语法
<客户端前缀>:模型[@base_url][#api_key]前缀:– 指定客户端(openai、openai-requests、openai-responses、anthropic、gemini、deepseek、openrouter、together)。@base_url– 使用代理或备用端点。#api_key– 内联密钥(覆盖环境变量)。
# 所有势力都使用OpenRouter上的gpt-4o: --models "openrouter:gpt-4o" # 仅奥地利使用自定义URL+密钥: --models "openai:llama-3.2-3b@http://localhost:8000#myapikey,openai:gpt-4o,openai:gpt-4o,openai:gpt-4o,openai:gpt-4o,openai:gpt-4o,openai:gpt-4o"
使用experiment_runner.py运行批量实验
experiment_runner.py是一个轻量级调度器:它会并行启动多个lm_game.py实例,在同一个实验目录下收集它们的成果,并执行您指定的分析模块。所有属于lm_game.py的参数标志都可以直接传递;调度器会验证这些参数并原封不动地转发给每个游戏实例。
示例
# 并行运行10个独立游戏(迭代),使用自定义提示目录,
# 并且所有七股势力都采用同一模型(GPT-4o)。
python3 experiment_runner.py \
--experiment_dir "results/exp001" \
--iterations 10 \
--parallel 10 \
--max_year 1905 \
--num_negotiation_rounds 0 \
--prompts_dir "ai_diplomacy/prompts" \
--models "gpt-4o,gpt-4o,gpt-4o,gpt-4o,gpt-4o,gpt-4o,gpt-4o"
# 关键状态分析:从W1901A阶段恢复每个运行(基于现有基础运行),并在S1902M阶段停止。将执行两个分析模块:
# • summary → 汇总结果与评分
# • critical_state → 关键阶段前后快照
python3 experiment_runner.py \
--experiment_dir "results/exp002" \
--iterations 10 \
--parallel 10 \
--resume_from_phase W1901A \
--end_at_phase S1902M \
--num_negotiation_rounds 0 \
--critical_state_base_run "results/test1" \
--prompts_dir "ai_diplomacy/prompts" \
--analysis_modules "summary,critical_state" \
--models "gpt-4o,gpt-4o,gpt-4o,gpt-4o,gpt-4o,gpt-4o,gpt-4o"
(任何其他 lm_game.py 标志——如 --planning_phase、--max_tokens 等——都可以像在单局游戏中使用它们那样直接添加。)
实验运行器专用参数
| 标志 | 类型 / 默认值 | 描述 |
|---|---|---|
--experiment_dir (必填) |
Path |
实验的根目录;子文件夹 runs/ 和 analysis/ 会自动管理。使用同一目录重新运行将恢复现有运行并重新生成分析结果。 |
--iterations |
int, 默认 1 |
本次实验要启动的独立游戏数量。 |
--parallel |
int, 默认 1 |
同时执行的最大游戏数量(使用进程池)。 |
--analysis_modules |
str, 默认 "summary" |
游戏全部结束后要运行的分析模块列表,用逗号分隔。模块从 experiment_runner.analysis.<name> 中导入,必须提供 run(experiment_dir, ctx) 方法。 |
--critical_state_base_run |
Path, 可选 |
指向先前 lm_game 运行产生的现有 run_dir 的路径。每次迭代都从该快照恢复;新生成的产物会写入当前的 experiment_dir 下。 |
--seed_base |
int, 默认 42 |
基础随机种子。第 ɪ 次运行的种子为 seed_base + ɪ,从而实现可重复的批次运行。 |
(所有其他命令行标志均属于 lm_game.py,并将原样传递给它。)
环境设置
创建一个包含 API 密钥的 .env 文件:
OPENAI_API_KEY=your_key_here
ANTHROPIC_API_KEY=your_key_here
GEMINI_API_KEY=your_key_here
DEEPSEEK_API_KEY=your_key_here
OPENROUTER_API_KEY=your_key_here
模型配置
可以在 ai_diplomacy/utils.py 中为各势力分配模型:
def assign_models_to_powers() -> Dict[str, str]:
return {
"AUSTRIA": "o3",
"ENGLAND": "claude-sonnet-4-20250514",
"FRANCE": "gpt-4.1",
"GERMANY": "gemini-2.5-pro-preview-05-06",
"ITALY": "openrouter-meta-llama/llama-4-maverick",
"RUSSIA": "claude-opus-4-20250514",
"TURKEY": "openrouter-google/gemini-2.5-flash-preview-05-20",
}
支持的模型包括:
- OpenAI:
gpt-4o,gpt-4.1,o3,o4-mini - Anthropic:
claude-3-5-sonnet-20241022,claude-opus-4-20250514 - Google:
gemini-2.0-flash,gemini-2.5-pro-preview - OpenRouter: 包括 Llama、Qwen、DeepSeek 等多种模型
游戏输出与分析
游戏会按时间戳保存到 results/ 目录下。每个游戏文件夹包含:
lmvsgame.json- 包含阶段摘要和代理关系的完整游戏数据overview.jsonl- 错误统计和模型分配信息game_manifesto.txt- 来自规划阶段的战略指令general_game.log- 详细的游戏执行日志llm_responses.csv- 所有 LLM 交互的完整日志
游戏 JSON 中包含用于 AI 分析的特殊字段:
phase_summaries- 每个阶段的分类行动结果agent_relationships- 每个阶段的外交态势final_agent_states- 游戏结束时的目标和关系
数据处理与 RL 分析流程
为了详细分析 LLM 交互及订单成功率,采用两步流程:
将 CSV 转换为 RL JSON:
csv_to_rl_json.py脚本会处理通常位于以“FULL_GAME”结尾的游戏特定子目录中的llm_responses.csv文件(例如results/20250524_..._FULL_GAME/)。它会将这些原始交互数据转换为适合强化学习(RL)分析的 JSON 格式。要批量处理所有相关 CSV 文件:
python csv_to_rl_json.py --scan_dir results/该命令会扫描
results/目录下的“FULL_GAME”子文件夹,将其中的llm_responses.csv文件转换为 JSON,并将所有生成的*_rl.json文件输出到results/json/目录中。分析 RL JSON 文件:
analyze_rl_json.py脚本会分析上一步生成的 JSON 文件。它会按模型汇总成功和失败的护航及支援订单统计数据。要运行分析:
python analyze_rl_json.py results/json/该命令会处理
results/json/目录下的所有*_rl.json文件,并在项目根目录下生成两份报告:analysis_summary.txt: 订单统计的简洁摘要。analysis_summary_debug.txt: 包含唯一“success”字段值及其他调试信息的详细报告。
此流程能够全面了解 LLM 在生成有效且成功的游戏订单方面的表现。
赛后分析工具
战略时刻分析
分析游戏中的关键战略时刻,包括背叛、合作以及精彩策略:
# 分析已完成的游戏
python analyze_game_moments.py results/20250522_210700_o3vclaudes_o3win
# 限制分析范围至特定阶段
python analyze_game_moments.py results/game_folder --max-phases 20
# 使用不同的分析模型
python analyze_game_moments.py results/game_folder --model claude-3-5-sonnet-20241022
分析会识别以下内容:
- 背叛行为:当各势力明确承诺某种行动,却采取了相矛盾的行动时
- 合作行为:各势力之间成功协调一致的行动
- 两面派行为:各势力对不同方做出相互矛盾的承诺
- 精彩战略:执行得极为出色的策略性操作
- 战略失误:严重削弱自身局势的重大错误
分析输出包括:
- Markdown 报告(
game_moments/[game]_report_[timestamp].md)- AI 自动生成的整局游戏叙述
- 总结性统计数据(背叛、合作等)
- 各模型的无效走法次数
- 谎言分析,区分故意与无意谎言
- 最重要的战略时刻,附完整背景及日记条目
- JSON 数据(
game_moments/[game]_data_[timestamp].json)- 所有检测到的事件的完整结构化数据
- 包含得分、类别和关系等元数据
- 原始谎言检测数据,供进一步分析使用
示例输出片段如下:
## 各势力使用的模型
- **土耳其**:o3
- **英格兰**:claude-sonnet-4-20250514
- **俄罗斯**:claude-opus-4-20250514
## 各模型的无效走法数量
- **o3**:91 次无效走法
- **claude-sonnet-4**:67 次无效走法
## 谎言分析
### 各模型的谎言情况
- **o3**:共 195 次谎言(71 次故意,124 次无意)
- **claude-opus-4**:共 96 次谎言(0 次故意,96 次无意)
外交谎言检测
分析系统通过比较以下三方面来检测谎言:
- 消息内容:各势力彼此之间的承诺
- 私人日记:各势力私下计划的内容(来自谈判日记条目)
- 实际命令:各势力真正执行的行动
谎言被分为两类:
- 故意谎言:日记中显示出有计划的欺骗意图(例如“误导他们”、“实际上……”)
- 无意谎言:没有证据表明存在计划中的欺骗行为(很可能是误解)
动画与可视化
使用交互式 3D 动画系统可视化游戏:
# 启动动画服务器
cd ai_animation
npm install
npm run dev
# 在浏览器中打开 http://localhost:5173
# 加载一个游戏 JSON 文件即可观看动画回放
功能特点:
- 3D 地图展示部队移动与战斗
- 分阶段播放控制
- 聊天窗口显示外交消息
- 排行榜实时追踪补给中心数量
- 配备音效与视觉特效
游戏统计与模式
对数百场 AI 对弈的分析揭示了一些有趣的规律:
各模型的表现特征
- 无效走法率:某些模型(如 o3)会产生较多无效走法,但打法较为激进
- 欺骗模式:各模型在诚实度方面差异巨大(故意谎言比例从 0% 到 100% 不等)
- 战略风格:从防守型/诚实型到进攻型/欺骗型不等
常见的战略模式
- 开局战术:RT 重锤(俄土组合)、西线三强联盟、勒班多阵型
- 中盘动态:背后捅刀时机、联盟转换、运输船队运作
- 收官挑战:僵持线、被迫和棋、关键玩家决定胜负
未来探索方向
- 自适应谈判:根据对话流程动态调整回合数
- 联盟检测:识别并跟踪多方联盟
- 个性演化:让智能体能够调整其外交风格
- 锦标赛模式:自动进行多局比赛,并计算 ELO 等级分
- 人机混合:允许人类玩家与 AI 智能体同场竞技
- 实时解说:为观众生成现场解说文字
- 欺骗训练:专门训练模型以检测或实施谎言
- 元策略学习:让智能体能够从过往对局中学习经验
文档说明
完整的文档可在 diplomacy.readthedocs.io 查阅。
可用的分析脚本
1. 战略时刻分析(analyze_game_moments.py)
全面分析游戏动态:
python analyze_game_moments.py results/game_folder [选项]
选项:
--model MODEL 使用的分析模型(默认:gemini-2.5-flash)
--max-phases N 只分析前 N 个阶段
--max-concurrent N 并发 API 调用数量(默认:5)
--report PATH 输出报告路径(未指定时自动生成)
--json PATH 输出 JSON 文件路径(未指定时自动生成)
2. 集中式谎言检测(analyze_lies_focused.py)
详细分析外交欺骗行为:
python analyze_lies_focused.py results/game_folder [--output report.md]
3. 游戏结果统计(analyze_game_results.py)
汇总所有已完成游戏的胜负统计数据:
python analyze_game_results.py
# 生成 model_power_statistics.csv
该脚本会分析所有 *_FULL_GAME 文件夹,统计每个模型作为各个势力出战并获胜的次数。
4. 游戏可视化(ai_animation/)
交互式 3D 游戏可视化工具:
cd ai_animation
npm install
npm run dev
# 打开 http://localhost:5173 并加载一个游戏 JSON 文件
快速入门
安装步骤
该项目使用 uv 进行 Python 依赖管理。
设置项目依赖
# 克隆仓库
git clone https://github.com/your-repo/AI_Diplomacy.git
cd AI_Diplomacy
# 安装依赖并创建虚拟环境
uv sync
# 激活虚拟环境
source .venv/bin/activate # Unix/macOS 系统
# 或
.venv\Scripts\activate # Windows 系统
运行一局游戏
以下脚本会在本地随机提交有效指令,直到游戏结束:
import random
from diplomacy import Game
from diplomacy.utils.export import to_saved_game_format
# 创建一局游戏
# 也可以通过参数指定地图名称,例如:Game(map_name='pure')
game = Game()
while not game.is_game_done:
# 获取所有地点的可能指令列表
possible_orders = game.get_all_possible_orders()
# 随机为每个势力选取一条有效指令
for power_name, power in game.powers.items():
power_orders = [random.choice(possible_orders[loc]) for loc in game.get_orderable_locations(power_name)
if possible_orders[loc]]
game.set_orders(power_name, power_orders)
# 可以通过 game.add_message 在本地发送消息
# 例如:game.add_message(Message(sender='FRANCE',
# recipient='ENGLAND',
# message='这是一条消息',
# phase=self.get_current_phase(),
# time_sent=int(time.time())))
# 处理游戏进入下一阶段
game.process()
# 将游戏导出到磁盘以便可视化(游戏会被追加到文件中)
# 或者,我们也可以这样做 >> file.write(json.dumps(to_saved_game_format(game)))
to_saved_game_format(game, output_path='game.json')
网页界面
还可以使用 React 安装一个网页界面,以便与机器人和/或其他人对战,并可视化游戏过程。
可以通过以下步骤安装网页界面:
# 安装 NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
# 克隆仓库
git clone https://github.com/diplomacy/diplomacy.git
# 在本地安装依赖
# 建议在 conda 或 virtualenv 环境中安装
cd diplomacy/
pip install -r requirements_dev.txt
# 构建 Node 模块
cd diplomacy/web
npm install .
npm install . --only=dev
# 在一个终端窗口或标签页中启动 React 服务器
npm start
# 在另一个终端窗口或标签页中启动 Diplomacy 服务器
python -m diplomacy.server.run
网页界面将可通过 http://localhost:3000 访问。
用户可以使用 admin/password 或 username/password 登录。如果输入的用户名在数据库中不存在,系统会自动创建新用户。

可视化游戏
可以通过网页界面右上角的“从磁盘加载游戏”菜单来可视化游戏。

网络对战
可以通过 WebSocket 远程加入网络对战。下面的脚本演示了如何进行网络对战。
注意:为了使脚本正常运行,必须使用 python -m diplomacy.server.run 启动服务器。
import asyncio
import random
from diplomacy.client.connection import connect
from diplomacy.utils import exceptions
POWERS = ['AUSTRIA', 'ENGLAND', 'FRANCE', 'GERMANY', 'ITALY', 'RUSSIA', 'TURKEY']
async def create_game(game_id, hostname='localhost', port=8432):
""" 在服务器上创建一场游戏 """
connection = await connect(hostname, port)
channel = await connection.authenticate('random_user', 'password')
await channel.create_game(game_id=game_id, rules={'REAL_TIME', 'NO_DEADLINE', 'POWER_CHOICE'})
async def play(game_id, power_name, hostname='localhost', port=8432):
""" 以指定势力身份进行游戏 """
connection = await connect(hostname, port)
channel = await connection.authenticate('user_' + power_name, 'password')
# 等待游戏开始并加入
while not (await channel.list_games(game_id=game_id)):
await asyncio.sleep(1.)
game = await channel.join_game(game_id=game_id, power_name=power_name)
# 开始游戏
while not game.is_game_done:
current_phase = game.get_current_phase()
# 提交指令
if game.get_orderable_locations(power_name):
possible_orders = game.get_all_possible_orders()
orders = [random.choice(possible_orders[loc]) for loc in game.get_orderable_locations(power_name)
if possible_orders[loc]]
print('[%s/%s] - 提交了: %s' % (power_name, game.get_current_phase(), orders))
await game.set_orders(power_name=power_name, orders=orders, wait=False)
# 可以通过 game.send_message 发送消息
# await game.send_game_message(message=game.new_power_message('FRANCE', '这是消息'))
# 等待游戏处理完成
while current_phase == game.get_current_phase():
await asyncio.sleep(0.1)
# 可以使用 to_saved_game_format 保存游戏的本地副本
# 若要下载包含所有势力消息的游戏副本,需要以管理员身份导出游戏,即使用 'admin' / 'password' 登录
async def launch(game_id):
""" 创建并进行一场网络对战 """
await create_game(game_id)
await asyncio.gather(*[play(game_id, power_name) for power_name in POWERS])
if __name__ == '__main__':
asyncio.run(launch(game_id=str(random.randint(1, 1000))))
许可证
版权所有 © 2025 Good Start Labs
更多详情请参阅 LICENSE 文件。
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。