ai-battle 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai-battle.sh +115 -42
- package/package.json +1 -1
package/ai-battle.sh
CHANGED
|
@@ -22,8 +22,9 @@ if [ -f ".env" ]; then
|
|
|
22
22
|
set +a
|
|
23
23
|
fi
|
|
24
24
|
|
|
25
|
-
# ========================
|
|
26
|
-
|
|
25
|
+
# ======================== 版本(从 package.json 读取) ========================
|
|
26
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
27
|
+
VERSION=$(node -p "require('${SCRIPT_DIR}/package.json').version" 2>/dev/null || echo "0.0.0")
|
|
27
28
|
|
|
28
29
|
# ======================== 颜色 ========================
|
|
29
30
|
BLUE='\033[1;34m'
|
|
@@ -37,13 +38,17 @@ NC='\033[0m'
|
|
|
37
38
|
# ======================== 默认配置 ========================
|
|
38
39
|
DEFAULT_AGENTS="claude,codex"
|
|
39
40
|
DEFAULT_MAX_ROUNDS=10
|
|
41
|
+
|
|
42
|
+
# 工作目录:所有程序产物放入 .ai-battle/,最终总结输出到运行目录
|
|
43
|
+
WORK_DIR=".ai-battle"
|
|
40
44
|
PROBLEM_FILE="problem.md"
|
|
41
|
-
ROUNDS_DIR="rounds"
|
|
42
|
-
CONSENSUS_FILE="consensus.md"
|
|
43
|
-
LOG_FILE=".
|
|
44
|
-
CONFIG_FILE=".
|
|
45
|
+
ROUNDS_DIR="${WORK_DIR}/rounds"
|
|
46
|
+
CONSENSUS_FILE="${WORK_DIR}/consensus.md"
|
|
47
|
+
LOG_FILE="${WORK_DIR}/battle.log"
|
|
48
|
+
CONFIG_FILE="${WORK_DIR}/config.json"
|
|
45
49
|
REFEREE_PROMPT_FILE="referee.md"
|
|
46
|
-
SESSIONS_DIR="
|
|
50
|
+
SESSIONS_DIR="${WORK_DIR}/sessions"
|
|
51
|
+
AGENTS_DIR="${WORK_DIR}/agents"
|
|
47
52
|
|
|
48
53
|
# ======================== Codex 配置 ========================
|
|
49
54
|
CODEX_MODEL="${CODEX_MODEL:-gpt-5.3-codex}"
|
|
@@ -536,6 +541,7 @@ agent_color() {
|
|
|
536
541
|
}
|
|
537
542
|
|
|
538
543
|
# Agent 指令文件名映射(支持实例名,如 claude_1 → CLAUDE_1.md)
|
|
544
|
+
# 输出到 AGENTS_DIR 目录中
|
|
539
545
|
agent_md_file() {
|
|
540
546
|
local base
|
|
541
547
|
base=$(agent_base "$1")
|
|
@@ -543,12 +549,14 @@ agent_md_file() {
|
|
|
543
549
|
if [ "$1" != "$base" ]; then
|
|
544
550
|
suffix="_${1##*_}" # 提取 _N 后缀
|
|
545
551
|
fi
|
|
552
|
+
local filename
|
|
546
553
|
case "$base" in
|
|
547
|
-
claude)
|
|
548
|
-
codex)
|
|
549
|
-
gemini)
|
|
550
|
-
*)
|
|
554
|
+
claude) filename="CLAUDE${suffix}.md" ;;
|
|
555
|
+
codex) filename="AGENTS${suffix}.md" ;;
|
|
556
|
+
gemini) filename="GEMINI${suffix}.md" ;;
|
|
557
|
+
*) filename="${1^^}.md" ;;
|
|
551
558
|
esac
|
|
559
|
+
echo "${AGENTS_DIR}/${filename}"
|
|
552
560
|
}
|
|
553
561
|
|
|
554
562
|
# 上帝视角: 等待用户输入补充信息
|
|
@@ -808,15 +816,24 @@ cmd_run() {
|
|
|
808
816
|
echo -e "${CYAN}📋 已加载裁判提示词: ${REFEREE_PROMPT_FILE}${NC}"
|
|
809
817
|
else
|
|
810
818
|
echo -e "${YELLOW}⚠️ 未找到裁判提示词文件: ${REFEREE_PROMPT_FILE}${NC}"
|
|
811
|
-
echo -e "
|
|
812
|
-
echo -e " ${CYAN}echo '重点关注架构设计的可行性和成本' > ${REFEREE_PROMPT_FILE}${NC}"
|
|
819
|
+
echo -e " 你可以创建该文件来自定义裁判的行为"
|
|
813
820
|
echo ""
|
|
814
|
-
echo -ne "${BOLD}
|
|
821
|
+
echo -ne "${BOLD}选择操作: [1] 编辑裁判提示词 [2] 跳过使用默认 [3] 取消: ${NC}"
|
|
815
822
|
local ref_choice
|
|
816
823
|
read -er ref_choice
|
|
817
824
|
case "$ref_choice" in
|
|
818
|
-
|
|
819
|
-
|
|
825
|
+
1)
|
|
826
|
+
mkdir -p "$WORK_DIR"
|
|
827
|
+
${EDITOR:-vim} "$REFEREE_PROMPT_FILE"
|
|
828
|
+
if [ -f "$REFEREE_PROMPT_FILE" ] && [ -s "$REFEREE_PROMPT_FILE" ]; then
|
|
829
|
+
referee_custom_prompt=$(cat "$REFEREE_PROMPT_FILE")
|
|
830
|
+
echo -e "${CYAN}📋 裁判提示词已保存${NC}"
|
|
831
|
+
else
|
|
832
|
+
echo -e "${CYAN}裁判提示词为空,使用默认。${NC}"
|
|
833
|
+
fi
|
|
834
|
+
;;
|
|
835
|
+
3|n|N)
|
|
836
|
+
echo -e "${CYAN}已取消。${NC}"
|
|
820
837
|
exit 0
|
|
821
838
|
;;
|
|
822
839
|
*)
|
|
@@ -871,7 +888,7 @@ cmd_run() {
|
|
|
871
888
|
case "$choice" in
|
|
872
889
|
1)
|
|
873
890
|
echo -e "${CYAN}清理历史记录...${NC}"
|
|
874
|
-
rm -rf "$
|
|
891
|
+
rm -rf "$WORK_DIR" SUMMARY.md
|
|
875
892
|
;;
|
|
876
893
|
2)
|
|
877
894
|
# 仅当有完整配置时 2=继续,否则 2=取消
|
|
@@ -893,12 +910,16 @@ cmd_run() {
|
|
|
893
910
|
echo ""
|
|
894
911
|
fi
|
|
895
912
|
|
|
896
|
-
# 检查 problem.md
|
|
913
|
+
# 检查 problem.md,不存在则自动用编辑器创建
|
|
914
|
+
mkdir -p "$WORK_DIR"
|
|
915
|
+
|
|
897
916
|
if [ ! -f "$PROBLEM_FILE" ]; then
|
|
898
|
-
echo -e "${
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
917
|
+
echo -e "${CYAN}📝 首次运行,请编辑讨论问题...${NC}"
|
|
918
|
+
${EDITOR:-vim} "$PROBLEM_FILE"
|
|
919
|
+
if [ ! -s "$PROBLEM_FILE" ]; then
|
|
920
|
+
echo -e "${RED}❌ 问题文件为空,已取消${NC}"
|
|
921
|
+
exit 1
|
|
922
|
+
fi
|
|
902
923
|
fi
|
|
903
924
|
|
|
904
925
|
if [ ! -s "$PROBLEM_FILE" ]; then
|
|
@@ -1042,8 +1063,7 @@ cmd_run() {
|
|
|
1042
1063
|
fi
|
|
1043
1064
|
|
|
1044
1065
|
# 创建 rounds 目录
|
|
1045
|
-
mkdir -p "$ROUNDS_DIR"
|
|
1046
|
-
mkdir -p "$SESSIONS_DIR"
|
|
1066
|
+
mkdir -p "$ROUNDS_DIR" "$SESSIONS_DIR" "$AGENTS_DIR"
|
|
1047
1067
|
|
|
1048
1068
|
# 动态生成各 Agent 的指令文件(新建和恢复模式都需要更新)
|
|
1049
1069
|
for agent in "${available_agents[@]}"; do
|
|
@@ -1061,8 +1081,7 @@ cmd_run() {
|
|
|
1061
1081
|
# 初始化 git(codex 需要)
|
|
1062
1082
|
if [ ! -d ".git" ]; then
|
|
1063
1083
|
git init -q
|
|
1064
|
-
echo ".
|
|
1065
|
-
echo ".debate.json" >> .gitignore 2>/dev/null || true
|
|
1084
|
+
echo ".ai-battle/" >> .gitignore 2>/dev/null || true
|
|
1066
1085
|
git add -A 2>/dev/null || true
|
|
1067
1086
|
git commit -q -m "ai-battle: init" 2>/dev/null || true
|
|
1068
1087
|
fi
|
|
@@ -1251,7 +1270,61 @@ $problem" "round_1_${agent}")
|
|
|
1251
1270
|
exit 0
|
|
1252
1271
|
fi
|
|
1253
1272
|
|
|
1254
|
-
#
|
|
1273
|
+
# 裁判总结: Round 1 结束后,调用裁判对各方初始观点进行总结
|
|
1274
|
+
if $referee_mode; then
|
|
1275
|
+
log_and_print ""
|
|
1276
|
+
log_and_print "${BOLD}\033[1;37m━━━ 🔨 裁判总结 [Round 1/${max_rounds}] ━━━${NC}"
|
|
1277
|
+
log_and_print "${CYAN}⏳ 裁判分析中...${NC}"
|
|
1278
|
+
|
|
1279
|
+
# 构建所有 agent 回复的汇总
|
|
1280
|
+
local all_responses_r1=""
|
|
1281
|
+
for ((ri=0; ri<agent_count; ri++)); do
|
|
1282
|
+
local ra="${available_agents[$ri]}"
|
|
1283
|
+
all_responses_r1+="<${ra}_response>
|
|
1284
|
+
${responses[$ri]}
|
|
1285
|
+
</${ra}_response>
|
|
1286
|
+
|
|
1287
|
+
"
|
|
1288
|
+
done
|
|
1289
|
+
|
|
1290
|
+
# 根据模式选择裁判 prompt
|
|
1291
|
+
local ref_prompt_r1
|
|
1292
|
+
if $god_mode; then
|
|
1293
|
+
ref_prompt_r1=$(build_referee_god_prompt)
|
|
1294
|
+
else
|
|
1295
|
+
ref_prompt_r1=$(build_referee_free_prompt)
|
|
1296
|
+
fi
|
|
1297
|
+
# 追加自定义裁判提示词
|
|
1298
|
+
if [ -n "$referee_custom_prompt" ]; then
|
|
1299
|
+
ref_prompt_r1+=$'\n\n[额外指示]\n'"$referee_custom_prompt"
|
|
1300
|
+
fi
|
|
1301
|
+
|
|
1302
|
+
local referee_result_r1
|
|
1303
|
+
referee_result_r1=$(call_referee "$referee_base" "$ref_prompt_r1" "以下是 Round 1 各参与者的回复:
|
|
1304
|
+
|
|
1305
|
+
${all_responses_r1}请进行裁判总结。" "referee_round_1")
|
|
1306
|
+
|
|
1307
|
+
# 保存裁判结果
|
|
1308
|
+
echo "$referee_result_r1" > "$ROUNDS_DIR/referee_round_1.md"
|
|
1309
|
+
log_and_print "${BOLD}\033[1;37m${referee_result_r1}${NC}"
|
|
1310
|
+
|
|
1311
|
+
# 自由辩论模式: 裁判检测共识
|
|
1312
|
+
if ! $god_mode; then
|
|
1313
|
+
if echo "$referee_result_r1" | grep -qiE 'CONSENSUS:[[:space:]]*YES'; then
|
|
1314
|
+
local ref_conclusion_r1
|
|
1315
|
+
ref_conclusion_r1=$(echo "$referee_result_r1" | grep -ioE '\*{0,2}AGREED:[[:space:]]*.*' | head -1 \
|
|
1316
|
+
| sed 's/^\*\{0,2\}[Aa][Gg][Rr][Ee][Ee][Dd]:[[:space:]]*//' | sed 's/[[:space:]]*$//' | sed 's/\*\{1,2\}$//')
|
|
1317
|
+
if [ -n "$ref_conclusion_r1" ]; then
|
|
1318
|
+
log_and_print "${CYAN}🔨 裁判判定: 已达成共识${NC}"
|
|
1319
|
+
finish_consensus "$ref_conclusion_r1" 1 "$max_rounds"
|
|
1320
|
+
generate_final_summary "$referee_base" "$referee_custom_prompt"
|
|
1321
|
+
exit 0
|
|
1322
|
+
fi
|
|
1323
|
+
fi
|
|
1324
|
+
fi
|
|
1325
|
+
fi
|
|
1326
|
+
|
|
1327
|
+
# 上帝视角: Round 1 后注入(裁判总结后再让 god 输入)
|
|
1255
1328
|
if $god_mode; then
|
|
1256
1329
|
god_context=$(god_input 1)
|
|
1257
1330
|
fi
|
|
@@ -1657,8 +1730,8 @@ cmd_help() {
|
|
|
1657
1730
|
检测共识、保存全部讨论记录。
|
|
1658
1731
|
|
|
1659
1732
|
前置条件:
|
|
1660
|
-
1.
|
|
1661
|
-
2.
|
|
1733
|
+
1. 确保参与讨论的 Agent CLI 工具已安装并可用
|
|
1734
|
+
2. 首次运行会自动弹出编辑器创建讨论问题
|
|
1662
1735
|
|
|
1663
1736
|
依赖: jq, bash 4+, (可选) claude, codex, gemini
|
|
1664
1737
|
|
|
@@ -1680,9 +1753,8 @@ cmd_help() {
|
|
|
1680
1753
|
gemini 通过 Gemini CLI 调用 (需 gemini 命令)
|
|
1681
1754
|
|
|
1682
1755
|
使用示例:
|
|
1683
|
-
#
|
|
1756
|
+
# 快速开始(首次运行会自动弹出编辑器输入问题)
|
|
1684
1757
|
mkdir my-topic && cd my-topic
|
|
1685
|
-
echo "微服务 vs 单体架构的优缺点?" > problem.md
|
|
1686
1758
|
ai-battle --agents claude,gemini --rounds 8
|
|
1687
1759
|
|
|
1688
1760
|
# 同类 Agent 自我辩论
|
|
@@ -1704,22 +1776,23 @@ cmd_help() {
|
|
|
1704
1776
|
ai-battle --agents claude,codex --referee --god
|
|
1705
1777
|
|
|
1706
1778
|
产出文件:
|
|
1707
|
-
rounds/
|
|
1708
|
-
rounds/referee_*.md
|
|
1709
|
-
rounds/god_*.md
|
|
1710
|
-
.sessions/
|
|
1711
|
-
consensus.md
|
|
1712
|
-
|
|
1713
|
-
.
|
|
1779
|
+
.ai-battle/rounds/ 每轮讨论记录 (round_N_<agent>.md)
|
|
1780
|
+
.ai-battle/rounds/referee_*.md 裁判总结记录 (--referee)
|
|
1781
|
+
.ai-battle/rounds/god_*.md 上帝视角注入记录 (--god)
|
|
1782
|
+
.ai-battle/sessions/ Agent CLI 原始输出记录
|
|
1783
|
+
.ai-battle/consensus.md 共识结论(如达成)
|
|
1784
|
+
.ai-battle/battle.log 完整日志
|
|
1785
|
+
SUMMARY.md 最终总结 (裁判自动生成,输出到运行目录)
|
|
1786
|
+
|
|
1787
|
+
用户文件 (运行目录):
|
|
1788
|
+
problem.md 讨论问题定义 (首次运行自动创建)
|
|
1789
|
+
referee.md 裁判自定义提示词 (--referee 时可选)
|
|
1790
|
+
.env 环境变量 (启动时自动加载)
|
|
1714
1791
|
|
|
1715
1792
|
扩展 Agent:
|
|
1716
1793
|
在脚本中实现 check_<name>()、call_<name>()、generate_<name>_md()
|
|
1717
1794
|
然后调用 register_agent "<name>"
|
|
1718
1795
|
|
|
1719
|
-
配置文件:
|
|
1720
|
-
.env 自动加载环境变量 (启动时)
|
|
1721
|
-
referee.md 裁判自定义提示词 (开启 --referee 时)
|
|
1722
|
-
|
|
1723
1796
|
环境变量:
|
|
1724
1797
|
Claude:
|
|
1725
1798
|
ANTHROPIC_BASE_URL API 地址
|