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