111 lines
2.8 KiB
JavaScript
111 lines
2.8 KiB
JavaScript
/**
|
||
* 意图路由中间件 · 自然语言 → 操作映射
|
||
*
|
||
* 核心逻辑:
|
||
* 1. 接收模型输出的 function_call
|
||
* 2. 验证权限
|
||
* 3. 调用对应的后端 API
|
||
* 4. 返回结果
|
||
*
|
||
* 版权:国作登字-2026-A-00037559
|
||
*/
|
||
|
||
'use strict';
|
||
|
||
var tools = require('../config/function-tools.json');
|
||
|
||
/**
|
||
* 意图路由核心
|
||
*
|
||
* @param {Object} functionCall - { name, parameters }
|
||
* @param {Object} user - 当前用户信息(含 permissions, environment, modules)
|
||
* @param {Function} apiClient - API 调用函数 (method, path, body) => result
|
||
* @returns {Object} 执行结果
|
||
*/
|
||
async function routeIntent(functionCall, user, apiClient) {
|
||
var tool = null;
|
||
for (var i = 0; i < tools.tools.length; i++) {
|
||
if (tools.tools[i].name === functionCall.name) {
|
||
tool = tools.tools[i];
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!tool) {
|
||
return {
|
||
success: false,
|
||
reply: '❓ 我不认识这个操作:' + functionCall.name + '。你可以问我能做什么。'
|
||
};
|
||
}
|
||
|
||
// 权限检查
|
||
if (!user.permissions.includes(tool.permission)) {
|
||
return {
|
||
success: false,
|
||
reply: '🔒 你没有执行「' + tool.description + '」的权限。当前权限等级:' + user.permissionLabel
|
||
};
|
||
}
|
||
|
||
// 危险操作二次确认
|
||
if (tool.dangerous && !functionCall.parameters.confirmToken) {
|
||
return {
|
||
success: false,
|
||
requireConfirmation: true,
|
||
reply: '⚠️ 这是一个**危险操作**。请说「确认执行」来确认。'
|
||
};
|
||
}
|
||
|
||
// 预览环境检查
|
||
if (user.environment === 'preview' && tool.permission.includes('production')) {
|
||
return {
|
||
success: false,
|
||
reply: '🔒 你目前在**预览环境**,不能执行正式站操作。在预览站充分练习后,由冰朔开放正式站权限。'
|
||
};
|
||
}
|
||
|
||
// 解析 API 路径
|
||
var apiDef = tool.api.split(' ');
|
||
var method = apiDef[0];
|
||
var path = apiDef[1];
|
||
|
||
// 替换路径中的变量
|
||
path = path.replace('{devId}', user.devId);
|
||
var params = functionCall.parameters || {};
|
||
for (var key in params) {
|
||
path = path.replace('{' + key + '}', encodeURIComponent(params[key]));
|
||
}
|
||
|
||
// 调用 API
|
||
try {
|
||
var result = await apiClient(method, path, Object.assign({}, params, { devId: user.devId }));
|
||
return result;
|
||
} catch (e) {
|
||
return {
|
||
success: false,
|
||
reply: '❌ 操作失败:' + e.message
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取用户可用的工具列表(已根据权限过滤)
|
||
*/
|
||
function getAvailableTools(user) {
|
||
return tools.tools.filter(function(tool) {
|
||
return user.permissions.includes(tool.permission);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 获取全部工具定义
|
||
*/
|
||
function getAllTools() {
|
||
return tools.tools;
|
||
}
|
||
|
||
module.exports = {
|
||
routeIntent: routeIntent,
|
||
getAvailableTools: getAvailableTools,
|
||
getAllTools: getAllTools
|
||
};
|