ai-speedometer 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-speedometer +1 -1
- package/package.json +1 -1
package/dist/ai-speedometer
CHANGED
|
@@ -85,7 +85,7 @@ Tracking stopped by user`),console.log(`Results saved to: ${this.csvFile}`)}init
|
|
|
85
85
|
`)}async runTrackingCycle(){let t=new Date;console.log(`[${t.toISOString()}] Running benchmark cycle...`);let o=await new ka(this.config).runSilent();this.writeResultsToCsv(t,o),this.displayCycleSummary(o)}writeResultsToCsv(t,n){let o=n.filter(r=>r.success).map(r=>{let i=`${r.provider}+${r.model}`;return[t.toISOString(),i,r.tokensPerSecond,r.totalTokens,r.duration].join(",")}).join(`
|
|
86
86
|
`);o&&Ro.appendFileSync(this.csvFile,o+`
|
|
87
87
|
`)}displayCycleSummary(t){let n=t.filter(r=>r.success),o=t.filter(r=>!r.success);if(console.log(` Completed: ${n.length} successful, ${o.length} failed`),n.length>0){let r=n.reduce((i,a)=>i+a.tokensPerSecond,0)/n.length;console.log(` Average tokens/sec: ${r.toFixed(2)}`)}if(o.length>0){let r=o.map(i=>`${i.provider}/${i.model}`).join(", ");console.log(` Failed: ${r}`)}}sleep(t){return new Promise(n=>setTimeout(n,t))}};function dE(){let e=process.argv.slice(2),t={};for(let n=0;n<e.length;n++)switch(e[n]){case"--provider":t.provider=e[++n];break;case"--model":t.model=e[++n];break;case"--all":t.all=!0;break;case"--track":t.track=!0;break;case"--help":pE(),process.exit(0);break}if(t.track&&!t.all&&(console.log("Error: --track requires --all"),console.log("Use --help for usage information"),process.exit(1)),t.all)return t;if(t.provider&&t.model)return t;console.log("Error: Either --provider and --model, or --all is required"),console.log("Use --help for usage information"),process.exit(1)}function pE(){console.log("Usage: node benchmark-rest.js --provider PROVIDER --model MODEL"),console.log(" node benchmark-rest.js --all [--track]"),console.log(""),console.log("Options:"),console.log(" --provider PROVIDER Provider name from ai-benchmark-config.json"),console.log(" --model MODEL Model name from ai-benchmark-config.json"),console.log(" --all Run benchmark on all configured models"),console.log(" --track Enable continuous tracking with CSV output (requires --all)"),console.log(" --help Display this help message")}async function mE(){try{let e=dE();if(e.all){let t=JSON.parse(Ro.readFileSync("ai-benchmark-config.json","utf8"));e.track?await new Ed(t).startTracking():await new ka(t).runAll()}else await new wa(e.provider,e.model).runBenchmark()}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}process.on("SIGINT",()=>{console.log(`
|
|
88
|
-
Benchmark interrupted by user`),process.exit(0)});import.meta.url===`file://${process.argv[1]}`&&process.argv[1].endsWith("benchmark-rest.js")&&mE();import Ut from"fs";import $a from"path";import{homedir as gE}from"os";var Td={"custom-verified-providers":{"zai-code-anth":{id:"zai-code-anth",name:"zai-code-anth",baseUrl:"https://api.z.ai/api/anthropic/v1",type:"anthropic",models:{"glm-4-5":{id:"glm-4.5",name:"GLM-4.5-anth"},"glm-4-5-air":{id:"glm-4.5-air",name:"GLM-4.5-air-anth"}}},"zai-china-anth-base":{id:"zai-china-anth-base",name:"zai-china-anth-base",baseUrl:"https://open.bigmodel.cn/api/anthropic/v1",type:"anthropic",models:{"glm-4-5":{id:"glm-4.5",name:"GLM-4.5-china-anth"},"glm-4-5-air":{id:"glm-4.5-air",name:"GLM-4.5-air-china-anth"}}},"extra-models-dev":{chutes:{"deepseek-ai/DeepSeek-V3.1-Terminus":{id:"deepseek-ai/DeepSeek-V3.1-Terminus",name:"DeepSeek V3.1 Terminus"},"meituan-longcat/LongCat-Flash-Thinking-FP8":{id:"meituan-longcat/LongCat-Flash-Thinking-FP8",name:"LongCat Flash Thinking FP8"},"zai-org/GLM-4.5-turbo":{id:"zai-org/GLM-4.5-turbo",name:"GLM-4.5 Turbo"},"deepseek-ai/DeepSeek-V3.1-turbo":{id:"deepseek-ai/DeepSeek-V3.1-turbo",name:"DeepSeek V3.1 Turbo"}}},"nanogpt-plan":{id:"nanogpt-plan",name:"nanogpt-plan",baseUrl:"https://nano-gpt.com/api/v1",type:"openai-compatible",models:{"deepseek-ai/DeepSeek-V3.1-Terminus":{id:"deepseek-ai/DeepSeek-V3.1-Terminus",name:"DeepSeek V3.1 Terminus"},"deepseek-ai/DeepSeek-V3.1":{id:"deepseek-ai/DeepSeek-V3.1",name:"DeepSeek V3.1"},"deepseek-ai/DeepSeek-V3.1-Terminus:thinking":{id:"deepseek-ai/DeepSeek-V3.1-Terminus:thinking",name:"DeepSeek V3.1 Terminus Thinking"},"zai-org/GLM-4.5-FP8":{id:"zai-org/GLM-4.5-FP8",name:"GLM 4.5 FP8"},"zai-org/GLM-4.5-FP8:thinking":{id:"zai-org/GLM-4.5-FP8:thinking",name:"GLM 4.5 FP8 Thinking"},"zai-org/GLM-4.5-Air":{id:"zai-org/GLM-4.5-Air",name:"GLM 4.5 Air"},"moonshotai/Kimi-K2-Instruct":{id:"moonshotai/Kimi-K2-Instruct",name:"Kimi K2 Instruct"},"moonshotai/Kimi-K2-Instruct-0905":{id:"moonshotai/Kimi-K2-Instruct-0905",name:"Kimi K2 Instruct 0905"},"deepseek-ai/deepseek-v3.2-exp":{id:"deepseek-ai/deepseek-v3.2-exp",name:"DeepSeek V3.2 Exp"},"z-ai/glm-4.6":{id:"z-ai/glm-4.6",name:"GLM 4.6"},"z-ai/glm-4.6:thinking":{id:"z-ai/glm-4.6:thinking",name:"GLM 4.6 Thinking"},"qwen3-vl-235b-a22b-instruct":{id:"qwen3-vl-235b-a22b-instruct",name:"Qwen3 VL 235B A22B Instruct"}}}}};var Cd=$a.join(gE(),".cache","ai-speedometer"),Ad=$a.join(Cd,"models.json"),Fv=[{id:"openai",name:"OpenAI",baseUrl:"https://api.openai.com/v1",type:"openai-compatible",models:[{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o Mini"},{id:"gpt-4-turbo",name:"GPT-4 Turbo"},{id:"gpt-3.5-turbo",name:"GPT-3.5 Turbo"}]},{id:"anthropic",name:"Anthropic",baseUrl:"https://api.anthropic.com",type:"anthropic",models:[{id:"claude-3-5-sonnet-20241022",name:"Claude 3.5 Sonnet"},{id:"claude-3-5-haiku-20241022",name:"Claude 3.5 Haiku"},{id:"claude-3-opus-20240229",name:"Claude 3 Opus"}]},{id:"openrouter",name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",type:"openai-compatible",models:[{id:"anthropic/claude-3.5-sonnet",name:"Claude 3.5 Sonnet"},{id:"openai/gpt-4o",name:"GPT-4o"},{id:"openai/gpt-4o-mini",name:"GPT-4o Mini"}]}];function hE(){try{Ut.existsSync(Cd)||Ut.mkdirSync(Cd,{recursive:!0})}catch(e){console.warn("Warning: Could not create cache directory:",e.message)}}function vE(e){if(!e.timestamp)return!0;let n=Date.now()-e.timestamp,o=3600*1e3;return n>o}function yE(){try{if(Ut.existsSync(Ad)){let e=Ut.readFileSync(Ad,"utf8"),t=JSON.parse(e);return vE(t)?null:t}}catch(e){console.warn("Warning: Could not load cache:",e.message)}return null}function bE(e){try{hE();let t={...e,timestamp:Date.now()};Ut.writeFileSync(Ad,JSON.stringify(t,null,2))}catch(t){console.warn("Warning: Could not save cache:",t.message)}}async function _E(){try{let e=await fetch("https://models.dev/api.json");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e.json()}catch(e){return console.warn("Warning: Could not fetch from models.dev API:",e.message),null}}function Fo(){try{let e=Td,t=$a.join(process.cwd(),"custom-verified-providers.json");if(Ut.existsSync(t))try{let o=Ut.readFileSync(t,"utf8");e=JSON.parse(o)}catch(o){console.warn("Warning: Could not load custom providers from file, using embedded data:",o.message)}let n=[];if(e["custom-verified-providers"]){for(let[,o]of Object.entries(e["custom-verified-providers"]))if(o.id!=="extra-models-dev"&&o.id&&o.name&&o.models){let r={id:o.id,name:o.name,baseUrl:o.baseUrl||"",type:o.type||"openai-compatible",models:Object.values(o.models).map(i=>({id:i.id,name:i.name}))};n.push(r)}}return n}catch(e){console.warn("Warning: Could not load custom verified providers:",e.message)}return[]}function Mv(){try{let e=Td,t=$a.join(process.cwd(),"custom-verified-providers.json");if(Ut.existsSync(t))try{let o=Ut.readFileSync(t,"utf8");e=JSON.parse(o)}catch(o){console.warn("Warning: Could not load extra models from file, using embedded data:",o.message)}let n={};if(e["custom-verified-providers"]&&e["custom-verified-providers"]["extra-models-dev"])for(let[o,r]of Object.entries(e["custom-verified-providers"]["extra-models-dev"]))n[o]=Object.values(r).map(i=>({id:i.id,name:i.name}));return n}catch(e){console.warn("Warning: Could not load extra models:",e.message)}return{}}function xE(e){let t=[],n=Fo();t.push(...n);let o=Mv();if(e){for(let[,r]of Object.entries(e))if(r.id&&r.name&&r.models){let i=Object.values(r.models).map(u=>({id:u.id,name:u.name}));o[r.id]&&i.push(...o[r.id]);let a={id:r.id,name:r.name,baseUrl:r.api||r.baseUrl||"",type:r.npm&&r.npm.includes("anthropic")?"anthropic":"openai-compatible",models:i};t.push(a)}}return t.length===0?Fv:t}async function gr(){let e=yE();if(e&&e.providers){let i=Fo(),a=new Set(e.providers.map(l=>l.id)),u=i.filter(l=>!a.has(l.id));return u.length>0&&e.providers.push(...u),e.providers}let t=await _E();if(t){let i=xE(t);return bE({providers:i}),i}let n=[...Fv],o=Mv(),r=Fo();return n.forEach(i=>{o[i.id]&&i.models.push(...o[i.id])}),n.push(...r),n}async function Pd(e){let t=await gr(),n=e.toLowerCase();return t.filter(o=>o.name.toLowerCase().includes(n)||o.id.toLowerCase().includes(n))}async function Sa(e){let n=(await gr()).find(o=>o.id===e);return n?n.models:[]}import ar from"fs";import ln from"path";import{homedir as Uv}from"os";import{parse as TE}from"jsonc-parser";var Rd=()=>{let e=process.env.XDG_DATA_HOME||ln.join(Uv(),".local","share"),t=process.env.XDG_CONFIG_HOME||ln.join(Uv(),".config");return{data:ln.join(e,"opencode"),config:ln.join(t,"opencode")}},Fd=()=>{let e=Rd();return{authJson:ln.join(e.data,"auth.json"),opencodeJson:ln.join(e.config,"opencode.json")}},CE=()=>{let e=Rd();[e.data,e.config].forEach(t=>{ar.existsSync(t)||ar.mkdirSync(t,{recursive:!0})})},Md=async()=>{let{authJson:e}=Fd();try{if(!ar.existsSync(e))return{};let t=ar.readFileSync(e,"utf8"),n=[],o=TE(t,n,{allowTrailingComma:!0});return n.length>0?(console.warn("Warning: JSONC parsing errors in auth.json:",n.map(r=>r.error).join(", ")),o||{}):o}catch(t){return console.warn("Warning: Could not read auth.json:",t.message),{}}},AE=async e=>{let{authJson:t}=Fd();try{CE();let n=JSON.stringify(e,null,2);return ar.writeFileSync(t,n),ar.chmodSync(t,384),!0}catch(n){return console.error("Error writing auth.json:",n.message),!1}};var PE=async()=>{let e=await Md(),t=await gr(),n=[];for(let[o,r]of Object.entries(e)){let i=t.find(a=>a.id===o);if(i&&r.type==="api"&&r.key){let a=await Sa(o);n.push({id:o,name:i.name,type:i.type,baseUrl:i.baseUrl,apiKey:r.key,authType:r.type,models:a.map(u=>({name:u.name,id:`${o}_${u.id}`}))})}}return n};var OE=async e=>{try{return(await gr()).find(n=>n.id===e)}catch(t){return console.warn("Warning: Could not verify provider:",t.message),null}},Ud=async(e,t)=>{let n=await Md();return n[e]={type:"api",key:t},await AE(n)};var Zv=async()=>{let[e,t,n]=await Promise.all([PE(),(async()=>{try{let{getCustomProvidersFromConfig:r}=await Promise.resolve().then(()=>(vr(),un));return await r()}catch(r){return console.warn("Warning: Could not load custom providers:",r.message),[]}})(),(async()=>{try{return Fo()}catch(r){return console.warn("Warning: Could not load custom verified providers:",r.message),[]}})()]),o=new Map;return n.forEach(r=>{o.set(r.id,r)}),t.forEach(r=>{o.set(r.id,r)}),e.forEach(r=>{o.set(r.id,r)}),Array.from(o.values())};var Lv=async e=>{let t={migrated:0,failed:0,errors:[]};try{if(e.verifiedProviders)for(let[n,o]of Object.entries(e.verifiedProviders))await OE(n)?await Ud(n,o)?t.migrated++:(t.failed++,t.errors.push(`Failed to migrate ${n}`)):(t.failed++,t.errors.push(`Provider ${n} not found in models.dev`));if(e.customProviders&&e.customProviders.length>0)try{let{addCustomProvider:n,readAIConfig:o,writeAIConfig:r}=await Promise.resolve().then(()=>(vr(),un)),i=await o();for(let a of e.customProviders)try{let u={id:a.id,name:a.name,type:a.type,baseUrl:a.baseUrl,apiKey:a.apiKey,models:a.models||[]};i.customProviders=i.customProviders||[],i.customProviders.push(u),t.migrated++}catch(u){t.failed++,t.errors.push(`Failed to migrate custom provider ${a.name}: ${u.message}`)}await r(i)}catch(n){t.failed++,t.errors.push(`Failed to migrate custom providers: ${n.message}`)}return t}catch(n){return t.failed++,t.errors.push(`Migration failed: ${n.message}`),t}},Bv=async()=>{let e=Fd(),[t,n]=await Promise.all([Md(),(async()=>{try{let{getAIConfigPaths:a}=await Promise.resolve().then(()=>(vr(),un));return await a()}catch{return{configDir:"N/A",configJson:"N/A",configExists:!1}}})()]),o=ar.existsSync(e.authJson),r=ar.existsSync(e.opencodeJson),i={verifiedProviders:{},customProviders:[]};try{let{readAIConfig:a}=await Promise.resolve().then(()=>(vr(),un));i=await a()}catch{}return{opencodePaths:e,authExists:o,configExists:r,authData:Object.keys(t),configProviders:[],aiConfigPaths:n,aiConfigData:{verifiedProviders:Object.keys(i.verifiedProviders||{}),customProviders:(i.customProviders||[]).map(a=>a.id)},xdgPaths:Rd()}};vr();var Wy=pb(Vy(),1);import"dotenv/config";var Yd=process.argv.includes("--debug"),Bo=null;function ve(e){if(!Yd)return;let n=`[${new Date().toISOString()}] ${e}
|
|
88
|
+
Benchmark interrupted by user`),process.exit(0)});import.meta.url===`file://${process.argv[1]}`&&process.argv[1].endsWith("benchmark-rest.js")&&mE();import Ut from"fs";import $a from"path";import{homedir as gE}from"os";var Td={"custom-verified-providers":{"zai-code-anth":{id:"zai-code-anth",name:"zai-code-anth",baseUrl:"https://api.z.ai/api/anthropic/v1",type:"anthropic",models:{"glm-4-5":{id:"glm-4.5",name:"GLM-4.5-anth"},"glm-4-5-air":{id:"glm-4.5-air",name:"GLM-4.5-air-anth"},"glm-4-6":{id:"glm-4.6",name:"GLM-4.6-anth"}}},"zai-china-anth-base":{id:"zai-china-anth-base",name:"zai-china-anth-base",baseUrl:"https://open.bigmodel.cn/api/anthropic/v1",type:"anthropic",models:{"glm-4-5":{id:"glm-4.5",name:"GLM-4.5-china-anth"},"glm-4-5-air":{id:"glm-4.5-air",name:"GLM-4.5-air-china-anth"},"glm-4-6":{id:"glm-4.6",name:"GLM-4.6-china-anth"}}},"extra-models-dev":{chutes:{"deepseek-ai/DeepSeek-V3.1-Terminus":{id:"deepseek-ai/DeepSeek-V3.1-Terminus",name:"DeepSeek V3.1 Terminus"},"meituan-longcat/LongCat-Flash-Thinking-FP8":{id:"meituan-longcat/LongCat-Flash-Thinking-FP8",name:"LongCat Flash Thinking FP8"},"zai-org/GLM-4.5-turbo":{id:"zai-org/GLM-4.5-turbo",name:"GLM-4.5 Turbo"},"deepseek-ai/DeepSeek-V3.1-turbo":{id:"deepseek-ai/DeepSeek-V3.1-turbo",name:"DeepSeek V3.1 Turbo"}}},"nanogpt-plan":{id:"nanogpt-plan",name:"nanogpt-plan",baseUrl:"https://nano-gpt.com/api/v1",type:"openai-compatible",models:{"deepseek-ai/DeepSeek-V3.1-Terminus":{id:"deepseek-ai/DeepSeek-V3.1-Terminus",name:"DeepSeek V3.1 Terminus"},"deepseek-ai/DeepSeek-V3.1":{id:"deepseek-ai/DeepSeek-V3.1",name:"DeepSeek V3.1"},"deepseek-ai/DeepSeek-V3.1-Terminus:thinking":{id:"deepseek-ai/DeepSeek-V3.1-Terminus:thinking",name:"DeepSeek V3.1 Terminus Thinking"},"zai-org/GLM-4.5-FP8":{id:"zai-org/GLM-4.5-FP8",name:"GLM 4.5 FP8"},"zai-org/GLM-4.5-FP8:thinking":{id:"zai-org/GLM-4.5-FP8:thinking",name:"GLM 4.5 FP8 Thinking"},"zai-org/GLM-4.5-Air":{id:"zai-org/GLM-4.5-Air",name:"GLM 4.5 Air"},"moonshotai/Kimi-K2-Instruct":{id:"moonshotai/Kimi-K2-Instruct",name:"Kimi K2 Instruct"},"moonshotai/Kimi-K2-Instruct-0905":{id:"moonshotai/Kimi-K2-Instruct-0905",name:"Kimi K2 Instruct 0905"},"deepseek-ai/deepseek-v3.2-exp":{id:"deepseek-ai/deepseek-v3.2-exp",name:"DeepSeek V3.2 Exp"},"z-ai/glm-4.6":{id:"z-ai/glm-4.6",name:"GLM 4.6"},"z-ai/glm-4.6:thinking":{id:"z-ai/glm-4.6:thinking",name:"GLM 4.6 Thinking"},"qwen3-vl-235b-a22b-instruct":{id:"qwen3-vl-235b-a22b-instruct",name:"Qwen3 VL 235B A22B Instruct"}}}}};var Cd=$a.join(gE(),".cache","ai-speedometer"),Ad=$a.join(Cd,"models.json"),Fv=[{id:"openai",name:"OpenAI",baseUrl:"https://api.openai.com/v1",type:"openai-compatible",models:[{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o Mini"},{id:"gpt-4-turbo",name:"GPT-4 Turbo"},{id:"gpt-3.5-turbo",name:"GPT-3.5 Turbo"}]},{id:"anthropic",name:"Anthropic",baseUrl:"https://api.anthropic.com",type:"anthropic",models:[{id:"claude-3-5-sonnet-20241022",name:"Claude 3.5 Sonnet"},{id:"claude-3-5-haiku-20241022",name:"Claude 3.5 Haiku"},{id:"claude-3-opus-20240229",name:"Claude 3 Opus"}]},{id:"openrouter",name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",type:"openai-compatible",models:[{id:"anthropic/claude-3.5-sonnet",name:"Claude 3.5 Sonnet"},{id:"openai/gpt-4o",name:"GPT-4o"},{id:"openai/gpt-4o-mini",name:"GPT-4o Mini"}]}];function hE(){try{Ut.existsSync(Cd)||Ut.mkdirSync(Cd,{recursive:!0})}catch(e){console.warn("Warning: Could not create cache directory:",e.message)}}function vE(e){if(!e.timestamp)return!0;let n=Date.now()-e.timestamp,o=3600*1e3;return n>o}function yE(){try{if(Ut.existsSync(Ad)){let e=Ut.readFileSync(Ad,"utf8"),t=JSON.parse(e);return vE(t)?null:t}}catch(e){console.warn("Warning: Could not load cache:",e.message)}return null}function bE(e){try{hE();let t={...e,timestamp:Date.now()};Ut.writeFileSync(Ad,JSON.stringify(t,null,2))}catch(t){console.warn("Warning: Could not save cache:",t.message)}}async function _E(){try{let e=await fetch("https://models.dev/api.json");if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return await e.json()}catch(e){return console.warn("Warning: Could not fetch from models.dev API:",e.message),null}}function Fo(){try{let e=Td,t=$a.join(process.cwd(),"custom-verified-providers.json");if(Ut.existsSync(t))try{let o=Ut.readFileSync(t,"utf8");e=JSON.parse(o)}catch(o){console.warn("Warning: Could not load custom providers from file, using embedded data:",o.message)}let n=[];if(e["custom-verified-providers"]){for(let[,o]of Object.entries(e["custom-verified-providers"]))if(o.id!=="extra-models-dev"&&o.id&&o.name&&o.models){let r={id:o.id,name:o.name,baseUrl:o.baseUrl||"",type:o.type||"openai-compatible",models:Object.values(o.models).map(i=>({id:i.id,name:i.name}))};n.push(r)}}return n}catch(e){console.warn("Warning: Could not load custom verified providers:",e.message)}return[]}function Mv(){try{let e=Td,t=$a.join(process.cwd(),"custom-verified-providers.json");if(Ut.existsSync(t))try{let o=Ut.readFileSync(t,"utf8");e=JSON.parse(o)}catch(o){console.warn("Warning: Could not load extra models from file, using embedded data:",o.message)}let n={};if(e["custom-verified-providers"]&&e["custom-verified-providers"]["extra-models-dev"])for(let[o,r]of Object.entries(e["custom-verified-providers"]["extra-models-dev"]))n[o]=Object.values(r).map(i=>({id:i.id,name:i.name}));return n}catch(e){console.warn("Warning: Could not load extra models:",e.message)}return{}}function xE(e){let t=[],n=Fo();t.push(...n);let o=Mv();if(e){for(let[,r]of Object.entries(e))if(r.id&&r.name&&r.models){let i=Object.values(r.models).map(u=>({id:u.id,name:u.name}));o[r.id]&&i.push(...o[r.id]);let a={id:r.id,name:r.name,baseUrl:r.api||r.baseUrl||"",type:r.npm&&r.npm.includes("anthropic")?"anthropic":"openai-compatible",models:i};t.push(a)}}return t.length===0?Fv:t}async function gr(){let e=yE();if(e&&e.providers){let i=Fo(),a=new Set(e.providers.map(l=>l.id)),u=i.filter(l=>!a.has(l.id));return u.length>0&&e.providers.push(...u),e.providers}let t=await _E();if(t){let i=xE(t);return bE({providers:i}),i}let n=[...Fv],o=Mv(),r=Fo();return n.forEach(i=>{o[i.id]&&i.models.push(...o[i.id])}),n.push(...r),n}async function Pd(e){let t=await gr(),n=e.toLowerCase();return t.filter(o=>o.name.toLowerCase().includes(n)||o.id.toLowerCase().includes(n))}async function Sa(e){let n=(await gr()).find(o=>o.id===e);return n?n.models:[]}import ar from"fs";import ln from"path";import{homedir as Uv}from"os";import{parse as TE}from"jsonc-parser";var Rd=()=>{let e=process.env.XDG_DATA_HOME||ln.join(Uv(),".local","share"),t=process.env.XDG_CONFIG_HOME||ln.join(Uv(),".config");return{data:ln.join(e,"opencode"),config:ln.join(t,"opencode")}},Fd=()=>{let e=Rd();return{authJson:ln.join(e.data,"auth.json"),opencodeJson:ln.join(e.config,"opencode.json")}},CE=()=>{let e=Rd();[e.data,e.config].forEach(t=>{ar.existsSync(t)||ar.mkdirSync(t,{recursive:!0})})},Md=async()=>{let{authJson:e}=Fd();try{if(!ar.existsSync(e))return{};let t=ar.readFileSync(e,"utf8"),n=[],o=TE(t,n,{allowTrailingComma:!0});return n.length>0?(console.warn("Warning: JSONC parsing errors in auth.json:",n.map(r=>r.error).join(", ")),o||{}):o}catch(t){return console.warn("Warning: Could not read auth.json:",t.message),{}}},AE=async e=>{let{authJson:t}=Fd();try{CE();let n=JSON.stringify(e,null,2);return ar.writeFileSync(t,n),ar.chmodSync(t,384),!0}catch(n){return console.error("Error writing auth.json:",n.message),!1}};var PE=async()=>{let e=await Md(),t=await gr(),n=[];for(let[o,r]of Object.entries(e)){let i=t.find(a=>a.id===o);if(i&&r.type==="api"&&r.key){let a=await Sa(o);n.push({id:o,name:i.name,type:i.type,baseUrl:i.baseUrl,apiKey:r.key,authType:r.type,models:a.map(u=>({name:u.name,id:`${o}_${u.id}`}))})}}return n};var OE=async e=>{try{return(await gr()).find(n=>n.id===e)}catch(t){return console.warn("Warning: Could not verify provider:",t.message),null}},Ud=async(e,t)=>{let n=await Md();return n[e]={type:"api",key:t},await AE(n)};var Zv=async()=>{let[e,t,n]=await Promise.all([PE(),(async()=>{try{let{getCustomProvidersFromConfig:r}=await Promise.resolve().then(()=>(vr(),un));return await r()}catch(r){return console.warn("Warning: Could not load custom providers:",r.message),[]}})(),(async()=>{try{return Fo()}catch(r){return console.warn("Warning: Could not load custom verified providers:",r.message),[]}})()]),o=new Map;return n.forEach(r=>{o.set(r.id,r)}),t.forEach(r=>{o.set(r.id,r)}),e.forEach(r=>{o.set(r.id,r)}),Array.from(o.values())};var Lv=async e=>{let t={migrated:0,failed:0,errors:[]};try{if(e.verifiedProviders)for(let[n,o]of Object.entries(e.verifiedProviders))await OE(n)?await Ud(n,o)?t.migrated++:(t.failed++,t.errors.push(`Failed to migrate ${n}`)):(t.failed++,t.errors.push(`Provider ${n} not found in models.dev`));if(e.customProviders&&e.customProviders.length>0)try{let{addCustomProvider:n,readAIConfig:o,writeAIConfig:r}=await Promise.resolve().then(()=>(vr(),un)),i=await o();for(let a of e.customProviders)try{let u={id:a.id,name:a.name,type:a.type,baseUrl:a.baseUrl,apiKey:a.apiKey,models:a.models||[]};i.customProviders=i.customProviders||[],i.customProviders.push(u),t.migrated++}catch(u){t.failed++,t.errors.push(`Failed to migrate custom provider ${a.name}: ${u.message}`)}await r(i)}catch(n){t.failed++,t.errors.push(`Failed to migrate custom providers: ${n.message}`)}return t}catch(n){return t.failed++,t.errors.push(`Migration failed: ${n.message}`),t}},Bv=async()=>{let e=Fd(),[t,n]=await Promise.all([Md(),(async()=>{try{let{getAIConfigPaths:a}=await Promise.resolve().then(()=>(vr(),un));return await a()}catch{return{configDir:"N/A",configJson:"N/A",configExists:!1}}})()]),o=ar.existsSync(e.authJson),r=ar.existsSync(e.opencodeJson),i={verifiedProviders:{},customProviders:[]};try{let{readAIConfig:a}=await Promise.resolve().then(()=>(vr(),un));i=await a()}catch{}return{opencodePaths:e,authExists:o,configExists:r,authData:Object.keys(t),configProviders:[],aiConfigPaths:n,aiConfigData:{verifiedProviders:Object.keys(i.verifiedProviders||{}),customProviders:(i.customProviders||[]).map(a=>a.id)},xdgPaths:Rd()}};vr();var Wy=pb(Vy(),1);import"dotenv/config";var Yd=process.argv.includes("--debug"),Bo=null;function ve(e){if(!Yd)return;let n=`[${new Date().toISOString()}] ${e}
|
|
89
89
|
`;Bo||(Bo=Na.createWriteStream("debug.log",{flags:"w"})),Bo.write(n),(e.includes("ERROR")||e.includes("Creating")||e.includes("API Request"))&&console.log(n.trim())}function yT(e,t){ve(`Creating Anthropic provider with baseUrl: ${e}`),ve(`API Key length: ${t?t.length:0}`);let n=cd({apiKey:t,baseURL:e,fetch:Yd?async(o,r)=>{ve(`API Request to: ${o}`);let i=await fetch(o,r);return ve(`Response status: ${i.status}`),i}:void 0});return ve(`Provider created successfully: ${n?"yes":"no"}`),n}var za=vT.createInterface({input:process.stdin,output:process.stdout}),qy={reset:"\x1B[0m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bright:"\x1B[1m",dim:"\x1B[2m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"};function g(e,t){return`${qy[t]}${e}${qy.reset}`}try{process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8")}catch{}function te(e){return new Promise(t=>za.question(e,t))}function $e(){console.clear()}function xt(){console.log(g("Ai-speedometer","cyan")),console.log(g("=============================","cyan")),console.log(g("Note: opencode uses ai-sdk","dim")),console.log("")}async function Ky(){try{let e="ai-benchmark-config.json";if(Na.existsSync(e)){console.log(g("Migrating from old config format to new format...","yellow"));try{let n=Na.readFileSync(e,"utf8"),o=JSON.parse(n),r=await Lv(o);console.log(g(`Migration complete: ${r.migrated} items migrated`,"green")),r.failed>0&&(console.log(g(`Migration warnings: ${r.failed} items failed`,"yellow")),r.errors.forEach(i=>{console.log(g(` - ${i}`,"dim"))})),Na.renameSync(e,`${e}.backup`),console.log(g("Old config backed up as ai-benchmark-config.json.backup","cyan")),await te(g("Press Enter to continue...","yellow"))}catch(n){console.log(g("Migration failed: ","red")+n.message),await te(g("Press Enter to continue with empty config...","yellow"))}}return{providers:await Zv(),verifiedProviders:{}}}catch(e){return console.log(g("Error loading config, starting fresh: ","yellow")+e.message),{providers:[],verifiedProviders:{}}}}async function V2(e){console.log(g("Note: Configuration is now automatically saved to ai-benchmark-config.json and auth.json","cyan"))}function br(){return new Promise(e=>{process.stdin.isRaw?process.stdin.once("data",t=>{t===""&&process.exit(0),e(t)}):za.question(g("Press Enter to continue...","yellow"),()=>{e("\r")})})}async function Jy(){$e(),xt(),console.log(g("Select Models for Benchmark","magenta")),console.log("");let e=await Ky();if(await Ca(),e.providers.length===0)return console.log(g("No providers available. Please add a provider first.","red")),await te(g("Press Enter to continue...","yellow")),[];let t=[];e.providers.forEach(y=>{y.models.forEach(p=>{t.push({...p,providerName:y.name,providerType:y.type,providerId:y.id,providerConfig:{...y,apiKey:y.apiKey||"",baseUrl:y.baseUrl||""},selected:!1})})});let n=await zd(),o=[];n.forEach(y=>{let p=t.find(d=>d.id===y.modelId&&d.providerName===y.providerName);p&&o.push({...p,isRecent:!0})});let r=0,i=0,a="",u=y=>{if(!y.trim()){let d=new Set(o.map(v=>v.id)),f=t.filter(v=>!d.has(v.id));return[...o,...f]}let p=y.toLowerCase().split(/\s+/).filter(d=>d.length>0);return t.filter(d=>{let f=`${d.name} ${d.providerName} ${d.providerId} ${d.providerType}`.toLowerCase();return p.every(v=>f.includes(v))})},l=u(""),c=!0,m,h=(y,p)=>{clearTimeout(m),m=setTimeout(()=>{l=u(y),c=!0,p(l)},50)};for(;;){let y=Yy(12),p=Math.ceil(l.length/y);if(c){let f="";f+=g("Ai-speedometer","cyan")+`
|
|
90
90
|
`,f+=g("=============================","cyan")+`
|
|
91
91
|
`,f+=g("Note: opencode uses ai-sdk","dim")+`
|
package/package.json
CHANGED