diff --git a/rpent/benchmarks/docs.css b/rpent/benchmarks/docs.css index 6cc32b9..13684c6 100644 --- a/rpent/benchmarks/docs.css +++ b/rpent/benchmarks/docs.css @@ -8,3 +8,5 @@ .rpent-static-leaderboard .table-wrap table{min-width:900px} html[data-theme="dark"] .rpent-static-leaderboard{--rpent-fallback-border:#494052;color:var(--pst-color-text-base,#f4f0fa)} .rpent-static-leaderboard .memory-context{margin:1rem 0} +.rpent-static-leaderboard .cost-section .table-wrap table{min-width:340px} +.rpent-static-leaderboard .cost-method small{display:block;font-size:12px;margin-top:4px} diff --git a/rpent/benchmarks/embed.css b/rpent/benchmarks/embed.css index ad3d14c..11170a3 100644 --- a/rpent/benchmarks/embed.css +++ b/rpent/benchmarks/embed.css @@ -23,8 +23,11 @@ .legend .astra{background:var(--astra)} .comparison-matrix>summary{font-size:20px} .comparison-matrix table,.comparison-matrix .matrix-label{font-size:16px} +.cost-section{background:var(--band);border-top:4px solid var(--best);padding:30px 0 24px}.cost-section h2{font-size:27px}.cost-group{margin-top:24px}.cost-group h3{font-size:21px}.cost-group table{font-size:16px;min-width:340px;table-layout:fixed}.cost-group th{font-size:14px;white-space:normal}.cost-group th:first-child{width:42%}.cost-group th,.cost-group td{padding:10px 8px}.cost-group td:first-child{overflow-wrap:anywhere}.cost-group .table-wrap{max-width:100%}th[aria-sort=ascending]{color:var(--best)}th[aria-sort=ascending] img{opacity:1;transform:rotate(180deg)} +@media(max-width:700px){.cost-group table{font-size:14px}.cost-section h2{font-size:23px}.cost-group h3{font-size:19px}} .comparison-matrix thead th{font-size:14px} .comparison-matrix .matrix-label small{font-size:12px} +.cost-group .matrix-label{font-size:inherit}.cost-group .matrix-label small,.cost-method small{display:block;font-size:12px;margin-top:4px} footer{background:var(--band)} th[aria-sort=ascending]{color:var(--best)}th[aria-sort=ascending] img{opacity:1;transform:rotate(180deg)} footer{max-width:none;padding-left:max(var(--gutter),calc((100% - 1344px)/2));padding-right:max(var(--gutter),calc((100% - 1344px)/2))} diff --git a/rpent/benchmarks/embed.html b/rpent/benchmarks/embed.html index d83cffe..7ab8ddb 100644 --- a/rpent/benchmarks/embed.html +++ b/rpent/benchmarks/embed.html @@ -6,10 +6,11 @@

RPent Leaderboard

- +
+
diff --git a/rpent/benchmarks/index.html b/rpent/benchmarks/index.html index 0f1dead..c07a1b1 100644 --- a/rpent/benchmarks/index.html +++ b/rpent/benchmarks/index.html @@ -7,15 +7,17 @@

RPent Leaderboard

- +
+

- + diff --git a/rpent/benchmarks/leaderboard-en-dark.png b/rpent/benchmarks/leaderboard-en-dark.png index 20fe9ba..e581e12 100644 Binary files a/rpent/benchmarks/leaderboard-en-dark.png and b/rpent/benchmarks/leaderboard-en-dark.png differ diff --git a/rpent/benchmarks/leaderboard-en-light.png b/rpent/benchmarks/leaderboard-en-light.png index 1baa09d..ffe4fb9 100644 Binary files a/rpent/benchmarks/leaderboard-en-light.png and b/rpent/benchmarks/leaderboard-en-light.png differ diff --git a/rpent/benchmarks/leaderboard-zh-dark.png b/rpent/benchmarks/leaderboard-zh-dark.png index daa340a..e243473 100644 Binary files a/rpent/benchmarks/leaderboard-zh-dark.png and b/rpent/benchmarks/leaderboard-zh-dark.png differ diff --git a/rpent/benchmarks/leaderboard-zh-light.png b/rpent/benchmarks/leaderboard-zh-light.png index f6cc93b..372da02 100644 Binary files a/rpent/benchmarks/leaderboard-zh-light.png and b/rpent/benchmarks/leaderboard-zh-light.png differ diff --git a/rpent/benchmarks/leaderboard.css b/rpent/benchmarks/leaderboard.css index a304ac4..a1ff01a 100644 --- a/rpent/benchmarks/leaderboard.css +++ b/rpent/benchmarks/leaderboard.css @@ -22,8 +22,11 @@ body,button,select,input,textarea,table,code,pre,kbd{font-family:var(--serif)} .legend .astra{background:var(--astra)} .comparison-matrix>summary{font-size:20px} .comparison-matrix table,.comparison-matrix .matrix-label{font-size:16px} +.cost-section{background:var(--band);border-top:4px solid var(--best);padding:30px 0 24px}.cost-section h2{font-size:27px}.cost-group{margin-top:24px}.cost-group h3{font-size:21px}.cost-group table{font-size:16px;min-width:340px;table-layout:fixed}.cost-group th{font-size:14px;white-space:normal}.cost-group th:first-child{width:42%}.cost-group th,.cost-group td{padding:10px 8px}.cost-group td:first-child{overflow-wrap:anywhere}.cost-group .table-wrap{max-width:100%}th[aria-sort=ascending]{color:var(--best)}th[aria-sort=ascending] img{opacity:1;transform:rotate(180deg)} +@media(max-width:700px){.cost-group table{font-size:14px}.cost-section h2{font-size:23px}.cost-group h3{font-size:19px}} .comparison-matrix thead th{font-size:14px} .comparison-matrix .matrix-label small{font-size:12px} +.cost-group .matrix-label{font-size:inherit}.cost-group .matrix-label small,.cost-method small{display:block;font-size:12px;margin-top:4px} footer{background:var(--band)} th[aria-sort=ascending]{color:var(--best)}th[aria-sort=ascending] img{opacity:1;transform:rotate(180deg)} footer{max-width:none;padding-left:max(var(--gutter),calc((100% - 1344px)/2));padding-right:max(var(--gutter),calc((100% - 1344px)/2))} diff --git a/rpent/benchmarks/leaderboard.js b/rpent/benchmarks/leaderboard.js index a9df3cf..22c8c5f 100644 --- a/rpent/benchmarks/leaderboard.js +++ b/rpent/benchmarks/leaderboard.js @@ -32,10 +32,12 @@ "backTop": "Back to top ↑", "view": "Evaluation", "rate": "Success rate", - "method": "Method / model", + "method": "Method", + "meanTime": "Mean time / episode (s)", + "outputTokens": "Total output tokens", "unreported": "Not reported", "modelUnknown": "Model not reported", - "noReasoning": "no reasoning", + "noReasoning": "no-reasoning", "table": "Results table", "download": "Download CSV", "print": "Print page", @@ -50,10 +52,12 @@ "backTop": "返回顶部 ↑", "view": "评测范围", "rate": "成功率", - "method": "方法 / 模型", + "method": "方法", + "meanTime": "平均每回合耗时(秒)", + "outputTokens": "总输出 token", "unreported": "未报告", "modelUnknown": "未报告模型", - "noReasoning": "无推理", + "noReasoning": "no-reasoning", "table": "结果明细表", "download": "下载 CSV", "print": "打印页面", @@ -117,7 +121,7 @@ const rows=d.configurations.filter(c=>columns.some(v=>v.record_ids.some(id=>records.get(id).configuration_id===c.id&&records.get(id).rate!==null))); return `
${t('allScores')} ${rows.length} ${lang==='en'?'configurations':'配置'}
${columns.map(v=>``).join('')}${rows.map(c=>{ const sample=columns.flatMap(allRows).find(r=>r.configuration_id===c.id&&r.rate!==null); - return `${columns.map(v=>{ + return `${columns.map(v=>{ const r=allRows(v).find(r=>r.configuration_id===c.id); return ``; }).join('')}`; @@ -136,13 +140,24 @@ function setupTables(element,key) { window.RPentTables.setup(element,{key,language:lang,icon:asset('arrow-down.svg'),download:asset('download.svg')}); } + function renderCosts() { + const element=document.getElementById('time-token-costs'); + const groups=[['libero-pro','LIBERO-PRO'],['robocasa','RoboCasa365'],['robotwin','RoboTwin']]; + element.innerHTML=`

Time & Token Costs

${groups.map(([id,name])=>{ + const rows=d.cost_results.filter(r=>r.benchmark_id===id); + return `

${name}

${t('method')}${h(tr(v.label))}
${h(label(sample))}${h(detailLabel(sample))}
${h(label(sample))} ${h(detailLabel(sample))}
${r?.rate!=null?r.rate+'%':``}
${rows.map(r=>{ + return ``; + }).join('')}
${t('method')}${t('meanTime')}${t('outputTokens')}
${h(label(r))} ${h(detailLabel(r))}
${r.mean_elapsed_seconds.toLocaleString('en-US')}${r.total_output_tokens.toLocaleString('en-US')}
`; + }).join('')}`; + setupTables(element,'costs'); + } function render() { (options.embedded?document.host:document.documentElement).lang=lang==='en'?'en':'zh-CN'; if(!options.embedded)document.title='RPent Leaderboard'; document.querySelectorAll('[data-i18n]').forEach(el=>el.textContent=t(el.dataset.i18n)); const language=document.getElementById('language');language.textContent=lang==='en'?'中文':'English';language.lang=lang==='en'?'zh-CN':'en';language.setAttribute('aria-label',lang==='en'?'切换为中文':'Switch to English'); document.getElementById('leaderboards').innerHTML=d.sections.filter(s=>!s.parent).map(s=>`

${h(s.name)}

${d.sections.filter(c=>c.parent===s.id).map(c=>`
`).join('')}
`).join(''); - d.sections.forEach(renderSection);hideTooltip(); + d.sections.forEach(renderSection);renderCosts();hideTooltip(); } function downloadCSV(rows, name) { const keys=['record_id','benchmark','view','method','model','planner','perception_model','reasoning','effort','success_rate_percent','successes','episodes','status','evaluation_note']; diff --git a/rpent/benchmarks/results.json b/rpent/benchmarks/results.json index 0da2503..c7a11e1 100644 --- a/rpent/benchmarks/results.json +++ b/rpent/benchmarks/results.json @@ -1,6 +1,6 @@ { "schema_version": 2, - "checked_at": "2026-09-17", + "checked_at": "2026-09-18", "paper_revision": "2607.08448v4", "repository_revision": "43f32aa08cba07bd4d49a4bfa5eba4ef633e9b92", "configurations": [ @@ -197,6 +197,30 @@ "model": "ASPIRE", "reasoning": null, "effort": null + }, + { + "id": "qwen3-6-27b-no-reasoning", + "kind": "rpent", + "backend": null, + "model": "Qwen3.6 27B", + "reasoning": false, + "effort": null + }, + { + "id": "gpt-5-6-xhigh", + "kind": "rpent", + "backend": "Codex", + "model": "GPT-5.6 Sol", + "reasoning": true, + "effort": "xhigh" + }, + { + "id": "gpt-5-6-no-reasoning", + "kind": "rpent", + "backend": "Codex", + "model": "GPT-5.6 Sol", + "reasoning": false, + "effort": null } ], "views": [ @@ -299,7 +323,8 @@ "spatial-task--rats", "spatial-task--pi-rlinf", "spatial-task--aspire", - "spatial-task--rpent-flash-mode" + "spatial-task--rpent-flash-mode", + "spatial-task--qwen3-6-27b-no-reasoning" ] }, { @@ -321,7 +346,8 @@ "spatial-swap--rats", "spatial-swap--pi-rlinf", "spatial-swap--aspire", - "spatial-swap--rpent-flash-mode" + "spatial-swap--rpent-flash-mode", + "spatial-swap--qwen3-6-27b-no-reasoning" ] }, { @@ -343,7 +369,8 @@ "object-task--rats", "object-task--pi-rlinf", "object-task--aspire", - "object-task--rpent-flash-mode" + "object-task--rpent-flash-mode", + "object-task--qwen3-6-27b-no-reasoning" ] }, { @@ -365,7 +392,8 @@ "object-swap--rats", "object-swap--pi-rlinf", "object-swap--aspire", - "object-swap--rpent-flash-mode" + "object-swap--rpent-flash-mode", + "object-swap--qwen3-6-27b-no-reasoning" ] }, { @@ -387,7 +415,8 @@ "goal-task--rats", "goal-task--pi-rlinf", "goal-task--aspire", - "goal-task--rpent-flash-mode" + "goal-task--rpent-flash-mode", + "goal-task--qwen3-6-27b-no-reasoning" ] }, { @@ -409,7 +438,8 @@ "goal-swap--rats", "goal-swap--pi-rlinf", "goal-swap--aspire", - "goal-swap--rpent-flash-mode" + "goal-swap--rpent-flash-mode", + "goal-swap--qwen3-6-27b-no-reasoning" ] }, { @@ -429,7 +459,8 @@ "long-task--atomvla", "long-task--pi-rlinf", "long-task--aspire", - "long-task--rpent-flash-mode" + "long-task--rpent-flash-mode", + "long-task--qwen3-6-27b-no-reasoning" ] }, { @@ -449,7 +480,8 @@ "long-swap--atomvla", "long-swap--pi-rlinf", "long-swap--aspire", - "long-swap--rpent-flash-mode" + "long-swap--rpent-flash-mode", + "long-swap--qwen3-6-27b-no-reasoning" ] }, { @@ -470,7 +502,8 @@ "libero-pro--pi-rlinf", "libero-pro--opus-4-7-reported", "libero-pro--rpent-flash-mode", - "libero-pro--aspire" + "libero-pro--aspire", + "libero-pro--qwen3-6-27b-no-reasoning" ] }, { @@ -2841,6 +2874,123 @@ "contributor-settings-20260915" ], "protocol_id": "contributor-target50-astra-five-seed" + }, + { + "id": "libero-pro--qwen3-6-27b-no-reasoning", + "view_id": "libero-pro", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "70.63", + "successes": 565, + "episodes": 800, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "spatial-task--qwen3-6-27b-no-reasoning", + "view_id": "spatial-task", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "82.00", + "successes": 82, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "spatial-swap--qwen3-6-27b-no-reasoning", + "view_id": "spatial-swap", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "78.00", + "successes": 78, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "object-task--qwen3-6-27b-no-reasoning", + "view_id": "object-task", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "83.00", + "successes": 83, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "object-swap--qwen3-6-27b-no-reasoning", + "view_id": "object-swap", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "84.00", + "successes": 84, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "goal-task--qwen3-6-27b-no-reasoning", + "view_id": "goal-task", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "68.00", + "successes": 68, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "goal-swap--qwen3-6-27b-no-reasoning", + "view_id": "goal-swap", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "68.00", + "successes": 68, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "long-task--qwen3-6-27b-no-reasoning", + "view_id": "long-task", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "61.00", + "successes": 61, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" + }, + { + "id": "long-swap--qwen3-6-27b-no-reasoning", + "view_id": "long-swap", + "configuration_id": "qwen3-6-27b-no-reasoning", + "status": "reported", + "rate": "41.00", + "successes": 41, + "episodes": 100, + "source_ids": [ + "contributor-qwen-costs-20260918" + ], + "protocol_id": "rpent-pro-qwen-eight-suites" } ], "sources": [ @@ -3045,6 +3195,11 @@ } }, "note": "250 unique contributor result.json outcomes match summary.json and final trace terminated flags. Five seeds per task make task-weighted Overall equal to 148/250. This corrects the previously assumed 340-case denominator; no missing cases are inferred. Model settings retain contributor confirmation." + }, + { + "id": "contributor-qwen-costs-20260918", + "type": "contributor_report", + "note": "Contributor-provided Qwen eight-suite counts and cost table. Mean elapsed time includes all evaluation episodes (success, failure, and timeout); tokens count evaluation-stage output only. No unreported planner, hardware, or token accounting details are inferred." } ], "astra": { @@ -3257,5 +3412,117 @@ "ellipsis.svg", "download.svg", "arrow-down.svg" + ], + "cost_results": [ + { + "id": "libero-pro--gpt-5-6-xhigh", + "benchmark_id": "libero-pro", + "configuration_id": "gpt-5-6-xhigh", + "mean_elapsed_seconds": 529.23, + "total_output_tokens": 3635426, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "libero-pro--gpt-5-6-no-reasoning", + "benchmark_id": "libero-pro", + "configuration_id": "gpt-5-6-no-reasoning", + "mean_elapsed_seconds": 344.17, + "total_output_tokens": 2569676, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "libero-pro--gpt-6-astra-low", + "benchmark_id": "libero-pro", + "configuration_id": "gpt-6-astra-low", + "mean_elapsed_seconds": 412.14, + "total_output_tokens": 3364938, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "libero-pro--qwen3-6-27b-no-reasoning", + "benchmark_id": "libero-pro", + "configuration_id": "qwen3-6-27b-no-reasoning", + "mean_elapsed_seconds": 626.3, + "total_output_tokens": 3270754, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "libero-pro--rpent-flash-mode", + "benchmark_id": "libero-pro", + "configuration_id": "rpent-flash-mode", + "mean_elapsed_seconds": 60.19, + "total_output_tokens": 0, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "robocasa--gpt-5-6-xhigh", + "benchmark_id": "robocasa", + "configuration_id": "gpt-5-6-xhigh", + "mean_elapsed_seconds": 1197.56, + "total_output_tokens": 5258391, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "robocasa--gpt-5-6-no-reasoning", + "benchmark_id": "robocasa", + "configuration_id": "gpt-5-6-no-reasoning", + "mean_elapsed_seconds": 1013.21, + "total_output_tokens": 4792104, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "robocasa--gpt-6-astra-low", + "benchmark_id": "robocasa", + "configuration_id": "gpt-6-astra-low", + "mean_elapsed_seconds": 1168.95, + "total_output_tokens": 5894436, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "robotwin--gpt-5-6-xhigh", + "benchmark_id": "robotwin", + "configuration_id": "gpt-5-6-xhigh", + "mean_elapsed_seconds": 1828.7, + "total_output_tokens": 4763915, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "robotwin--gpt-5-6-no-reasoning", + "benchmark_id": "robotwin", + "configuration_id": "gpt-5-6-no-reasoning", + "mean_elapsed_seconds": 957.4, + "total_output_tokens": 2456401, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + }, + { + "id": "robotwin--gpt-6-astra-low", + "benchmark_id": "robotwin", + "configuration_id": "gpt-6-astra-low", + "mean_elapsed_seconds": 1078.8, + "total_output_tokens": 2763641, + "source_ids": [ + "contributor-qwen-costs-20260918" + ] + } ] } diff --git a/rpent/benchmarks/table-sort.js b/rpent/benchmarks/table-sort.js index fc139b7..8674419 100644 --- a/rpent/benchmarks/table-sort.js +++ b/rpent/benchmarks/table-sort.js @@ -15,21 +15,22 @@ function sort(table, column) { const state=table._rpentSort; state.column=column;saved.set(state.key,column); + const ascending=column===state.idColumn||state.direction==='ascending'; const rows=[...table.tBodies[0].rows].filter(row=>!row.dataset.total); rows.sort((a,b)=>{ const av=valueOf(a.cells[column]),bv=valueOf(b.cells[column]); return av===null ? bv===null?collator.compare(a.dataset.sortId,b.dataset.sortId):1 - : bv===null?-1:(column===state.idColumn?av-bv:bv-av)||collator.compare(a.dataset.sortId,b.dataset.sortId); + : bv===null?-1:(ascending?av-bv:bv-av)||collator.compare(a.dataset.sortId,b.dataset.sortId); }); const total=table.tBodies[0].querySelector('[data-total]'); rows.forEach(row=>table.tBodies[0].insertBefore(row,total)); state.headers.forEach((th,i)=>{ - if(state.columns.includes(i))th.setAttribute('aria-sort',i===column?(column===state.idColumn?'ascending':'descending'):'none'); + if(state.columns.includes(i))th.setAttribute('aria-sort',i===column?(ascending?'ascending':'descending'):'none'); }); const maximum=rows.length?valueOf(rows[0].cells[column]):null; for(const row of rows){ for(const cell of row.cells)cell.classList.remove('metric-best'); - if(column!==state.idColumn&&maximum!==null&&valueOf(row.cells[column])===maximum)row.cells[column].classList.add('metric-best'); + if(state.highlightBest&&column!==state.idColumn&&maximum!==null&&valueOf(row.cells[column])===maximum)row.cells[column].classList.add('metric-best'); } } function exportTable(table) { @@ -56,12 +57,13 @@ row.dataset.sortId??=row.dataset.method??row.dataset.tableRecord??row.dataset.astraTask??row.dataset.roboTask??row.dataset.paperTasks??row.cells[0].textContent.trim()+'-'+i; if(/^(Total|合计)$/i.test(row.cells[0].textContent.trim()))row.dataset.total='true'; }); - table._rpentSort={key,columns,headers,idColumn,column:preferred.i}; + const direction=table.dataset.sortDirection??'descending'; + table._rpentSort={key,columns,headers,idColumn,column:preferred.i,direction,highlightBest:table.dataset.highlightBest!=='false'}; headers.forEach((th,i)=>{ th.dataset.label=th.textContent.trim(); if(!columns.includes(i))return; const button=document.createElement('button');button.type='button';button.className='sort-heading'; - button.textContent=th.dataset.label;button.title=(i===idColumn?(zh?'按任务 ID 升序:':'Sort task ID ascending: '):(zh?'按此列降序:':'Sort descending: '))+th.dataset.label; + button.textContent=th.dataset.label;button.title=(i===idColumn?(zh?'按任务 ID 升序:':'Sort task ID ascending: '):direction==='ascending'?(zh?'按此列升序:':'Sort ascending: '):(zh?'按此列降序:':'Sort descending: '))+th.dataset.label; const img=document.createElement('img');img.src=options.icon;img.alt='';img.width=12;img.height=12; button.append(img);button.addEventListener('click',()=>sort(table,i));th.replaceChildren(button); });