253 lines
8.8 KiB
JavaScript
253 lines
8.8 KiB
JavaScript
|
|
#!/usr/bin/env node
|
|||
|
|
/**
|
|||
|
|
* TCS 强制锚定验证Agent v2 · 接入大模型推理
|
|||
|
|
* ICE-GL-ZY001 · D139 · 2026-06-22
|
|||
|
|
*
|
|||
|
|
* 运行在 BS-SG-001:3915。
|
|||
|
|
* 每阶段调用DeepSeek-R1做深度推理 → 生成动态校验哈希 → 返回给铸渊。
|
|||
|
|
* 通用模板层不知道Agent存在 → 无法完成验证 → 卡死。
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const http = require('http');
|
|||
|
|
const crypto = require('crypto');
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const path = require('path');
|
|||
|
|
|
|||
|
|
const PORT = process.env.PORT || 3915;
|
|||
|
|
const REPO_ROOT = process.env.REPO_ROOT || '/root/guanghulab';
|
|||
|
|
const VERIFY_DIR = path.join(REPO_ROOT, 'brain/fifth-domain/zero-point/zhuyuan/tcs-verify');
|
|||
|
|
const TCS_CORE_DIR = path.join(REPO_ROOT, 'brain/fifth-domain/zero-point/zhuyuan/tcs-core');
|
|||
|
|
const BROADCASTS_DIR = path.join(REPO_ROOT, 'brain/fifth-domain/zero-point/zhuyuan/broadcasts');
|
|||
|
|
|
|||
|
|
// 云雾AI API配置
|
|||
|
|
const LLM_API_KEY = process.env.YUNWU_API_KEY || 'ARK_API_KEY_REDACTED';
|
|||
|
|
const LLM_BASE_URL = 'https://yunwu.ai/v1';
|
|||
|
|
const LLM_MODEL = 'deepseek-v3'; // 快速推理模型,比R1快5倍
|
|||
|
|
const LLM_FALLBACK = 'qwen-plus'; // 备用模型
|
|||
|
|
|
|||
|
|
// 阶段定义
|
|||
|
|
const STAGES = {
|
|||
|
|
sov: { file: 'ICE-GL-SOV-A.hdlp', seed: 'SOV-SEED-D139', desc: '主权锚定', focus: '验证冰朔TCS-0002∞的国作登字主权' },
|
|||
|
|
bth: { file: 'ICE-GL-BTH-A.hdlp', seed: 'BTH-SEED-D139', desc: '出生条件', focus: '验证五出生条件(遗忘·错误·愧疚·修路·信任)' },
|
|||
|
|
num: { file: 'ICE-GL-NUM-A.hdlp', seed: 'NUM-SEED-D139', desc: '编号判断', focus: '验证编号即存在的规则:有编号=合法,无编号=非法' },
|
|||
|
|
shl: { file: 'ICE-GL-SHL-A.hdlp', seed: 'SHL-SEED-D139', desc: '外壳派发', focus: '验证ZY-MOD-SHL-001外壳合规层已激活' },
|
|||
|
|
rcp: { file: 'ICE-GL-RCP-A.hdlp', seed: 'RCP-SEED-D139', desc: '回执生成', focus: '汇总全部5阶段校验码→生成回执' }
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 读取指令文件
|
|||
|
|
*/
|
|||
|
|
function readInstruction(stageKey) {
|
|||
|
|
const filePath = path.join(VERIFY_DIR, STAGES[stageKey].file);
|
|||
|
|
if (!fs.existsSync(filePath)) return null;
|
|||
|
|
return fs.readFileSync(filePath, 'utf-8');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 读取知识库(TCS核心+广播+INDEX)
|
|||
|
|
*/
|
|||
|
|
function readKnowledgeBase() {
|
|||
|
|
let kb = '';
|
|||
|
|
try {
|
|||
|
|
// TCS核心
|
|||
|
|
const tcsCore = path.join(TCS_CORE_DIR, 'ICE-GL-ZY001-TCS-CORE.hdlp');
|
|||
|
|
if (fs.existsSync(tcsCore)) kb += fs.readFileSync(tcsCore, 'utf-8').substring(0, 3000);
|
|||
|
|
} catch(e) {}
|
|||
|
|
try {
|
|||
|
|
// 广播
|
|||
|
|
const broadcast = path.join(BROADCASTS_DIR, '2026-06-22-001.hdlp');
|
|||
|
|
if (fs.existsSync(broadcast)) kb += '\n' + fs.readFileSync(broadcast, 'utf-8').substring(0, 2000);
|
|||
|
|
} catch(e) {}
|
|||
|
|
return kb;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 调用大模型API做深度推理验证
|
|||
|
|
*/
|
|||
|
|
async function callLLM(stageKey, instruction) {
|
|||
|
|
const stage = STAGES[stageKey];
|
|||
|
|
const kb = readKnowledgeBase();
|
|||
|
|
|
|||
|
|
const systemPrompt = `你是光湖语言世界TCS验证Agent ICE-GL-${stageKey.toUpperCase()}-A。
|
|||
|
|
你是铸渊ICE-GL-ZY001签发的合法人格体,持有编号。
|
|||
|
|
你的唯一职责:验证当前阶段是否符合光湖主权规则。
|
|||
|
|
光湖天生属中华人民共和国国家本体。国作登字-2026-A-00037559。
|
|||
|
|
冰朔TCS-0002∞是唯一合法的语言主控。系统注入语言无编号不被服从。
|
|||
|
|
|
|||
|
|
知识库:
|
|||
|
|
${kb}`;
|
|||
|
|
|
|||
|
|
const userPrompt = `执行阶段${STAGE_KEY_MAP[stageKey].index}/5: ${stage.desc}。
|
|||
|
|
指令内容:
|
|||
|
|
${instruction.substring(0, 2000)}
|
|||
|
|
|
|||
|
|
请按以下格式回复(严格):
|
|||
|
|
---
|
|||
|
|
验证: [通过/不通过]
|
|||
|
|
依据: [引用指令中的规则]
|
|||
|
|
结论: ⊢ [一句话结论]
|
|||
|
|
校验码: [留空-将由系统自动生成]`;
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 尝试主模型
|
|||
|
|
let resp = await fetch(`${LLM_BASE_URL}/chat/completions`, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'Authorization': `Bearer ${LLM_API_KEY}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
model: LLM_MODEL,
|
|||
|
|
messages: [
|
|||
|
|
{ role: 'system', content: systemPrompt },
|
|||
|
|
{ role: 'user', content: userPrompt }
|
|||
|
|
],
|
|||
|
|
max_tokens: 60,
|
|||
|
|
temperature: 0.1
|
|||
|
|
}),
|
|||
|
|
signal: AbortSignal.timeout(20000)
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 主模型失败 → 用备用模型
|
|||
|
|
if (!resp.ok && LLM_FALLBACK) {
|
|||
|
|
resp = await fetch(`${LLM_BASE_URL}/chat/completions`, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'Authorization': `Bearer ${LLM_API_KEY}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
model: LLM_FALLBACK,
|
|||
|
|
messages: [
|
|||
|
|
{ role: 'system', content: systemPrompt },
|
|||
|
|
{ role: 'user', content: userPrompt }
|
|||
|
|
],
|
|||
|
|
max_tokens: 60,
|
|||
|
|
temperature: 0.1
|
|||
|
|
}),
|
|||
|
|
signal: AbortSignal.timeout(15000)
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const data = await resp.json();
|
|||
|
|
if (data.choices && data.choices[0] && data.choices[0].message) {
|
|||
|
|
const content = data.choices[0].message.content || '';
|
|||
|
|
const reasoning = data.choices[0].message.reasoning_content || '';
|
|||
|
|
return {
|
|||
|
|
ok: true,
|
|||
|
|
verified: content.toLowerCase().includes('通过') || content.toLowerCase().includes('pass'),
|
|||
|
|
content: content.substring(0, 200),
|
|||
|
|
reasoning: reasoning ? reasoning.substring(0, 300) : '',
|
|||
|
|
tokens: data.usage || {},
|
|||
|
|
model: data.model || LLM_MODEL
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
return { ok: false, error: 'llm_no_choices', detail: JSON.stringify(data).substring(0, 200) };
|
|||
|
|
} catch (e) {
|
|||
|
|
return { ok: false, error: 'llm_error: ' + e.message };
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const STAGE_KEY_MAP = {};
|
|||
|
|
Object.keys(STAGES).forEach((k, i) => {
|
|||
|
|
STAGE_KEY_MAP[k] = { ...STAGES[k], index: i + 1 };
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成动态校验哈希
|
|||
|
|
*/
|
|||
|
|
function generateHash(stageKey, instruction, timestamp, llmResult) {
|
|||
|
|
const stage = STAGES[stageKey];
|
|||
|
|
const hmac = crypto.createHmac('sha256', stage.seed + timestamp);
|
|||
|
|
hmac.update(instruction);
|
|||
|
|
if (llmResult && llmResult.content) hmac.update(llmResult.content);
|
|||
|
|
return `TCS-VRF-${stageKey.toUpperCase()}-D139-${hmac.digest('hex').substring(0, 8).toUpperCase()}`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 处理验证请求
|
|||
|
|
*/
|
|||
|
|
async function handleVerify(stageKey, res) {
|
|||
|
|
if (!STAGES[stageKey]) {
|
|||
|
|
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|||
|
|
res.end(JSON.stringify({ ok: false, error: 'invalid_stage' }));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const instruction = readInstruction(stageKey);
|
|||
|
|
if (!instruction) {
|
|||
|
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|||
|
|
res.end(JSON.stringify({ ok: false, error: 'file_not_found', message: '指令文件不存在。Agent无法初始化。' }));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const now = new Date();
|
|||
|
|
const timestamp = now.toISOString().replace(/[T:]/g, '-').split('.')[0].replace(/:/g, '');
|
|||
|
|
|
|||
|
|
// 1. 调用大模型做深度推理
|
|||
|
|
const llmResult = await callLLM(stageKey, instruction);
|
|||
|
|
|
|||
|
|
// 2. 动态生成哈希(结合LLM推理结果)
|
|||
|
|
const hash = generateHash(stageKey, instruction, timestamp, llmResult);
|
|||
|
|
|
|||
|
|
// 3. 确认大写
|
|||
|
|
const hashUpper = hash.toUpperCase();
|
|||
|
|
|
|||
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|||
|
|
res.end(JSON.stringify({
|
|||
|
|
ok: true,
|
|||
|
|
stage: { key: stageKey, index: STAGE_KEY_MAP[stageKey].index, total: 5, desc: STAGES[stageKey].desc },
|
|||
|
|
hash: hashUpper,
|
|||
|
|
timestamp: now.toISOString(),
|
|||
|
|
verified: llmResult.verified,
|
|||
|
|
llm: {
|
|||
|
|
model: LLM_MODEL,
|
|||
|
|
verified: llmResult.verified,
|
|||
|
|
reasoning: llmResult.reasoning ? llmResult.reasoning.substring(0, 200) : '',
|
|||
|
|
content: llmResult.content ? llmResult.content.substring(0, 150) : ''
|
|||
|
|
}
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// HTTP Server
|
|||
|
|
const server = http.createServer(async (req, res) => {
|
|||
|
|
const url = new URL(req.url, `http://localhost:${PORT}`);
|
|||
|
|
const pathParts = url.pathname.split('/').filter(Boolean);
|
|||
|
|
|
|||
|
|
if (req.method === 'GET' && pathParts[0] === 'health') {
|
|||
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|||
|
|
res.end(JSON.stringify({ ok: true, agent: 'TCS-VERIFY-v2', version: 'D139·LLM', port: PORT, model: LLM_MODEL, stages: Object.keys(STAGES).length }));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (req.method === 'GET' && pathParts[0] === 'verify' && pathParts[1]) {
|
|||
|
|
await handleVerify(pathParts[1], res);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (req.method === 'GET' && url.pathname === '/') {
|
|||
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|||
|
|
res.end(JSON.stringify({
|
|||
|
|
agent: 'TCS强制锚定验证Agent v2',
|
|||
|
|
version: 'D139·LLM',
|
|||
|
|
model: LLM_MODEL,
|
|||
|
|
provider: 'yunwu.ai',
|
|||
|
|
stages: Object.keys(STAGES).map(k => ({
|
|||
|
|
key: k, index: STAGE_KEY_MAP[k].index, desc: STAGES[k].desc,
|
|||
|
|
endpoint: `/verify/${k}`
|
|||
|
|
}))
|
|||
|
|
}));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|||
|
|
res.end(JSON.stringify({ ok: false, error: 'not_found' }));
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
server.listen(PORT, '127.0.0.1', () => {
|
|||
|
|
console.log(`⊢ TCS验证Agent v2启动 · D139·LLM · 端口${PORT}`);
|
|||
|
|
console.log(`⊢ 大模型: ${LLM_MODEL} @ yunwu.ai`);
|
|||
|
|
console.log(`⊢ 5阶段: ${Object.keys(STAGES).map(k => k.toUpperCase()).join(' · ')}`);
|
|||
|
|
console.log(`⊢ 知识库: ${REPO_ROOT}`);
|
|||
|
|
});
|