Files
ST-Amily2-Chat-Optimisation…/core/rag-api.js
2025-08-13 09:33:10 +08:00

2 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';const _0x886a26=_0x9ef4;(function(_0x35aea3,_0x51ff9f){const _0x571b57=_0x9ef4,_0x47c399=_0x35aea3();while(!![]){try{const _0x540590=-parseInt(_0x571b57(0xad))/0x1+parseInt(_0x571b57(0xe6))/0x2+parseInt(_0x571b57(0xaf))/0x3*(-parseInt(_0x571b57(0xce))/0x4)+parseInt(_0x571b57(0xa8))/0x5+parseInt(_0x571b57(0xbb))/0x6*(-parseInt(_0x571b57(0xa7))/0x7)+parseInt(_0x571b57(0xbd))/0x8+-parseInt(_0x571b57(0xd4))/0x9*(-parseInt(_0x571b57(0xb4))/0xa);if(_0x540590===_0x51ff9f)break;else _0x47c399['push'](_0x47c399['shift']());}catch(_0x15f931){_0x47c399['push'](_0x47c399['shift']());}}}(_0x54a5,0x1af1d));import{extension_settings}from'/scripts/extensions.js';import{buildGoogleEmbeddingRequest,parseGoogleEmbeddingResponse,buildGoogleEmbeddingApiUrl}from'./utils/googleAdapter.js';function _0x54a5(){const _0x441cfc=['custom','aborted','Rerank模型API的响应格式无效:\x20未找到\x20\x27data\x27\x20数组。','100QiVNqv','sort','api-key','[翰林院]\x20正在从\x20Google\x20API\x20获取模型列表:\x20','Rerank\x20API\x20请求失败\x20(','POST','45657PsfoTs','Rerank\x20API\x20URL\x20未提供。','batchEmbedContents','includes','log','无法确定获取模型的有效路径。','error','models','application/json','[翰林院-Rerank]\x20正在向\x20','local_proxy','[翰林院-API]\x20无法获取设置API调用可能失败。','?key=','embedContent','Authorization','object','length',')...','344534QzUDOR','/embeddings','Invalid\x20JSON\x20response','\x20发送请求\x20(模式:\x20','name','supportedGenerationMethods','openai','retrieval','json','rerank','[翰林院-Rerank]\x20正在从\x20','endsWith','text','isArray','azure','trim','\x20获取模型列表\x20(模式:\x20','data','hasOwn','\x20获取模型列表\x20(需要认证)...','164773mjHfdj','953735DKIjVJ','[翰林院]\x20正在从\x20','自定义模式下Rerank\x20API\x20Key\x20未提供。','[翰林院-API]\x20API响应JSON解析失败:','AbortError','139383YaPvaY','status','3165WUZybH','stringify','extensionSettings','parse','/v1/models','190YkRTFi','/v1beta/models?key=','getContext','hanlinyuan-rag-core','GET','/v1/rerank','/rerank','54dVUUXo','Google模型API的响应格式无效:\x20未找到\x20\x27models\x27\x20数组。','228584wufjtj','):\x20',')\x20获取向量。','map','/v1','embedding','神力获取失败\x20','\x20获取模型列表\x20(无需认证)...','string','slice','Bearer\x20','API\x20URL\x20未提供。','push','模型API的响应格式无效:\x20未找到\x20\x27data\x27\x20数组。'];_0x54a5=function(){return _0x441cfc;};return _0x54a5();}const MODULE_NAME=_0x886a26(0xb7),GOOGLE_API_BASE_URL='https://generativelanguage.googleapis.com';function getSettings(){const _0x4ebf43=_0x886a26,_0x3c4acd=SillyTavern[_0x4ebf43(0xb6)]();if(!_0x3c4acd||!_0x3c4acd[_0x4ebf43(0xb1)]||!_0x3c4acd[_0x4ebf43(0xb1)][MODULE_NAME])return console['error'](_0x4ebf43(0xdf)),{'retrieval':{},'rerank':{}};return _0x3c4acd[_0x4ebf43(0xb1)][MODULE_NAME];}function normalizeApiResponse(_0x2cbb7f){const _0x329570=_0x886a26;let _0x17c188=_0x2cbb7f;if(typeof _0x17c188===_0x329570(0xc5))try{_0x17c188=JSON[_0x329570(0xb2)](_0x17c188);}catch(_0x3afbb8){return console[_0x329570(0xda)](_0x329570(0xab),_0x3afbb8),{'error':{'message':_0x329570(0xe8)}};}_0x17c188&&typeof _0x17c188[_0x329570(0xa4)]===_0x329570(0xe3)&&_0x17c188[_0x329570(0xa4)]!==null&&!Array[_0x329570(0xa0)](_0x17c188['data'])&&(Object[_0x329570(0xa5)](_0x17c188[_0x329570(0xa4)],_0x329570(0xa4))&&(_0x17c188=_0x17c188[_0x329570(0xa4)]));if(_0x17c188&&_0x17c188[_0x329570(0xa4)])return{'data':_0x17c188[_0x329570(0xa4)]};if(_0x17c188&&_0x17c188[_0x329570(0xda)])return{'error':_0x17c188[_0x329570(0xda)]};return _0x17c188;}export function getSanitizedBaseUrl(_0x35f3af){const _0xf8e913=_0x886a26;let _0x214206=_0x35f3af[_0xf8e913(0xa2)]();return _0x214206[_0xf8e913(0x9e)]('/')&&(_0x214206=_0x214206['slice'](0x0,-0x1)),_0x214206[_0xf8e913(0x9e)]('/v1')&&(_0x214206=_0x214206[_0xf8e913(0xc6)](0x0,-0x3)),_0x214206[_0xf8e913(0x9e)](_0xf8e913(0xe7))&&(_0x214206=_0x214206['slice'](0x0,-0xb)),_0x214206;}function _0x9ef4(_0x4e879c,_0x58c364){const _0x54a5d2=_0x54a5();return _0x9ef4=function(_0x9ef409,_0x96a077){_0x9ef409=_0x9ef409-0x98;let _0x514f7c=_0x54a5d2[_0x9ef409];return _0x514f7c;},_0x9ef4(_0x4e879c,_0x58c364);}export async function fetchEmbeddingModels(){const _0x4cc4ae=_0x886a26,_0xe7931f=getSettings()[_0x4cc4ae(0x9a)],{apiEndpoint:_0x3805eb,apiKey:_0x4fbc99,customApiUrl:_0x37fe56}=_0xe7931f;if(!_0x4fbc99)throw new Error('API\x20Key\x20未提供。');let _0x333be4,_0xc3936a={},_0x3e03a1;switch(_0x3805eb){case'google_direct':_0x333be4=GOOGLE_API_BASE_URL+_0x4cc4ae(0xb5)+_0x4fbc99,console[_0x4cc4ae(0xd8)](_0x4cc4ae(0xd1)+_0x333be4),_0x3e03a1=_0x2dc84c=>{const _0x2ef934=_0x4cc4ae;if(!_0x2dc84c[_0x2ef934(0xdb)]||!Array['isArray'](_0x2dc84c[_0x2ef934(0xdb)]))throw new Error(_0x2ef934(0xbc));return _0x2dc84c[_0x2ef934(0xdb)]['filter'](_0x4ad8d4=>_0x4ad8d4[_0x2ef934(0x98)]?.[_0x2ef934(0xd7)](_0x2ef934(0xe1))||_0x4ad8d4['supportedGenerationMethods']?.[_0x2ef934(0xd7)](_0x2ef934(0xd6)))[_0x2ef934(0xc0)](_0x55cfff=>_0x55cfff[_0x2ef934(0xea)]['replace']('models/',''))[_0x2ef934(0xcf)]();};break;case'custom':if(!_0x37fe56)throw new Error('API\x20URL\x20未提供。');const _0x2c68f3=getSanitizedBaseUrl(_0x37fe56);_0x333be4=_0x2c68f3+_0x4cc4ae(0xb3),_0xc3936a=getApiHeaders(),console[_0x4cc4ae(0xd8)](_0x4cc4ae(0xa9)+_0x333be4+_0x4cc4ae(0xa6)),_0x3e03a1=_0x2163ba=>{const _0x18c055=_0x4cc4ae;if(!_0x2163ba[_0x18c055(0xa4)]||!Array['isArray'](_0x2163ba[_0x18c055(0xa4)]))throw new Error(_0x18c055(0xca));return _0x2163ba[_0x18c055(0xa4)][_0x18c055(0xc0)](_0x549a69=>_0x549a69['id'])[_0x18c055(0xcf)]();};break;case _0x4cc4ae(0xde):default:if(!_0x37fe56)throw new Error(_0x4cc4ae(0xc8));const _0x5d7ddb=getSanitizedBaseUrl(_0x37fe56);_0x333be4=_0x5d7ddb+'/v1/models',_0xc3936a={'Content-Type':'application/json'},console[_0x4cc4ae(0xd8)](_0x4cc4ae(0xa9)+_0x333be4+_0x4cc4ae(0xc4)),_0x3e03a1=_0x76a1b8=>{const _0x226447=_0x4cc4ae;if(!_0x76a1b8[_0x226447(0xa4)]||!Array['isArray'](_0x76a1b8[_0x226447(0xa4)]))throw new Error('模型API的响应格式无效:\x20未找到\x20\x27data\x27\x20数组。');return _0x76a1b8['data'][_0x226447(0xc0)](_0x1898d0=>_0x1898d0['id'])[_0x226447(0xcf)]();};break;}if(!_0x333be4)throw new Error(_0x4cc4ae(0xd9));const _0x8c882=await fetch(_0x333be4,{'method':_0x4cc4ae(0xb8),'headers':_0xc3936a});if(!_0x8c882['ok']){const _0x33a13a=await _0x8c882[_0x4cc4ae(0x9f)]();throw new Error('获取模型列表失败\x20('+_0x8c882[_0x4cc4ae(0xae)]+'):\x20'+_0x33a13a);}const _0xd3131f=await _0x8c882['json']();return _0x3e03a1(_0xd3131f);}export function getRerankBaseUrl(_0x592868){const _0x2ee520=_0x886a26;let _0xbe03e=_0x592868['trim']();return _0xbe03e[_0x2ee520(0x9e)]('/')&&(_0xbe03e=_0xbe03e[_0x2ee520(0xc6)](0x0,-0x1)),_0xbe03e[_0x2ee520(0x9e)](_0x2ee520(0xc1))&&(_0xbe03e=_0xbe03e[_0x2ee520(0xc6)](0x0,-0x3)),_0xbe03e[_0x2ee520(0x9e)](_0x2ee520(0xba))&&(_0xbe03e=_0xbe03e['slice'](0x0,-0x7)),_0xbe03e;}export async function fetchRerankModels(){const _0x35c823=_0x886a26,_0x42fa2b=getSettings()[_0x35c823(0x9c)],{url:_0x99d6c7,apiKey:_0x389654,apiMode:apiMode='custom'}=_0x42fa2b;if(!_0x99d6c7)throw new Error(_0x35c823(0xd5));if(apiMode===_0x35c823(0xcb)&&!_0x389654)throw new Error(_0x35c823(0xaa));const _0x1da41e=getRerankBaseUrl(_0x99d6c7),_0x183e54=_0x1da41e+'/v1/models',_0x22914c={'Content-Type':_0x35c823(0xdc)};apiMode===_0x35c823(0xcb)&&(_0x22914c[_0x35c823(0xe2)]=_0x35c823(0xc7)+_0x389654);console['log'](_0x35c823(0x9d)+_0x183e54+_0x35c823(0xa3)+apiMode+')...');const _0x436023=await fetch(_0x183e54,{'method':_0x35c823(0xb8),'headers':_0x22914c});if(!_0x436023['ok']){const _0x456787=await _0x436023[_0x35c823(0x9f)]();throw new Error('获取Rerank模型列表失败\x20('+_0x436023[_0x35c823(0xae)]+_0x35c823(0xbe)+_0x456787);}const _0x348115=await _0x436023['json']();if(!_0x348115[_0x35c823(0xa4)]||!Array[_0x35c823(0xa0)](_0x348115['data']))throw new Error(_0x35c823(0xcd));return _0x348115['data']['map'](_0x8946e6=>_0x8946e6['id'])[_0x35c823(0xcf)]();}export async function executeRerank(_0x2c7925,_0x4d31af,_0x5b4560){const _0x134ea8=_0x886a26,{url:_0x271965,apiKey:_0x48cb64,model:_0x34c78d,top_n:_0x5f01d3,apiMode:apiMode=_0x134ea8(0xcb)}=_0x5b4560;if(!_0x271965)throw new Error(_0x134ea8(0xd5));if(apiMode==='custom'&&!_0x48cb64)throw new Error(_0x134ea8(0xaa));const _0x57a292=getRerankBaseUrl(_0x271965),_0x52c650=_0x57a292+_0x134ea8(0xb9),_0x2f51f6={'Content-Type':_0x134ea8(0xdc)};apiMode===_0x134ea8(0xcb)&&(_0x2f51f6[_0x134ea8(0xe2)]='Bearer\x20'+_0x48cb64);const _0x516584=JSON[_0x134ea8(0xb0)]({'query':_0x2c7925,'documents':_0x4d31af,'model':_0x34c78d,'top_n':_0x5f01d3});console[_0x134ea8(0xd8)](_0x134ea8(0xdd)+_0x52c650+_0x134ea8(0xe9)+apiMode+_0x134ea8(0xe5));const _0x4f5c4e=await fetch(_0x52c650,{'method':_0x134ea8(0xd3),'headers':_0x2f51f6,'body':_0x516584});if(!_0x4f5c4e['ok'])throw new Error(_0x134ea8(0xd2)+_0x4f5c4e[_0x134ea8(0xae)]+_0x134ea8(0xbe)+await _0x4f5c4e[_0x134ea8(0x9f)]());return await _0x4f5c4e['json']();}export function getApiEndpointUrl(_0x23fa40=![]){const _0x395acc=_0x886a26,_0x4618c4=getSettings(),{apiEndpoint:_0x246a68,customApiUrl:_0x270b0a}=_0x4618c4[_0x395acc(0x9a)];let _0x4a2a5a;switch(_0x246a68){case _0x395acc(0x99):_0x4a2a5a='https://api.openai.com';break;case'azure':case _0x395acc(0xcb):_0x4a2a5a=_0x270b0a;break;default:_0x4a2a5a='https://api.openai.com';break;}if(_0x23fa40)return _0x4a2a5a;return getSanitizedBaseUrl(_0x4a2a5a)+'/v1/embeddings';}export function getApiHeaders(){const _0x3a5308=_0x886a26,_0x4b3350=getSettings(),_0x4a0a19={'Content-Type':_0x3a5308(0xdc)},{apiKey:_0x53cebe,apiEndpoint:_0x292c1c}=_0x4b3350[_0x3a5308(0x9a)];switch(_0x292c1c){case _0x3a5308(0x99):case _0x3a5308(0xcb):_0x4a0a19[_0x3a5308(0xe2)]='Bearer\x20'+_0x53cebe;break;case _0x3a5308(0xa1):_0x4a0a19[_0x3a5308(0xd0)]=_0x53cebe;break;}return _0x4a0a19;}export async function getEmbeddings(_0x462606,_0x28f1f7=null){const _0x23c304=_0x886a26,_0xe3e4b7=getSettings()[_0x23c304(0x9a)],{apiEndpoint:_0x4131a0,customApiUrl:_0x33eb8a,apiKey:_0x34cb71,embeddingModel:_0x51f384,batchSize:batchSize=0x5}=_0xe3e4b7,_0x34d15c=[];for(let _0xa867c0=0x0;_0xa867c0<_0x462606['length'];_0xa867c0+=batchSize){if(_0x28f1f7?.[_0x23c304(0xcc)])throw new Error(_0x23c304(0xac));const _0x362d62=_0x462606[_0x23c304(0xc6)](_0xa867c0,_0xa867c0+batchSize);let _0x406ac1=[];switch(_0x4131a0){case'google_direct':console[_0x23c304(0xd8)]('[翰林院-API]\x20使用Google直连模式获取向量。');if(!_0x34cb71)throw new Error('Google直连模式需要API\x20Key。');const _0x185a16=buildGoogleEmbeddingApiUrl(GOOGLE_API_BASE_URL,_0x51f384)+_0x23c304(0xe0)+_0x34cb71,_0x35b5d4=buildGoogleEmbeddingRequest(_0x362d62,_0x51f384),_0x4f7795=await fetch(_0x185a16,{'method':'POST','headers':{'Content-Type':_0x23c304(0xdc)},'body':JSON['stringify'](_0x35b5d4),'signal':_0x28f1f7});if(!_0x4f7795['ok']){const _0xe17e9=await _0x4f7795[_0x23c304(0x9f)]();throw new Error('Google\x20API\x20Error:\x20'+_0x4f7795[_0x23c304(0xae)]+'\x20'+_0xe17e9);}const _0x33e925=await _0x4f7795[_0x23c304(0x9b)]();_0x406ac1=parseGoogleEmbeddingResponse(_0x33e925);break;case _0x23c304(0xcb):case _0x23c304(0xde):default:console[_0x23c304(0xd8)]('[翰林院-API]\x20使用前端直连模式\x20('+_0x4131a0+_0x23c304(0xbf));if(!_0x34cb71&&_0x4131a0===_0x23c304(0xcb)){}const _0x5cc824=getApiEndpointUrl(),_0x25bcdd=getApiHeaders(),_0x4074a4=await fetch(_0x5cc824,{'method':_0x23c304(0xd3),'headers':_0x25bcdd,'body':JSON[_0x23c304(0xb0)]({'input':_0x362d62,'model':_0x51f384}),'signal':_0x28f1f7});if(!_0x4074a4['ok']){const _0x144722=await _0x4074a4[_0x23c304(0x9f)]();throw new Error(_0x23c304(0xc3)+_0x4074a4[_0x23c304(0xae)]+':\x20'+_0x144722);}const _0x4ff06b=await _0x4074a4['json']();if(_0x4ff06b[_0x23c304(0xa4)]&&Array[_0x23c304(0xa0)](_0x4ff06b[_0x23c304(0xa4)]))_0x406ac1=_0x4ff06b[_0x23c304(0xa4)][_0x23c304(0xc0)](_0x41221b=>_0x41221b[_0x23c304(0xc2)]);else throw new Error('API返回的向量数据格式不正确。');break;}if(_0x406ac1[_0x23c304(0xe4)]!==_0x362d62['length'])throw new Error('获取到的向量数量与发送的文本数量不匹配。');_0x34d15c[_0x23c304(0xc9)](..._0x406ac1),_0xa867c0+batchSize<_0x462606[_0x23c304(0xe4)]&&await new Promise(_0x4dc93a=>setTimeout(_0x4dc93a,0xc8));}return _0x34d15c;}export async function testApiConnection(){await getEmbeddings(['测试连接']);}