// 用本仓库的声明式工具代码看某个预设会声明出什么 tools(不发请求)。 // 用法: node node_modules/tsx/dist/cli.mjs tools/st-request-diff/inspect-tools-decl.mjs import { readFileSync } from "node:fs"; import path from "node:path"; import { importSillyTavernPreset } from "../../src/preset/importer.js"; import { declarePresetTools } from "../../src/preset/tool-declaration.js"; const file = process.argv[2]; const raw = JSON.parse(readFileSync(file, "utf8")); const report = importSillyTavernPreset(raw, { name: path.basename(file, ".json") }); const declared = declarePresetTools(report.preset); if (!declared) { console.log("没有声明工具(declarePresetTools = null)"); process.exit(0); } console.log("来源: " + declared.source + ",toolChoice: " + declared.toolChoice + ",正文参数: " + declared.payloadFields.join(", ")); for (const tool of declared.tools) { const fn = tool.function; const params = fn.parameters; console.log(" 工具名: " + fn.name); console.log(" 描述字数: " + fn.description.length + " 开头: " + fn.description.replace(/\s+/g, " ").slice(0, 60)); console.log(" 参数: " + JSON.stringify(Object.keys(params.properties ?? {})) + " required=" + JSON.stringify(params.required ?? [])); for (const [key, value] of Object.entries(params.properties ?? {})) { const desc = String(value.description ?? ""); console.log(" - " + key + " (" + (value.type ?? "") + ") 说明字数 " + desc.length + " 开头: " + desc.replace(/\s+/g, " ").slice(0, 50)); } }