70 lines
2.1 KiB
JavaScript
70 lines
2.1 KiB
JavaScript
|
|
// ═══════════════════════════════════════
|
|||
|
|
// 铸渊开发Agent · 成本守卫 + 统一插座 v1.0
|
|||
|
|
// API调用计数 · 预算控制 · 输出格式校验
|
|||
|
|
// ═══════════════════════════════════════
|
|||
|
|
|
|||
|
|
const fs = require("fs");
|
|||
|
|
const path = require("path");
|
|||
|
|
|
|||
|
|
const CONSTITUTION = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "agent-constitution.json"), "utf-8"));
|
|||
|
|
const { cost_guard, unified_interface } = CONSTITUTION;
|
|||
|
|
|
|||
|
|
let _callCount = 0;
|
|||
|
|
let _budgetExceeded = false;
|
|||
|
|
|
|||
|
|
function reset() {
|
|||
|
|
_callCount = 0;
|
|||
|
|
_budgetExceeded = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getCallCount() { return _callCount; }
|
|||
|
|
|
|||
|
|
function isBudgetExceeded() { return _budgetExceeded; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 包裹模型调用——自动计数
|
|||
|
|
*/
|
|||
|
|
function wrapModelCaller(rawCaller) {
|
|||
|
|
return async function(prompt, opts) {
|
|||
|
|
if (_budgetExceeded) {
|
|||
|
|
throw new Error(cost_guard.stop_message);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_callCount++;
|
|||
|
|
|
|||
|
|
if (_callCount > cost_guard.max_api_calls_per_session) {
|
|||
|
|
_budgetExceeded = true;
|
|||
|
|
throw new Error(cost_guard.stop_message + " (已用 " + _callCount + " 次,上限 " + cost_guard.max_api_calls_per_session + ")");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log("[CostGuard] API调用 #" + _callCount + "/" + cost_guard.max_api_calls_per_session);
|
|||
|
|
return rawCaller(prompt, opts);
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 统一校验——每个模块输出必须通过这把尺
|
|||
|
|
*/
|
|||
|
|
function validateOutput(output) {
|
|||
|
|
const required = unified_interface.required_output_fields;
|
|||
|
|
const missing = required.filter(f => !(f in output));
|
|||
|
|
|
|||
|
|
if (missing.length > 0) {
|
|||
|
|
return {
|
|||
|
|
valid: false,
|
|||
|
|
error: "输出缺少必要字段: " + missing.join(", "),
|
|||
|
|
required,
|
|||
|
|
received: Object.keys(output)
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 类型校验
|
|||
|
|
if (typeof output.ok !== "boolean") {
|
|||
|
|
return { valid: false, error: "ok 必须是 boolean,收到: " + typeof output.ok };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return { valid: true };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
module.exports = { wrapModelCaller, validateOutput, reset, getCallCount, isBudgetExceeded };
|