 context window 滿了?先看 sessions 與 jsonl 再?zèng)Q定 codex clear)
1. Codex 長(zhǎng)會(huì)話報(bào) context window 滿了先別急著 codex clear你大概率是在一個(gè)跑了很久的 Codex 會(huì)話里突然看到這么一行Codex ran out of room in the models context window. Start a new conversation or clear earlier history before retrying.第一反應(yīng)通常是敲codex clear或者干脆重開(kāi)一個(gè)會(huì)話。但如果你已經(jīng)試過(guò)這兩招還是不行那說(shuō)明問(wèn)題不在「當(dāng)前這一輪對(duì)話」而在 Codex 落盤(pán)的會(huì)話歷史文件里。Codex 會(huì)把每一輪交互按天寫(xiě)進(jìn)~/.codex/sessions/下的 jsonl 文件一個(gè)會(huì)話跑久了單個(gè) jsonl 漲到十幾 MB 很常見(jiàn)我見(jiàn)過(guò) 18M 的。context window 報(bào)錯(cuò)本質(zhì)上是「喂給模型的 token 超了」而 Codex 在恢復(fù)會(huì)話時(shí)會(huì)把這些歷史重新拼進(jìn)上下文所以哪怕你codex clear了當(dāng)前屏幕底層 jsonl 還在重新進(jìn)入會(huì)話照樣爆。這篇就按「先定位、再?zèng)Q定清不清」的順序走一遍怎么找到 sessions 目錄、怎么讀 jsonl 判斷占用來(lái)源、codex clear和新建會(huì)話到底差在哪、以及把 endpoint 切到 TaoToken 之后怎么用一次可復(fù)現(xiàn)的請(qǐng)求驗(yàn)證配置真的生效。適合已經(jīng)在用 Codex CLI、被長(zhǎng)會(huì)話卡住、又不想無(wú)腦刪庫(kù)的人。核心檢索詞先擺出來(lái)Codex context window 報(bào)錯(cuò)排查、codex sessions jsonl 清理、codex clear 與新建會(huì)話區(qū)別。這三個(gè)詞基本覆蓋了你從報(bào)錯(cuò)到解決的完整路徑。先說(shuō)結(jié)論方向免得你中途跑偏codex clear清的是當(dāng)前會(huì)話的上下文視圖新建會(huì)話是換一條干凈的上下文線而真正占空間的歷史躺在 jsonl 里。三者不是一回事混著用就會(huì)覺(jué)得「怎么清都沒(méi)用」。下面一步步來(lái)。2. 定位 ~/.codex/sessions 與 jsonl 占用來(lái)源Codex 的會(huì)話數(shù)據(jù)默認(rèn)落在用戶(hù)主目錄下的.codex里。不同系統(tǒng)路徑略有差異但結(jié)構(gòu)一致# macOS / Linux ls -la ~/.codex/ # Windows PowerShell Get-ChildItem $env:USERPROFILE\.codex你會(huì)看到類(lèi)似這樣的目錄結(jié)構(gòu)~/.codex/ ├── sessions/ │ └── 2025/ │ └── 09/ │ └── 23/ │ ├── 0f3a1c2e-....jsonl │ └── 7b9d4a10-....jsonl ├── config.toml └── auth.jsonsessions下面按年/月/日分層每天一個(gè)目錄每個(gè)會(huì)話一個(gè)session-id.jsonl。文件名就是會(huì)話 ID方便你對(duì)照。先看哪個(gè)文件大# 找出 sessions 下最大的 10 個(gè) jsonl find ~/.codex/sessions -name *.jsonl -type f -exec du -h {} | sort -rh | head -n 10Windows 上用 PowerShellGet-ChildItem -Path $env:USERPROFILE\.codex\sessions -Recurse -Filter *.jsonl | Sort-Object Length -Descending | Select-Object -First 10 FullName, {NMB;E{[math]::Round($_.Length/1MB,2)}}跑完你就能看到那個(gè) 18M 的元兇。接下來(lái)別急著刪先讀一下它判斷占用到底來(lái)自哪。jsonl 是「一行一個(gè) JSON 對(duì)象」每行通常帶type、role、content之類(lèi)的字段。用jq統(tǒng)計(jì)一下每行的類(lèi)型分布# 統(tǒng)計(jì)各 type 出現(xiàn)次數(shù)先裝 jqbrew install jq / apt install jq jq -r .type // unknown ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl | sort | uniq -c | sort -rn如果沒(méi)裝 jq用 Python 一行也能看python3 -c import json,collections,sys ccollections.Counter() for line in open(sys.argv[1]): lineline.strip() if not line: continue try: c[json.loads(line).get(type,unknown)]1 except: c[parse_error]1 print(c.most_common()) ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl典型輸出會(huì)告訴你大頭在哪。常見(jiàn)占用來(lái)源有三類(lèi)一是超長(zhǎng)的工具調(diào)用返回比如你讓它讀了一個(gè)大文件整段內(nèi)容被塞進(jìn)歷史二是反復(fù)的失敗重試同一段報(bào)錯(cuò)被記了很多遍三是會(huì)話本身輪次太多累積起來(lái)自然大。看清來(lái)源再?zèng)Q定是「刪早期行」還是「整段丟棄」。注意jsonl 是純文本刪之前先備份一份cp xxx.jsonl xxx.jsonl.bak改壞了還能回滾。這一步的目標(biāo)不是馬上清理而是讓你心里有數(shù)到底是哪幾行把上下文撐爆的。定位準(zhǔn)了后面codex clear還是新建會(huì)話你都能選對(duì)。3. 可復(fù)制配置把 endpoint 切到 TaoToken 并控制上下文排查完歷史另一個(gè)容易被忽略的點(diǎn)是 endpoint 和模型配置。Codex 默認(rèn)走官方 endpoint如果你想讓長(zhǎng)會(huì)話更穩(wěn)、或者單純想換個(gè)入口可以把 base URL 指到 TaoToken。先拿 Key打開(kāi) https://taotoken.net/api-keys 生成一個(gè) API Key然后編輯~/.codex/config.toml。Codex 的配置是 TOML 格式路徑固定為~/.codex/config.toml。一個(gè)可復(fù)制的最小片段如下# ~/.codex/config.toml model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api responses這里三件套要寫(xiě)全缺一個(gè)都會(huì)連不上Base URLhttps://taotoken.net/apiAPI Key通過(guò)環(huán)境變量TAOTOKEN_API_KEY注入別硬編碼進(jìn)文件Model IDmodel字段比如gpt-5-codex按你實(shí)際要用的填環(huán)境變量這樣設(shè)# macOS / Linux寫(xiě)進(jìn) ~/.zshrc 或 ~/.bashrc export TAOTOKEN_API_KEYsk-你的key # Windows PowerShell當(dāng)前會(huì)話 $env:TAOTOKEN_API_KEYsk-你的key如果你用的是auth.json那套部分 Codex 版本會(huì)讀~/.codex/auth.json結(jié)構(gòu)長(zhǎng)這樣{ OPENAI_API_KEY: sk-你的key, OPENAI_BASE_URL: https://taotoken.net/api }提示config.toml和auth.json二選一即可別同時(shí)配兩套互相打架。改完重啟 Codex 進(jìn)程配置才會(huì)重新加載。關(guān)于上下文控制Codex 本身沒(méi)有「一鍵壓縮」的開(kāi)關(guān)但你可以通過(guò)配置減少歷史回灌。比如把model_provider指到 TaoToken 后配合更短的會(huì)話策略使用。真正壓上下文還是靠第 4 步的清理動(dòng)作。配置這塊先保證 endpoint 通、Key 對(duì)、Model ID 存在這是后面驗(yàn)證的前提。如果你更習(xí)慣用 Coding Plan 做長(zhǎng)期編碼任務(wù)可以在 https://taotoken.net/coding-plan 看套餐長(zhǎng)會(huì)話場(chǎng)景下按量或包月自己權(quán)衡。接入文檔在 https://taotoken.net/doc 配置字段有疑問(wèn)對(duì)著查。4. 驗(yàn)證請(qǐng)求一次可復(fù)現(xiàn)的清理前后對(duì)照配置改完先做一次最小驗(yàn)證確認(rèn) endpoint 真的通了。用 curl 打一發(fā)curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY返回里能看到模型列表就說(shuō)明 Key 和 Base URL 沒(méi)問(wèn)題。接著回到 Codex 里跑一句最簡(jiǎn)單的codex print hello如果這一步就報(bào)401或local proxy failed先回第 5 步排錯(cuò)別往下走?,F(xiàn)在做清理前后的對(duì)照。假設(shè)你鎖定了那個(gè) 18M 的 jsonl先記錄清理前的狀態(tài)# 清理前文件大小 行數(shù) ls -lh ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl wc -l ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl然后備份并刪掉早期歷史。思路是保留最近 N 行把前面的丟掉# 備份 cp ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl \ ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl.bak # 只保留最后 200 行按需調(diào)整 tail -n 200 ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl.bak \ ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl再對(duì)比一次ls -lh ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl wc -l ~/.codex/sessions/2025/09/23/0f3a1c2e-....jsonl文件從 18M 掉到幾百 KB行數(shù)從幾萬(wàn)掉到 200這就是可復(fù)現(xiàn)的對(duì)照。然后重新進(jìn)入這個(gè)會(huì)話再發(fā)一條消息看 context window 報(bào)錯(cuò)是否消失。如果消失說(shuō)明占用確實(shí)來(lái)自被刪的早期歷史如果還在說(shuō)明當(dāng)前會(huì)話的活躍上下文本身就超了那就得新建會(huì)話。codex clear和新建會(huì)話的取舍在這里就清楚了codex clear只清當(dāng)前視圖jsonl 不動(dòng)適合「當(dāng)前屏幕太亂但歷史還想留」新建會(huì)話是徹底換一條上下文線適合「這個(gè)會(huì)話已經(jīng)沒(méi)救、歷史也不需要」。而手動(dòng)裁剪 jsonl 是介于兩者之間——保留會(huì)話 ID只砍掉撐爆的部分。驗(yàn)證動(dòng)作建議固定成一套改配置 → curl 測(cè) models → codex 跑 hello → 裁剪 jsonl → 重進(jìn)會(huì)話發(fā)消息。每次排查都走一遍出問(wèn)題能快速定位在哪一環(huán)。5. 常見(jiàn)報(bào)錯(cuò)排查401、local proxy failed、reading choices、OAuth排錯(cuò)這塊按真實(shí)報(bào)錯(cuò)對(duì)照別憑感覺(jué)猜。401 UnauthorizedKey 沒(méi)生效。先確認(rèn)環(huán)境變量在當(dāng)前 shell 里真的存在echo $TAOTOKEN_API_KEY看有沒(méi)有值。如果為空說(shuō)明export沒(méi)寫(xiě)進(jìn)啟動(dòng)文件或者你開(kāi)的是新終端沒(méi) source。Windows 上注意$env:只在當(dāng)前會(huì)話有效要持久化得用setx。另外檢查config.toml里的env_key名字和實(shí)際環(huán)境變量名是否一致大小寫(xiě)敏感。local proxy failedCodex 嘗試走本地代理但沒(méi)起來(lái)。檢查config.toml里base_url是不是寫(xiě)成了http://localhost:xxxx之類(lèi)正常應(yīng)該直連https://taotoken.net/api。如果你之前配過(guò)別的 provider殘留的 proxy 字段要?jiǎng)h掉。reading choices相關(guān)報(bào)錯(cuò)通常是響應(yīng)體格式和wire_api不匹配。Codex 的wire_api有responses和chat兩種填錯(cuò)會(huì)解析失敗。用 TaoToken 時(shí)按文檔填responses如果報(bào)錯(cuò)就換成chat試。這個(gè)字段在[model_providers.taotoken]段里。OAuth報(bào)錯(cuò)說(shuō)明 Codex 還在走官方登錄態(tài)沒(méi)切到 API Key 模式。檢查auth.json里是不是還留著舊的 OAuth token清掉改用OPENAI_API_KEYOPENAI_BASE_URL那套?;蛘叽_認(rèn)config.toml的model_provider指向了taotoken而不是默認(rèn) provider。還有一個(gè)高頻坑改了config.toml但沒(méi)重啟 Codex。配置是啟動(dòng)時(shí)讀的熱改不生效。每次改完pkill codex再重開(kāi)。對(duì)照表方便你快速定位報(bào)錯(cuò)大概率原因處理401Key 未注入 / 名字不符檢查環(huán)境變量與 env_keylocal proxy failedbase_url 指向本地改為 https://taotoken.net/apireading choiceswire_api 填錯(cuò)responses / chat 互換OAuth仍走官方登錄態(tài)清 auth.json改用 API Key排錯(cuò)時(shí)優(yōu)先看 Codex 的啟動(dòng)日志它會(huì)打印實(shí)際加載的 provider 和 base_url比猜快得多。6. 長(zhǎng)會(huì)話繼續(xù)用把清理和接入固定成習(xí)慣走到這里你應(yīng)該已經(jīng)能自己定位那個(gè)撐爆 context window 的 jsonl 了。我的習(xí)慣是每次長(zhǎng)會(huì)話結(jié)束前先du -h看一眼當(dāng)天 jsonl 大小超過(guò) 5M 就順手tail -n 300裁一下備份留著。這樣下次進(jìn)會(huì)話不會(huì)一上來(lái)就爆。endpoint 切到 TaoToken 之后配置就固定成config.toml里那三件套Key 走環(huán)境變量別寫(xiě)死。需要換模型時(shí)只改model字段provider 段不動(dòng)。驗(yàn)證動(dòng)作保持那套固定流程出問(wèn)題按第 5 步的報(bào)錯(cuò)表對(duì)號(hào)入座。如果你要長(zhǎng)期跑編碼或 Agent 任務(wù)長(zhǎng)會(huì)話是常態(tài)與其每次爆了再救不如把「定期裁 jsonl 固定 endpoint 配置」變成肌肉記憶。接入細(xì)節(jié)對(duì)著 https://taotoken.net/doc 查模型對(duì)話想先試效果可以去 https://taotoken.net/chat Key 在 https://taotoken.net/api-keys 生成。配置改完記得重啟 Codex這一步別省。