guanghulab/server/chat/tool-registry.js
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

104 lines
3.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"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 };