free-coding-models 0.1.81 → 0.1.82

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.
@@ -1441,8 +1441,8 @@ const PROVIDER_METADATA = {
1441
1441
  sambanova: {
1442
1442
  label: 'SambaNova',
1443
1443
  color: chalk.rgb(255, 165, 0),
1444
- signupUrl: 'https://sambanova.ai/developers',
1445
- signupHint: 'Developers portal → Create API key',
1444
+ signupUrl: 'https://cloud.sambanova.ai/apis',
1445
+ signupHint: 'SambaCloud portal → Create API key',
1446
1446
  rateLimits: 'Dev tier generous quota',
1447
1447
  },
1448
1448
  openrouter: {
@@ -1539,7 +1539,7 @@ const PROVIDER_METADATA = {
1539
1539
  qwen: {
1540
1540
  label: 'Alibaba Cloud (DashScope)',
1541
1541
  color: chalk.rgb(255, 140, 0),
1542
- signupUrl: 'https://dashscope.console.alibabacloud.com',
1542
+ signupUrl: 'https://modelstudio.console.alibabacloud.com',
1543
1543
  signupHint: 'Model Studio → API Key → Create (1M free tokens, 90 days)',
1544
1544
  rateLimits: '1M free tokens per model (Singapore region, 90 days)',
1545
1545
  },
@@ -2806,6 +2806,7 @@ async function main() {
2806
2806
  settingsCursor: 0, // 📖 Which provider row is selected in settings
2807
2807
  settingsEditMode: false, // 📖 Whether we're in inline key editing mode
2808
2808
  settingsEditBuffer: '', // 📖 Typed characters for the API key being edited
2809
+ settingsErrorMsg: null, // 📖 Temporary error message to display in settings
2809
2810
  settingsTestResults: {}, // 📖 { providerKey: 'pending'|'ok'|'fail'|null }
2810
2811
  settingsUpdateState: 'idle', // 📖 'idle'|'checking'|'available'|'up-to-date'|'error'|'installing'
2811
2812
  settingsUpdateLatestVersion: null, // 📖 Latest npm version discovered from manual check
@@ -2902,6 +2903,9 @@ async function main() {
2902
2903
 
2903
2904
  lines.push('')
2904
2905
  lines.push(` ${chalk.bold('⚙ Settings')} ${chalk.dim('— free-coding-models v' + LOCAL_VERSION)}`)
2906
+ if (state.settingsErrorMsg) {
2907
+ lines.push(` ${chalk.red.bold(state.settingsErrorMsg)}`)
2908
+ }
2905
2909
  lines.push('')
2906
2910
  lines.push(` ${chalk.bold('🧩 Providers')}`)
2907
2911
  lines.push(` ${chalk.dim(' ' + '─'.repeat(112))}`)
@@ -3942,6 +3946,15 @@ async function main() {
3942
3946
  const pk = providerKeys[state.settingsCursor]
3943
3947
  const newKey = state.settingsEditBuffer.trim()
3944
3948
  if (newKey) {
3949
+ // 📖 Validate OpenRouter keys start with "sk-or-" to detect corruption
3950
+ if (pk === 'openrouter' && !newKey.startsWith('sk-or-')) {
3951
+ // 📖 Don't save corrupted keys - show warning and cancel
3952
+ state.settingsEditMode = false
3953
+ state.settingsEditBuffer = ''
3954
+ state.settingsErrorMsg = '⚠️ OpenRouter keys must start with "sk-or-". Key not saved.'
3955
+ setTimeout(() => { state.settingsErrorMsg = null }, 3000)
3956
+ return
3957
+ }
3945
3958
  state.config.apiKeys[pk] = newKey
3946
3959
  saveConfig(state.config)
3947
3960
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-coding-models",
3
- "version": "0.1.81",
3
+ "version": "0.1.82",
4
4
  "description": "Find the fastest coding LLM models in seconds — ping free models from multiple providers, pick the best one for OpenCode, Cursor, or any AI coding assistant.",
5
5
  "keywords": [
6
6
  "nvidia",
package/sources.js CHANGED
@@ -293,7 +293,7 @@ export const perplexity = [
293
293
  // 📖 Alibaba Cloud (DashScope) source - https://dashscope-intl.aliyuncs.com
294
294
  // 📖 OpenAI-compatible endpoint: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
295
295
  // 📖 Free tier: 1M tokens per model (Singapore region only), valid for 90 days
296
- // 📖 Get API key: https://dashscope.console.alibabacloud.com
296
+ // 📖 Get API key: https://modelstudio.console.alibabacloud.com
297
297
  // 📖 Env var: DASHSCOPE_API_KEY
298
298
  // 📖 Qwen3-Coder models: optimized coding models with excellent SWE-bench scores
299
299
  export const qwen = [