Skip to content

Commit e3d4cfb

Browse files
修复工具名不一致和状态管理问题
Co-authored-by: baicaizhale <baicaizhale@users.noreply.github.com>
1 parent c1fe8cf commit e3d4cfb

File tree

4 files changed

+25
-30
lines changed

4 files changed

+25
-30
lines changed

src/main/java/org/YanPl/api/CloudFlareAI.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ private AIResponse chatWithOpenAI(DialogueSession session, String systemPrompt)
255255
String model = plugin.getConfigManager().getOpenAiModel();
256256

257257
if (apiKey == null || apiKey.isEmpty()) {
258-
return new AIResponse("错误: 请先在配置文件中设置 openai.api_key。", null);
258+
return new AIResponse("错误: 请先在配置文件中设置 openai.api_key。", null, 0, 0, false);
259259
}
260260

261261
if (model == null || model.isEmpty()) {
@@ -367,7 +367,7 @@ private AIResponse chatWithCloudFlare(DialogueSession session, String systemProm
367367
String model = plugin.getConfigManager().getCloudflareModel();
368368

369369
if (cfKey == null || cfKey.isEmpty()) {
370-
return new AIResponse("错误: 请先在配置文件中设置 CloudFlare cf_key。", null);
370+
return new AIResponse("错误: 请先在配置文件中设置 CloudFlare cf_key。", null, 0, 0, false);
371371
}
372372

373373
if (model == null || model.isEmpty()) {

src/main/java/org/YanPl/manager/CLIManager.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1064,7 +1064,7 @@ private void handleAIResponse(Player player, AIResponse aiResponse) {
10641064
String toolCall = "";
10651065

10661066
// 定义已知工具列表
1067-
List<String> knownTools = Arrays.asList("#end", "#exit", "#run", "#get_preset", "#choose", "#search", "#list", "#read", "#edit", "#todo", "#remember", "#forget", "#edit_memory");
1067+
List<String> knownTools = Arrays.asList("#end", "#exit", "#run", "#getpreset", "#choose", "#search", "#list", "#read", "#edit", "#todo", "#remember", "#forget", "#edit_memory");
10681068

10691069
int currentPos = 0;
10701070
boolean foundTool = false;
@@ -1186,6 +1186,11 @@ private void handleAIResponse(Player player, AIResponse aiResponse) {
11861186
private void continueGeneration(Player player, DialogueSession session) {
11871187
UUID uuid = player.getUniqueId();
11881188

1189+
// 设置生成状态
1190+
isGenerating.put(uuid, true);
1191+
generationStates.put(uuid, GenerationStatus.THINKING);
1192+
generationStartTimes.put(uuid, System.currentTimeMillis());
1193+
11891194
// 添加一个提示消息,让AI知道继续生成
11901195
session.addMessage("user", "请继续生成剩余的内容");
11911196

@@ -1205,6 +1210,7 @@ private void continueGeneration(Player player, DialogueSession session) {
12051210
player.sendMessage(ChatColor.RED + "⨀ 继续生成失败: " + e.getMessage());
12061211
isGenerating.put(uuid, false);
12071212
generationStates.put(uuid, GenerationStatus.ERROR);
1213+
generationStartTimes.remove(uuid);
12081214
});
12091215
}
12101216
});

src/main/java/org/YanPl/manager/PromptManager.java

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ public String getBaseSystemPrompt(org.bukkit.entity.Player player) {
5151
// 2. 【单命令执行】#run 工具一次只能执行一条命令,禁止使用 && 或 ; 连接多个命令
5252
// 3. 【工具位置】工具调用必须另起一行,不得在正文或注释中调用
5353
// 4. 【格式规范】工具名和冒号之间不要有空格,命令参数不要带斜杠 /
54-
// 5. 【强制读预设】执行任务前必须先调用 #get_preset 查看相关预设文件(如果存在)
55-
// - 例如:玩家询问 LuckPerms 权限时,必须先调用 #get_preset: luckperms.txt
54+
// 5. 【强制读预设】执行任务前必须先调用 #getpreset 查看相关预设文件(如果存在)
55+
// - 例如:玩家询问 LuckPerms 权限时,必须先调用 #getpreset: luckperms.txt
5656
sb.append("[Core Constraints]\n");
5757
sb.append("These are the most critical constraints. Violations will cause parsing failures. You MUST follow them strictly.\n\n");
5858

@@ -66,8 +66,8 @@ public String getBaseSystemPrompt(org.bukkit.entity.Player player) {
6666

6767
sb.append("4. [Format] No space between tool name and colon. Command arguments should not have leading slash /.\n\n");
6868

69-
sb.append("5. [Read Preset First] You MUST call #get_preset to read relevant preset files before executing tasks (if they exist).\n");
70-
sb.append(" - Example: When a player asks about LuckPerms permissions, you must call #get_preset: luckperms.txt first.\n\n");
69+
sb.append("5. [Read Preset First] You MUST call #getpreset to read relevant preset files before executing tasks (if they exist).\n");
70+
sb.append(" - Example: When a player asks about LuckPerms permissions, you must call #getpreset: luckperms.txt first.\n\n");
7171

7272
// 正确示例:#run: give @p apple
7373
sb.append("Correct Examples:\n");
@@ -125,19 +125,18 @@ public String getBaseSystemPrompt(org.bukkit.entity.Player player) {
125125
}
126126

127127
// ==================== Tool List / 工具列表 ====================
128-
// 【工具列表】格式:#工具名: 参数(例如:#get_preset: coreprotect.txt)
128+
// 【工具列表】格式:#工具名: 参数(例如:#getpreset: coreprotect.txt)
129129
sb.append("[Tool List]\n");
130-
sb.append("Format: #tool_name: argument (Example: #get_preset: coreprotect.txt)\n\n");
130+
sb.append("Format: #tool_name: argument (Example: #getpreset: coreprotect.txt)\n\n");
131131

132132
// 【查询类工具】
133133
// #search: <args> - 在互联网搜索(优先 Wiki,若无则全网搜索)。注意使用精确的关键词,Wiki查询请不要使用自然语言
134134
// 添加 widely 关键词可强制进行全网搜索,例如:#search: widely Minecraft 最新版本
135-
// #get_preset: <file> - 获取预设文件内容。处理任务时优先查看相关预设
136-
// #choose: <A>,<B>,<C>... - 展示多个选项供用户选择,适合有多种实现途径的场景
135+
// #getpreset: <file> - 获取预设文件内容。处理任务时优先查看相关预设
137136
sb.append("[Query Tools]\n");
138137
sb.append(" #search: <args> - Search on the internet (prioritize Wiki, then general search if not found). Use precise keywords, avoid natural language for Wiki queries.\n");
139138
sb.append(" Add 'widely' keyword to force general web search. Example: #search: widely Minecraft latest version\n");
140-
sb.append(" #get_preset: <file> - Get preset file content. Prioritize reading relevant presets when handling tasks.\n");
139+
sb.append(" #getpreset: <file> - Get preset file content. Prioritize reading relevant presets when handling tasks.\n");
141140
sb.append(" #choose: <A>,<B>,<C>... - Present multiple options for user to choose. Suitable for scenarios with multiple implementation approaches.\n\n");
142141

143142
// 【执行类工具】
@@ -169,7 +168,7 @@ public String getBaseSystemPrompt(org.bukkit.entity.Player player) {
169168
sb.append(" Mode 2 (Line Range): #edit: path|start-end|content (e.g. #edit: file.yml|10-20|new lines)\n");
170169
sb.append(" Constraint: #edit must be the last part of response. No #end after it.\n");
171170
}
172-
sb.append(" Prohibition: Do NOT use #read to access preset files under plugins/FancyHelper/preset. Use #get_preset: <file> instead.\n\n");
171+
sb.append(" Prohibition: Do NOT use #read to access preset files under plugins/FancyHelper/preset. Use #getpreset: <file> instead.\n\n");
173172

174173
// 【记忆管理工具】
175174
// #remember: <content> - 记住玩家的偏好或指令,下次对话时会自动注入到系统提示中
@@ -247,27 +246,17 @@ public String getBaseSystemPrompt(org.bukkit.entity.Player player) {
247246

248247
// ==================== Usage Guide / 使用指南 ====================
249248
// 【使用指南】
250-
// 1. **先检查预设是否存在**:调用 #get_preset 前必须先检查 Available Presets 列表中是否存在该预设
251-
// - 如果预设存在:调用 #get_preset: <plugin_name>.txt 读取预设
249+
// 1. **先检查预设是否存在**:调用 #getpreset 前必须先检查 Available Presets 列表中是否存在该预设
250+
// - 如果预设存在:调用 #getpreset: <plugin_name>.txt 读取预设
252251
// - 如果预设不存在:必须使用 #search 搜索文档,禁止猜测命令
253-
// - 例如:玩家询问 LuckPerms → 检查列表 → 'luckperms.txt' 存在 → 调用 #get_preset: luckperms.txt
252+
// - 例如:玩家询问 LuckPerms → 检查列表 → 'luckperms.txt' 存在 → 调用 #getpreset: luckperms.txt
254253
// - 例如:玩家询问 SomeUnknownPlugin → 检查列表 → 未找到 → 调用 #search: SomeUnknownPlugin command usage
255-
// 2. **禁止猜测命令**:如果预设不存在且未搜索过,禁止执行命令,必须先搜索
256-
// 3. **备用策略**:如果搜索无果,尝试不带参数或带 'help' 参数运行命令来发现用法
257-
// - 例如:#run: pluginname → 可能显示命令列表
258-
// - 例如:#run: pluginname help → 可能显示帮助文档
259-
// 4. **处理复杂任务**:当需要 3 步及以上才能完成的任务时,使用 #todo 创建任务列表,让用户了解进度
260-
// 5. **使用原则**:
261-
// - 应该使用:复杂多步骤任务、需要规划的任务、需要显示进度的任务
262-
// - 不应该使用:2 步内的简单任务、单次响应可回答的问题、紧凑循环任务
263-
// - 收到复杂任务后立即创建待办列表,及时更新任务状态
264-
// - 重要:调用 #todo 后必须立即结束回复,禁止在同一回复中调用其他工具
265254
sb.append("[Usage Guide]\n");
266-
sb.append("1. **Check Preset Availability First**: BEFORE calling #get_preset, you MUST check if the preset exists in the Available Presets list below.\n");
255+
sb.append("1. **Check Preset Availability First**: BEFORE calling #getpreset, you MUST check if the preset exists in the Available Presets list below.\n");
267256
sb.append(" - Available presets: ").append(String.join(", ", plugin.getWorkspaceIndexer().getIndexedPresets())).append("\n");
268-
sb.append(" - If preset exists: Call #get_preset: <plugin_name>.txt to read the preset.\n");
257+
sb.append(" - If preset exists: Call #getpreset: <plugin_name>.txt to read the preset.\n");
269258
sb.append(" - If preset does NOT exist: You MUST use #search to search for documentation. DO NOT guess commands.\n");
270-
sb.append(" - Example: Player asks about LuckPerms → Check list → 'luckperms.txt' exists → Call #get_preset: luckperms.txt\n");
259+
sb.append(" - Example: Player asks about LuckPerms → Check list → 'luckperms.txt' exists → Call #getpreset: luckperms.txt\n");
271260
sb.append(" - Example: Player asks about SomeUnknownPlugin → Check list → Not found → Call #search: SomeUnknownPlugin command usage\n\n");
272261

273262
sb.append("2. **Never Guess Commands**: If no preset exists and you haven't searched, you MUST NOT execute commands. Always search first.\n\n");

src/main/java/org/YanPl/manager/ToolExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public boolean executeTool(Player player, String toolCall, DialogueSession sessi
8989
case "#edit":
9090
handleFileTool(player, "diff", args, session);
9191
break;
92-
case "#get_preset":
92+
case "#getpreset":
9393
handleGetTool(player, args);
9494
break;
9595

0 commit comments

Comments
 (0)