guanghulab/server/chat/tool-registry.js

104 lines
3.8 KiB
JavaScript
Raw Normal View History

"use strict";
/*
* 光湖 · 工具注册中心
* 所有真实可调用的工具在此注册
* Anti-Hallucination 系统工具不存在时返回无工具回执
*/
const https = require("https");
const http = require("http");
// ─── 工具定义 ─────────────────────────────────────────────────
const TOOLS = {};
// Notion 查询(通过 repo-mcp MCP 工具)
TOOLS.notion = {
name: "Notion 知识库",
description: "查询 Notion 中的知识库页面内容",
execute: async (query) => {
try {
const body = JSON.stringify({ action: "search", query: query || "" });
const res = await fetch("http://127.0.0.1:3902/api/tools/notion/search", {
method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer " + (process.env.REPO_MCP_SECRET_ZZ || "") },
body, signal: AbortSignal.timeout(10000),
});
if (!res.ok) return "[Notion] 查询失败: HTTP " + res.status;
const data = await res.json();
return "[Notion 查询结果]\n" + JSON.stringify(data, null, 2).slice(0, 3000);
} catch (e) {
return "[Notion] 查询出错: " + e.message;
}
}
};
// 仓库查询Forgejo API
TOOLS.repo = {
name: "代码仓库",
description: "查询代码仓库信息",
execute: async (query) => {
try {
const token = process.env.GITEA_TOKEN || "2d924a6e19b44d14bf367f5dd1ce238510128183";
// 只返回基本的仓库信息
const res = await fetch("https://guanghulab.com/code/api/v1/repos/bingshuo/guanghulab", {
headers: { "Authorization": "token " + token },
signal: AbortSignal.timeout(8000),
});
if (!res.ok) return "[仓库] 查询失败: HTTP " + res.status;
const data = await res.json();
return "[代码仓库信息]\n仓库: " + data.full_name + "\n描述: " + (data.description || "无") + "\n分支: " + data.default_branch + "\n更新: " + data.updated_at;
} catch (e) {
return "[仓库] 查询出错: " + e.message;
}
}
};
// 系统健康
TOOLS.health = {
name: "系统健康",
description: "查询服务器和系统运行状态",
execute: async () => {
try {
const res = await fetch("http://127.0.0.1:3000/api/health", { signal: AbortSignal.timeout(5000) });
if (!res.ok) return "[系统健康] 查询失败";
const data = await res.json();
return "[系统健康状态]\n服务器: " + (data.server || "未知") + "\n推理端: " + (data.inference?.ready ? "就绪" : "未配置") + "\n时间: " + (data.ts || "");
} catch (e) {
return "[系统健康] 查询出错: " + e.message;
}
}
};
// 训练状态
TOOLS.training = {
name: "训练状态",
description: "查询模型训练进度和状态",
execute: async () => {
try {
const fs = require("fs");
const p = "/data/guanghulab/repo/homepage/training-status.json";
if (!fs.existsSync(p)) return "[训练状态] 数据文件不存在";
const raw = fs.readFileSync(p, "utf-8");
const data = JSON.parse(raw);
const steps = data.pipeline?.steps || [];
const done = steps.filter(s => s.status === "completed").length;
const total = steps.length;
return "[训练状态]\n流水线: " + done + "/" + total + " 完成\n" +
steps.map(s => (s.label || "⬜") + " " + s.name).join("\n");
} catch (e) {
return "[训练状态] 读取失败: " + e.message;
}
}
};
// 工具列表
TOOLS.list = {
name: "工具列表",
description: "列出所有可用工具",
execute: async () => {
const names = Object.keys(TOOLS).filter(k => k !== "list");
return "[可用工具列表]\n" + names.map(n => " " + n + " - " + TOOLS[n].description).join("\n");
}
};
module.exports = { TOOLS };