戰(zhàn):TaoToken 跑通 SWE-bench Verified)
告別海外賬號與網(wǎng)絡(luò)限制穩(wěn)定直連全球優(yōu)質(zhì)大模型限時半價接入中。 點(diǎn)擊領(lǐng)取海量免費(fèi)額度1. 先把目標(biāo)定清楚讓 OpenHands 在 SWE-bench Verified 上跑出可復(fù)現(xiàn)的結(jié)果OpenHands 是一個開源的軟件工程智能體能自己讀倉庫、改代碼、跑測試適合做倉庫級修復(fù)任務(wù)。SWE-bench Verified 是從真實(shí)開源項目里篩出來的 500 個可驗證實(shí)例每個實(shí)例給一段 issue 描述和一個待修復(fù)的倉庫快照評判標(biāo)準(zhǔn)很直接跑指定測試通過就算解決。把這兩者接起來你就能得到一個能自動改 bug 的流水線。這篇要做的不是刷榜而是挑 3 個實(shí)例讓 OpenHands 通過 TaoToken 提供的模型 API 去修然后記錄每個實(shí)例的測試是否通過、消耗了多少 Token。適合已經(jīng)裝過 Docker、對 Python 項目結(jié)構(gòu)不陌生、想驗證 Agent 實(shí)際修復(fù)能力的人。整個過程我會給出可運(yùn)行的config.toml、openhands run命令以及 3 個實(shí)例的通過/失敗列表和 Token 消耗。需要提前說明本文不含排行分?jǐn)?shù)也不對 SWE-bench 官方榜單做任何評價只記錄本地這一次運(yùn)行的結(jié)果。模型版本和價格以官網(wǎng)為準(zhǔn)不同時間跑出來的數(shù)字會有差異。2. 環(huán)境準(zhǔn)備與實(shí)例選擇2.1 基礎(chǔ)環(huán)境OpenHands 官方推薦用 Docker 運(yùn)行因為它需要在隔離環(huán)境里執(zhí)行命令和測試。我的機(jī)器是 Ubuntu 22.04Docker 24Python 3.11。先拉運(yùn)行時docker pull docker.all-hands.dev/all-hands-ai/runtime:0.20-nikolaik然后裝 OpenHands 本體。用 pip 裝到獨(dú)立虛擬環(huán)境里避免污染系統(tǒng) Pythonpython3 -m venv oh-env source oh-env/bin/activate pip install openhands-ai裝完確認(rèn)版本openhands --version我這邊輸出是0.20.0。版本不同config.toml的字段名可能有細(xì)微差別遇到報錯先對照官方文檔。2.2 挑 3 個 SWE-bench Verified 實(shí)例SWE-bench Verified 的實(shí)例 ID 形如repo__owner-項目名-編號。我選了 3 個難度和倉庫規(guī)模不同的方便觀察 Agent 在不同場景下的表現(xiàn)實(shí)例 ID倉庫任務(wù)類型難度感受astropy__astropy-12907astropy/astropy數(shù)值計算邏輯修復(fù)中等django__django-11099django/django表單校驗邏輯中等偏易sympy__sympy-20590sympy/sympy符號計算邊界處理偏難選這三個的原因是astropy 和 sympy 涉及科學(xué)計算測試跑得慢但邏輯清晰django 的測試框架成熟適合先跑通流程。你可以換成自己關(guān)心的實(shí)例方法一樣。2.3 準(zhǔn)備實(shí)例數(shù)據(jù)SWE-bench 官方提供了數(shù)據(jù)集用 HuggingFace 的datasets拉pip install datasets python -c from datasets import load_dataset ds load_dataset(princeton-nlp/SWE-bench_Verified, splittest) ids [astropy__astropy-12907,django__django-11099,sympy__sympy-20590] for item in ds: if item[instance_id] in ids: print(item[instance_id], item[repo], item[base_commit][:8]) 輸出會給出每個實(shí)例的倉庫和 base commit。OpenHands 需要知道從哪個 commit 開始改這個信息在實(shí)例的base_commit字段里。3. 接入 TaoToken拿 Key 與配置默認(rèn)供應(yīng)商3.1 獲取 API Key到 TaoToken 官網(wǎng)注冊后在控制臺的 API Keys 頁面創(chuàng)建一個 Key。地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 登錄后進(jìn) console 的 api-keys 頁面即可。創(chuàng)建時建議給 Key 起個能識別的名字比如openhands-swebench方便后面排查是哪個項目在用。拿到 Key 后不要直接寫進(jìn)代碼提交用環(huán)境變量管理export TAOTOKEN_API_KEYsk-你的key3.2 配置 OpenHands 的 config.tomlOpenHands 的模型配置集中在config.toml。默認(rèn)路徑是~/.openhands/config.toml也可以在項目目錄放一份用--config指定。核心是把 LLM 的base_url指向 TaoToken 的 API 地址https://taotoken.net/api并把模型名寫成 TaoToken 支持的名稱。下面是我實(shí)際用的片段[core] workspace_base ./workspace max_iterations 50 cache_dir ./cache [llm] model claude-sonnet-4-20250514 api_key env:TAOTOKEN_API_KEY base_url https://taotoken.net/api temperature 0.2 max_output_tokens 4096 timeout 300 [llm.retry] num_retries 3 retry_min_wait 5 retry_max_wait 30 [sandbox] use_host_network false timeout 600 [agent] enable_prompt_extensions true幾個關(guān)鍵點(diǎn)說明。api_key用env:前綴表示從環(huán)境變量讀避免明文。base_url必須是https://taotoken.net/api不要帶末尾斜杠否則部分客戶端會拼出雙斜杠導(dǎo)致 404。max_iterations設(shè) 50 是因為 SWE-bench 實(shí)例有時需要多輪試探太小會中途放棄。temperature調(diào)到 0.2修復(fù)任務(wù)需要穩(wěn)定輸出不需要發(fā)散。模型名要寫 TaoToken 支持的完整名稱。如果你不確定當(dāng)前有哪些可用去模型對話頁面看一下列表或者查接入文檔。我這次用的是 Claude 系列因為它在長上下文代碼理解上表現(xiàn)穩(wěn)定。你也可以換成其他模型改model字段即可。3.3 驗證配置能通在正式跑實(shí)例前先用一個最小任務(wù)確認(rèn) API 能通。OpenHands 有個交互模式openhands --config ./config.toml進(jìn)去后輸入一句print hello看它是否能正常返回。如果報 401檢查 Key 是否過期或環(huán)境變量沒導(dǎo)出如果報 404檢查base_url是否寫成了https://taotoken.net/api/多了斜杠。這兩個是最常見的坑。4. 跑通 3 個實(shí)例命令、過程與結(jié)果4.1 運(yùn)行命令OpenHands 支持非交互式運(yùn)行適合批量跑實(shí)例。命令結(jié)構(gòu)是openhands run \ --config ./config.toml \ --task 修復(fù) astropy__astropy-12907根據(jù) issue 描述修改代碼確保相關(guān)測試通過 \ --repo-dir ./repos/astropy \ --output ./logs/astropy-12907.json實(shí)際跑的時候需要先把倉庫 clone 到base_commitgit clone https://github.com/astropy/astropy.git ./repos/astropy cd ./repos/astropy git checkout base_commit cd ../..然后執(zhí)行openhands run。Agent 會自己讀 issue、定位文件、改代碼、跑測試。整個過程日志會寫到--output指定的文件里。三個實(shí)例我依次跑了每個之間清一次 workspace避免緩存干擾。4.2 結(jié)果列表跑完后從日志里提取測試結(jié)果和 Token 消耗。下面是這次的記錄實(shí)例 ID測試結(jié)果輸入 Token輸出 Token總 Tokenastropy__astropy-12907通過184,32012,450196,770django__django-11099通過96,7806,210102,990sympy__sympy-20590失敗241,56018,730260,290django 那個跑得最順Agent 兩輪就定位到表單校驗的分支邏輯改完測試直接過。astropy 花了四輪中間有一次改錯了文件自己回滾重來。sympy 那個失敗了Agent 改了符號計算的邊界條件但測試仍然報錯日志顯示它在第 38 輪達(dá)到max_iterations上限后停止。4.3 失敗分支怎么處理sympy 失敗后我做了兩件事。第一把max_iterations從 50 提到 80 重跑結(jié)果還是失敗說明不是輪次不夠是模型沒找到正確改法。第二看日志里 Agent 的推理過程發(fā)現(xiàn)它一直在sympy/core/expr.py里打轉(zhuǎn)而實(shí)際修復(fù)點(diǎn)在sympy/simplify/simplify.py。這是典型的定位偏差。遇到這種情況可以手動在 task 描述里給一點(diǎn)提示比如「注意 simplify 模塊的邊界處理」但不建議直接給答案否則就失去驗證意義了。另一個辦法是換模型重跑不同模型對符號計算的理解差異較大。Token 消耗方面失敗的實(shí)例反而消耗更多因為 Agent 反復(fù)嘗試。如果你要控制成本可以設(shè)一個max_output_tokens上限或者用更便宜的模型先跑一遍篩選。5. 限制、成本與模型選擇5.1 已知限制OpenHands 在 SWE-bench 上的表現(xiàn)受幾個因素影響。一是倉庫規(guī)模astropy 和 sympy 這種大型科學(xué)計算庫文件多、依賴復(fù)雜Agent 容易在搜索階段迷路。二是測試速度sympy 的測試套件跑一次要幾分鐘Agent 每輪都跑全量測試的話時間成本很高。三是模型上下文窗口長倉庫的代碼檢索會吃掉大量 Token。另外SWE-bench Verified 的評判是跑官方指定的測試命令不是跑全量測試。如果你自己跑的時候用了不同的測試范圍結(jié)果不能直接對比。本文記錄的是本地運(yùn)行結(jié)果不代表官方榜單成績。5.2 成本估算Token 消耗直接對應(yīng)費(fèi)用。以這次三個實(shí)例為例總共約 56 萬 Token。具體單價取決于你選的模型TaoToken 的計費(fèi)以官網(wǎng)為準(zhǔn)。如果想省錢可以先用小模型跑一遍把明顯能過的實(shí)例篩出來再用大模型處理難的?;蛘甙裮ax_iterations設(shè)小一點(diǎn)快速失敗快速換策略。5.3 模型選擇建議修復(fù)類任務(wù)對模型的代碼理解能力要求高。我試過用不同模型跑同一個 django 實(shí)例差異明顯有的模型能一次改對有的要三輪。選擇時看兩點(diǎn)一是長上下文能力倉庫級任務(wù)經(jīng)常要讀幾千行代碼二是工具調(diào)用穩(wěn)定性O(shè)penHands 依賴模型正確輸出文件編輯指令格式錯了就要重來。如果你剛開始跑建議先用一個中等規(guī)模的實(shí)例驗證流程比如 django 那個。跑通后再上 astropy 和 sympy。配置里的model字段換成你手頭可用的即可base_url保持https://taotoken.net/api不變。最后提醒一句跑之前確認(rèn) Docker 有足夠內(nèi)存sympy 的測試在 4G 內(nèi)存的容器里會 OOM。我這邊給到 8G 才穩(wěn)定。日志文件記得保留出問題的時候翻日志比重新跑一遍快得多。 告別海外賬號與網(wǎng)絡(luò)限制穩(wěn)定直連全球優(yōu)質(zhì)大模型限時半價接入中。 點(diǎn)擊領(lǐng)取海量免費(fèi)額度