'use strict'; /** * NAC AI 资产估值问答界面 - 服务端 v2.0 * 新增: * - 20大类资产 × 60+辖区 知识库集成 * - 辖区感知估值(每个辖区独立参数模型) * - 三重价值输出(当地货币 + USD + XTZH) * - 智能资产类型和辖区识别 * - /api/v4/asset-categories 资产分类接口 * - /api/v4/jurisdictions 辖区列表接口 */ const express = require('express'); const http = require('http'); const path = require('path'); // 知识库适配层 const { ASSET_VALUATION_KB, ASSET_KEYWORDS: ASSET_KB_KEYWORDS } = require('./knowledge/asset_valuation_kb'); const { JURISDICTION_KB } = require('./knowledge/jurisdiction_kb'); // 适配:将 ASSET_VALUATION_KB 映射为 ASSET_CATEGORIES(server.js 内部使用格式) const ASSET_CATEGORIES = {}; Object.entries(ASSET_VALUATION_KB).forEach(([key, cat]) => { const lowerKey = key.toLowerCase(); ASSET_CATEGORIES[lowerKey] = { code: cat.gnacs || lowerKey, name: cat.name, nameEn: cat.nameEn || '', icon: cat.icon || '📦', subcategories: {} }; if (cat.subcategories) { Object.entries(cat.subcategories).forEach(([sk, sub]) => { ASSET_CATEGORIES[lowerKey].subcategories[sk.toLowerCase()] = { name: sub.name || sk, types: sub.types || [], methods: sub.valuationMethods ? [sub.valuationMethods.primary, ...(sub.valuationMethods.secondary || [])] : [], keyParams: sub.keyParameters || sub.keyParams || [] }; }); } }); // 辖区国旗映射 const JURISDICTION_FLAGS = { HK:'🇭🇰', SG:'🇸🇬', US:'🇺🇸', GB:'🇬🇧', DE:'🇩🇪', FR:'🇫🇷', JP:'🇯🇵', KR:'🇰🇷', AU:'🇦🇺', AE:'🇦🇪', CN:'🇨🇳', TW:'🇹🇼', MY:'🇲🇾', IN:'🇮🇳', CH:'🇨🇭', CA:'🇨🇦', SA:'🇸🇦', BR:'🇧🇷', ZA:'🇿🇦', IL:'🇮🇱', NL:'🇳🇱', EU:'🇪🇺', NZ:'🇳🇿', QA:'🇶🇦', KW:'🇰🇼', BH:'🇧🇭', RU:'🇷🇺', AR:'🇦🇷', CL:'🇨🇱', NG:'🇳🇬', EG:'🇪🇬', KE:'🇰🇪', MX:'🇲🇽', IT:'🇮🇹', ES:'🇪🇸', TR:'🇹🇷', MO:'🇲🇴', TH:'🇹🇭', ID:'🇮🇩', PH:'🇵🇭', VN:'🇻🇳', PT:'🇵🇹', SE:'🇸🇪', NO:'🇳🇴', DK:'🇩🇰', FI:'🇫🇮', PL:'🇵🇱', CZ:'🇨🇿', HU:'🇭🇺', RO:'🇷🇴', GR:'🇬🇷', AT:'🇦🇹', BE:'🇧🇪', LU:'🇱🇺', IE:'🇮🇪', SZ:'🇸🇿' }; // 适配:将 JURISDICTION_KB 映射为 JURISDICTION_MODELS const JURISDICTION_MODELS = {}; Object.entries(JURISDICTION_KB).forEach(([code, j]) => { JURISDICTION_MODELS[code] = { ...j, flag: JURISDICTION_FLAGS[code] || '🌍', regulator: Array.isArray(j.regulators) ? j.regulators.join('/') : (j.regulator || 'N/A'), realEstate: j.realEstate ? { residential: { primaryMethod: j.realEstate.valuationMethods ? j.realEstate.valuationMethods[0] : '市场比较法', capRate: j.realEstate.residentialCapRate ? { range: `${j.realEstate.residentialCapRate.min}-${j.realEstate.residentialCapRate.max}%`, note: `均值 ${j.realEstate.residentialCapRate.avg}%` } : null, foreignOwnership: j.realEstate.foreignOwnership || '无特殊限制', taxConsiderations: j.realEstate.stampDuty ? JSON.stringify(j.realEstate.stampDuty).replace(/[{}"]|\\n/g, ' ') : null, specialRules: j.realEstate.keyFactors || [] }, commercial: { capRate: j.realEstate.commercialCapRate ? { range: `${j.realEstate.commercialCapRate.min}-${j.realEstate.commercialCapRate.max}%`, note: `均值 ${j.realEstate.commercialCapRate.avg}%` } : null } } : null }; }); // GNACS 编码映射 const GNACS_CODES = { 'GNACS-01': { key: 'real_estate', name: '不动产类' }, 'GNACS-02': { key: 'financial_securities', name: '金融证券类' }, 'GNACS-03': { key: 'commodities', name: '大宗商品类' }, 'GNACS-04': { key: 'art_collectibles', name: '艺术品与收藏品类' }, 'GNACS-05': { key: 'intellectual_property', name: '知识产权类' }, 'GNACS-06': { key: 'digital_assets', name: '数字资产类' }, 'GNACS-07': { key: 'infrastructure', name: '基础设施类' }, 'GNACS-08': { key: 'natural_resources', name: '自然资源类' }, 'GNACS-09': { key: 'environmental_rights', name: '环境权益类' }, 'GNACS-10': { key: 'corporate_equity', name: '企业权益类' }, 'GNACS-11': { key: 'debt_assets', name: '债权类' }, 'GNACS-12': { key: 'insurance_products', name: '保险产品类' }, 'GNACS-13': { key: 'agricultural_assets', name: '农业资产类' }, 'GNACS-14': { key: 'vehicles', name: '交通工具类' }, 'GNACS-15': { key: 'machinery_equipment', name: '机械设备类' }, 'GNACS-16': { key: 'data_assets', name: '数据资产类' }, 'GNACS-17': { key: 'brand_assets', name: '品牌资产类' }, 'GNACS-18': { key: 'sports_assets', name: '体育资产类' }, 'GNACS-19': { key: 'entertainment_assets', name: '娱乐资产类' }, 'GNACS-20': { key: 'other_assets', name: '其他资产类' } }; // 关键词映射 - 重建为嵌套格式供 detectAssetType 使用 const ASSET_KEYWORDS = { real_estate: { residential: ['住宅','公寓','别墅','房子','房产','套房','单元房','联排','独栋','学区房','老年公寓','度假屋'], commercial: ['写字楼','商铺','商业地产','零售','购物中心','酒店','商业综合体','办公楼','甲级','乙级'], industrial: ['厂房','仓储','工业','物流','冷链','数据中心','工业园','仓库'], agricultural: ['农地','耕地','农田','果园','林地','渔场','牧场','温室','农业用地'], infrastructure: ['基础设施','港口','机场','高速','管道','电网','水务','轨道交通'] }, intellectual_property: { copyright: ['版权','著作权','音乐版权','影视版权','文学版权','软件著作权','版税','授权收入'], patent: ['专利','发明专利','实用新型','外观设计','许可费','技术转让','专利授权'], trademark: ['商标','品牌授权','商标权','注册商标','品牌价值'], portrait_rights: ['肖像权','形象权','姓名权','艺人','网红','运动员','明星IP','人物IP'], trade_secret: ['商业秘密','技术秘密','配方','工艺'], domain: ['域名','网络资产','互联网资产'] }, art_collectibles: { fine_art: ['艺术品','油画','水墨','雕塑','版画','当代艺术','毕加索','梵高','齐白石','张大千'], antiques: ['古董','文物','古玩','瓷器','青铜器','字画','古籍'], luxury: ['名表','劳力士','百达翡丽','爱彼','珠宝','钻石','宝石','翡翠'], wine: ['红酒','葡萄酒','威士忌','白兰地','茅台','收藏酒'], collectibles: ['邮票','钱币','球星卡','限量版','收藏品'] }, financial_securities: { stocks: ['股票','股权','上市公司','A股','港股','美股','纳斯达克','纽交所'], bonds: ['债券','国债','企业债','可转债','债权'], funds: ['基金','私募','公募','REITs','房地产信托','对冲基金'], derivatives: ['期权','期货','衍生品','结构化产品'] }, corporate_equity: { unlisted: ['非上市','未上市股权','私人公司','创业公司','初创','股份','股东','PE','VC','天使'], listed: ['上市公司','控股','大股东','战略股东'], startup: ['初创企业','独角兽','估值','融资轮次','A轮','B轮','C轮'] }, commodities: { precious_metals: ['黄金','白银','铂金','钯金','贵金属','金条','金币'], energy: ['石油','天然气','煤炭','能源','原油','LNG'], agricultural_commodities: ['大豆','小麦','玉米','棉花','糖','咖啡','农产品期货'], metals: ['铜','铝','铁矿石','锂','稀土','工业金属'] }, digital_assets: { cryptocurrency: ['比特币','以太坊','加密货币','虚拟货币','数字货币','BTC','ETH'], nft: ['NFT','非同质化代币','数字艺术','数字收藏品'], metaverse: ['元宇宙','虚拟土地','虚拟资产','游戏资产','Sandbox','Decentraland'] }, environmental_rights: { carbon: ['碳排放权','碳信用','碳汇','VCS','Gold Standard','CDM','碳中和','CCER'], renewable: ['可再生能源','绿证','REC','绿色电力','光伏','风电'], water: ['水权','排污权','环境权益'] }, data_assets: { data: ['数据资产','数据集','用户数据','大数据','AI数据','训练数据','数据库'], algorithm: ['算法','AI模型','机器学习模型','深度学习'] }, brand_assets: { brand: ['品牌','品牌价值','商誉','特许经营','加盟权','品牌授权','连锁品牌'], franchise: ['特许经营权','加盟','特许牌照','经营许可'] }, sports_assets: { club: ['体育俱乐部','足球俱乐部','篮球队','球队','球员转会'], rights: ['赛事版权','转播权','体育IP','运动员合同'] }, entertainment_assets: { film_tv: ['影视版权','电影版权','电视剧版权','流媒体权益','院线'], music_rights: ['音乐版权','唱片','流媒体版权','演唱会版权'], gaming: ['游戏IP','游戏版权','游戏资产'] }, natural_resources: { mining: ['矿权','采矿权','矿产','矿山','金矿','铜矿','煤矿'], forest: ['林权','森林碳汇','木材','林地资源'], water_resources: ['水资源','水域使用权','渔业权'] }, infrastructure: { transport: ['港口','机场','高速公路','铁路','轨道交通','桥梁隧道'], utilities: ['电网','水务','燃气管道','通信基础设施'], energy_infra: ['发电站','变电站','储能设施','充电桩'] }, debt_assets: { receivables: ['应收账款','票据','债权','贷款','抵押贷款','消费贷'], bonds_debt: ['债券','高收益债','不良资产','NPL'] }, insurance_products: { life: ['人寿保险','寿险保单','年金','保险价值'], property: ['财产保险','再保险','保险权益'] }, agricultural_assets: { crops: ['农作物','粮食','蔬菜','水果','农业收益'], livestock: ['牲畜','畜牧','家禽','水产','养殖'], equipment: ['农业机械','农业设备','拖拉机','收割机'] }, vehicles: { luxury_cars: ['豪车','超跑','法拉利','兰博基尼','保时捷','劳斯莱斯','宾利','迈巴赫'], yacht: ['游艇','私人游艇','帆船','豪华游轮'], aircraft: ['私人飞机','公务机','直升机','飞机'], classic_cars: ['经典车','老爷车','复古车','收藏车'] }, machinery_equipment: { industrial: ['工业设备','生产线','机床','数控机床','机械设备'], medical: ['医疗设备','CT机','核磁共振','手术机器人'], construction: ['工程机械','挖掘机','起重机','建筑设备'] } }; const app = express(); const PORT = process.env.PORT || 3005; app.use(express.json({ limit: '2mb' })); app.use(express.static(path.join(__dirname, 'public'))); app.use((req, res, next) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization'); if (req.method === 'OPTIONS') return res.sendStatus(204); next(); }); const VALUATION_ENGINE = { host: '127.0.0.1', port: 3003, timeout: 30000 }; const INFERENCE_ENGINE = { host: '127.0.0.1', port: 3001, timeout: 60000 }; let xtzhPriceCache = null; let xtzhPriceCacheTime = 0; const XTZH_CACHE_TTL = 5 * 60 * 1000; // ============================================================ // 工具函数 // ============================================================ function proxyRequest(method, target, reqPath, body, timeout) { return new Promise((resolve, reject) => { const bodyStr = body ? JSON.stringify(body) : null; const options = { hostname: target.host, port: target.port, path: reqPath, method, headers: { 'Content-Type': 'application/json', ...(bodyStr ? { 'Content-Length': Buffer.byteLength(bodyStr) } : {}) }, timeout: timeout || 10000 }; const req = http.request(options, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { try { resolve(JSON.parse(data)); } catch(e) { reject(new Error('Invalid JSON')); } }); }); req.on('error', reject); req.on('timeout', () => { req.destroy(); reject(new Error('Timeout')); }); if (bodyStr) req.write(bodyStr); req.end(); }); } async function getXTZHPrice() { if (xtzhPriceCache && Date.now() - xtzhPriceCacheTime < XTZH_CACHE_TTL) return xtzhPriceCache; try { const data = await proxyRequest('GET', VALUATION_ENGINE, '/api/v4/xtzh-price', null, 5000); xtzhPriceCache = data; xtzhPriceCacheTime = Date.now(); return data; } catch(_) { return { usd: 4.3944, source: 'fallback', goldCoverage: 1.25, sdrBasket: { USD: 0.5813, EUR: 0.1886, CNY: 0.1042, JPY: 0.0895, GBP: 0.0864 } }; } } // ============================================================ // 智能识别:资产类型 + 辖区 // ============================================================ function detectAssetType(text) { const lower = text.toLowerCase(); for (const [category, subcats] of Object.entries(ASSET_KEYWORDS)) { for (const [subcat, keywords] of Object.entries(subcats)) { for (const kw of keywords) { if (lower.includes(kw.toLowerCase())) return { category, subcat }; } } } return null; } function detectJurisdiction(text) { const lower = text.toLowerCase(); const map = { HK: ['香港','hong kong','hk','港岛','九龙','新界','差饷'], SG: ['新加坡','singapore','sg','ccr','rcr','ocr','hdb','absd','ura'], US: ['美国','united states','usa','纽约','洛杉矶','旧金山','加州','德州','new york','california','firpta'], GB: ['英国','uk','united kingdom','伦敦','london','leasehold','sdlt','rics'], DE: ['德国','germany','柏林','慕尼黑','法兰克福','berlin','munich','bafin'], FR: ['法国','france','巴黎','paris','amf'], JP: ['日本','japan','东京','大阪','tokyo','osaka','fsa'], KR: ['韩国','korea','首尔','seoul','江南','전세'], AU: ['澳大利亚','australia','悉尼','墨尔本','sydney','melbourne','firb','asic'], AE: ['阿联酋','uae','迪拜','阿布扎比','dubai','abu dhabi','freehold','dld'], CN: ['中国大陆','中国','china mainland','北京','上海','深圳','广州','成都','杭州','csrc'], TW: ['台湾','taiwan','台北','taipei','fsc台湾'], MY: ['马来西亚','malaysia','吉隆坡','kuala lumpur','sc马来'], IN: ['印度','india','孟买','德里','mumbai','delhi','sebi'], CH: ['瑞士','switzerland','苏黎世','日内瓦','zurich','geneva','finma'], CA: ['加拿大','canada','多伦多','温哥华','toronto','vancouver','csa'], SA: ['沙特','saudi','利雅得','riyadh','cma沙特'], BR: ['巴西','brazil','圣保罗','sao paulo','cvm'], ZA: ['南非','south africa','开普敦','约翰内斯堡','cape town','fsca'], IL: ['以色列','israel','特拉维夫','tel aviv','isa以色列'], NL: ['荷兰','netherlands','阿姆斯特丹','amsterdam','afm'], EU: ['欧盟','european union','欧洲','esma','mifid'], NZ: ['新西兰','new zealand','奥克兰','auckland','fma'], QA: ['卡塔尔','qatar','多哈','doha','qfma'], KW: ['科威特','kuwait','科威特城','cma科威特'], BH: ['巴林','bahrain','麦纳麦','manama','cbb'], RU: ['俄罗斯','russia','莫斯科','moscow','cbr'], AR: ['阿根廷','argentina','布宜诺斯艾利斯','buenos aires'], CL: ['智利','chile','圣地亚哥','santiago'], NG: ['尼日利亚','nigeria','拉各斯','lagos'], EG: ['埃及','egypt','开罗','cairo'], KE: ['肯尼亚','kenya','内罗毕','nairobi'], MX: ['墨西哥','mexico','墨西哥城'], IT: ['意大利','italy','罗马','米兰','rome','milan'], ES: ['西班牙','spain','马德里','巴塞罗那','madrid','barcelona'], TR: ['土耳其','turkey','伊斯坦布尔','istanbul'], MO: ['澳门','macau','macao'], TH: ['泰国','thailand','曼谷','bangkok'], ID: ['印度尼西亚','indonesia','雅加达','jakarta'], PH: ['菲律宾','philippines','马尼拉','manila'], VN: ['越南','vietnam','河内','胡志明','hanoi'], }; for (const [code, keywords] of Object.entries(map)) { for (const kw of keywords) { if (lower.includes(kw)) return code; } } return null; } function isValuationRequest(text) { const vkw = ['估值','值多少','价格','价值','多少钱','市价','市值','评估','上链','通证化','valuation','worth','price','value','how much']; const qkw = ['解释','什么是','如何','为什么','原理','机制','介绍','说明','区别','比较','explain','what is','how does','why','mechanism','difference']; const lower = text.toLowerCase(); const hasV = vkw.some(k => lower.includes(k)); const hasQ = qkw.some(k => lower.includes(k)); if (hasQ && !hasV) return false; return hasV; } // ============================================================ // 知识库回答生成 // ============================================================ async function generateKnowledgeAnswer(userMessage, assetType, jurisdiction) { const lower = userMessage.toLowerCase(); const priceData = await getXTZHPrice(); const xtzhPrice = priceData.usd || 4.3944; // XTZH 定价机制 if ((lower.includes('xtzh') || lower.includes('稳定币')) && (lower.includes('定价') || lower.includes('价格') || lower.includes('机制') || lower.includes('sdr') || lower.includes('稳定') || lower.includes('黄金'))) { return buildXTZHPricingAnswer(xtzhPrice, priceData); } // GNACS 编码 if (lower.includes('gnacs') || (lower.includes('资产分类') && lower.includes('nac'))) { return buildGNACSAnswer(); } // 估值方法论 if (lower.includes('估值方法') || lower.includes('收益资本化') || lower.includes('市场比较法') || lower.includes('成本法') || lower.includes('dcf') || lower.includes('折现') || lower.includes('许可费节省')) { return buildValuationMethodsAnswer(assetType); } // 上链流程 if (lower.includes('上链') || lower.includes('通证化') || lower.includes('tokenize') || lower.includes('acc-20') || lower.includes('charter')) { return buildTokenizationAnswer(jurisdiction); } // NAC 公链介绍 if ((lower.includes('nac') || lower.includes('newassetchain')) && (lower.includes('介绍') || lower.includes('什么是') || lower.includes('公链') || lower.includes('rwa'))) { return buildNACIntroAnswer(); } // 辖区对比 if (lower.includes('对比') || lower.includes('比较辖区') || lower.includes('哪个辖区')) { return buildJurisdictionCompareAnswer(xtzhPrice); } // 辖区感知资产估值 if (assetType) { return buildAssetValuationAnswer(assetType, jurisdiction, xtzhPrice, userMessage); } return null; } // ============================================================ // XTZH 定价机制 // ============================================================ function buildXTZHPricingAnswer(xtzhPrice, priceData) { const basket = priceData.sdrBasket || { USD: 0.5813, EUR: 0.1886, CNY: 0.1042, JPY: 0.0895, GBP: 0.0864 }; return `## XTZH 价值稳定机制详解 **XTZH(新资产链稳定币)** 是 NewAssetChain 公链的原生稳定币,采用 **SDR 锚定 + 黄金储备双重保障**机制。 ### 一、SDR 五货币篮子 | 货币 | 权重 | 说明 | |------|------|------| | 美元 (USD) | ${(basket.USD * 100).toFixed(2)}% | 全球储备主导货币 | | 欧元 (EUR) | ${(basket.EUR * 100).toFixed(2)}% | 欧元区货币 | | 人民币 (CNY) | ${(basket.CNY * 100).toFixed(2)}% | 新兴市场代表 | | 日元 (JPY) | ${(basket.JPY * 100).toFixed(2)}% | 亚太区货币 | | 英镑 (GBP) | ${(basket.GBP * 100).toFixed(2)}% | 英联邦货币 | ### 二、黄金储备保障 - **储备覆盖率:** ${priceData.goldCoverage ? (priceData.goldCoverage * 100).toFixed(0) : 125}%(超额储备) - **储备构成:** 实物黄金 + 黄金 ETF - **质押规则:** 资产上链需质押 **80%** 等值 XTZH - **再平衡触发:** 当 XTZH 偏离 SDR 基准 ±2% 时自动触发 ### 三、当前价格 **XTZH/USD = $${xtzhPrice.toFixed(4)}** ### 四、双链双币架构 | 代币 | 类型 | 用途 | |------|------|------| | **XTZH** | 稳定币 | 资产估值、交易结算、质押担保 | | **XIC** | 治理币 | 网络治理、节点激励、协议升级 | > XTZH 不是投机性加密货币,而是 RWA 资产通证化的**价值锚点**,其稳定性由 SDR 篮子和实物黄金储备共同保障。`; } // ============================================================ // GNACS 说明 // ============================================================ function buildGNACSAnswer() { let rows = ''; Object.entries(GNACS_CODES).forEach(([code, info]) => { const cat = ASSET_CATEGORIES[info.key]; const icon = cat ? cat.icon : ''; const subcatCount = cat ? Object.keys(cat.subcategories).length : 0; rows += `| ${code} | ${icon} ${info.name} | ${subcatCount} 个子类 |\n`; }); return `## GNACS 全球新资产分类标准 **GNACS(Global New Asset Classification Standard)** 是 NAC 公链的原生资产分类体系,覆盖 **20 大类、60+ 子类**资产。 | 编码 | 资产类别 | 子类数量 | |------|---------|---------| ${rows} ### 核心价值 每个 GNACS 编码对应: - **独立估值模型** — 针对该类资产的专业估值方法 - **辖区合规规则** — 60+ 辖区的特定法规要求 - **ACC-20 协议参数** — 通证化标准参数 - **Charter 合约模板** — 预置智能合约模板 > 资产上链时,系统根据 GNACS 编码自动匹配估值模型和合规规则,无需手动配置。`; } // ============================================================ // 估值方法论 // ============================================================ function buildValuationMethodsAnswer(assetType) { const cat = assetType ? ASSET_CATEGORIES[assetType.category] : null; let specificMethods = ''; if (cat && assetType.subcat && cat.subcategories[assetType.subcat]) { const sub = cat.subcategories[assetType.subcat]; specificMethods = `\n### 针对「${sub.name}」的推荐方法\n\n`; sub.methods.forEach(m => { specificMethods += `- **${m}**\n`; }); specificMethods += `\n**关键参数:** ${sub.keyParams.join('、')}\n`; } let methodsText = ''; Object.entries(VALUATION_METHODS).forEach(([key, method]) => { methodsText += `### ${method.name}\n\n`; methodsText += `${method.description}\n\n`; if (method.formula) methodsText += `**公式:** \`${method.formula}\`\n\n`; methodsText += `**适用资产:** ${method.applicableAssets.join('、')}\n\n`; methodsText += `**XTZH 换算:** ${method.xtzh_conversion}\n\n---\n\n`; }); return `## NAC 支持的资产估值方法论 ${specificMethods} ${methodsText}`; } // ============================================================ // 上链流程 // ============================================================ function buildTokenizationAnswer(jurisdiction) { const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null; const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区'; return `## RWA 资产上链(通证化)流程 ### 标准流程(基于 ACC-20 协议) **第一步:资产登记** - 提交资产基本信息(GNACS 类型、地点、权属证明) - 系统自动分配 GNACS 编码(20大类之一) - 生成唯一 NAC Asset ID **第二步:AI 合规审核(${jName})** - CNNL 神经网络语言自动分析合规性 - 七层合规验证(KYC / AML / CFT / 证券法 / 税务 / 产权 / 环境) ${jModel && jModel.regulator ? `- 辖区监管机构:**${jModel.regulator}**\n` : ''}${jModel && jModel.realEstate && jModel.realEstate.residential && jModel.realEstate.residential.foreignOwnership ? `- 外籍购买规则:${jModel.realEstate.residential.foreignOwnership}\n` : ''}- 合规评分 ≥ 80 分方可上链 **第三步:专业估值** - AI 估值引擎根据 GNACS 类别选择估值方法 - 辖区感知参数自动调用 - 输出三重价值:**当地货币 + USD + XTZH** **第四步:质押与发行** - 资产所有人质押 **80%** 等值 XTZH - Charter 智能合约自动部署(NVM 虚拟机) - ACC-20 通证在链上发行 **第五步:二级市场流通** - 通证在 NAC 生态内自由交易 - CBPP 共识确保交易最终性 - CSNP 网络保障合规传输 > 完整上链流程通常需要 **3-7 个工作日**,具体时间取决于辖区审批速度。`; } // ============================================================ // NAC 公链介绍 // ============================================================ function buildNACIntroAnswer() { return `## NewAssetChain (NAC) — RWA 专用原生公链 NAC 是全球首个专为**现实世界资产(RWA)**设计的原生公链,不是以太坊或任何现有公链的衍生或扩展。 ### 核心技术栈 | 组件 | NAC 原生实现 | 说明 | |------|------------|------| | 智能合约语言 | **Charter** | 专为 RWA 合规设计,非 Solidity | | 虚拟机 | **NVM** | 原生 RWA 操作码,非 EVM | | RPC 协议 | **NRPC 4.0** | 原生协议,非 JSON-RPC | | 共识机制 | **CBPP** | 宪政区块生产协议,非 PoS/PoW | | 网络协议 | **CSNP** | 合规感知网络,非 P2P | | 神经网络语言 | **CNNL** | AI 合规推理语言 | | 资产分类 | **GNACS** | 20 大类 × 60+ 辖区 | | 资产协议 | **ACC-20** | RWA 通证化标准 | ### 核心功能 - **AI 合规验证:** 内置 AI 自动审核资产合规性(七层框架) - **AI 估值引擎:** 多辖区、多资产类型专业估值 - **AI 审批系统:** 智能合约自动化审批流程 - **双链双币:** XTZH(稳定币)+ XIC(治理币) ### 支持资产规模 - **20 大类资产**(GNACS-01 至 GNACS-20) - **60+ 司法辖区**(覆盖全球主要经济体) - **50+ 资产子类**(充分细化每类资产)`; } // ============================================================ // 辖区对比 // ============================================================ function buildJurisdictionCompareAnswer(xtzhPrice) { const tier1 = Object.entries(JURISDICTION_MODELS).filter(([, j]) => j.tier === 1).slice(0, 12); let rows = ''; tier1.forEach(([code, j]) => { const re = j.realEstate && j.realEstate.residential; const capRate = re && re.capRate ? re.capRate.range : 'N/A'; const foreign = re && re.foreignOwnership ? (re.foreignOwnership.length > 25 ? re.foreignOwnership.substring(0, 25) + '…' : re.foreignOwnership) : '无限制'; rows += `| ${j.flag} ${j.name} | ${j.currency} | ${j.regulator || 'N/A'} | ${capRate} | ${foreign} |\n`; }); return `## Tier 1 辖区不动产估值对比 | 辖区 | 货币 | 监管机构 | 住宅资本化率 | 外籍购房规则 | |------|------|---------|------------|------------| ${rows} ### 辖区选择建议 - **最友好外籍购房:** 🇯🇵 日本(无限制)、🇩🇪 德国(无限制)、🇦🇪 阿联酋(Freehold区域) - **最高收益率:** 🇦🇪 阿联酋(6-8%)、🇿🇦 南非(6-10%) - **最成熟市场:** 🇺🇸 美国、🇬🇧 英国、🇯🇵 日本 - **最严格限制:** 🇨🇳 中国大陆、🇸🇬 新加坡(外籍 ABSD 60%) > 当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**。所有辖区的资产估值均可换算为 XTZH 等值。`; } // ============================================================ // 知识产权类专业估值回答 // ============================================================ function buildIPValuationAnswer(subcat, jModel, xtzhPrice, userMessage) { const ipInfo = { copyright: { name: '版权/著作权', gnacs: 'GNACS-05', methods: [ '**收益法(版税折现法)**:以未来版税收入折现为现值,是最常用方法', '**市场比较法**:参考同类版权的可比交易价格', '**成本法**:以创作成本+市场溢价估算(适用于新作品)' ], params: ['年版税收入(或预期版税率×授权收入基数)', '剩余保护期(著作权:作者终身+50-70年)', '折现率(通常8-15%)', '授权地域范围(全球/区域)', '授权类型(独家/非独家)', '商业化程度(已授权/未授权)'], formula: '版权价值 = 年版税收入 × [(1-(1+r)^-n) / r]', formula_note: 'r=折现率,n=剩余保护期(年)', collateral: 0.60, special: { music: '音乐版权:版税率通常8-12%,流媒体版权额外考虑平台分成比例', film: '影视版权:考虑院线/流媒体/海外发行多渠道收益', software: '软件著作权:SaaS模式按ARR×倍数,许可模式按版税折现' } }, patent: { name: '专利权', gnacs: 'GNACS-05', methods: [ '**许可费节省法(Relief from Royalty)**:假设使用该专利需支付的许可费折现值', '**超额收益法(Multi-Period Excess Earnings)**:专利带来的超额利润折现', '**技术贡献法**:专利对产品价值的贡献比例×产品市值', '**可比交易法**:参考同技术领域的专利交易案例' ], params: ['专利有效期(剩余年数)', '年许可费收入(或可比许可费率3-15%)', '技术替代风险(高/中/低)', '专利覆盖范围(国家/地区数量)', '技术成熟度(早期/成长/成熟)', '是否核心专利(基础专利溢价30-50%)'], formula: '专利价值 = 年许可费 × [(1-(1+r)^-n) / r] × 技术风险折扣', formula_note: '技术风险折扣:高风险0.5-0.7,中风险0.7-0.85,低风险0.85-1.0', collateral: 0.55, special: { invention: '发明专利:保护期20年,价值最高,需考虑无效风险', utility: '实用新型:保护期10年,价值适中', design: '外观设计:保护期15年,依赖品牌溢价' } }, trademark: { name: '商标权', gnacs: 'GNACS-05', methods: [ '**品牌收益折现法**:品牌带来的溢价收益折现', '**市场溢价法**:品牌产品与无品牌产品的价格差×销售量', '**特许权使用费节省法**:假设授权使用商标需支付的费率×收入基数', '**成本法**:品牌建设总成本(广告+推广+时间价值)' ], params: ['品牌知名度(地区/全国/全球)', '注册地域数量', '年品牌授权收入', '品牌溢价率(vs无品牌产品)', '商标有效期(10年可续期)', '行业影响力指数'], formula: '商标价值 = 年品牌溢价收益 × 品牌强度系数 × 年金现值系数', formula_note: '品牌强度系数:全球知名品牌1.5-3.0,区域品牌0.8-1.5,本地品牌0.5-0.8', collateral: 0.55 }, portrait_rights: { name: '肖像权/形象权/IP', gnacs: 'GNACS-05', methods: [ '**商业化收益折现法**:年商业代言/授权收入折现', '**品牌溢价法**:个人IP带来的商业溢价估算', '**可比交易法**:参考同量级艺人/运动员的IP授权价格', '**影响力指数法**:粉丝数量×互动率×商业转化率' ], params: ['年商业化收入(代言+授权+演出)', '知名度等级(国际/全国/区域)', '粉丝规模与互动率', '职业剩余年限(运动员/艺人)', '商业化潜力评分', '独家授权溢价'], formula: '肖像权价值 = 年商业化收入 × 知名度系数 × 职业剩余年限折现', formula_note: '知名度系数:国际顶级3-5倍,全国知名1.5-3倍,区域知名0.8-1.5倍', collateral: 0.50, special: { athlete: '运动员:需考虑运动生涯有限性(通常10-20年),退役后品牌衰减', celebrity: '艺人:考虑作品积累、粉丝黏性、负面风险折价', influencer: '网红/KOL:考虑平台依赖风险、粉丝忠诚度、变现能力' } }, trade_secret: { name: '商业秘密', gnacs: 'GNACS-05', methods: [ '**成本法**:开发/获取该秘密的成本+市场溢价', '**收益法**:商业秘密带来的超额利润折现', '**市场法**:同类技术秘密的可比交易(较少)' ], params: ['秘密的独特性和稀缺性', '竞争优势持续期', '年超额利润贡献', '泄露风险评估', '保密措施完善程度'], collateral: 0.45 } }; const info = ipInfo[subcat] || ipInfo.copyright; const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区'; // 辖区知识产权保护信息 let ipJurisdiction = ''; if (jModel && jModel.intellectualProperty) { const ipData = jModel.intellectualProperty; ipJurisdiction = `\n### ${jModel.flag} ${jModel.name}知识产权保护\n\n`; if (ipData.copyrightTerm) ipJurisdiction += `- **版权保护期:** ${ipData.copyrightTerm}\n`; if (ipData.patentTerm) ipJurisdiction += `- **专利保护期:** ${ipData.patentTerm}\n`; if (ipData.trademarkTerm) ipJurisdiction += `- **商标保护期:** ${ipData.trademarkTerm}(可续期)\n`; if (ipData.registrationBody) ipJurisdiction += `- **注册机构:** ${ipData.registrationBody}\n`; if (ipData.royaltyRates) { ipJurisdiction += `- **市场版税率参考:**\n`; Object.entries(ipData.royaltyRates).forEach(([type, rate]) => { ipJurisdiction += ` - ${type}:${rate}\n`; }); } } let response = `## 💡 ${info.name}估值分析(GNACS-05 知识产权类)\n\n`; response += `**适用辖区:** ${jName}\n\n`; response += `### 推荐估值方法\n\n`; info.methods.forEach(m => { response += `${m}\n\n`; }); response += `### 关键估值参数\n\n`; info.params.forEach(p => { response += `- ${p}\n`; }); response += `\n### 估值公式\n\n`; response += `\`${info.formula}\`\n\n`; response += `> ${info.formula_note}\n`; response += ipJurisdiction; // 特殊说明 if (info.special) { response += `\n### 细分类型特殊考量\n\n`; Object.entries(info.special).forEach(([, note]) => { response += `- ${note}\n`; }); } // XTZH 换算 response += `\n### 💎 XTZH 通证化换算\n\n`; response += `| 估值维度 | 说明 |\n|---------|------|\n`; response += `| 当地货币 | 按${jModel ? jModel.name : '目标辖区'}市场参数计算 |\n`; response += `| USD 等值 | 当地货币 × ${jModel ? jModel.usdRate : '当前汇率'} |\n`; response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`; response += `| 质押比例 | ${(info.collateral * 100).toFixed(0)}%(知识产权类,低于不动产) |\n\n`; response += `> **提示:** 请提供具体参数(年收入/保护期/授权范围),AI 将计算精确的三重价值。\n\n`; response += `> **NAC 上链优势:** 知识产权通证化后,可实现版权分拆交易、自动版税分配、全球授权追踪,Charter 智能合约自动执行授权协议。`; return response; } // ============================================================ // 资产估值回答(辖区感知) // ============================================================ function buildAssetValuationAnswer(assetType, jurisdiction, xtzhPrice, userMessage) { const cat = ASSET_CATEGORIES[assetType.category]; const sub = cat && assetType.subcat ? cat.subcategories[assetType.subcat] : null; const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null; // 知识产权类:使用专业 IP 估值回答 if (assetType.category === 'intellectual_property') { return buildIPValuationAnswer(assetType.subcat, jModel, xtzhPrice, userMessage); } // 艺术品与收藏品类 if (assetType.category === 'art_collectibles') { return buildArtValuationAnswer(assetType.subcat, jModel, xtzhPrice); } // 环境权益类 if (assetType.category === 'environmental_rights') { return buildEnvironmentalValuationAnswer(assetType.subcat, jModel, xtzhPrice); } // 企业权益类 if (assetType.category === 'corporate_equity') { return buildEquityValuationAnswer(assetType.subcat, jModel, xtzhPrice); } let response = `## ${cat ? cat.icon : '📦'} ${cat ? cat.name : '资产'}估值分析`; if (jModel) response += `(${jModel.flag} ${jModel.name}辖区)`; response += '\n\n'; if (cat) { response += `**GNACS 编码:** ${cat.code}\n\n`; } if (sub) { response += `**资产子类:** ${sub.name}\n\n`; response += `### 推荐估值方法\n\n`; sub.methods.forEach(m => { response += `- ${m}\n`; }); response += `\n### 关键估值参数\n\n`; sub.keyParams.forEach(p => { response += `- ${p}\n`; }); response += '\n'; } // 辖区特定规则 if (jModel) { response += `### ${jModel.flag} ${jModel.name}辖区特定规则\n\n`; const re = jModel.realEstate; if (re && assetType.category === 'real_estate') { const reModel = re[assetType.subcat] || re.residential; if (reModel) { if (reModel.primaryMethod) response += `**主要估值方法:** ${reModel.primaryMethod}\n\n`; if (reModel.capRate) response += `**资本化率参考:** ${reModel.capRate.range}(${reModel.capRate.note})\n\n`; if (reModel.foreignOwnership) response += `**外籍购买规则:** ${reModel.foreignOwnership}\n\n`; if (reModel.taxConsiderations) response += `**税务考量:** ${reModel.taxConsiderations}\n\n`; if (reModel.specialRules && reModel.specialRules.length > 0) { response += `**特殊规定:**\n`; reModel.specialRules.forEach(r => { response += `- ${r}\n`; }); response += '\n'; } } } else { response += `- **货币:** ${jModel.currency}(1 ${jModel.currency} ≈ ${jModel.usdRate} USD)\n`; if (jModel.regulator) response += `- **监管机构:** ${jModel.regulator}\n`; response += `- **市场成熟度:** Tier ${jModel.tier}\n\n`; } } // XTZH 换算 response += `### 💎 XTZH 通证化换算\n\n`; response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`; response += `| 估值维度 | 计算方式 |\n|---------|--------|\n`; if (jModel) { response += `| 当地货币 | 按${jModel.name}市场参数计算 |\n`; response += `| USD 等值 | 当地货币 × ${jModel.usdRate} |\n`; } else { response += `| 当地货币 | 按目标辖区市场参数计算 |\n`; response += `| USD 等值 | 按当前汇率换算 |\n`; } response += `| XTZH 等值 | USD 价值 ÷ ${xtzhPrice.toFixed(4)} |\n`; response += `| 质押要求 | XTZH 等值 × 80% |\n\n`; response += `> **提示:** 请提供具体资产参数(面积/价格/年收入等),AI 将给出精确的三重价值估算。`; return response; } // ============================================================ // 艺术品估值回答 // ============================================================ function buildArtValuationAnswer(subcat, jModel, xtzhPrice) { const jName = jModel ? `${jModel.flag} ${jModel.name}` : '全球'; let response = `## 🎨 艺术品与收藏品估值分析(GNACS-04)\n\n`; response += `**适用辖区:** ${jName}\n\n`; response += `### 主要估值方法\n\n`; response += `**拍卖记录法(Market Approach)**:参考同一艺术家或同类作品的近期拍卖成交价,是最权威的方法。\n\n`; response += `**专家鉴定法**:由认证艺术品评估师(AAA/ASA认证)出具专业评估报告。\n\n`; response += `**成本法**:以创作成本+艺术家声誉溢价估算(适用于当代艺术)。\n\n`; response += `### 关键估值参数\n\n`; response += `- 艺术家知名度与市场认可度(拍卖记录、展览经历)\n`; response += `- 作品真实性证明(来源证明/Provenance、鉴定证书)\n`; response += `- 作品状态与保存条件(修复记录、保存环境)\n`; response += `- 创作年代与历史意义\n`; response += `- 稀缺性(限量版/孤品/系列作品)\n`; response += `- 近期市场行情(艺术品市场周期)\n\n`; response += `### 主要拍卖行参考\n\n`; response += `| 拍卖行 | 总部 | 专长 |\n|--------|------|------|\n`; response += `| 苏富比 (Sotheby's) | 纽约/伦敦 | 全类别,古典与当代 |\n`; response += `| 佳士得 (Christie's) | 纽约/伦敦 | 全类别,印象派强 |\n`; response += `| 保利拍卖 | 北京 | 中国书画、瓷器 |\n`; response += `| 嘉德拍卖 | 北京 | 中国文物、当代艺术 |\n`; response += `| 邦瀚斯 (Bonhams) | 伦敦 | 古董、珠宝、名车 |\n\n`; response += `### 💎 XTZH 通证化换算\n\n`; response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`; response += `| 估值维度 | 说明 |\n|---------|------|\n`; response += `| 市场价值 | 最近可比拍卖成交价(USD) |\n`; response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`; response += `| 质押比例 | 60%(艺术品流动性折价) |\n\n`; response += `> **NAC 优势:** 艺术品 NFT 化后,可实现分拆所有权(碎片化)、全球流通、版权自动追踪。`; return response; } // ============================================================ // 环境权益估值回答 // ============================================================ function buildEnvironmentalValuationAnswer(subcat, jModel, xtzhPrice) { const jName = jModel ? `${jModel.flag} ${jModel.name}` : '全球'; let response = `## 🌱 环境权益估值分析(GNACS-09)\n\n`; response += `**适用辖区:** ${jName}\n\n`; response += `### 碳排放权估值方法\n\n`; response += `**市场价格法**:参考碳交易市场现货/期货价格(EU ETS、中国碳市场、VCS等)。\n\n`; response += `**替代成本法**:以减排同等碳量所需的技术成本估算。\n\n`; response += `### 主要碳市场参考价格\n\n`; response += `| 市场 | 标准 | 参考价格(USD/tCO₂) | 备注 |\n|------|------|-------------------|------|\n`; response += `| EU ETS | 欧盟 | $60-80 | 全球最大强制碳市场 |\n`; response += `| 中国碳市场 | CCER | $8-15 | 全球最大配额量 |\n`; response += `| VCS/Verra | 自愿 | $5-25 | 国际自愿减排 |\n`; response += `| Gold Standard | 自愿 | $15-50 | 高质量认证溢价 |\n`; response += `| California Cap | 美国加州 | $25-40 | 美国最严格 |\n\n`; response += `### 关键估值参数\n\n`; response += `- 碳信用数量(tCO₂当量)\n`; response += `- 核证标准(VCS/Gold Standard/CDM/CCER)\n`; response += `- 项目类型(可再生能源/森林碳汇/工业减排)\n`; response += `- 有效期与到期日\n`; response += `- 政策风险(碳价格波动、政策变化)\n\n`; response += `### 💎 XTZH 通证化换算\n\n`; response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`; response += `| 估值维度 | 说明 |\n|---------|------|\n`; response += `| 市场价值 | 碳信用数量 × 市场价格(USD/tCO₂) |\n`; response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`; response += `| 质押比例 | 65%(环境权益类) |\n\n`; response += `> **NAC 优势:** 碳信用通证化后,实现全球碳交易、自动核证、防止重复计算,Charter 合约自动执行碳抵消协议。`; return response; } // ============================================================ // 企业权益估值回答 // ============================================================ function buildEquityValuationAnswer(subcat, jModel, xtzhPrice) { const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区'; let response = `## 📊 企业权益估值分析(GNACS-10)\n\n`; response += `**适用辖区:** ${jName}\n\n`; response += `### 主要估值方法\n\n`; response += `**市场乘数法(Market Multiples)**:\n`; response += `- P/E 市盈率法:股价 ÷ 每股收益(适用于盈利稳定企业)\n`; response += `- EV/EBITDA:企业价值 ÷ 息税折旧摊销前利润(适用于重资产行业)\n`; response += `- P/S 市销率:市值 ÷ 年收入(适用于高成长科技企业)\n\n`; response += `**DCF 折现现金流法**:预测未来5-10年自由现金流,按WACC折现。\n\n`; response += `**可比交易法**:参考同行业近期并购交易的估值倍数。\n\n`; response += `### 非上市股权特殊折价\n\n`; response += `| 折价类型 | 折价幅度 | 说明 |\n|---------|---------|------|\n`; response += `| 流动性折价 (DLOM) | 20-40% | 非上市股权无法快速变现 |\n`; response += `| 少数股权折价 (DLOC) | 10-30% | 非控股股权缺乏控制权 |\n`; response += `| 控制权溢价 | +20-40% | 控股股权享有溢价 |\n\n`; if (jModel && jModel.financialAssets) { const fa = jModel.financialAssets; response += `### ${jModel.flag} ${jModel.name}市场参数\n\n`; if (fa.stockMarket) response += `- **证券交易所:** ${fa.stockMarket}\n`; if (fa.peRatioRange) response += `- **市场平均P/E:** ${fa.peRatioRange.min}-${fa.peRatioRange.max}倍(均值${fa.peRatioRange.avg}倍)\n`; if (fa.dividendYield) response += `- **股息率:** ${fa.dividendYield.min}-${fa.dividendYield.max}%\n`; if (fa.capitalGainsTax) response += `- **资本利得税:** ${fa.capitalGainsTax}\n`; response += '\n'; } response += `### 💎 XTZH 通证化换算\n\n`; response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`; response += `| 估值维度 | 说明 |\n|---------|------|\n`; response += `| 股权价值 | 按估值方法计算(USD) |\n`; response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`; response += `| 质押比例 | 55%(股权类,含流动性折价) |\n\n`; response += `> **NAC 优势:** 非上市股权通证化后,可实现股权分拆、全球投资者参与、自动分红分配,解决传统私募股权流动性差的问题。`; return response; } // ============================================================ // 构建推理引擎 System Prompt(辖区感知) // ============================================================ async function buildSystemPrompt(assetType, jurisdiction) { const priceData = await getXTZHPrice(); const xtzhPrice = priceData.usd || 4.3944; const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null; const cat = assetType ? ASSET_CATEGORIES[assetType.category] : null; let prompt = `你是 NAC NewAssetChain 公链的专业 AI 估值顾问,专注于 RWA(现实世界资产)的估值、通证化和合规咨询。 ## 核心身份 - NAC 是 RWA 专用原生公链,不是以太坊或任何现有公链的衍生 - 智能合约语言:Charter(非 Solidity);虚拟机:NVM(非 EVM) - 资产分类:GNACS(20大类,60+辖区) - 稳定币:XTZH(当前:$${xtzhPrice.toFixed(4)} USD,SDR锚定+黄金储备) - 治理币:XIC ## 估值原则 1. 根据 GNACS 编码选择最适合的估值方法 2. 充分考虑辖区特定规则(税务、外籍限制、监管要求) 3. 估值结果必须同时提供:当地货币 + USD + XTZH 三重价值 4. 无形资产(版权/专利/肖像权等)使用专业估值方法(许可费节省法/超额收益法等) 5. 回答要专业、结构化,使用 Markdown 格式 ## GNACS 20大类资产 ${Object.entries(GNACS_CODES).map(([code, info]) => `- ${code}: ${info.name}`).join('\n')} `; if (jModel) { prompt += `\n## 当前辖区:${jModel.flag} ${jModel.name} (${jModel.currency}) - 汇率:1 ${jModel.currency} = ${jModel.usdRate} USD - 监管机构:${jModel.regulator || 'N/A'} - 市场成熟度:Tier ${jModel.tier} `; const re = jModel.realEstate && jModel.realEstate.residential; if (re) { prompt += `- 住宅资本化率:${re.capRate ? re.capRate.range : 'N/A'} - 外籍购房规则:${re.foreignOwnership || 'N/A'} - 特殊规定:${re.specialRules ? re.specialRules.join(';') : 'N/A'} `; } } if (cat) { prompt += `\n## 当前资产类别:${cat.icon} ${cat.name}(${cat.code})\n`; Object.entries(cat.subcategories).forEach(([, sub]) => { const methods = Array.isArray(sub.methods) ? sub.methods.join('、') : (sub.methods || 'N/A'); const keyParams = Array.isArray(sub.keyParams) ? sub.keyParams.join('、') : (sub.keyParams || 'N/A'); prompt += `### ${sub.name}\n- 估值方法:${methods}\n- 关键参数:${keyParams}\n`; }); } return prompt; } // ============================================================ // 本地降级处理(推理引擎不可用时) // ============================================================ async function handleLocalFallback(body, res) { const question = body.question || body.messages?.[body.messages.length - 1]?.content || ''; // 文本识别优先:先从问题文本识别资产类型,后备用 assetCategory const textDetected = detectAssetType(question); const assetType = textDetected || (body.assetCategory ? { category: body.assetCategory, subcat: null } : null); const jurisdiction = body.jurisdictionCode || detectJurisdiction(question); let answer = await generateKnowledgeAnswer(question, assetType, jurisdiction); if (!answer) { const priceData = await getXTZHPrice(); const xtzhPrice = priceData.usd || 4.3944; answer = `## NAC AI 估值顾问 当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD** 我是 NAC NewAssetChain 的专业 AI 估值顾问,支持 **20 大类资产 × 60+ 辖区**的专业估值。 **可咨询内容:** - 不动产(住宅/商业/工业/土地)— 辖区特定估值模型 - 知识产权(版权/专利/商标/肖像权)— 许可费节省法/超额收益法 - 金融证券(股权/债券/基金)— DCF/市场乘数法 - 艺术品与收藏品 — 拍卖记录法/专家鉴定法 - 大宗商品(贵金属/能源/农产品)— 现货/期货市场法 - 数字资产(加密货币/NFT)— 网络价值法 - 以及更多 GNACS-07 至 GNACS-20 类别 请描述您的资产(类型、位置、面积/数量、市值),我将给出专业估值。`; } const lines = answer.split('\n'); let i = 0; const interval = setInterval(() => { if (i >= lines.length) { clearInterval(interval); res.write('data: [DONE]\n\n'); res.end(); return; } const lineContent = lines[i] + (i < lines.length - 1 ? '\n' : ''); res.write(`data: ${JSON.stringify({ type: 'chunk', content: lineContent })}\n\n`); i++; }, 30); } // ============================================================ // API 路由 // ============================================================ // XTZH 价格 app.get('/api/v4/xtzh-price', async (req, res) => { res.json(await getXTZHPrice()); }); // 20大类资产分类 app.get('/api/v4/asset-categories', (req, res) => { const categories = Object.entries(ASSET_CATEGORIES).map(([key, cat]) => ({ key, code: cat.code, name: cat.name, nameEn: cat.nameEn, icon: cat.icon, subcategories: Object.entries(cat.subcategories).map(([sk, sub]) => ({ key: sk, name: sub.name, types: sub.types, methods: sub.methods, keyParams: sub.keyParams })) })); res.json({ categories, total: categories.length }); }); // 60+辖区列表 app.get('/api/v4/jurisdictions', (req, res) => { const jurisdictions = Object.entries(JURISDICTION_MODELS).map(([code, j]) => ({ code, name: j.name, nameEn: j.nameEn, currency: j.currency, currencySymbol: j.currencySymbol, usdRate: j.usdRate, tier: j.tier, region: j.region, flag: j.flag, regulator: j.regulator })); res.json({ jurisdictions, total: jurisdictions.length }); }); // 辖区详情 app.get('/api/v4/jurisdiction/:code', (req, res) => { const code = req.params.code.toUpperCase(); const jModel = JURISDICTION_MODELS[code]; if (jModel) return res.json(jModel); res.status(404).json({ error: 'Jurisdiction not found' }); }); // 估值引擎代理 app.post('/api/v4/valuate', async (req, res) => { try { const data = await proxyRequest('POST', VALUATION_ENGINE, '/api/v4/valuate', req.body, VALUATION_ENGINE.timeout); return res.json(data); } catch(e) { // 本地估值降级 const priceData = await getXTZHPrice(); const xtzhPrice = priceData.usd || 4.3944; const { area, pricePerUnit, income, capRate, jurisdiction, assetType } = req.body; const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : JURISDICTION_MODELS['GLOBAL']; const usdRate = jModel ? jModel.usdRate : 1.0; let valueLocal = 0; let method = '市场比较法'; if (area && pricePerUnit) { valueLocal = parseFloat(area) * parseFloat(pricePerUnit); method = '市场比较法(单价×面积)'; } else if (income && capRate) { valueLocal = parseFloat(income) / (parseFloat(capRate) / 100); method = '收益资本化法'; } const valueUSD = valueLocal * usdRate; const valueXTZH = valueUSD / xtzhPrice; return res.json({ success: true, valuationMethod: method, valueLocal: { amount: valueLocal, currency: jModel ? jModel.currency : 'USD' }, valueUSD: { amount: valueUSD, currency: 'USD' }, valueXTZH: { amount: valueXTZH, currency: 'XTZH', price: xtzhPrice }, pledgeRequired: { amount: valueXTZH * 0.8, currency: 'XTZH' }, gnacs: assetType ? (ASSET_CATEGORIES[assetType] ? ASSET_CATEGORIES[assetType].code : 'GNACS-20') : 'GNACS-20', timestamp: new Date().toISOString() }); } }); // 推理引擎 SSE 流式输出(主问答接口) app.post('/api/inference/stream', async (req, res) => { const body = req.body; const question = body.question || body.messages?.[body.messages.length - 1]?.content || ''; // 文本识别优先 const textDetectedStream = detectAssetType(question); const assetType = textDetectedStream || (body.assetCategory ? { category: body.assetCategory, subcat: null } : null); const jurisdiction = body.jurisdictionCode || detectJurisdiction(question); res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); res.setHeader('X-Accel-Buffering', 'no'); // 构建增强的请求体(加入辖区感知 system prompt) const systemPrompt = await buildSystemPrompt(assetType, jurisdiction); const enhancedBody = { ...body, systemPrompt, messages: body.messages ? [{ role: 'system', content: systemPrompt }, ...body.messages.filter(m => m.role !== 'system')] : undefined }; const bodyStr = JSON.stringify(enhancedBody); const options = { hostname: INFERENCE_ENGINE.host, port: INFERENCE_ENGINE.port, path: '/api/inference/stream', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(bodyStr) }, timeout: INFERENCE_ENGINE.timeout }; const proxyReq = http.request(options, (proxyRes) => { proxyRes.on('data', chunk => { if (!res.writableEnded) res.write(chunk); }); proxyRes.on('end', () => { if (!res.writableEnded) { res.write('data: [DONE]\n\n'); res.end(); } }); proxyRes.on('error', () => { if (!res.writableEnded) handleLocalFallback(body, res); }); }); proxyReq.on('error', () => { if (!res.writableEnded) handleLocalFallback(body, res); }); proxyReq.on('timeout', () => { proxyReq.destroy(); if (!res.writableEnded) handleLocalFallback(body, res); }); proxyReq.write(bodyStr); proxyReq.end(); req.on('close', () => { if (!proxyReq.destroyed) proxyReq.destroy(); }); }); // 健康检查 app.get('/health', async (req, res) => { const priceData = await getXTZHPrice(); res.json({ status: 'ok', service: 'nac-valuation-ui', version: '2.0.0', timestamp: new Date().toISOString(), knowledgeBase: { assetCategories: Object.keys(ASSET_CATEGORIES).length, jurisdictions: Object.keys(JURISDICTION_MODELS).length }, xtzhPrice: priceData.usd || 4.3944, engines: { valuation: `${VALUATION_ENGINE.host}:${VALUATION_ENGINE.port}`, inference: `${INFERENCE_ENGINE.host}:${INFERENCE_ENGINE.port}` } }); }); app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'index.html')); }); app.listen(PORT, '0.0.0.0', () => { console.log(`[NAC Valuation UI v2.0] 服务启动 → http://0.0.0.0:${PORT}`); console.log(`[知识库] ${Object.keys(ASSET_CATEGORIES).length} 大类资产,${Object.keys(JURISDICTION_MODELS).length} 个辖区`); });