[{"data":1,"prerenderedAt":1118},["ShallowReactive",2],{"post-zh-codexbar-5h-vs-weekly-quota-calculation":3,"surround-zh-blog\u002Fzh\u002Fblog\u002Fcodexbar-5h-vs-weekly-quota-calculation.md":1105},{"id":4,"title":5,"body":6,"canonical":135,"category":1087,"date":1088,"description":1089,"extension":1090,"image":1091,"meta":1092,"navigation":331,"path":1093,"seo":1094,"slug":1095,"status":1096,"stem":1097,"tags":1098,"translationSlug":1095,"__hash__":1104},"blog\u002Fzh\u002Fblog\u002Fcodexbar-5h-vs-weekly-quota-calculation.md","5 小时额度占周额度多少？我用 CodexBar 历史数据算了 Claude、Codex 和 Antigravity",{"type":7,"value":8,"toc":1074},"minimark",[9,14,18,21,88,91,94,97,101,104,107,110,120,124,129,178,193,220,224,242,288,298,302,309,713,716,734,737,745,748,765,768,771,810,813,817,820,828,878,889,892,896,899,902,906,1046,1050,1053,1067,1070],[10,11,13],"h2",{"id":12},"_1-起因与结论先行","1. 起因与结论先行",[15,16,17],"p",{},"我同时在用 Claude Pro、ChatGPT Plus 里的 Codex，以及 Google AI Pro 的 Antigravity。三家都是两层额度：一个每 5 小时重置的窗口，一个每周重置的总量。我想弄清两件事：用满一轮 5 小时，会吃掉多少周额度？怎么安排，才能把一周的额度用够？",[15,19,20],{},"CodexBar 会把这几家的用量百分比存成本地历史，我就让 Codex 读这些记录来算。10 月 22 日中午在对话里算了一遍，晚上又用整理好的脚本复跑了一次：",[22,23,24,43],"table",{},[25,26,27],"thead",{},[28,29,30,34,37,40],"tr",{},[31,32,33],"th",{},"账户 \u002F 额度池",[31,35,36],{},"一轮 5 小时 ≈ 周额度的",[31,38,39],{},"一周约几轮",[31,41,42],{},"把握",[44,45,46,61,74],"tbody",{},[28,47,48,52,55,58],{},[49,50,51],"td",{},"Claude Pro",[49,53,54],{},"12.5%–13%",[49,56,57],{},"7.5–8",[49,59,60],{},"高",[28,62,63,66,69,72],{},[49,64,65],{},"Codex（ChatGPT Plus）",[49,67,68],{},"约 16%",[49,70,71],{},"约 6.4",[49,73,60],{},[28,75,76,79,82,85],{},[49,77,78],{},"Antigravity 普通 Gemini（Google AI Pro）",[49,80,81],{},"约 28.6%",[49,83,84],{},"约 3.5",[49,86,87],{},"中",[15,89,90],{},"算完才发现，那天正好是 Claude 的周额度重置日。上午 11:54 周额度只用了 46%，就算之后每个窗口都用满，到晚上 22:00 重置前最多也只能用到 73% 左右。问题出在前几天用得太少，最后一天怎么补都来不及。",[15,92,93],{},"省流：别数窗口次数，每天看周额度涨了多少。一周 7 天都用的话，Claude 每天要用满一轮还多一点，Codex 每天用一轮的九成左右，Antigravity 每天半轮就够。",[15,95,96],{},"这是我自己账户在 2026 年 10 月的实测，官方没有承诺固定的换算比例。",[10,98,100],{"id":99},"_2-核心认知为什么不能拿当前百分比直接相除","2. 核心认知：为什么不能拿当前百分比直接相除",[15,102,103],{},"最直觉的算法，是把 CodexBar 上的两个数一除：Claude 5 小时 85%、周 46%。这样算没有意义，因为 46% 里还装着本周之前每个窗口的用量。",[15,105,106],{},"能用的是增量。同一个 5 小时窗口里，同一份消耗会同时计入两项额度，所以「周额度涨了多少」除以「5 小时额度涨了多少」，就是一整轮 5 小时折合的周额度。10 月 19 日 12:58 到 13:58，我的 Claude 5 小时用量从 48% 涨到 80%（+32），周用量从 8% 涨到 12%（+4），4 ÷ 32 = 12.5%。第二天晚上的另一段是 +48 和 +6，也是 12.5%。",[15,108,109],{},"还有两点要先说清楚：",[111,112,113,117],"ul",{},[114,115,116],"li",{},"「5 小时」是额度窗口，不是要连续工作 5 小时。任务密集时，可能提前用满。",[114,118,119],{},"换入口不会多出额度。Claude 帮助中心写明 claude.ai、Claude Code 和 Claude Desktop 计入同一份额度；OpenAI 定价页写明 ChatGPT Work 和 Codex 共用用量，另外 Codex 的 Pro 套餐目前没有 5 小时限制。消耗速度还受模型、上下文、推理和工具调用影响，所以这个比例只代表你自己的用法。",[10,121,123],{"id":122},"_3-完整复现步骤","3. 完整复现步骤",[125,126,128],"h3",{"id":127},"step-1找到-codexbar-的历史文件","Step 1：找到 CodexBar 的历史文件",[130,131,136],"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"language-sh shiki shiki-themes github-light github-dark","codexbar --help | head -1\nls ~\u002FLibrary\u002FApplication\\ Support\u002Fcom.steipete.codexbar\u002Fhistory\u002F\n","sh","",[137,138,139,162],"code",{"__ignoreMap":135},[140,141,144,148,152,156,159],"span",{"class":142,"line":143},"line",1,[140,145,147],{"class":146},"sScJk","codexbar",[140,149,151],{"class":150},"sj4cs"," --help",[140,153,155],{"class":154},"szBVR"," |",[140,157,158],{"class":146}," head",[140,160,161],{"class":150}," -1\n",[140,163,165,168,172,175],{"class":142,"line":164},2,[140,166,167],{"class":146},"ls",[140,169,171],{"class":170},"sZZnC"," ~\u002FLibrary\u002FApplication",[140,173,174],{"class":150},"\\ ",[140,176,177],{"class":170},"Support\u002Fcom.steipete.codexbar\u002Fhistory\u002F\n",[15,179,180,181,184,185,188,189,192],{},"我这里是 CodexBar 0.79.0，目录里有 ",[137,182,183],{},"antigravity.json","、",[137,186,187],{},"claude.json"," 和 ",[137,190,191],{},"codex.json","。想看当前状态，就用 CLI 实时查。它会联网，要等几秒：",[130,194,196],{"className":132,"code":195,"language":134,"meta":135,"style":135},"codexbar usage --provider claude --format json --pretty\n",[137,197,198],{"__ignoreMap":135},[140,199,200,202,205,208,211,214,217],{"class":142,"line":143},[140,201,147],{"class":146},[140,203,204],{"class":170}," usage",[140,206,207],{"class":150}," --provider",[140,209,210],{"class":170}," claude",[140,212,213],{"class":150}," --format",[140,215,216],{"class":170}," json",[140,218,219],{"class":150}," --pretty\n",[125,221,223],{"id":222},"step-2看懂文件结构","Step 2：看懂文件结构",[15,225,226,227,230,231,234,235,230,238,241],{},"每个文件按账户分组，每个账户下有 ",[137,228,229],{},"session","（",[137,232,233],{},"windowMinutes: 300","）和 ",[137,236,237],{},"weekly",[137,239,240],{},"windowMinutes: 10080","）两个序列。每条记录只有三个字段：",[130,243,247],{"className":244,"code":245,"language":246,"meta":135,"style":135},"language-json shiki shiki-themes github-light github-dark","{\"capturedAt\": \"2026-10-19T04:58:37Z\", \"resetsAt\": \"2026-10-19T08:30:00Z\", \"usedPercent\": 48}\n","json",[137,248,249],{"__ignoreMap":135},[140,250,251,255,258,261,264,267,270,272,275,277,280,282,285],{"class":142,"line":143},[140,252,254],{"class":253},"sVt8B","{",[140,256,257],{"class":150},"\"capturedAt\"",[140,259,260],{"class":253},": ",[140,262,263],{"class":170},"\"2026-10-19T04:58:37Z\"",[140,265,266],{"class":253},", ",[140,268,269],{"class":150},"\"resetsAt\"",[140,271,260],{"class":253},[140,273,274],{"class":170},"\"2026-10-19T08:30:00Z\"",[140,276,266],{"class":253},[140,278,279],{"class":150},"\"usedPercent\"",[140,281,260],{"class":253},[140,283,284],{"class":150},"48",[140,286,287],{"class":253},"}\n",[15,289,290,291,293,294,297],{},"时间是 UTC，大约每小时一条。它记的是百分比快照，不是每次请求的账单。一个文件里可能有多个账户，我的 ",[137,292,191],{}," 就有两个，",[137,295,296],{},"preferredAccountKey"," 指向当前账户。",[125,299,301],{"id":300},"step-3挑出同一窗口的样本算比例","Step 3：挑出同一窗口的样本，算比例",[15,303,304,305,308],{},"把下面的脚本保存为 ",[137,306,307],{},"quota_ratio.py","：",[130,310,314],{"className":311,"code":312,"language":313,"meta":135,"style":135},"language-python shiki shiki-themes github-light github-dark","#!\u002Fusr\u002Fbin\u002Fenv python3\n\"\"\"用 CodexBar 本地历史估算：一整轮 5 小时额度约等于多少周额度。\n\n用法：python3 quota_ratio.py \u003Cclaude|codex|antigravity> [起始时间] [5 小时增量下限]\n\"\"\"\nimport json\nimport sys\nfrom datetime import datetime\nfrom pathlib import Path\n\nprovider = sys.argv[1]\nsince = sys.argv[2] if len(sys.argv) > 2 else \"1970-01-01\"   # 只用这个时间之后的采样（UTC）\nmin_delta = float(sys.argv[3]) if len(sys.argv) > 3 else 15  # 整数百分比的产品建议 15\n\npath = Path.home() \u002F \"Library\u002FApplication Support\u002Fcom.steipete.codexbar\u002Fhistory\" \u002F f\"{provider}.json\"\ndata = json.loads(path.read_text())\nseries = data[\"accounts\"][data[\"preferredAccountKey\"]]       # 只取当前账户\n\n\ndef entries(name, minutes):\n    return {e[\"capturedAt\"]: e for s in series\n            if s[\"name\"] == name and s[\"windowMinutes\"] == minutes for e in s[\"entries\"]}\n\n\ndef ts(t):\n    return datetime.fromisoformat(t.replace(\"Z\", \"+00:00\"))\n\n\ndef close(a, b):                                             # resetsAt 会有 ±1 分钟抖动\n    return abs((ts(a) - ts(b)).total_seconds()) \u003C= 60\n\n\nsession, weekly = entries(\"session\", 300), entries(\"weekly\", 10080)\nsamples = [(t, session[t], weekly[t]) for t in sorted(session.keys() & weekly.keys()) if t >= since]\n\n\ndef same_window(a, b):\n    (_, sa, wa), (tb, sb, wb) = a, b\n    if not all(e.get(\"resetsAt\") for e in (sa, sb, wa, wb)):  # 空闲条目可能没有 resetsAt\n        return False\n    return (close(sa[\"resetsAt\"], sb[\"resetsAt\"]) and close(wa[\"resetsAt\"], wb[\"resetsAt\"])\n            and ts(sb[\"resetsAt\"]) > ts(tb)                   # 后一条还没过 5 小时重置点\n            and sb[\"usedPercent\"] >= sa[\"usedPercent\"]\n            and wb[\"usedPercent\"] >= wa[\"usedPercent\"])\n\n\ngroups = []\nfor s in samples:\n    if groups and same_window(groups[-1][-1], s):\n        groups[-1].append(s)\n    else:\n        groups.append([s])\n\ntotal_s = total_w = 0\nfor g in groups:\n    (ta, sa, wa), (tb, sb, wb) = g[0], g[-1]\n    ds = sb[\"usedPercent\"] - sa[\"usedPercent\"]\n    dw = wb[\"usedPercent\"] - wa[\"usedPercent\"]\n    if ds \u003C min_delta or dw \u003C= 0:\n        continue\n    total_s += ds\n    total_w += dw\n    print(f\"{ta} → {tb}  5h +{ds:g}  周 +{dw:g}  比例 {dw \u002F ds:.1%}\")\n\nif total_s:\n    r = total_w \u002F total_s\n    print(f\"合计：5h +{total_s:g}，周 +{total_w:g} → 一整轮 5h ≈ 周额度的 {r:.1%}，一周约 {1 \u002F r:.1f} 轮\")\nelse:\n    print(\"没有符合条件的样本：放宽起始时间，或调低 5 小时增量下限\")\n","python",[137,315,316,321,326,333,339,345,351,357,363,369,374,380,386,392,397,403,409,415,420,425,431,437,443,448,453,459,465,470,475,481,487,492,497,503,509,514,519,525,531,537,543,549,555,561,567,572,577,583,589,595,601,607,613,618,624,630,636,642,648,654,660,666,672,678,683,689,695,701,707],{"__ignoreMap":135},[140,317,318],{"class":142,"line":143},[140,319,320],{},"#!\u002Fusr\u002Fbin\u002Fenv python3\n",[140,322,323],{"class":142,"line":164},[140,324,325],{},"\"\"\"用 CodexBar 本地历史估算：一整轮 5 小时额度约等于多少周额度。\n",[140,327,329],{"class":142,"line":328},3,[140,330,332],{"emptyLinePlaceholder":331},true,"\n",[140,334,336],{"class":142,"line":335},4,[140,337,338],{},"用法：python3 quota_ratio.py \u003Cclaude|codex|antigravity> [起始时间] [5 小时增量下限]\n",[140,340,342],{"class":142,"line":341},5,[140,343,344],{},"\"\"\"\n",[140,346,348],{"class":142,"line":347},6,[140,349,350],{},"import json\n",[140,352,354],{"class":142,"line":353},7,[140,355,356],{},"import sys\n",[140,358,360],{"class":142,"line":359},8,[140,361,362],{},"from datetime import datetime\n",[140,364,366],{"class":142,"line":365},9,[140,367,368],{},"from pathlib import Path\n",[140,370,372],{"class":142,"line":371},10,[140,373,332],{"emptyLinePlaceholder":331},[140,375,377],{"class":142,"line":376},11,[140,378,379],{},"provider = sys.argv[1]\n",[140,381,383],{"class":142,"line":382},12,[140,384,385],{},"since = sys.argv[2] if len(sys.argv) > 2 else \"1970-01-01\"   # 只用这个时间之后的采样（UTC）\n",[140,387,389],{"class":142,"line":388},13,[140,390,391],{},"min_delta = float(sys.argv[3]) if len(sys.argv) > 3 else 15  # 整数百分比的产品建议 15\n",[140,393,395],{"class":142,"line":394},14,[140,396,332],{"emptyLinePlaceholder":331},[140,398,400],{"class":142,"line":399},15,[140,401,402],{},"path = Path.home() \u002F \"Library\u002FApplication Support\u002Fcom.steipete.codexbar\u002Fhistory\" \u002F f\"{provider}.json\"\n",[140,404,406],{"class":142,"line":405},16,[140,407,408],{},"data = json.loads(path.read_text())\n",[140,410,412],{"class":142,"line":411},17,[140,413,414],{},"series = data[\"accounts\"][data[\"preferredAccountKey\"]]       # 只取当前账户\n",[140,416,418],{"class":142,"line":417},18,[140,419,332],{"emptyLinePlaceholder":331},[140,421,423],{"class":142,"line":422},19,[140,424,332],{"emptyLinePlaceholder":331},[140,426,428],{"class":142,"line":427},20,[140,429,430],{},"def entries(name, minutes):\n",[140,432,434],{"class":142,"line":433},21,[140,435,436],{},"    return {e[\"capturedAt\"]: e for s in series\n",[140,438,440],{"class":142,"line":439},22,[140,441,442],{},"            if s[\"name\"] == name and s[\"windowMinutes\"] == minutes for e in s[\"entries\"]}\n",[140,444,446],{"class":142,"line":445},23,[140,447,332],{"emptyLinePlaceholder":331},[140,449,451],{"class":142,"line":450},24,[140,452,332],{"emptyLinePlaceholder":331},[140,454,456],{"class":142,"line":455},25,[140,457,458],{},"def ts(t):\n",[140,460,462],{"class":142,"line":461},26,[140,463,464],{},"    return datetime.fromisoformat(t.replace(\"Z\", \"+00:00\"))\n",[140,466,468],{"class":142,"line":467},27,[140,469,332],{"emptyLinePlaceholder":331},[140,471,473],{"class":142,"line":472},28,[140,474,332],{"emptyLinePlaceholder":331},[140,476,478],{"class":142,"line":477},29,[140,479,480],{},"def close(a, b):                                             # resetsAt 会有 ±1 分钟抖动\n",[140,482,484],{"class":142,"line":483},30,[140,485,486],{},"    return abs((ts(a) - ts(b)).total_seconds()) \u003C= 60\n",[140,488,490],{"class":142,"line":489},31,[140,491,332],{"emptyLinePlaceholder":331},[140,493,495],{"class":142,"line":494},32,[140,496,332],{"emptyLinePlaceholder":331},[140,498,500],{"class":142,"line":499},33,[140,501,502],{},"session, weekly = entries(\"session\", 300), entries(\"weekly\", 10080)\n",[140,504,506],{"class":142,"line":505},34,[140,507,508],{},"samples = [(t, session[t], weekly[t]) for t in sorted(session.keys() & weekly.keys()) if t >= since]\n",[140,510,512],{"class":142,"line":511},35,[140,513,332],{"emptyLinePlaceholder":331},[140,515,517],{"class":142,"line":516},36,[140,518,332],{"emptyLinePlaceholder":331},[140,520,522],{"class":142,"line":521},37,[140,523,524],{},"def same_window(a, b):\n",[140,526,528],{"class":142,"line":527},38,[140,529,530],{},"    (_, sa, wa), (tb, sb, wb) = a, b\n",[140,532,534],{"class":142,"line":533},39,[140,535,536],{},"    if not all(e.get(\"resetsAt\") for e in (sa, sb, wa, wb)):  # 空闲条目可能没有 resetsAt\n",[140,538,540],{"class":142,"line":539},40,[140,541,542],{},"        return False\n",[140,544,546],{"class":142,"line":545},41,[140,547,548],{},"    return (close(sa[\"resetsAt\"], sb[\"resetsAt\"]) and close(wa[\"resetsAt\"], wb[\"resetsAt\"])\n",[140,550,552],{"class":142,"line":551},42,[140,553,554],{},"            and ts(sb[\"resetsAt\"]) > ts(tb)                   # 后一条还没过 5 小时重置点\n",[140,556,558],{"class":142,"line":557},43,[140,559,560],{},"            and sb[\"usedPercent\"] >= sa[\"usedPercent\"]\n",[140,562,564],{"class":142,"line":563},44,[140,565,566],{},"            and wb[\"usedPercent\"] >= wa[\"usedPercent\"])\n",[140,568,570],{"class":142,"line":569},45,[140,571,332],{"emptyLinePlaceholder":331},[140,573,575],{"class":142,"line":574},46,[140,576,332],{"emptyLinePlaceholder":331},[140,578,580],{"class":142,"line":579},47,[140,581,582],{},"groups = []\n",[140,584,586],{"class":142,"line":585},48,[140,587,588],{},"for s in samples:\n",[140,590,592],{"class":142,"line":591},49,[140,593,594],{},"    if groups and same_window(groups[-1][-1], s):\n",[140,596,598],{"class":142,"line":597},50,[140,599,600],{},"        groups[-1].append(s)\n",[140,602,604],{"class":142,"line":603},51,[140,605,606],{},"    else:\n",[140,608,610],{"class":142,"line":609},52,[140,611,612],{},"        groups.append([s])\n",[140,614,616],{"class":142,"line":615},53,[140,617,332],{"emptyLinePlaceholder":331},[140,619,621],{"class":142,"line":620},54,[140,622,623],{},"total_s = total_w = 0\n",[140,625,627],{"class":142,"line":626},55,[140,628,629],{},"for g in groups:\n",[140,631,633],{"class":142,"line":632},56,[140,634,635],{},"    (ta, sa, wa), (tb, sb, wb) = g[0], g[-1]\n",[140,637,639],{"class":142,"line":638},57,[140,640,641],{},"    ds = sb[\"usedPercent\"] - sa[\"usedPercent\"]\n",[140,643,645],{"class":142,"line":644},58,[140,646,647],{},"    dw = wb[\"usedPercent\"] - wa[\"usedPercent\"]\n",[140,649,651],{"class":142,"line":650},59,[140,652,653],{},"    if ds \u003C min_delta or dw \u003C= 0:\n",[140,655,657],{"class":142,"line":656},60,[140,658,659],{},"        continue\n",[140,661,663],{"class":142,"line":662},61,[140,664,665],{},"    total_s += ds\n",[140,667,669],{"class":142,"line":668},62,[140,670,671],{},"    total_w += dw\n",[140,673,675],{"class":142,"line":674},63,[140,676,677],{},"    print(f\"{ta} → {tb}  5h +{ds:g}  周 +{dw:g}  比例 {dw \u002F ds:.1%}\")\n",[140,679,681],{"class":142,"line":680},64,[140,682,332],{"emptyLinePlaceholder":331},[140,684,686],{"class":142,"line":685},65,[140,687,688],{},"if total_s:\n",[140,690,692],{"class":142,"line":691},66,[140,693,694],{},"    r = total_w \u002F total_s\n",[140,696,698],{"class":142,"line":697},67,[140,699,700],{},"    print(f\"合计：5h +{total_s:g}，周 +{total_w:g} → 一整轮 5h ≈ 周额度的 {r:.1%}，一周约 {1 \u002F r:.1f} 轮\")\n",[140,702,704],{"class":142,"line":703},68,[140,705,706],{},"else:\n",[140,708,710],{"class":142,"line":709},69,[140,711,712],{},"    print(\"没有符合条件的样本：放宽起始时间，或调低 5 小时增量下限\")\n",[15,714,715],{},"运行：",[130,717,719],{"className":132,"code":718,"language":134,"meta":135,"style":135},"python3 quota_ratio.py claude 2026-10-15\n",[137,720,721],{"__ignoreMap":135},[140,722,723,726,729,731],{"class":142,"line":143},[140,724,725],{"class":146},"python3",[140,727,728],{"class":170}," quota_ratio.py",[140,730,210],{"class":170},[140,732,733],{"class":170}," 2026-10-15\n",[15,735,736],{},"我在 10 月 22 日晚上的输出：",[130,738,743],{"className":739,"code":741,"language":742,"meta":135},[740],"language-text","2026-10-19T03:59:15Z → 2026-10-19T07:59:31Z  5h +56  周 +8  比例 14.3%\n2026-10-19T14:57:59Z → 2026-10-19T18:55:03Z  5h +19  周 +2  比例 10.5%\n2026-10-20T10:56:43Z → 2026-10-20T14:57:51Z  5h +91  周 +11  比例 12.1%\n2026-10-22T02:59:05Z → 2026-10-22T06:56:11Z  5h +64  周 +9  比例 14.1%\n2026-10-22T07:56:59Z → 2026-10-22T11:52:47Z  5h +44  周 +6  比例 13.6%\n合计：5h +274，周 +36 → 一整轮 5h ≈ 周额度的 13.1%，一周约 7.6 轮\n","text",[137,744,741],{"__ignoreMap":135},[15,746,747],{},"脚本做了三件事：",[749,750,751,759,762],"ol",{},[114,752,753,754,188,756,758],{},"只取当前账户、起始时间之后的采样，",[137,755,229],{},[137,757,237],{}," 按同一个采样时间配对。",[114,760,761],{},"相邻两条的两个重置时间都在 60 秒内一致、后一条还没过重置点、两项都没有减少，才算同一个窗口。",[114,763,764],{},"每个窗口用首尾两条算增量，丢掉 5 小时增量太小的窗口，最后先加总再相除。",[15,766,767],{},"单个窗口的比例在 10.5% 到 14.3% 之间跳，是整数取整造成的：周增量差 1 个点，比例就差好几个百分点。合并后是 13.1%，和中午挑出的两段 12.5% 都在误差范围内，所以我按 12.5%–13% 做预算。",[15,769,770],{},"另外两家换个参数：",[130,772,774],{"className":132,"code":773,"language":134,"meta":135,"style":135},"python3 quota_ratio.py codex 2026-10-20T07:23:40Z   # 从本周周窗口开始的时间算起（UTC）\npython3 quota_ratio.py antigravity 2026-10-14 2     # 百分比是小数，但会回落，下限设成 2\n",[137,775,776,792],{"__ignoreMap":135},[140,777,778,780,782,785,788],{"class":142,"line":143},[140,779,725],{"class":146},[140,781,728],{"class":170},[140,783,784],{"class":170}," codex",[140,786,787],{"class":170}," 2026-10-20T07:23:40Z",[140,789,791],{"class":790},"sJ8bj","   # 从本周周窗口开始的时间算起（UTC）\n",[140,793,794,796,798,801,804,807],{"class":142,"line":164},[140,795,725],{"class":146},[140,797,728],{"class":170},[140,799,800],{"class":170}," antigravity",[140,802,803],{"class":170}," 2026-10-14",[140,805,806],{"class":150}," 2",[140,808,809],{"class":790},"     # 百分比是小数，但会回落，下限设成 2\n",[15,811,812],{},"Codex 得到 15.6%，和中午在对话里算出的 15.7% 基本一致。Antigravity 得到 28.9%；中午挑出的三段样本都是 2\u002F7（28.57%），两个结果接近，但它的数据比另外两家乱，后面单独说。",[125,814,816],{"id":815},"step-4把比例换算成每天的目标","Step 4：把比例换算成每天的目标",[15,818,819],{},"公式只有两个：",[111,821,822,825],{},[114,823,824],{},"一周约有 1 \u002F r 轮。",[114,826,827],{},"每周用 D 天，每天要用掉一轮的 1 \u002F (D × r)。",[22,829,830,843],{},[25,831,832],{},[28,833,834,837,840],{},[31,835,836],{},"账户（r）",[31,838,839],{},"每周用 7 天",[31,841,842],{},"每周用 5 天",[44,844,845,856,867],{},[28,846,847,850,853],{},[49,848,849],{},"Claude（12.5%）",[49,851,852],{},"每天一整轮，其中一天再加一轮",[49,854,855],{},"每天两个窗口，各用约 80%",[28,857,858,861,864],{},[49,859,860],{},"Codex（16%）",[49,862,863],{},"每天一轮的约 90%",[49,865,866],{},"每天一轮的 125%，比如上午 80%，重置后再用 45%",[28,868,869,872,875],{},[49,870,871],{},"Antigravity（28.6%）",[49,873,874],{},"每天半轮",[49,876,877],{},"每天一轮的 70%",[15,879,880,881,884,885,888],{},"周中可以重新算：剩余周额度 ÷ 剩余天数 ÷ r，就是从今天起每天要用掉的轮数。也可以直接比较「周窗口已经过去的时间比例」和「已用的周额度」。CodexBar CLI 输出的 JSON 里有一个 ",[137,882,883],{},"pace"," 字段，其中的 ",[137,886,887],{},"expectedUsedPercent"," 和这个时间比例对得上。",[15,890,891],{},"10 月 22 日 12:54，我的 Codex 周额度用了 27%，本周时间也过去了约 27%，正好跟上。剩下 5.1 天、73% 的周额度，每天用掉一轮的九成左右，就能接近用满。",[125,893,895],{"id":894},"step-5临近周重置先算还来不来得及","Step 5：临近周重置，先算还来不来得及",[15,897,898],{},"上限 = 当前周额度 +（当前窗口剩余 + 重置前还能开始并用满的窗口数 × 100%）× r",[15,900,901],{},"Claude 那天的情况：11:54 时周额度 46%，22:00 重置；5 小时窗口已用 85%，15:20 重置。用完剩下的 15%，15:20 之后用满一轮，约 20:20 再开一轮，并赶在 22:00 前用满：46% +（15 + 100 + 100）× 12.5% ≈ 73%。剩下四分之一多的周额度，这周已经用不上了。",[10,903,905],{"id":904},"_4-踩坑记录与排错清单","4. 踩坑记录与排错清单",[22,907,908,921],{},[25,909,910],{},[28,911,912,915,918],{},[31,913,914],{},"现象",[31,916,917],{},"原因",[31,919,920],{},"解法",[44,922,923,937,955,985,996,1007,1018,1029],{},[28,924,925,931,934],{},[49,926,927,928],{},"脚本里写死最新时间戳，一分钟后再跑就报 ",[137,929,930],{},"KeyError",[49,932,933],{},"当前小时的采样会被同一小时内的新采样覆盖",[49,935,936],{},"每次重新读文件，按条件筛选，不写死时间戳",[28,938,939,946,952],{},[49,940,941,942,945],{},"同一个窗口的 ",[137,943,944],{},"resetsAt"," 对不上",[49,947,948,949,951],{},"空闲时 ",[137,950,944],{}," 是「采样时间 + 窗口长度」的占位值；重置时间还有 ±1 分钟抖动",[49,953,954],{},"留 60 秒容差；遇到占位值或缺字段的条目，就当作窗口断开",[28,956,957,964,974],{},[49,958,959,960,963],{},"Antigravity 的 ",[137,961,962],{},"primary"," 不是 5 小时",[49,965,966,967,969,970,973],{},"各家字段位置不同：Antigravity 的 ",[137,968,962],{}," 是 Gemini 周额度，",[137,971,972],{},"secondary"," 是 Claude\u002FGPT 5 小时",[49,975,976,977,980,981,984],{},"按 ",[137,978,979],{},"windowMinutes"," 和 bucket ",[137,982,983],{},"id"," 识别窗口",[28,986,987,990,993],{},[49,988,989],{},"小组件显示 80%，CLI 显示 85%",[49,991,992],{},"小组件是缓存",[49,994,995],{},"当前状态以 CLI 为准",[28,997,998,1001,1004],{},[49,999,1000],{},"相邻两次采样的比例在 12.5% 到 20% 之间跳",[49,1002,1003],{},"整数取整误差",[49,1005,1006],{},"按窗口取首尾，只用增量大的窗口，加总后再除",[28,1008,1009,1012,1015],{},[49,1010,1011],{},"Antigravity 的用量会回落，两项同时增加的相邻采样，比例也从约 4% 到 190% 都有",[49,1013,1014],{},"回落原因没查明；额度还分普通 Gemini、Gemini Argon、Claude\u002FGPT 几个池",[49,1016,1017],{},"只用两项同步增加、增量足够大的窗口；结果只用于普通 Gemini 池",[28,1019,1020,1023,1026],{},[49,1021,1022],{},"想算 Antigravity 里 Claude 比 Gemini 贵几倍",[49,1024,1025],{},"Claude 和 GPT 是一个合并池，历史里只有两条 0% 记录",[49,1027,1028],{},"现有数据算不出来；要两边跑可比的任务，记下模型、token 数和额度增量",[28,1030,1031,1034,1043],{},[49,1032,1033],{},"CLI 输出里有邮箱和组织名",[49,1035,1036,184,1039,1042],{},[137,1037,1038],{},"accountEmail",[137,1040,1041],{},"accountOrganization"," 字段",[49,1044,1045],{},"截图或贴出之前删掉",[10,1047,1049],{"id":1048},"_5-小结与适用边界","5. 小结与适用边界",[15,1051,1052],{},"如果你也在用 CodexBar，想给自己的订阅定一个每天的节奏，这个方法可以直接用。几条边界：",[111,1054,1055,1058,1061,1064],{},[114,1056,1057],{},"比例是单个账户、单个周期的实测。换套餐（比如 Claude Max），换主力模型，或者大量使用云端任务，都要重新跑一遍脚本。",[114,1059,1060],{},"Codex 的周重置时间会变。这一周的历史里，它的周窗口三次提前归零并重新计时，原因我还没查。排期以 CodexBar 显示的重置时间为准。",[114,1062,1063],{},"免费重置另算。我的 Codex 账户有 3 次「Full reset (Weekly + 5 hr)」，每次发放 30 天后过期；Claude 的 limit reset 要在网页或 Claude Desktop 的 Settings > Usage 里使用。",[114,1065,1066],{},"Antigravity 的 28.6% 把握最低，回落的原因还没查明，暂时只当预算参考。",[15,1068,1069],{},"后续测到新数据，会继续更新补充。",[1071,1072,1073],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":135,"searchDepth":164,"depth":164,"links":1075},[1076,1077,1078,1085,1086],{"id":12,"depth":164,"text":13},{"id":99,"depth":164,"text":100},{"id":122,"depth":164,"text":123,"children":1079},[1080,1081,1082,1083,1084],{"id":127,"depth":328,"text":128},{"id":222,"depth":328,"text":223},{"id":300,"depth":328,"text":301},{"id":815,"depth":328,"text":816},{"id":894,"depth":328,"text":895},{"id":904,"depth":164,"text":905},{"id":1048,"depth":164,"text":1049},"coder","2026-10-22","基于 CodexBar 本地历史数据，测算 Claude Pro、ChatGPT Codex 与 Antigravity 的 5 小时窗口折合周额度比例，附 Python 提取脚本与每周用量排期策略。","md",null,{},"\u002Fzh\u002Fblog\u002Fcodexbar-5h-vs-weekly-quota-calculation",{"title":5,"description":1089},"codexbar-5h-vs-weekly-quota-calculation","publish","zh\u002Fblog\u002Fcodexbar-5h-vs-weekly-quota-calculation",[1099,1100,1101,1102,1103],"CodexBar","Claude","Codex","Antigravity","AI Quota","35U8mpAKlV9M0Gybn1vYK2YaKqJkHpMHeiP6DEsXwno",[1106,1112],{"title":1107,"path":1108,"stem":1109,"slug":1110,"date":1111,"children":-1},"告别“先用 Mac Preview”：Antigravity 2.28.0 上线内置 PDF 查看器与内置浏览器","\u002Fzh\u002Fblog\u002Fantigravity-2-28-0-builtin-pdf-viewer-browser","zh\u002Fblog\u002Fantigravity-2-28-0-builtin-pdf-viewer-browser","antigravity-2-28-0-builtin-pdf-viewer-browser","2026-10-28",{"title":1113,"path":1114,"stem":1115,"slug":1116,"date":1117,"children":-1},"让 ChatGPT 操作 Chrome：找到 Moodle 题库并修改题目","\u002Fzh\u002Fblog\u002Fchatgpt-browser-moodle-question-bank","zh\u002Fblog\u002Fchatgpt-browser-moodle-question-bank","chatgpt-browser-moodle-question-bank","2026-10-21",1793891959771]