Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
203 changes: 203 additions & 0 deletions MCAgent/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
# MCAgent 使用文档

MCAgent 可以通过自然语言让AI调用各种游戏工具完成一系列操作 目前已支持聊天栏菜单调用



首先你需要访问DeepSeek官网或硅基流动官网获取API密匙(网上有教程)

将密匙添加进配置文件中的'Api key' 并更改模型提供商

在游戏中输入以下触发词之一即可启动 AI 助手:
- `助手`
- `ai`

然后输入你的需求,例如:
```
给我10个钻石
传送我到坐标 100 64 200
查看在线玩家列表
帮我举报xxx玩家(已安装举报系统)
```

### 其他命令

- **清除对话历史**:`清除对话` 或 `clear` 清除你与ai的对话历史
- **取消当前请求**:`退出助手`、`取消` 或 `cancel` 防止请求卡住或循环

## 权限等级说明

MCAgent 采用权限系统,不同权限等级可以使用不同的工具:

### 1. 普通玩家 (NONE)
- 无法使用 AI 助手功能

### 2. 创造模式玩家 (CREATIVE)
可使用以下工具:
- ✅ 传送玩家 (`teleport_player`)
- ✅ 给予物品 (`give_item`)
- ✅ 设置方块 (`set_block`)
- ✅ 填充方块 (`fill_blocks`)
- ✅ 广播消息 (`broadcast_message`)
- ✅ 获取玩家信息 (`get_player_info`)
- ✅ 获取在线玩家 (`get_online_players`)
- ✅ 获取玩家位置 (`get_player_position`)
- ✅ 获取玩家背包 (`get_player_inventory`)
- ✅ 获取玩家标签 (`get_player_tags`)
- ✅ 获取玩家分数 (`get_player_score`)
- ✅ 发送消息 (`send_message`)
- ✅ 获取菜单触发词 (`get_chatbar_menu_triggers`)
- ✅ 与菜单交互 (`interact_with_menu`)

### 3. OP 权限 (OP)
除创造模式权限外,还可使用:
- ✅ 执行命令 (`execute_command`) - 受危险命令限制
- ✅ 获取游戏规则 (`get_game_rule`)
- ✅ 放置命令方块 (`place_command_block`) - 受安全限制

### 4. 完全权限 (FULL)
- ✅ 所有工具无限制使用
- ✅ 可以执行危险命令
- ✅ 可以创建循环命令方块和保持激活的命令方块
- ✅ 可以查看工具调用的详细参数

## 🛡️ 安全机制

### 危险命令拦截
非完全权限玩家执行命令时,系统会自动拦截以下危险操作:
- `op` / `deop` - 权限管理
- `stop` - 服务器关闭
- 配置中定义的危险命令

### 命令方块安全限制
为了安全考虑 非完全权限玩家放置命令方块时:
- ❌ 禁止创建循环命令方块
- ⚠️ 强制设置为需要红石激活
- ⚠️ 不在第一刻自动执行

## 📚 使用示例

### 示例 1:基础操作
```
玩家:给我10个钻石
AI:§a✓ §f已给予§e Steve §f物品§b minecraft:diamond ×10
```

### 示例 2:传送操作
```
玩家:传送我到主城
AI:首先让我查看在线玩家...
§a✓ §f已将玩家§e Steve §f传送到§b (100, 64, 200)
```

### 示例 3:查询信息
```
玩家:查看我的背包
AI:§e Steve §f的背包:
§b• minecraft:diamond ×10
§b• minecraft:iron_ingot ×64
§b• minecraft:gold_ingot ×32
§f等共15种物品,剩余21个空槽位
```

### 示例 4:菜单交互
```
玩家:帮我把职业升到40级 (这只是个例子 实际上插件不附带职业系统)
AI:正在为您操作职业系统...
[工具调用 #1] interact_with_menu
• 触发词: 职业
• 操作: 开始会话

[工具调用 #2] interact_with_menu
• 输入: 4 (选择提升等级)

[工具调用 #3] interact_with_menu
• 输入: 39 (提升39级)

[工具调用 #4] interact_with_menu
• 输入: 确认

§a✓ §f职业等级已提升至40级!
```

### 示例 5:建筑操作
```
玩家:在我脚下建一个5x5的石头平台
AI:[工具调用 #1] get_player_position
获取到您的位置:(150, 65, 200)

[工具调用 #2] fill_blocks
§a✓ §f已在 (148, 64, 198) 到 (152, 64, 202) 填充石头
```

## ⚙️ 配置说明

### 白名单配置
在插件配置文件中设置:

```json
{
"白名单": ["player1", "player2"],
"完全权限白名单": ["admin"],
"一级权限白名单": ["builder1", "builder2"],
"危险命令列表": ["op ", "deop ", "stop"]
}
```

### AI 配置
```json
{
"AI配置": {
"API提供商": "siliconflow",
"APIkey": "your-api-key-here",
"模型名称": "deepseek-chat",
"硅基流动模型名称": "deepseek-ai/DeepSeek-V3.2",
"最大历史长度": 3,
"最大工具调用次数": 24,
"API请求超时秒数": 90
}
}
```

每次 AI 响应后会显示:
- 🔧 工具调用次数
- 📝 Token 使用量
- 💰 预估费用 注意 Cost仅为预期消耗费用 实际产生费用以模型提供方的每百万输入/输出token为主

## ⚠️ 注意事项

请妥善保管您的 API 密钥
合理分配玩家权限,避免滥用
注意 Token 消耗,合理设置最大工具调用次数
如果 AI 执行了错误操作,立即使用取消命令

## 🐛 常见问题

### Q: AI 没有响应?
A: 检查以下几点:
- 查看面板输出返回的错误码 询问AI解决问题
- 是否有权限使用 AI 助手
- API 密钥是否正确配置
- 网络连接是否正常
- 是否有其他请求正在处理中

### Q: 工具调用失败?
A: 可能原因:
- 权限不足
- 参数格式错误
- 目标玩家不在线

### Q: 如何查看操作日志?
A: 关键工具调用会自动记录在插件数据目录的日志文件中,文件名格式为 `tool_calls_YYYY-MM-DD.json`

### Q: 对话历史如何管理?
A:
- 对话历史自动保存,支持上下文理解
- 使用 `清除对话` 命令可以清空历史
- 历史长度由配置文件中的 `最大历史长度` 控制

## 广告

-定制插件可联系3340903371 (*^_^*)

---
59 changes: 59 additions & 0 deletions MCAgent/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from tooldelta import Plugin, plugin_entry, cfg
from .config import CONFIG_DEFAULT, CONFIG_STD
from .core import Core
from .agent import AIAgent
from .permission import PermissionManager
from .tool_logger import ToolLogger
from . import utils
# Author 3340903371 定制插件dd

class MCAgent(Plugin):
name = "MCAgent"
author = "果_k"
version = (1, 0, 0)

def __init__(self, frame):
"""Initialize MCAgent plugin."""
super().__init__(frame)
self.players = self.game_ctrl.players
self.ListenPreload(self.on_def)
config, _ = cfg.get_plugin_config_and_version(
self.name, CONFIG_STD, CONFIG_DEFAULT, self.version
)
self.config = config
self.whitelist = config["白名单"]
self.full_permission_whitelist = config.get("完全权限白名单", [])
self.level1_permission_whitelist = config.get("一级权限白名单", [])
self.dangerous_commands = config.get("危险命令列表", ["/op", "/deop", "op ", "deop ", "stop"])
self.Info = config["Info"]
self.ui_texts = config["UI文本"]
self.agent_config = config["AI配置"]
self.utils = utils.Utils(self)
self.permission_manager = PermissionManager(self)
self.tool_logger = ToolLogger(self)
self.core = Core(self)
self.agent = AIAgent(self)

def on_def(self):
"""Register chatbar menu triggers."""
self.chatbar = self.GetPluginAPI("聊天栏菜单")

always_registered = [
([ "助手", "ai"], ..., "MC Agent(支持工具调用)", self.core.AIAssistant),
(["清除对话", "clear"], [], "清除AI对话历史", self.core.ClearChat),
(["退出助手", "取消", "cancel"], [], "取消当前AI请求", self.core.CancelAI),
]

for trigger in always_registered:
self.chatbar.add_new_trigger(*trigger)

def get_core(self):
return self.core

def get_agent(self):
return self.agent

def get_utils(self):
return utils

entry = plugin_entry(MCAgent, "GetMCAgentAPI", (1, 0, 0))
Loading