@aituber-onair/chat 0.16.0 → 0.17.0

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.
Files changed (31) hide show
  1. package/README.ja.md +29 -0
  2. package/README.md +28 -0
  3. package/dist/cjs/constants/openrouter.js +1 -1
  4. package/dist/cjs/constants/openrouter.js.map +1 -1
  5. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  6. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +1 -1
  7. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  8. package/dist/cjs/utils/index.d.ts +1 -0
  9. package/dist/cjs/utils/index.d.ts.map +1 -1
  10. package/dist/cjs/utils/index.js +1 -0
  11. package/dist/cjs/utils/index.js.map +1 -1
  12. package/dist/cjs/utils/refreshOpenRouterFreeModels.d.ts +25 -0
  13. package/dist/cjs/utils/refreshOpenRouterFreeModels.d.ts.map +1 -0
  14. package/dist/cjs/utils/refreshOpenRouterFreeModels.js +207 -0
  15. package/dist/cjs/utils/refreshOpenRouterFreeModels.js.map +1 -0
  16. package/dist/esm/constants/openrouter.js +1 -1
  17. package/dist/esm/constants/openrouter.js.map +1 -1
  18. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -1
  19. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +2 -2
  20. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -1
  21. package/dist/esm/utils/index.d.ts +1 -0
  22. package/dist/esm/utils/index.d.ts.map +1 -1
  23. package/dist/esm/utils/index.js +1 -0
  24. package/dist/esm/utils/index.js.map +1 -1
  25. package/dist/esm/utils/refreshOpenRouterFreeModels.d.ts +25 -0
  26. package/dist/esm/utils/refreshOpenRouterFreeModels.d.ts.map +1 -0
  27. package/dist/esm/utils/refreshOpenRouterFreeModels.js +204 -0
  28. package/dist/esm/utils/refreshOpenRouterFreeModels.js.map +1 -0
  29. package/dist/umd/aituber-onair-chat.js +209 -2
  30. package/dist/umd/aituber-onair-chat.min.js +6 -6
  31. package/package.json +1 -1
package/README.ja.md CHANGED
@@ -265,6 +265,7 @@ const openRouterService = ChatServiceFactory.createChatService('openrouter', {
265
265
  - `gpt-oss-20b:free`モデルでは、技術的制限によりトークン制限が自動的に無効化されます
266
266
  - 応答の長さを制御するには、プロンプト内で指示してください(例:「40文字以内で返答してください」)
267
267
  - 無料階層にはレート制限があります(20リクエスト/分)
268
+ - 無料モデル判定はモデルID末尾の `:free` で行います(動的取得した `:free` も同様にレート制限対象)
268
269
  - サポート対象モデル(キュレーション済み):
269
270
  - `openai/gpt-oss-20b:free`
270
271
  - `openai/gpt-5.1-chat`, `openai/gpt-5.1-codex`, `openai/gpt-5-mini`, `openai/gpt-5-nano`
@@ -275,6 +276,34 @@ const openRouterService = ChatServiceFactory.createChatService('openrouter', {
275
276
  - `z-ai/glm-4.7-flash`, `z-ai/glm-4.5-air`, `z-ai/glm-4.5-air:free`
276
277
  - `moonshotai/kimi-k2.5`
277
278
 
279
+ **OpenRouter freeモデルの動的リフレッシュ**
280
+
281
+ 利用可能な `:free` モデルを取得し、利用前に疎通確認できます。
282
+
283
+ ```typescript
284
+ import { refreshOpenRouterFreeModels } from '@aituber-onair/chat';
285
+
286
+ const result = await refreshOpenRouterFreeModels({
287
+ apiKey: process.env.OPENROUTER_API_KEY || '',
288
+ concurrency: 2, // デフォルト: 2
289
+ timeoutMs: 12000, // デフォルト: 12000
290
+ maxCandidates: 1, // デフォルト: 1
291
+ maxWorking: 10, // デフォルト: 10
292
+ });
293
+
294
+ console.log(result.working); // 例: ['openai/gpt-oss-20b:free']
295
+ console.log(result.failed); // [{ id, reason }, ...]
296
+ console.log(result.fetchedAt); // Date.now() のタイムスタンプ
297
+ ```
298
+
299
+ 注意:
300
+ - モデル一覧は `https://openrouter.ai/api/v1/models` から取得します
301
+ - 候補はモデルID末尾が `:free` のものに絞り込みます
302
+ - `maxCandidates` は「疎通確認する候補の最大件数」です
303
+ (例: `10` は「最大10候補を試す」意味で、動作モデルが10件見つかるまで継続はしません)
304
+ - 疎通確認は OpenRouter chat completions の最小 one-shot リクエスト(`stream: false`)を使います
305
+ - `fetch` を利用しているため、ブラウザとNodeの両方で動作します
306
+
278
307
  #### Z.ai(GLM)
279
308
 
280
309
  ```typescript
package/README.md CHANGED
@@ -262,6 +262,7 @@ const openRouterService = ChatServiceFactory.createChatService('openrouter', {
262
262
  - Token limits are automatically disabled for the `gpt-oss-20b:free` model due to technical limitations
263
263
  - To control response length, include instructions in your prompt (e.g., "Please respond in 40 characters or less")
264
264
  - Free tier has rate limits (20 requests/minute)
265
+ - Free tier detection is based on the model ID suffix `:free` (dynamic `:free` IDs are also rate-limited)
265
266
  - Supported models (curated list):
266
267
  - `openai/gpt-oss-20b:free`
267
268
  - `openai/gpt-5.1-chat`, `openai/gpt-5.1-codex`, `openai/gpt-5-mini`, `openai/gpt-5-nano`
@@ -272,6 +273,33 @@ const openRouterService = ChatServiceFactory.createChatService('openrouter', {
272
273
  - `z-ai/glm-4.7-flash`, `z-ai/glm-4.5-air`, `z-ai/glm-4.5-air:free`
273
274
  - `moonshotai/kimi-k2.5`
274
275
 
276
+ **Dynamic OpenRouter free model refresh**
277
+
278
+ You can fetch currently available `:free` models and probe them before use:
279
+
280
+ ```typescript
281
+ import { refreshOpenRouterFreeModels } from '@aituber-onair/chat';
282
+
283
+ const result = await refreshOpenRouterFreeModels({
284
+ apiKey: process.env.OPENROUTER_API_KEY || '',
285
+ concurrency: 2, // default: 2
286
+ timeoutMs: 12000, // default: 12000
287
+ maxCandidates: 1, // default: 1
288
+ maxWorking: 10, // default: 10
289
+ });
290
+
291
+ console.log(result.working); // e.g. ['openai/gpt-oss-20b:free']
292
+ console.log(result.failed); // [{ id, reason }, ...]
293
+ console.log(result.fetchedAt); // Date.now() timestamp
294
+ ```
295
+
296
+ Notes:
297
+ - Models are fetched from `https://openrouter.ai/api/v1/models`
298
+ - Candidates are filtered by model ID suffix `:free`
299
+ - `maxCandidates` means "maximum number of candidates to probe" (e.g., `10` probes up to 10 candidates, not until 10 working models are found)
300
+ - Probe uses OpenRouter chat completions with a minimal one-shot request (`stream: false`)
301
+ - Works in both browser and Node runtimes (uses `fetch`)
302
+
275
303
  #### Z.ai (GLM)
276
304
 
277
305
  ```typescript
@@ -59,7 +59,7 @@ exports.OPENROUTER_CREDITS_THRESHOLD = 10;
59
59
  * @returns True if the model is free tier
60
60
  */
61
61
  function isOpenRouterFreeModel(model) {
62
- return exports.OPENROUTER_FREE_MODELS.some((freeModel) => model.includes(freeModel));
62
+ return model.trim().endsWith(':free');
63
63
  }
64
64
  /**
65
65
  * Check if a model supports vision on OpenRouter
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../src/constants/openrouter.ts"],"names":[],"mappings":";;;AA8DA,sDAEC;AAOD,0DAIC;AA3EY,QAAA,uBAAuB,GAClC,+CAA+C,CAAC;AAElD,oBAAoB;AACP,QAAA,sBAAsB,GAAG,yBAAyB,CAAC;AACnD,QAAA,0BAA0B,GAAG,sBAAsB,CAAC;AACpD,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;AAClD,QAAA,0BAA0B,GAAG,sBAAsB,CAAC;AACpD,QAAA,uBAAuB,GAAG,mBAAmB,CAAC;AAC9C,QAAA,uBAAuB,GAAG,mBAAmB,CAAC;AAC9C,QAAA,mBAAmB,GAAG,eAAe,CAAC;AACtC,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;AAClD,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;AAClD,QAAA,6BAA6B,GAAG,yBAAyB,CAAC;AAC1D,QAAA,+BAA+B,GAAG,2BAA2B,CAAC;AAC9D,QAAA,iCAAiC,GAAG,6BAA6B,CAAC;AAClE,QAAA,iCAAiC,GAAG,6BAA6B,CAAC;AAClE,QAAA,gCAAgC,GAAG,4BAA4B,CAAC;AAChE,QAAA,2BAA2B,GAAG,uBAAuB,CAAC;AACtD,QAAA,6BAA6B,GAAG,yBAAyB,CAAC;AAC1D,QAAA,kDAAkD,GAC7D,8CAA8C,CAAC;AACpC,QAAA,uBAAuB,GAAG,oBAAoB,CAAC;AAC/C,QAAA,qBAAqB,GAAG,kBAAkB,CAAC;AAC3C,QAAA,0BAA0B,GAAG,uBAAuB,CAAC;AAElE,mBAAmB;AACN,QAAA,sBAAsB,GAAG;IACpC,8BAAsB;IACtB,kCAA0B;CAC3B,CAAC;AAEF,wCAAwC;AAC3B,QAAA,kCAAkC,GAAG;IAChD,iCAAyB;IACzB,kCAA0B;IAC1B,+BAAuB;IACvB,+BAAuB;IACvB,2BAAmB;IACnB,iCAAyB;IACzB,iCAAyB;IACzB,qCAA6B;IAC7B,uCAA+B;IAC/B,yCAAiC;IACjC,wCAAgC;IAChC,mCAA2B;IAC3B,qCAA6B;IAC7B,0DAAkD;IAClD,kCAA0B;CAC3B,CAAC;AAEF,4BAA4B;AACf,QAAA,qCAAqC,GAAG,EAAE,CAAC;AAC3C,QAAA,uCAAuC,GAAG,EAAE,CAAC;AAC7C,QAAA,wCAAwC,GAAG,IAAI,CAAC;AAChD,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,KAAa;IACjD,OAAO,8BAAsB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,KAAa;IACnD,OAAO,0CAAkC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7D,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../src/constants/openrouter.ts"],"names":[],"mappings":";;;AA8DA,sDAEC;AAOD,0DAIC;AA3EY,QAAA,uBAAuB,GAClC,+CAA+C,CAAC;AAElD,oBAAoB;AACP,QAAA,sBAAsB,GAAG,yBAAyB,CAAC;AACnD,QAAA,0BAA0B,GAAG,sBAAsB,CAAC;AACpD,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;AAClD,QAAA,0BAA0B,GAAG,sBAAsB,CAAC;AACpD,QAAA,uBAAuB,GAAG,mBAAmB,CAAC;AAC9C,QAAA,uBAAuB,GAAG,mBAAmB,CAAC;AAC9C,QAAA,mBAAmB,GAAG,eAAe,CAAC;AACtC,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;AAClD,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;AAClD,QAAA,6BAA6B,GAAG,yBAAyB,CAAC;AAC1D,QAAA,+BAA+B,GAAG,2BAA2B,CAAC;AAC9D,QAAA,iCAAiC,GAAG,6BAA6B,CAAC;AAClE,QAAA,iCAAiC,GAAG,6BAA6B,CAAC;AAClE,QAAA,gCAAgC,GAAG,4BAA4B,CAAC;AAChE,QAAA,2BAA2B,GAAG,uBAAuB,CAAC;AACtD,QAAA,6BAA6B,GAAG,yBAAyB,CAAC;AAC1D,QAAA,kDAAkD,GAC7D,8CAA8C,CAAC;AACpC,QAAA,uBAAuB,GAAG,oBAAoB,CAAC;AAC/C,QAAA,qBAAqB,GAAG,kBAAkB,CAAC;AAC3C,QAAA,0BAA0B,GAAG,uBAAuB,CAAC;AAElE,mBAAmB;AACN,QAAA,sBAAsB,GAAG;IACpC,8BAAsB;IACtB,kCAA0B;CAC3B,CAAC;AAEF,wCAAwC;AAC3B,QAAA,kCAAkC,GAAG;IAChD,iCAAyB;IACzB,kCAA0B;IAC1B,+BAAuB;IACvB,+BAAuB;IACvB,2BAAmB;IACnB,iCAAyB;IACzB,iCAAyB;IACzB,qCAA6B;IAC7B,uCAA+B;IAC/B,yCAAiC;IACjC,wCAAgC;IAChC,mCAA2B;IAC3B,qCAA6B;IAC7B,0DAAkD;IAClD,kCAA0B;CAC3B,CAAC;AAEF,4BAA4B;AACf,QAAA,qCAAqC,GAAG,EAAE,CAAC;AAC3C,QAAA,uCAAuC,GAAG,EAAE,CAAC;AAC7C,QAAA,wCAAwC,GAAG,IAAI,CAAC;AAChD,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,KAAa;IACjD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,KAAa;IACnD,OAAO,0CAAkC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7D,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OpenRouterChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAIhC;;;GAGG;AACH,qBAAa,6BACX,YAAW,mBAAmB,CAAC,4BAA4B,CAAC;IAE5D;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,WAAW;IAmCrE;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,EAAE;IA+B9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAMzB;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC"}
1
+ {"version":3,"file":"OpenRouterChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAIhC;;;GAGG;AACH,qBAAa,6BACX,YAAW,mBAAmB,CAAC,4BAA4B,CAAC;IAE5D;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,WAAW;IAmCrE;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,EAAE;IA+B9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAMzB;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC"}
@@ -109,7 +109,7 @@ class OpenRouterChatServiceProvider {
109
109
  * @returns True if the model is free
110
110
  */
111
111
  isModelFree(model) {
112
- return openrouter_1.OPENROUTER_FREE_MODELS.includes(model) || model.endsWith(':free');
112
+ return (0, openrouter_1.isOpenRouterFreeModel)(model);
113
113
  }
114
114
  }
115
115
  exports.OpenRouterChatServiceProvider = OpenRouterChatServiceProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"OpenRouterChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":";;;AAAA,8DAuBuC;AAEvC,mEAAgE;AAMhE,0CAAoD;AAEpD;;;GAGG;AACH,MAAa,6BAA6B;IAGxC;;;;OAIG;IACH,iBAAiB,CAAC,OAAqC;QACrD,iEAAiE;QACjE,sDAAsD;QACtD,MAAM,WAAW,GAAG,IAAA,0BAAkB,EAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE;YAC3D,sBAAsB,EAAE,CAAC,WAAW,EAAE,EAAE,CACtC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC;YAC1C,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,KAAK,GAAiC,OAAO,CAAC,KAAK,CAAC;QAE1D,sCAAsC;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,OAAO,IAAI,6CAAqB,CAC9B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,KAAK,EACL,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,cAAc,EACtB,OAAO,EACP,MAAM,EACN,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,kBAAkB,CAC3B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,OAAO;YACL,cAAc;YACd,mCAAsB;YACtB,uCAA0B;YAC1B,gBAAgB;YAChB,sCAAyB;YACzB,uCAA0B;YAC1B,oCAAuB;YACvB,oCAAuB;YACvB,gCAAmB;YACnB,sCAAyB;YACzB,sCAAyB;YACzB,mBAAmB;YACnB,0CAA6B;YAC7B,4CAA+B;YAC/B,8CAAiC;YACjC,8CAAiC;YACjC,6CAAgC;YAChC,gBAAgB;YAChB,wCAA2B;YAC3B,0CAA6B;YAC7B,+DAAkD;YAClD,cAAc;YACd,oCAAuB;YACvB,kCAAqB;YACrB,eAAe;YACf,uCAA0B;SAC3B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,mCAAsB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9C,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CACnC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,IAAA,oCAAuB,EAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,mCAAsB,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,KAAa;QACvB,OAAO,mCAAsB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC;CACF;AAlID,sEAkIC"}
1
+ {"version":3,"file":"OpenRouterChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":";;;AAAA,8DAwBuC;AAEvC,mEAAgE;AAMhE,0CAAoD;AAEpD;;;GAGG;AACH,MAAa,6BAA6B;IAGxC;;;;OAIG;IACH,iBAAiB,CAAC,OAAqC;QACrD,iEAAiE;QACjE,sDAAsD;QACtD,MAAM,WAAW,GAAG,IAAA,0BAAkB,EAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE;YAC3D,sBAAsB,EAAE,CAAC,WAAW,EAAE,EAAE,CACtC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC;YAC1C,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,KAAK,GAAiC,OAAO,CAAC,KAAK,CAAC;QAE1D,sCAAsC;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,OAAO,IAAI,6CAAqB,CAC9B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,KAAK,EACL,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,cAAc,EACtB,OAAO,EACP,MAAM,EACN,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,kBAAkB,CAC3B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,OAAO;YACL,cAAc;YACd,mCAAsB;YACtB,uCAA0B;YAC1B,gBAAgB;YAChB,sCAAyB;YACzB,uCAA0B;YAC1B,oCAAuB;YACvB,oCAAuB;YACvB,gCAAmB;YACnB,sCAAyB;YACzB,sCAAyB;YACzB,mBAAmB;YACnB,0CAA6B;YAC7B,4CAA+B;YAC/B,8CAAiC;YACjC,8CAAiC;YACjC,6CAAgC;YAChC,gBAAgB;YAChB,wCAA2B;YAC3B,0CAA6B;YAC7B,+DAAkD;YAClD,cAAc;YACd,oCAAuB;YACvB,kCAAqB;YACrB,eAAe;YACf,uCAA0B;SAC3B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,mCAAsB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9C,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CACnC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,IAAA,oCAAuB,EAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,mCAAsB,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,KAAa;QACvB,OAAO,IAAA,kCAAqB,EAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF;AAlID,sEAkIC"}
@@ -10,4 +10,5 @@ export * from './openaiCompatibleSse';
10
10
  export * from './openaiCompatibleTools';
11
11
  export * from './processChatFlow';
12
12
  export * from './visionModelResolver';
13
+ export * from './refreshOpenRouterFreeModels';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC"}
@@ -26,4 +26,5 @@ __exportStar(require("./openaiCompatibleSse"), exports);
26
26
  __exportStar(require("./openaiCompatibleTools"), exports);
27
27
  __exportStar(require("./processChatFlow"), exports);
28
28
  __exportStar(require("./visionModelResolver"), exports);
29
+ __exportStar(require("./refreshOpenRouterFreeModels"), exports);
29
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,0DAAwC;AACxC,0DAAwC;AACxC,+CAA6B;AAC7B,kDAAgC;AAChC,4CAA0B;AAC1B,wDAAsC;AACtC,0DAAwC;AACxC,oDAAkC;AAClC,wDAAsC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,0DAAwC;AACxC,0DAAwC;AACxC,+CAA6B;AAC7B,kDAAgC;AAChC,4CAA0B;AAC1B,wDAAsC;AACtC,0DAAwC;AACxC,oDAAkC;AAClC,wDAAsC;AACtC,gEAA8C"}
@@ -0,0 +1,25 @@
1
+ export interface RefreshOpenRouterFreeModelsOptions {
2
+ apiKey: string;
3
+ endpoint?: string;
4
+ modelsEndpoint?: string;
5
+ timeoutMs?: number;
6
+ concurrency?: number;
7
+ maxCandidates?: number;
8
+ maxWorking?: number;
9
+ appName?: string;
10
+ appUrl?: string;
11
+ }
12
+ export interface RefreshOpenRouterFreeModelsFailure {
13
+ id: string;
14
+ reason: string;
15
+ }
16
+ export interface RefreshOpenRouterFreeModelsResult {
17
+ working: string[];
18
+ failed: RefreshOpenRouterFreeModelsFailure[];
19
+ fetchedAt: number;
20
+ }
21
+ /**
22
+ * Fetch currently available OpenRouter free models and probe each model.
23
+ */
24
+ export declare function refreshOpenRouterFreeModels(options: RefreshOpenRouterFreeModelsOptions): Promise<RefreshOpenRouterFreeModelsResult>;
25
+ //# sourceMappingURL=refreshOpenRouterFreeModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshOpenRouterFreeModels.d.ts","sourceRoot":"","sources":["../../../src/utils/refreshOpenRouterFreeModels.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,kCAAkC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kCAAkC;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,kCAAkC,EAAE,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AA6MD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,iCAAiC,CAAC,CAoE5C"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.refreshOpenRouterFreeModels = refreshOpenRouterFreeModels;
4
+ const openrouter_1 = require("../constants/openrouter");
5
+ const OPENROUTER_MODELS_ENDPOINT = 'https://openrouter.ai/api/v1/models';
6
+ const DEFAULT_CONCURRENCY = 2;
7
+ const DEFAULT_TIMEOUT_MS = 12000;
8
+ const DEFAULT_MAX_CANDIDATES = 1;
9
+ const DEFAULT_MAX_WORKING = 10;
10
+ function toErrorMessage(error) {
11
+ if (error instanceof Error) {
12
+ return error.message;
13
+ }
14
+ return String(error);
15
+ }
16
+ function normalizeLimit(value, fallback) {
17
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
18
+ return fallback;
19
+ }
20
+ return Math.max(1, Math.floor(value));
21
+ }
22
+ function normalizeModelIds(modelIds) {
23
+ const seen = new Set();
24
+ const normalized = [];
25
+ for (const modelId of modelIds) {
26
+ const trimmed = modelId.trim();
27
+ if (!trimmed || seen.has(trimmed)) {
28
+ continue;
29
+ }
30
+ seen.add(trimmed);
31
+ normalized.push(trimmed);
32
+ }
33
+ return normalized;
34
+ }
35
+ async function fetchWithTimeout(url, init, timeoutMs) {
36
+ const hasAbortController = typeof AbortController !== 'undefined';
37
+ if (!hasAbortController) {
38
+ return fetch(url, init);
39
+ }
40
+ const controller = new AbortController();
41
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
42
+ try {
43
+ return await fetch(url, {
44
+ ...init,
45
+ signal: controller.signal,
46
+ });
47
+ }
48
+ catch (error) {
49
+ if (error instanceof Error && error.name === 'AbortError') {
50
+ throw new Error(`Timeout after ${timeoutMs}ms`);
51
+ }
52
+ throw error;
53
+ }
54
+ finally {
55
+ clearTimeout(timeoutId);
56
+ }
57
+ }
58
+ async function toHttpFailureReason(response) {
59
+ const status = `HTTP ${response.status} ${response.statusText}`.trim();
60
+ let body = '';
61
+ try {
62
+ body = await response.text();
63
+ }
64
+ catch {
65
+ return status;
66
+ }
67
+ const compactBody = body.replace(/\s+/g, ' ').trim().slice(0, 200);
68
+ if (!compactBody) {
69
+ return status;
70
+ }
71
+ return `${status}: ${compactBody}`;
72
+ }
73
+ function extractModelIds(payload) {
74
+ if (!payload || typeof payload !== 'object') {
75
+ throw new Error('Invalid models response shape');
76
+ }
77
+ const response = payload;
78
+ const modelEntries = Array.isArray(response.data)
79
+ ? response.data
80
+ : Array.isArray(response.models)
81
+ ? response.models
82
+ : [];
83
+ if (modelEntries.length === 0) {
84
+ return [];
85
+ }
86
+ const modelIds = modelEntries
87
+ .map((entry) => entry.id)
88
+ .filter((id) => typeof id === 'string');
89
+ return normalizeModelIds(modelIds);
90
+ }
91
+ async function probeModel({ modelId, apiKey, endpoint, timeoutMs, appName, appUrl, }) {
92
+ const headers = {
93
+ Authorization: `Bearer ${apiKey}`,
94
+ 'Content-Type': 'application/json',
95
+ };
96
+ if (appName) {
97
+ headers['X-Title'] = appName;
98
+ }
99
+ if (appUrl) {
100
+ headers['HTTP-Referer'] = appUrl;
101
+ }
102
+ try {
103
+ const response = await fetchWithTimeout(endpoint, {
104
+ method: 'POST',
105
+ headers,
106
+ body: JSON.stringify({
107
+ model: modelId,
108
+ messages: [{ role: 'user', content: 'Reply only with OK.' }],
109
+ stream: false,
110
+ }),
111
+ }, timeoutMs);
112
+ if (!response.ok) {
113
+ return {
114
+ id: modelId,
115
+ ok: false,
116
+ reason: await toHttpFailureReason(response),
117
+ };
118
+ }
119
+ try {
120
+ await response.json();
121
+ }
122
+ catch (error) {
123
+ return {
124
+ id: modelId,
125
+ ok: false,
126
+ reason: `JSON parse failed: ${toErrorMessage(error)}`,
127
+ };
128
+ }
129
+ return { id: modelId, ok: true };
130
+ }
131
+ catch (error) {
132
+ return {
133
+ id: modelId,
134
+ ok: false,
135
+ reason: toErrorMessage(error),
136
+ };
137
+ }
138
+ }
139
+ async function runWithConcurrency(items, concurrency, worker) {
140
+ if (items.length === 0) {
141
+ return [];
142
+ }
143
+ const results = new Array(items.length);
144
+ let nextIndex = 0;
145
+ const workerCount = Math.min(concurrency, items.length);
146
+ await Promise.all(Array.from({ length: workerCount }, async () => {
147
+ while (nextIndex < items.length) {
148
+ const current = nextIndex;
149
+ nextIndex += 1;
150
+ results[current] = await worker(items[current]);
151
+ }
152
+ }));
153
+ return results;
154
+ }
155
+ /**
156
+ * Fetch currently available OpenRouter free models and probe each model.
157
+ */
158
+ async function refreshOpenRouterFreeModels(options) {
159
+ const apiKey = options.apiKey.trim();
160
+ if (!apiKey) {
161
+ throw new Error('OpenRouter API key is required.');
162
+ }
163
+ const modelsEndpoint = options.modelsEndpoint || OPENROUTER_MODELS_ENDPOINT;
164
+ const endpoint = options.endpoint || openrouter_1.ENDPOINT_OPENROUTER_API;
165
+ const timeoutMs = normalizeLimit(options.timeoutMs, DEFAULT_TIMEOUT_MS);
166
+ const concurrency = normalizeLimit(options.concurrency, DEFAULT_CONCURRENCY);
167
+ const maxCandidates = normalizeLimit(options.maxCandidates, DEFAULT_MAX_CANDIDATES);
168
+ const maxWorking = normalizeLimit(options.maxWorking, DEFAULT_MAX_WORKING);
169
+ const modelsResponse = await fetchWithTimeout(modelsEndpoint, { method: 'GET' }, timeoutMs);
170
+ if (!modelsResponse.ok) {
171
+ throw new Error(await toHttpFailureReason(modelsResponse));
172
+ }
173
+ let payload;
174
+ try {
175
+ payload = await modelsResponse.json();
176
+ }
177
+ catch (error) {
178
+ throw new Error(`JSON parse failed: ${toErrorMessage(error)}`);
179
+ }
180
+ const candidateModelIds = extractModelIds(payload)
181
+ .filter((modelId) => (0, openrouter_1.isOpenRouterFreeModel)(modelId))
182
+ .slice(0, maxCandidates);
183
+ const probeResults = await runWithConcurrency(candidateModelIds, concurrency, (modelId) => probeModel({
184
+ modelId,
185
+ apiKey,
186
+ endpoint,
187
+ timeoutMs,
188
+ appName: options.appName,
189
+ appUrl: options.appUrl,
190
+ }));
191
+ const working = probeResults
192
+ .filter((result) => result.ok)
193
+ .map((result) => result.id)
194
+ .slice(0, maxWorking);
195
+ const failed = probeResults
196
+ .filter((result) => !result.ok)
197
+ .map((result) => ({
198
+ id: result.id,
199
+ reason: result.reason || 'Unknown error',
200
+ }));
201
+ return {
202
+ working,
203
+ failed,
204
+ fetchedAt: Date.now(),
205
+ };
206
+ }
207
+ //# sourceMappingURL=refreshOpenRouterFreeModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshOpenRouterFreeModels.js","sourceRoot":"","sources":["../../../src/utils/refreshOpenRouterFreeModels.ts"],"names":[],"mappings":"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"}
@@ -54,7 +54,7 @@ export const OPENROUTER_CREDITS_THRESHOLD = 10;
54
54
  * @returns True if the model is free tier
55
55
  */
56
56
  export function isOpenRouterFreeModel(model) {
57
- return OPENROUTER_FREE_MODELS.some((freeModel) => model.includes(freeModel));
57
+ return model.trim().endsWith(':free');
58
58
  }
59
59
  /**
60
60
  * Check if a model supports vision on OpenRouter
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../src/constants/openrouter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAClC,+CAA+C,CAAC;AAElD,oBAAoB;AACpB,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AACjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAC3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AACvE,MAAM,CAAC,MAAM,+BAA+B,GAAG,2BAA2B,CAAC;AAC3E,MAAM,CAAC,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;AAC/E,MAAM,CAAC,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;AAC/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,4BAA4B,CAAC;AAC7E,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAC;AACnE,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AACvE,MAAM,CAAC,MAAM,kDAAkD,GAC7D,8CAA8C,CAAC;AACjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AACxD,MAAM,CAAC,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AAElE,mBAAmB;AACnB,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,sBAAsB;IACtB,0BAA0B;CAC3B,CAAC;AAEF,wCAAwC;AACxC,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,yBAAyB;IACzB,0BAA0B;IAC1B,uBAAuB;IACvB,uBAAuB;IACvB,mBAAmB;IACnB,yBAAyB;IACzB,yBAAyB;IACzB,6BAA6B;IAC7B,+BAA+B;IAC/B,iCAAiC;IACjC,gCAAgC;IAChC,2BAA2B;IAC3B,6BAA6B;IAC7B,kDAAkD;IAClD,0BAA0B;CAC3B,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,uCAAuC,GAAG,EAAE,CAAC;AAC1D,MAAM,CAAC,MAAM,wCAAwC,GAAG,IAAI,CAAC;AAC7D,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,kCAAkC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7D,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../src/constants/openrouter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAClC,+CAA+C,CAAC;AAElD,oBAAoB;AACpB,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AACjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAC3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AACvE,MAAM,CAAC,MAAM,+BAA+B,GAAG,2BAA2B,CAAC;AAC3E,MAAM,CAAC,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;AAC/E,MAAM,CAAC,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;AAC/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,4BAA4B,CAAC;AAC7E,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAC;AACnE,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AACvE,MAAM,CAAC,MAAM,kDAAkD,GAC7D,8CAA8C,CAAC;AACjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AACxD,MAAM,CAAC,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AAElE,mBAAmB;AACnB,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,sBAAsB;IACtB,0BAA0B;CAC3B,CAAC;AAEF,wCAAwC;AACxC,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,yBAAyB;IACzB,0BAA0B;IAC1B,uBAAuB;IACvB,uBAAuB;IACvB,mBAAmB;IACnB,yBAAyB;IACzB,yBAAyB;IACzB,6BAA6B;IAC7B,+BAA+B;IAC/B,iCAAiC;IACjC,gCAAgC;IAChC,2BAA2B;IAC3B,6BAA6B;IAC7B,kDAAkD;IAClD,0BAA0B;CAC3B,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,uCAAuC,GAAG,EAAE,CAAC;AAC1D,MAAM,CAAC,MAAM,wCAAwC,GAAG,IAAI,CAAC;AAC7D,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,kCAAkC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7D,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OpenRouterChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAIhC;;;GAGG;AACH,qBAAa,6BACX,YAAW,mBAAmB,CAAC,4BAA4B,CAAC;IAE5D;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,WAAW;IAmCrE;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,EAAE;IA+B9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAMzB;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC"}
1
+ {"version":3,"file":"OpenRouterChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAIhC;;;GAGG;AACH,qBAAa,6BACX,YAAW,mBAAmB,CAAC,4BAA4B,CAAC;IAE5D;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,WAAW;IAmCrE;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,EAAE;IA+B9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAMzB;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC"}
@@ -1,4 +1,4 @@
1
- import { MODEL_GPT_OSS_20B_FREE, MODEL_MOONSHOTAI_KIMI_K2_5, MODEL_OPENAI_GPT_5_1_CHAT, MODEL_OPENAI_GPT_5_1_CODEX, MODEL_OPENAI_GPT_5_MINI, MODEL_OPENAI_GPT_5_NANO, MODEL_OPENAI_GPT_4O, MODEL_OPENAI_GPT_4_1_MINI, MODEL_OPENAI_GPT_4_1_NANO, MODEL_ANTHROPIC_CLAUDE_OPUS_4, MODEL_ANTHROPIC_CLAUDE_SONNET_4, MODEL_ANTHROPIC_CLAUDE_3_7_SONNET, MODEL_ANTHROPIC_CLAUDE_3_5_SONNET, MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU, MODEL_GOOGLE_GEMINI_2_5_PRO, MODEL_GOOGLE_GEMINI_2_5_FLASH, MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025, MODEL_ZAI_GLM_4_7_FLASH, MODEL_ZAI_GLM_4_5_AIR, MODEL_ZAI_GLM_4_5_AIR_FREE, OPENROUTER_FREE_MODELS, isOpenRouterVisionModel, } from '../../../constants/openrouter';
1
+ import { MODEL_GPT_OSS_20B_FREE, MODEL_MOONSHOTAI_KIMI_K2_5, MODEL_OPENAI_GPT_5_1_CHAT, MODEL_OPENAI_GPT_5_1_CODEX, MODEL_OPENAI_GPT_5_MINI, MODEL_OPENAI_GPT_5_NANO, MODEL_OPENAI_GPT_4O, MODEL_OPENAI_GPT_4_1_MINI, MODEL_OPENAI_GPT_4_1_NANO, MODEL_ANTHROPIC_CLAUDE_OPUS_4, MODEL_ANTHROPIC_CLAUDE_SONNET_4, MODEL_ANTHROPIC_CLAUDE_3_7_SONNET, MODEL_ANTHROPIC_CLAUDE_3_5_SONNET, MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU, MODEL_GOOGLE_GEMINI_2_5_PRO, MODEL_GOOGLE_GEMINI_2_5_FLASH, MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025, MODEL_ZAI_GLM_4_7_FLASH, MODEL_ZAI_GLM_4_5_AIR, MODEL_ZAI_GLM_4_5_AIR_FREE, OPENROUTER_FREE_MODELS, isOpenRouterFreeModel, isOpenRouterVisionModel, } from '../../../constants/openrouter';
2
2
  import { OpenRouterChatService } from './OpenRouterChatService';
3
3
  import { resolveVisionModel } from '../../../utils';
4
4
  /**
@@ -106,7 +106,7 @@ export class OpenRouterChatServiceProvider {
106
106
  * @returns True if the model is free
107
107
  */
108
108
  isModelFree(model) {
109
- return OPENROUTER_FREE_MODELS.includes(model) || model.endsWith(':free');
109
+ return isOpenRouterFreeModel(model);
110
110
  }
111
111
  }
112
112
  //# sourceMappingURL=OpenRouterChatServiceProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OpenRouterChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenRouterChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"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"}
@@ -10,4 +10,5 @@ export * from './openaiCompatibleSse';
10
10
  export * from './openaiCompatibleTools';
11
11
  export * from './processChatFlow';
12
12
  export * from './visionModelResolver';
13
+ export * from './refreshOpenRouterFreeModels';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC"}
@@ -10,4 +10,5 @@ export * from './openaiCompatibleSse';
10
10
  export * from './openaiCompatibleTools';
11
11
  export * from './processChatFlow';
12
12
  export * from './visionModelResolver';
13
+ export * from './refreshOpenRouterFreeModels';
13
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface RefreshOpenRouterFreeModelsOptions {
2
+ apiKey: string;
3
+ endpoint?: string;
4
+ modelsEndpoint?: string;
5
+ timeoutMs?: number;
6
+ concurrency?: number;
7
+ maxCandidates?: number;
8
+ maxWorking?: number;
9
+ appName?: string;
10
+ appUrl?: string;
11
+ }
12
+ export interface RefreshOpenRouterFreeModelsFailure {
13
+ id: string;
14
+ reason: string;
15
+ }
16
+ export interface RefreshOpenRouterFreeModelsResult {
17
+ working: string[];
18
+ failed: RefreshOpenRouterFreeModelsFailure[];
19
+ fetchedAt: number;
20
+ }
21
+ /**
22
+ * Fetch currently available OpenRouter free models and probe each model.
23
+ */
24
+ export declare function refreshOpenRouterFreeModels(options: RefreshOpenRouterFreeModelsOptions): Promise<RefreshOpenRouterFreeModelsResult>;
25
+ //# sourceMappingURL=refreshOpenRouterFreeModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshOpenRouterFreeModels.d.ts","sourceRoot":"","sources":["../../../src/utils/refreshOpenRouterFreeModels.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,kCAAkC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kCAAkC;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,kCAAkC,EAAE,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AA6MD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,iCAAiC,CAAC,CAoE5C"}