您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows ratelimit information on Grok
当前为
// ==UserScript== // @name Grok ratelimit indicator // @namespace https://6942020.xyz/ // @version 1.0 // @description Shows ratelimit information on Grok // @author WadeGrimridge // @match https://grok.com/* // @license MIT // @grant none // ==/UserScript== (function () { "use strict"; let rateInfoElement = null; const modelRateLimits = { "grok-latest": null, "grok-3": null, }; const modelDisplayNames = { "grok-latest": "Grok 2", "grok-3": "Grok 3", }; function formatTime(seconds) { const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`; } async function fetchRateLimit(modelName, attempt = 1) { try { const response = await fetch("/rest/rate-limits", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ requestKind: "DEFAULT", modelName }), }); if (response.status === 401 && attempt <= 10) { await new Promise((resolve) => setTimeout(resolve, 2500)); return fetchRateLimit(modelName, attempt + 1); } const data = await response.json(); if ( data.remainingQueries !== undefined && data.totalQueries !== undefined ) { updateRateInfo(data, modelName); } } catch (error) { console.error(`[grok-ratelimit] Rate limit fetch failed:`, error); if (attempt > 10 && rateInfoElement) { rateInfoElement.textContent = "Couldn't fetch ratelimit info"; } } } function createRateInfoElement() { const targetDiv = document.querySelector( 'main div:has(> a[aria-label="Home page"])' ); if (targetDiv && !rateInfoElement) { rateInfoElement = document.createElement("div"); rateInfoElement.className = "ml-2 text-sm"; rateInfoElement.textContent = "Fetching ratelimit info..."; targetDiv.appendChild(rateInfoElement); (async () => { await fetchRateLimit("grok-3"); await fetchRateLimit("grok-latest"); })(); } } function updateRateInfo(data, modelName) { if (rateInfoElement) { modelRateLimits[modelName] = data; const lines = []; const displayOrder = ["grok-3", "grok-latest"]; for (const model of displayOrder) { const data = modelRateLimits[model]; if (data) { const timeStr = formatTime(data.windowSizeSeconds); lines.push( `${modelDisplayNames[model]}: ${data.remainingQueries}/${data.totalQueries} (${timeStr})` ); } } rateInfoElement.textContent = lines.join(" | "); } } const originalFetch = window.fetch; window.fetch = async function (...args) { const [resource, options] = args; const url = resource instanceof Request ? resource.url : resource.toString(); if (url.includes("/rest/rate-limits")) { const requestBody = JSON.parse(options.body); const modelName = requestBody.modelName; const response = await originalFetch.apply(this, args); const clone = response.clone(); clone.json().then((data) => { if ( data.remainingQueries !== undefined && data.totalQueries !== undefined ) { updateRateInfo(data, modelName); } }); return response; } return originalFetch.apply(this, args); }; function waitForElement() { const targetDiv = document.querySelector( 'main div:has(> a[aria-label="Home page"])' ); if (targetDiv) { createRateInfoElement(); } else { requestAnimationFrame(waitForElement); } } waitForElement(); })();