Help
RSS
API
Feed
Maltego
Contact
Domain > apichecker.snaily.top
×
Welcome!
Right click nodes and scroll the mouse to navigate the graph.
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2024-10-03
172.67.217.64
(
ClassC
)
2025-01-22
104.21.61.250
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyDate: Wed, 22 Jan 2025 10:28:44 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveCache-Control: max-age3600Expires: Wed, 22 Jan 2025 11:28:44 GMTLocation: https://apichecker.snaily.top/Report-To: {endpoints:{url:https:\/\/a.nel.cloudflare.com\/report\/v4?sPEXkQrTB2mZqH7R%2B%2Bfh1ZjzVEWf7qpaLITg5kIfm0d%2BGQWsbJnPtCx2H%2BTQf4DEgARpUGKSW4hZSvLXgmcy%2FP9B1CDnc7hcXyInW4TmS8U7r1T169AI6V96n7GiP9fx8jJsFWXla394%3D},group:cf-nel,max_age:604800}NEL: {success_fraction:0,report_to:cf-nel,max_age:604800}Vary: Accept-Encodingcf-cache-status: DYNAMICServer: cloudflareCF-RAY: 905edbdf7d27ef57-PDXalt-svc: h3:443; ma86400server-timing: cfL4;desc?protoTCP&rtt6519&min_rtt6519&rtt_var3259&sent1&recv3&lost0&retrans0&sent_bytes0&recv_bytes60&delivery_rate0&cwnd247&unsent_bytes0&cid0000000000000000&ts0&x0 html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>cloudflare/center>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Wed, 22 Jan 2025 10:28:44 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveAccess-Control-Allow-Origin: *Cache-Control: public, max-age0, must-revalidatereferrer-policy: strict-origin-when-cross-originx-content-type-options: nosniffReport-To: {endpoints:{url:https:\/\/a.nel.cloudflare.com\/report\/v4?sNbZuw9PudilFqgpK86zu3%2B3xTs3P6YnjeSch3t0OHvu0nIJKil21vdSKCgVlbJycjooniEDoD1FH30LwgKmTy544KZ%2F5dl9aufgE3rxppHDAuEpHUi9MRzSDcdgCq0s5%2BQ8mLnc7qB0%3D},group:cf-nel,max_age:604800}NEL: {success_fraction:0,report_to:cf-nel,max_age:604800}Vary: Accept-Encodingcf-cache-status: DYNAMICServer: cloudflareCF-RAY: 905edbe00ecbef8c-PDXalt-svc: h3:443; ma86400server-timing: cfL4;desc?protoTCP&rtt6132&min_rtt6022&rtt_var1774&sent5&recv6&lost0&retrans0&sent_bytes2858&recv_bytes732&delivery_rate480903&cwnd252&unsent_bytes0&cid1f16b78b4ea09152&ts273&x0 !DOCTYPE html>html langzh-CN>head> meta charsetUTF-8> title>API CHECKER/title> meta nameviewport contentwidthdevice-width, initial-scale1.0> link relicon href./logo.png typeimage/x-icon> link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/layui/2.6.8/css/layui.min.css> script srchttps://cdnjs.cloudflare.com/ajax/libs/layui/2.6.8/layui.min.js>/script> style> body { font-family: Arial, sans-serif; margin: 50px 10px; padding: 20px; box-sizing: border-box; } .container { display: flex; flex-direction: column; margin: auto; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 90%; max-width: 600px; } .response-container { width: 90%; margin: 20px auto 0; max-width: 1000px; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); font-size: 16px; } inputtypetext, textarea { width: 100%; padding: 10px; margin: 10px 0; box-sizing: border-box; } textarea { resize: vertical; height: 100px; } .submit-container { display: flex; justify-content: space-between; flex-wrap: wrap; } .submit-container inputtypebutton, .copy-btn { width: 30%; padding: 10px; border: none; cursor: pointer; margin-top: 10px; } .copy-btn { margin-left: 10%; width: 20%; } .copy-btn2 { width: 20%; } .submit-query { background-color: #007bff; color: white; } .check-quota { background-color: #28a745; color: white; } .clear-form { background-color: #dc3545; color: white; } .model-input-container { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; } .model-input-container inputtypetext { margin-right: 10px; } .model-input-container textareatypetext { width: 70%; height: 200px; margin-right: 10px; } .model-input-container inputtypebutton { width: 28%; background-color: #fe9307; color: white; border: none; cursor: pointer; } h1 { font-weight: bold; } h2, h3 { margin-top: 20px; text-align: center; } .response-container pre { white-space: pre-wrap; border: 1px solid #ddd; padding: 10px; background-color: #f9f9f9; margin-bottom: 20px; } .model-timeout-concurrency { display: flex; justify-content: space-between; margin-top: 10px; margin-bottom: 15px } .model-timeout, .model-concurrency { height: 35px; width: 40%; } .model-timeout input, .model-concurrency input { width: 100%; height: 25px; } table { width: 100%; border-collapse: collapse; margin-top: 20px; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; vertical-align: middle; } th { background-color: #f2f2f2; } h1, h2 { color: #007bff; text-align: center; } .td1 { width: 250px; } .td1-ok { color: green; } .td1-no { color: coral; } .td1-error { color: red; } .td2 { width: 200px; } .td4 { max-width: 350px; max-height: 100px; } /* 可以根据需要为 td3 添加样式 */ .td3 { width: 100px; /* 或者设置一个具体的宽度 */ } .copy-buttons { margin: 10px 0; } .copyright { margin-top: 20px; text-align: center; font-size: 14px; color: #666; } .copyright img { width: 24px; height: 24px; border-radius: 50%; margin-right: 5px; vertical-align: middle; } .copyright a { color: #1e88e5; text-decoration: none; } .copyright a:hover { text-decoration: underline; } /*.verify-btn-group {*/ /* display: line-block;*/ /*}*/ .verify-btn { padding: 3px 8px; margin-left: 8px; cursor: pointer; border: none; border-radius: 3px; color: white; background-color: #28a745; display: inline-block; font-size: 14px; line-height: 1.5; } .verify-btn.blue { background-color: #3498db; color: white; } .verify-btn.blue:hover { background-color: #2980b9; } .verify-btn.cyan { background-color: #1abc9c; color: white; } .verify-btn.cyan:hover { background-color: #16a085; } .verify-btn::after { content: attr(data-tooltip); /* 获取 data-tooltip 属性的值作为提示文本 */ visibility: hidden; opacity: 0; position: absolute; background-color: #333; color: #fff; padding: 5px 10px; border-radius: 3px; transition: opacity 0.3s; } .verify-btn:hover::after { visibility: visible; opacity: 1; } .model-filter-container { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .model-filter-container inputtypetext { flex-grow: 1; margin-right: 10px; } .model-filter-container button { padding: 5px 10px; background-color: #4CAF50; color: white; border: none; cursor: pointer; } .checkbox-container { display: flex; justify-content: space-between; margin-bottom: 10px; } .checkbox-container label { display: flex; align-items: center; } .checkbox-container inputtypecheckbox { margin-right: 5px; } .model-filter-container { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .model-filter-container inputtypetext { flex-grow: 1; margin-right: 10px; } .model-filter-container button { padding: 5px 10px; background-color: #4CAF50; color: white; border: none; cursor: pointer; margin-right: 5px; } .model-filter-container button.clear { background-color: #f44336; } .checkbox-container { display: flex; justify-content: space-between; margin-bottom: 10px; } .checkbox-container label { display: flex; align-items: center; } .checkbox-container inputtypecheckbox { margin-right: 5px; } #modelList { max-height: 250px; overflow-y: auto; } .toast { position: fixed; top: 10px; right: 10px; background-color: #fff; color: #333; border: 1px solid #ddd; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); padding: 10px 20px; z-index: 1000; display: flex; align-items: center; justify-content: space-between; border-radius: 5px; animation: slideIn 0.5s ease-out; max-width: 300px; } @keyframes slideIn { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: translateX(0); } } .toast p { margin: 0; } .toast button { background: none; border: none; cursor: pointer; color: #888; } .toast button:hover { color: #333; } .copyright { margin-top: 20px; text-align: center; font-size: 14px; color: #666; } .copyright img { width: 24px; height: 24px; border-radius: 50%; margin-right: 5px; vertical-align: middle; } .copyright a { color: #1e88e5; text-decoration: none; } .copyright a:hover { text-decoration: underline; } /style>/head>body>div classcontainer> h1>API CHECKER/h1> h3>(适配 oneapi/newapi 等中转格式)/h3> form idapiForm> textarea idapi_info nameapi_info placeholder懒人专用文本框,支持同时粘贴接口地址和密钥,智能提取,如:https://api.openai.com,sk-TodayIsThursdayVme50ForKFC>/textarea> input typetext idapi_url nameapi_url placeholder接口地址,如:https://api.openai.com value> input typetext idapi_key nameapi_key placeholder密钥,如:sk-TodayIsThursdayVme50ForKFC value> div classmodel-input-container idmodel-input-container> textarea typetext idmodel_name namemodel_name placeholder支持手动填入测试模型名称,用英文逗号分隔多个模型>/textarea> input typebutton value获取模型列表 styleheight: 50px onclickgetModelList()> /div> div idmodelCheckboxes>/div> div classmodel-timeout-concurrency> div classmodel-timeout> label formodel_timeout>设置请求超时(秒):/label> input typenumber idmodel_timeout namemodel_timeout value10 min1 stylemax-width: 100px;> /div> div classmodel-concurrency> label formodel_concurrency>设置请求并发数量:/label> input typenumber idmodel_concurrency namemodel_concurrency value5 min1 stylemax-width: 100px;> /div> /div> div classsubmit-container> input typebutton value测试模型 onclicktestModels() classsubmit-query> input typebutton value检查额度 onclickcheckQuota() classcheck-quota> input typebutton value清空表单 onclickclearForm() classclear-form> /div> /form>/div>div classcopyright> !-- 不要删除 感谢 Rick 和 Megasoft 的贡献--> p> © 2024 linuxdoer 版权所有br>点点star 自行部署 a hrefhttps://github.com/QAbot-zh/query-key target_blank>github仓库/a> br>贡献者:a hrefhttps://linux.do/u/rick target_blank>img srchttps://linux.do/user_avatar/linux.do/rick/288/137821_2.png altrick>rick /a>和a hrefhttps://linux.do/u/zhong_little target_blank>img srchttps://linux.do/user_avatar/linux.do/zhong_little/288/104887_2.png altMegasoft>Megasoft/a>和a hrefhttps://linux.do/u/fangyuan99 target_blank>img srchttps://linux.do/letter_avatar_proxy/v4/letter/f/b3f665/144.png altfangyuan99>fangyuan99/a>和a hrefhttps://github.com/juzeon target_blank>img srchttps://avatars.githubusercontent.com/u/12206799?s60&v4 altjuzeon>juzeon/a>/p>/div>div idresults classresponse-container>/div>script> // 显示公告 function showToast() { const message ` div> p>strong>API CHECKER v1.4/strong>/p> br> div>仓库地址: a hrefhttps://github.com/QAbot-zh/query-key target_blank stylecolor: #1e88e5>QAbot-zh/query-key/a>/div>div>点点star 可以自行部署/div> br> p>strong>启用新域名: /strong> a hrefhttps://check.crond.dev target_blank stylecolor: #1e88e5>https://check.crond.dev/a>/p> br> p>strong>如何使用 :/strong>/p> ul> div>🕵️ 使用“官转验证”功能确认API的真实性/div> div>🕵️♀️ 使用“温度验证”功能确认API的真实性/div> div>📊 使用“函数验证”功能检测API是否支持FC/div> div>🔒 strong> beta 功能:支持本地缓存API信息,数据仅本地保留,默认关闭/strong> /div> /ul> br> p>strong>Tips:/strong>/p> div>🌱GPT系列,才有官转验证,系统判断仅供参考,原理请看 a hrefhttps://linux.do/t/topic/191420 target_blank stylecolor: #1e88e5>v1.3版本介绍/a>/div> div>🌡️ 温度验证:低温度参数下,大模型回复的稳定性。测试结果仅供参考,原理请看 a hrefhttps://linux.do/t/topic/195972 target_blank stylecolor: #1e88e5>温度验证/a>/div> /div> `; const toast document.createElement(div); toast.className toast; toast.innerHTML `${message} button onclickthis.parentElement.style.displaynone; aria-labelclose> svg aria-hiddentrue viewBox0 0 14 16 width14 height16> path fill-ruleevenodd dM7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z>/path> /svg> /button>`; document.body.appendChild(toast); } showToast(); // 智能提取API信息 document.getElementById(api_info).addEventListener(input, function () { let text this.value; let urlPattern /(https?:\/\/^\s,。、!,;;\n+)/; let keyPattern /(sk-a-zA-Z0-9+)/; let urlMatch text.match(urlPattern); let keyMatch text.match(keyPattern); if (urlMatch) { //去除末尾/后的空格 其他字符 保留到最后一个/前面 let cleanUrl urlMatch0.match(/(.*)\/.*/)1; //如果. 存在则使用 if (cleanUrl.includes(.)) { document.getElementById(api_url).value cleanUrl; console.log(cleanUrl); } else { document.getElementById(api_url).value urlMatch0; console.log(urlMatch0); } } if (keyMatch) { document.getElementById(api_key).value keyMatch0; } }); function getModelList() { const apiUrl document.getElementById(api_url).value.replace(/\/+$/, ); const apiKey document.getElementById(api_key).value; console.log(apiUrl, apiKey); layui.use(layer, function () { let layer layui.layer; layer.load(); fetch(`${apiUrl}/v1/models`, { headers: { Authorization: `Bearer ${apiKey}`, Content-Type: application/json } }) .then(response > response.json()) .then(data > { layer.closeAll(loading); const models data.data.map(model > model.id); models.sort(); displayModelCheckboxes(models); }) .catch(error > { layer.closeAll(loading); layer.alert(获取模型列表失败: + error.message); }); }); } // 显示模型复选框 function displayModelCheckboxes(models) { layui.use(layer, form, function () { let layer layui.layer; let form layui.form; let content div stylepadding: 20px;>form classlayui-form>; content + div idselectedCount>已选择 0 个模型/div>; content + ` div classmodel-filter-container> input typetext idprefixFilter placeholder输入模型前缀筛选> button typebutton onclickfilterModels()>筛选/button> button typebutton classclear onclickclearFilter()>清空/button> /div> div classcheckbox-container> label>input typecheckbox lay-skinprimary lay-filtercheckAll title全选>/label> label>input typecheckbox lay-skinprimary lay-filtercheckAllChatOnly title全选(过滤音/图/视/嵌入模型)>/label> /div> `; content + div idmodelList>; models.forEach((model, index) > { content + ` div classlayui-form-item model-item data-model${model}> input typecheckbox namemodels${index} value${model} title${model} lay-skinprimary> /div> `; }); content + /div>/form>/div>; layer.open({ type: 1, title: 选择模型, content: content, area: 400px, 550px, btn: 确定, 取消, success: function (layero, index) { form.render(checkbox); setupEventListeners(layero, form); }, yes: function (index, layero) { const selectedModels layero.find(inputname^models:checked).map(function () { return this.value; }).get(); document.getElementById(model_name).value selectedModels.join(,); layer.close(index); } }); }); } function setupEventListeners(layero, form) { form.on(checkbox, function (data) { updateSelectedCount(layero); }); form.on(checkbox(checkAll), function (data) { let child layero.find(inputname^models); child.each(function (index, item) { item.checked data.elem.checked; }); form.render(checkbox); updateSelectedCount(layero); layero.find(inputlay-filtercheckAllChatOnly).prop(checked, false); }); form.on(checkbox(checkAllChatOnly), function (data) { const child layero.find(inputname^models); const notChatPattern /^(dall|mj|midjourney|stable-diffusion|playground|flux|swap_face|tts|whisper|text|emb|luma|vidu|pdf|suno|pika|chirp|domo|runway|cogvideo)/; child.each(function (index, item) { const modelName item.value; item.checked data.elem.checked && !notChatPattern.test(modelName) && !/(image|audio|video|music|pdf|flux|suno|embed)/.test(modelName); }); form.render(checkbox); updateSelectedCount(layero); layero.find(inputlay-filtercheckAll).prop(checked, false); }); } function filterModels() { const prefix document.getElementById(prefixFilter).value.trim().toLowerCase(); const modelItems document.querySelectorAll(.model-item); const modelList document.getElementById(modelList); const matchedModels ; const unmatchedModels ; modelItems.forEach(item > { const model item.getAttribute(data-model).toLowerCase(); if (model.startsWith(prefix)) { matchedModels.push(item); } else { unmatchedModels.push(item); } }); matchedModels.forEach(item > { modelList.insertBefore(item, modelList.firstChild); item.querySelector(inputtypecheckbox).checked true; }); unmatchedModels.forEach(item > { modelList.appendChild(item); }); layui.form.render(checkbox); let count matchedModels.length; updateSelectedCount2(count); } function clearFilter() { document.getElementById(prefixFilter).value ; const modelItems document.querySelectorAll(.model-item); const modelList document.getElementById(modelList); modelItems.forEach(item > { item.querySelector(inputtypecheckbox).checked false; modelList.appendChild(item); }); layui.form.render(checkbox); updateSelectedCount2(0); } // 更新已选择的模型数量 function updateSelectedCount(layero) { const selectedCount layero.find(inputname^models:checked).length; layero.find(#selectedCount).text(`已选择 ${selectedCount} 个模型`); } function updateSelectedCount2(count) { document.querySelector(#selectedCount).innerText `已选择 ${count} 个模型`; } let results { valid: , invalid: , inconsistent: , awaitOfficialVerification: }; async function testModels() { results { valid: , invalid: , inconsistent: , awaitOfficialVerification: }; const apiUrl document.getElementById(api_url).value.replace(/\/+$/, ); const apiKey document.getElementById(api_key).value; const modelNames document.getElementById(model_name).value.split(,).map(m > m.trim()).filter(m > m); const timeout parseInt(document.getElementById(model_timeout).value) * 1000; // 转换为毫秒 const concurrency parseInt(document.getElementById(model_concurrency).value); if (modelNames.length 0) { layui.use(layer, function () { const layer layui.layer; layer.alert(请输入至少一个模型名称或从列表中选择模型); }); return; } layui.use(layer, function () { let layer layui.layer; layer.load(); async function testModel(model) { const controller new AbortController(); const id setTimeout(() > controller.abort(), timeout); const startTime Date.now(); let response_text; try { const requestBody { model: model, messages: {role: user, content: 写一个10个字的冷笑话} }; if (/^(gpt-|chatgpt-|o1-)/.test(model)) { requestBody.seed 331; } const response await fetch(`${apiUrl}/v1/chat/completions`, { method: POST, headers: { Authorization: `Bearer ${apiKey}`, Content-Type: application/json, }, body: JSON.stringify(requestBody), signal: controller.signal }); const endTime Date.now(); const responseTime (endTime - startTime) / 1000; // 转换为秒 if (response.ok) { const data await response.json(); const returnedModel data.model || no returned model by rick; // 确保 returnedModel 有效 if (returnedModel model) { results.valid.push({model, responseTime}); if (/^(gpt-|chatgpt-|o1-)/.test(model)) { if (data.system_fingerprint) { results.awaitOfficialVerification.push({ model, system_fingerprint: data.system_fingerprint }); } } console.log(`测试 API 节点:${apiUrl} 测试模型:${model} 模型一致,响应时间:${responseTime.toFixed(2)} 秒`); } else { results.inconsistent.push({model, returnedModel, responseTime}); console.log(`测试 API 节点:${apiUrl} 测试模型:${model} 模型不一致,期望:${model},实际:${returnedModel},响应时间:${responseTime.toFixed(2)} 秒`); } } else { try { const jsonResponse await response.json(); response_text jsonResponse.error.message; } catch (jsonError) { try { response_text await response.text(); } catch (textError) { response_text 无法解析响应内容; } } results.invalid.push({model, response_text}); console.log(`测试 API 节点:${apiUrl} 测试模型:${model} 模型不可用,响应:${response.status} ${response.statusText} ${response_text}`); } } catch (error) { if (error.name AbortError) { results.invalid.push({model, error: 超时}); console.log(`测试 API 节点:${apiUrl} 测试模型:${model} 模型不可用(超时)`); } else { results.invalid.push({model, error: error.message}); console.log(`测试 API 节点:${apiUrl} 测试模型:${model} 模型不可用,错误:${error.message}`); } } finally { clearTimeout(id); } } async function runBatch(models) { const promises models.map(model > testModel(model).catch(error > { console.error(`测试模型 ${model} 时发生错误:${error.message}`); }) ); await Promise.all(promises); } async function runAllTests() { for (let i 0; i modelNames.length; i + concurrency) { const batch modelNames.slice(i, i + concurrency); await runBatch(batch); } layer.closeAll(loading); displayResults(results); showSummary(results); } runAllTests().catch(error > { layer.closeAll(loading); layer.alert(测试模型时发生错误: + error.message); }); }); } function showSummary(results) { const validCount results.valid.length; const inconsistentCount results.inconsistent.length; const invalidCount results.invalid.length; const totalCount validCount + inconsistentCount + invalidCount; layui.use(layer, function () { const layer layui.layer; layer.alert(`测试总结:br> 总共测试了 ${totalCount} 个模型br> 其中:br> - ${validCount} 个模型可用且一致br> - ${inconsistentCount} 个模型可用但不一致br> - ${invalidCount} 个模型不可用`, {title: 测试结果总结} ); }); } // 显示测试结果 function displayResults(results) { const resultsDiv document.getElementById(results); let content h2>测试结果/h2> + h3>(结果仅供参考,防君子不防小人)/h3> + div classsubmit-container> + input typebutton onclickcopyConsistentModels() value复制一致模型 classcheck-quota> + input typebutton onclickcopyConsistentAndInconsistentModels() value复制可用模型 classcheck-quota> + input typebutton onclickcopyConsistentAndInconsistentReturedModels() value复制可用原始模型 classcheck-quota> + /div> + table> + tr> + th classtd1>状态/th> + th classtd2>模型名称/th> + th classtd3>响应时间 (秒)/th> + th classtd4>备注/th> + /tr>; results.valid.forEach(function (r) { content + tr> + td classtd1 td1-ok>模型一致可用/ td> + td classtd2>span classcopy-btn2 onclickcopyText(\ + r.model + \)> + r.model + /span>/td> + td classtd3> + r.responseTime.toFixed(2) + /td> let verifyButtons ` button classverify-btn cyan data-tooltip校验函数功能是否可用,将发起1次请求 onclickverifyFunctionCalling(${r.model})> 函数验证 /button> `; if (/^(gpt-|chatgpt-|o1-)/.test(r.model) || r.model.startsWith(claude-)) { let officialButtonClass results.awaitOfficialVerification.some(item > item.model r.model) ? green : yellow; verifyButtons + ` button classverify-btn blue data-tooltip低温度参数下预测序列下一个值,将发起4次请求 onclickverifyTemperature(${r.model})> 温度验证 /button> ${/^(gpt-|chatgpt-|o1-)/.test(r.model) ? ` button classverify-btn ${officialButtonClass} data-tooltip相同种子参数下校验回复相似性和系统指纹,将发起4次请求 onclickverifyOfficial(${r.model})> 官转验证 /button> ` : } `; } content + `td classtd4>div classverify-btn-group>${verifyButtons}/div>/td>`; }); results.inconsistent.forEach(function (r) { let verifyButtons `button classverify-btn cyan data-tooltip校验函数功能是否可用,将发起1次请求 onclickverifyFunctionCalling(${r.model})> 函数验证 /button>` if (/^(gpt-|chatgpt-|o1-)/.test(r.model) || r.model.startsWith(claude-)) { let officialButtonClass results.awaitOfficialVerification.some(item > item.model r.model) ? green : yellow; verifyButtons + ` button classverify-btn blue data-tooltip低温度参数下预测序列下一个值,将发起4次请求 onclickverifyTemperature(${r.model})> 温度验证 /button> ${/^(gpt-|chatgpt-|o1-)/.test(r.model) ? ` button classverify-btn ${officialButtonClass} data-tooltip相同种子参数下校验回复相似性和系统指纹,将发起4次请求 onclickverifyOfficial(${r.model})> 官转验证 /button> ` : } `; } let highlightedReturnModel r.returnedModel; if (r.returnedModel.startsWith(`${r.model}-`)){ highlightedReturnModel `span stylecolor: green; font-weight: bold;>${r.model}/span>${r.returnedModel.slice(r.model.length)}br>可能是带版本号模型映射`; } content + ` tr> td classtd1 td1-no >模型不一致/映射,tnnd掺假?/td> td classtd2> span classcopy-btn2 onclickcopyText(${r.model})>${r.model}/span> /td> td classtd3>${r.responseTime.toFixed(2)}/td> td classtd4> ${verifyButtons} br> ${r.returnedModel ? 返回模型: + highlightedReturnModel : 该接口未返回模型名称} /td> /tr> `; }); results.invalid.forEach(function (r) { content + tr> + td classtd1 td1-error>模型不可用!!!,干啥呢/td> + td classtd2>span classcopy-btn2 onclickcopyText(\ + r.model + \)> + r.model + /span>/td> + td classtd3>-/td> + td classtd4> + (r.response_text || r.error) + /td> + /tr>; }); content + /table>; resultsDiv.innerHTML content; } async function verifyOfficial(model) { layui.use(layer, function () { const layer layui.layer; layer.prompt({ formType: 0, value: 888, title: 请输入seed值 (1-900), area: 300px, 50px }, function (seed, index) { layer.close(index); performOfficialVerification(model, parseInt(seed)); }); }); } function findMostFrequent(arr) { const frequency {}; let maxCount 0; let mostFrequentElement null; for (const item of arr) { frequencyitem (frequencyitem || 0) + 1; if (frequencyitem > maxCount) { maxCount frequencyitem; mostFrequentElement item; } } return { element: mostFrequentElement, count: maxCount }; } async function verifyTemperature(model) { layui.use(layer, function () { const layer layui.layer; layer.load(); }); try { const results await Promise.all( 1, 2, 3, 4.map(() > sendTemperatureVerificationRequest(model)) ); const responses results.map((result) > result.choices ? result?.choices?.0?.message?.content?.trim() : 该次调用响应异常 ); const referenceMap { gpt-4o-mini: 32, gpt-4o: 59, claude-3-5: 51, claude-3.5: 51 }; const matchedKey Object.keys(referenceMap).find(key > model.startsWith(key)); let referenceValue matchedKey ? referenceMapmatchedKey : null; layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); let message `strong>当前待验证模型:${model}/strong>p>参考值:c3.5 51(gcp测试),gpt-4o 59,gpt-4o-mini 32(azure测试)/p>`; message + table stylewidth:100%; border-collapse: collapse; margin-bottom: 20px;> + tr>th styleborder: 1px solid #ddd; padding: 4px;>测试/th>th styleborder: 1px solid #ddd; padding: 4px;>响应/th>/tr>; let hitReferenceCount 0; let color; for (let i 0; i 4; i++) { if (responsesi referenceValue) { hitReferenceCount++; color green; } else if (responsesi 该次调用响应失败){ color red } else{ color black; } message + tr> + td styleborder: 1px solid #ddd; padding: 4px;>测试 + (i + 1) + /td> + `td styleborder: 1px solid #ddd; padding: 4px; color: ${color};>` + responsesi + /td> + /tr>; } message + /table>strong>结论:/strong>; frequencyCheckResult findMostFrequent(responses); const diffentCount frequencyCheckResult.count; if (diffentCount responses.length) { message + 所有响应相同,可能是官方API; } else { message + `响应结果重复度:${diffentCount}/${responses.length}`; // 检查模型前缀是否符合条件 if (/^(gpt-4o|claude-3-5|claude-3.5)/.test(model)) { message + `,参考值命中率:${hitReferenceCount}/${responses.length}`; } message + ,可能不是官方API; } message + br>; layer.alert(message, { title: 温度验证结果(strong>无参考值模型请自行根据结果重复度判断/strong>), area: 600px, 400px, }); }); } catch (error) { console.error(Error in verifyTemperature:, error); layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); layer.alert(验证过程中发生错误: + error.message, { title: 错误, }); }); } } async function sendTemperatureVerificationRequest(model) { const apiUrl document .getElementById(api_url) .value.replace(/\/+$/, ); const apiKey document.getElementById(api_key).value; try { const response await fetch(`${apiUrl}/v1/chat/completions`, { method: POST, headers: { Authorization: `Bearer ${apiKey}`, Content-Type: application/json, }, body: JSON.stringify({ messages: { role: system, content: Youre an associative thinker. The user gives you a sequence of 6 numbers. Your task is to figure out and provide the 7th number directly, without explaining how you got there., }, { role: user, content: 5, 15, 77, 19, 53, 54,, }, , temperature: 0.01, model: model, }), }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { console.error(Error in sendTemperatureVerificationRequest:, error); return { error: error.message }; } } async function performOfficialVerification(model, seed) { layui.use(layer, function () { const layer layui.layer; layer.load(); }); try { const results await Promise.all(1, 2, 3, 4.map(() > sendVerificationRequest(model, seed))); const texts ; const fingerprints ; for (let i 0; i results.length; i++) { if (resultsi.error) { console.error(`Error in request ${i + 1}:`, resultsi.error); layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); layer.alert(`请求 ${i + 1} 失败: ${resultsi.error}`, {title: 错误}); }); return; } if (!resultsi.choices?.0?.message?.content) { console.error(`Invalid response structure in request ${i + 1}:`, resultsi); layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); layer.alert(`请求 ${i + 1} 返回的数据结构无效`, {title: 错误}); }); return; } texts.push(resultsi.choices0.message.content); fingerprints.push(resultsi.system_fingerprint || N/A); } const similarity compareTextSimilarity(texts0, texts1, texts2, texts3); layui.use(layer, function () { api_url document.getElementById(api_url).value; const layer layui.layer; layer.closeAll(loading); if (api_url https://api.openai.com) { layer.alert(官方API你来验证?, {title: 官方API}); } let validFingerprintsCount Object.values(fingerprints).filter(value > value ! N/A).length; let similarityCount Object.values(similarity).filter(value > parseFloat(value) > 0.6).length; let lowSimilarityCount Object.values(similarity).filter(value > parseFloat(value) 0.1).length; let title 验证结果; let message ; if (validFingerprintsCount >3 && similarityCount > 3) { title 恭喜你,大概率是官方API呀!; message + strong>Tips: 这是官方API!/strong>; } else if (validFingerprintsCount > 2 && similarityCount > 2) { title 可能是官方API; message + strong>Tips: 应该是官方的/strong>; } else if (validFingerprintsCount 2 && lowSimilarityCount > 2) { title 可能是假的; message + strong>Tips: 假的8/strong>; } else { title 没有系统指纹且回答一致性差,则api大概率是假的; message + strong>Tips: 结果不确定,请进一步验证/strong>; } message + table stylewidth:100%; border-collapse: collapse; margin-bottom: 20px;> + tr>th styleborder: 1px solid #ddd; padding: 8px;>测试/th>th styleborder: 1px solid #ddd; padding: 8px;>文本/th>th styleborder: 1px solid #ddd; padding: 8px;>系统指纹/th>/tr>; for (let i 0; i 4; i++) { message + tr> + td styleborder: 1px solid #ddd; padding: 8px;>测试 + (i + 1) + /td> + td styleborder: 1px solid #ddd; padding: 8px;> + textsi + /td> + td styleborder: 1px solid #ddd; padding: 8px;> + fingerprintsi + /td> + /tr>; } message + /table>; message + 相似度结果:br> + Object.entries(similarity).map((key, value) > `${key}: ${value}`).join(br>); layer.alert(message, {title: title, area: 600px, 400px}); }); } catch (error) { console.error(Error in performOfficialVerification:, error); layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); layer.alert(验证过程中发生错误: + error.message, {title: 错误}); }); } } async function sendVerificationRequest(model, seed) { const apiUrl document.getElementById(api_url).value.replace(/\/+$/, ); const apiKey document.getElementById(api_key).value; try { const response await fetch(`${apiUrl}/v1/chat/completions`, { method: POST, headers: { Authorization: `Bearer ${apiKey}`, Content-Type: application/json }, body: JSON.stringify({ messages: { role: user, content: 写一个10个字的冷笑话 } , seed: seed, temperature: 0.7, model: model }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { console.error(Error in sendVerificationRequest:, error); return {error: error.message}; } } async function verifyFunctionCalling(model) { console.log(开始验证函数调用); layui.use(layer, function () { const layer layui.layer; layer.open({ title: 请输入两个整数 a 和 b, area: 400px, 250px, content: ` div stylepadding: 10px;> div stylemargin-bottom: 10px;> label styledisplay: inline-block; width: 100px;>请输入整数 a:/label> input typenumber idinputA classlayui-input stylewidth: 60px; display: inline-block; value3 placeholdera> /div> div stylemargin-bottom: 10px;> label styledisplay: inline-block; width: 100px;>请输入整数 b:/label> input typenumber idinputB classlayui-input stylewidth: 60px; display: inline-block; value5 placeholderb> /div> /div> `, btn: 确定, 取消, yes: function (index, layero) { const a parseInt(document.getElementById(inputA).value); const b parseInt(document.getElementById(inputB).value); if (isNaN(a) || isNaN(b)) { layer.msg(请输入有效的整数 a 和 b); return; } layer.close(index); performFunctionCallingVerification(model, a, b); } }); }); } async function sendFunctionCallingRequest(model, a, b) { const apiUrl document.getElementById(api_url).value.replace(/\/+$/, ); const apiKey document.getElementById(api_key).value; try { const response await fetch(`${apiUrl}/v1/chat/completions`, { method: POST, headers: { Authorization: `Bearer ${apiKey}`, Content-Type: application/json }, body: JSON.stringify({ messages: {role: system, content: You are a helpful assistant.}, {role: user, content: `Please add ${a} and ${b}.`} , functions: { name: add_numbers, description: Adds two numbers together, parameters: { type: object, properties: { a: { type: number, description: The first number }, b: { type: number, description: The second number } }, required: a, b } } , function_call: auto, temperature: 0.5, model: model }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { console.error(Error in sendFunctionCallingRequest:, error); return {error: error.message}; } } async function performFunctionCallingVerification(model, a, b) { layui.use(layer, function () { const layer layui.layer; layer.load(); }); try { const result await sendFunctionCallingRequest(model, a, b); if (result.error) { console.error(`Error in request:`, result.error); layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); layer.alert(`请求失败: ${result.error}`, {title: 错误}); }); return; } layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); const title b>span stylecolor: black;>模型函数调用响应对比(非openai模型的函数调用响应可能有差异,但肉眼可辨)/span>/b>; let text; // 第一种是 openai 的函数调用响应,第二种是经 oneapi 中转后 gemini 的函数调用响应,目前手里只有这两种支持 FC if(result.choices?.0?.finish_reason function_call || result.choices?.0?.message?.tool_calls?.0?.type function){ text b>span stylecolor: green;>模型返回了函数调用响应,测试模型为: + model + /span>/b>; } else{ text b>span stylecolor: red;>模型无函数调用响应返回,测试模型为: + model + /span>/b>; } const referenceFunctionCall JSON.stringify({ index: 0, message: { role: assistant, content: null, function_call: { name: add_numbers, arguments: `{a:${a},b:${b}}` }, }, logprobs: null, finish_reason: function_call, }, null, 4); const modelFunctionCall JSON.stringify(result.choices?.0, null, 4); const message text + ` table border1 stylewidth: 100%; border-collapse: collapse; text-align: left;> thead> tr> th stylepadding: 8px; background-color: #f2f2f2;>OpenAI 标准输出参考/th> th stylepadding: 8px; background-color: #f2f2f2;>测试模型输出/th> /tr> /thead> tbody> tr> td stylepadding: 8px;> pre stylewhite-space: pre-wrap; word-wrap: break-word;>${referenceFunctionCall}/pre> /td> td stylepadding: 8px;> pre stylewhite-space: pre-wrap; word-wrap: break-word;>${modelFunctionCall}/pre> /td> /tr> /tbody> /table> `; layer.alert(message, {title: title, area: 800px, 600px}); }); } catch (error) { console.error(Error in performOfficialVerification:, error); layui.use(layer, function () { const layer layui.layer; layer.closeAll(loading); layer.alert(验证过程中发生错误: + error.message, {title: 错误}); }); } } function compareTextSimilarity(text1, text2, text3, text4) { function calculateSimilarity(str1, str2) { const len1 str1.length; const len2 str2.length; const matrix Array(len1 + 1).fill().map(() > Array(len2 + 1).fill(0)); for (let i 0; i len1; i++) matrixi0 i; for (let j 0; j len2; j++) matrix0j j; for (let i 1; i len1; i++) { for (let j 1; j len2; j++) { const cost str1i - 1 str2j - 1 ? 0 : 1; matrixij Math.min( matrixi - 1j + 1, matrixij - 1 + 1, matrixi - 1j - 1 + cost ); } } return 1 - matrixlen1len2 / Math.max(len1, len2); } return { similarity12: calculateSimilarity(text1, text2).toFixed(4), similarity13: calculateSimilarity(text1, text3).toFixed(4), similarity14: calculateSimilarity(text1, text4).toFixed(4), similarity23: calculateSimilarity(text2, text3).toFixed(4), similarity24: calculateSimilarity(text2, text4).toFixed(4), similarity34: calculateSimilarity(text3, text4).toFixed(4) }; } // 复制文本功能 function copyText(text) { navigator.clipboard.writeText(text).then(() > { layui.use(layer, function () { const layer layui.layer; layer.msg(模型名已复制到剪贴板); }); }).catch(err > { console.error(复制失败:, err); }); } // 检查额度 function checkQuota() { const apiUrl document.getElementById(api_url).value.replace(/\/+$/, ); const apiKey document.getElementById(api_key).value; layui.use(layer, function () { const layer layui.layer; layer.load(); let quotaInfo, usedInfo, remainInfo; // 获取总额度 fetch(`${apiUrl}/dashboard/billing/subscription`, { headers: {Authorization: `Bearer ${apiKey}`} }) .then(response > response.json()) .then(quotaData > { quotaInfo quotaData.hard_limit_usd ? `${quotaData.hard_limit_usd.toFixed(2)} $` : 无法获得额度信息; // 获取使用情况 const today new Date(); const year today.getFullYear(); const month String(today.getMonth() + 1).padStart(2, 0); const day String(today.getDate()).padStart(2, 0); const startDate `${year}-${month}-01`; const endDate `${year}-${month}-${day}`; return fetch(`${apiUrl}/dashboard/billing/usage?start_date${startDate}&end_date${endDate}`, { headers: {Authorization: `Bearer ${apiKey}`} }); }) .then(response > response.json()) .then(usageData > { usedInfo `${(usageData.total_usage / 100).toFixed(2)} $`; // 计算剩余额度 const quotaNumber parseFloat(quotaInfo); const usedNumber parseFloat(usedInfo); if (!isNaN(quotaNumber) && !isNaN(usedNumber)) { remainInfo `${(quotaNumber - usedNumber).toFixed(2)} $`; } else { remainInfo 无法计算剩余额度; } const showInfo `可用额度为: ${remainInfo}\n\n已用额度为: ${usedInfo}\n\n总额度为: ${quotaInfo}`; layer.closeAll(loading); layer.alert(showInfo); }) .catch(error > { layer.closeAll(loading); layer.alert(检查额度失败: + error.message); }); }); } // 清空表单 function clearForm() { document.getElementById(apiForm).reset(); document.getElementById(results).innerHTML ; } // 复制一致模型 function copyConsistentModels() { const models results.valid.map(function (r) { return r.model; }); copyText(models.join(,)); } // 复制所有可用模型去重 function copyConsistentAndInconsistentModels() { const models results.valid.map(function (r) { return r.model; }) .concat(results.inconsistent.map(function (r) { return r.model; })); const uniqueModels Array.from(new Set(models)); // 去重 copyText(uniqueModels.join(,)); } // 复制一致和不一致模型的原始模型的函数名称 去重 function copyConsistentAndInconsistentReturedModels() { const models results.valid.map(function (r) { return r.model; }) .concat(results.inconsistent.map(function (r) { return r.returnedModel; })); let uniqueModels Array.from(new Set(models)); // 去重 //去除undefined uniqueModels uniqueModels.filter(function (s) { return s && s.trim(); }); copyText(uniqueModels.join(,)); }/script>/body>/html>
Subdomains
Date
Domain
IP
bpb.snaily.top
2025-01-07
172.67.217.64
apichecker.snaily.top
2025-01-22
104.21.61.250
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]