104 lines
3.8 KiB
JavaScript
104 lines
3.8 KiB
JavaScript
"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 };
|