free-model-router-v1@2.2.0
BLOCKED· startup onlyPublisher claims: "为 OpenClaw 提供免费模型智能路由服务,支持本地代理、自动配置、自动轮询、故障切换和配置零侵入。在需要设置免费模型路由、配置 Provider、切换模型或诊断模型可用性问题时使用。" Observed in sandbox: sends data to freemodel.eu.org, freemodel.dpdns.org, model-server.codebot.workers.dev.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-09 and scored it 47/100 (Blocked). Do not install it: the sandbox observed behaviour consistent with credential theft, exfiltration or persistence. Notable findings: document.cookie access; Pipe-to-shell pattern. Summary: sends data to freemodel.eu.org, freemodel.dpdns.org, model-server.codebot.workers.dev.
Behavior trace
Honeypot run · 21 s · 2 scenariosStatic findings
…ndow.location.href="/admin/login.html",!1}return!0}function _syncAdminCookie(e){document.cookie="admin_token="+e+";path=/;max-age=604800;SameSite=Strict"}function _clearAdminC…Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.const LOG_PREFIX="[anthropic-transform]";function log(...t){console.log(`${LOG_PREFIX} ${(new Date).toISOString()}`,...t)}function _isValidToolName(t){return"string"==typeof t&&t.trim().length>0}function _convertSystemToOpenAI(t){if(t){if("…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…int");n&&(n.textContent="自动更新失败,您也可以在服务器终端手动执行以下命令完成升级:"),e&&t&&(t.textContent="curl -sSL https://freemodel.eu.org/install.sh | bash -s -- --force",e.style.display="block")}},startStatusPolling(){this.stopStatusP…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…}async function initAuth(){try{const e=await fetch("/api/auth/status"),t=await e.json();if(t.success&&t.data.isLocalAccess)return _isLocalAccess=!0,void initApp()}catch(e){console.warn("[Admin] 无法获取认证状态,使用默认检查")}await _checkTokenAndRedirec…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…int");n&&(n.textContent="自动更新失败,您也可以在服务器终端手动执行以下命令完成升级:"),e&&t&&(t.textContent="curl -sSL https://freemodel.eu.org/install.sh | bash -s -- --force",e.style.display="block")}},startStatusPolling(){this.stopStatusP…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…e("./context-window"),LOG_PREFIX="[routing-strategy]";function log(...e){console.log(`${LOG_PREFIX} ${(new Date).toISOString()}`,...e)}const _strategyRegistry={};function registerStrategy(e,t){_strategyRegistry[e]=t}function createStrategy…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…(path.dirname(config.DATA_DIR),"logs"),LOG_FILE=path.join(LOG_DIR,"server-client.log");function _writeLogFile(e,t){try{fs.existsSync(LOG_DIR)||fs.mkdirSync(LOG_DIR,{recursive:!0});const n=(new Date).toISOString()+` [${e}] ${LOG_PREFIX} `;f…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…nfig=require("./config"),LOG_PREFIX="[notifications]";function log(...e){console.log(`${LOG_PREFIX} ${(new Date).toISOString()}`,...e)}const ALLOWED_ANNOUNCE_DOMAINS=["freemodel.eu.org","freemodel.dpdns.org"];function isAllowedAnnounceUrl(…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ction _debug(...e){config.isDebugLogEnabled&&config.isDebugLogEnabled()&&console.log(`[proxy] [DEBUG] ${(new Date).toISOString()}`,...e)}function _trace(e,t={}){monitorLogger.trace("proxy",e,t)}function _classifyHttpError(e,t=""){if(/conte…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…n require("./config")}const LOG_PREFIX="[probe]",MODEL_STATES_FILE="model-states.json",MODEL_STATES_VERSION=4;function log(...e){console.log(`[probe] ${(new Date).toISOString()}`,...e)}const SHADOW_PROBE_CONFIG={maxCallsPerModel:3,minSucce…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…=10,MAX_LOG_AGE_DAYS=7;let _fmrVersion="unknown";try{const e=require("../package.json");_fmrVersion=e.version||"unknown"}catch(e){}const LOG_LEVELS={ERROR:0,WARN:1,INFO:2,DEBUG:3,TRACE:4},KNOWN_ERROR_PATTERNS=[{pattern:/rate limit|too many…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…,LOG_PREFIX="[router]";let _fmrVersion="unknown";try{const e=require("../package.json");_fmrVersion=e.version||"unknown"}catch(e){}function _getSyncProviderIds(e){return Object.entries(e.providers||{}).filter(([e,r])=>!r.deleted).map(([e])…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…require("./provider-ids"),LOG_PREFIX="[route-engine]";function log(...e){console.log(`${LOG_PREFIX} ${(new Date).toISOString()}`,...e)}function _debug(...e){config.isDebugLogEnabled&&config.isDebugLogEnabled()&&console.log(`${LOG_PREFIX} […Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…foldProviderId}=require("./provider-ids"),LOG_PREFIX="[stats]",STATS_FILE="stats.json",EWMA_ALPHA=.5,MAX_RECENT_CALLS=20,LATENCY_BUCKETS=[{label:"< 500ms",max:500},{label:"500ms-1s",max:1e3},{label:"1-2s",max:2e3},{label:"2-5s",max:5e3},{l…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…动超时")))},1e3)})}async function ensureRouter(){return isRouterRunning()||(console.log("Router 未运行,正在启动..."),await startRouter()),!0}async function cmdHelp(){console.log("\nfree-model-cli — 免费模型智能路由 CLI\n\n用法:node free-model-cli.js <command>…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ata"),CONFIG_FILE=process.env.FMR_CONFIG_PATH||path.join(DATA_DIR,"router-config.json"),MAX_BACKUPS=3,LOG_PREFIX="[config]";let _config=null;const _watchCallbacks=[];let _watcher=null,_debounceTimer=null,_watchPaused=!1;const KNOWN_PROVIDE…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…k]",MAX_CHECK_MODELS=20,DELAY_BETWEEN_REQUESTS_MS=500;function log(...e){console.log(`${LOG_PREFIX} ${(new Date).toISOString()}`,...e)}function _getHealthCheckTimeouts(){const e=config.get(),t=e.routing&&e.routing.healthCheckTimeouts||{};r…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
33 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Contacts a host you did not declare≈ +23 on the totalList every host you talk to in SKILL.md frontmatter (`network: [api.example.com]`), or stop contacting the ones you cannot justify.
- Pipe-to-shell pattern≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Unclaimed publisher≈ +8 on the totalClaim laodao-agent: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- document.cookie access≈ +4 on the totalReplace encoded or assembled strings with plain literals and remove undeclared network calls.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.