@aituber-onair/chat 0.43.0 → 0.45.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 (87) hide show
  1. package/README.ja.md +40 -9
  2. package/README.md +40 -9
  3. package/dist/cjs/constants/claude.d.ts +1 -0
  4. package/dist/cjs/constants/claude.d.ts.map +1 -1
  5. package/dist/cjs/constants/claude.js +3 -1
  6. package/dist/cjs/constants/claude.js.map +1 -1
  7. package/dist/cjs/constants/xai.d.ts +9 -0
  8. package/dist/cjs/constants/xai.d.ts.map +1 -1
  9. package/dist/cjs/constants/xai.js +27 -2
  10. package/dist/cjs/constants/xai.js.map +1 -1
  11. package/dist/cjs/services/ChatServiceFactory.d.ts +9 -0
  12. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
  13. package/dist/cjs/services/ChatServiceFactory.js +63 -0
  14. package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
  15. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  16. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +1 -0
  17. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  18. package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts +5 -1
  19. package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
  20. package/dist/cjs/services/providers/openai/OpenAIChatService.js +3 -1
  21. package/dist/cjs/services/providers/openai/OpenAIChatService.js.map +1 -1
  22. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  23. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js +17 -1
  24. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  25. package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts +4 -1
  26. package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  27. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js +21 -1
  28. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  29. package/dist/cjs/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.d.ts.map +1 -1
  30. package/dist/cjs/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js +18 -1
  31. package/dist/cjs/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js.map +1 -1
  32. package/dist/cjs/services/providers/xai/XAIChatService.d.ts.map +1 -1
  33. package/dist/cjs/services/providers/xai/XAIChatService.js +1 -1
  34. package/dist/cjs/services/providers/xai/XAIChatService.js.map +1 -1
  35. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
  36. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js +2 -1
  37. package/dist/cjs/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
  38. package/dist/cjs/types/capabilities.d.ts +15 -0
  39. package/dist/cjs/types/capabilities.d.ts.map +1 -0
  40. package/dist/cjs/types/capabilities.js +3 -0
  41. package/dist/cjs/types/capabilities.js.map +1 -0
  42. package/dist/cjs/types/index.d.ts +1 -0
  43. package/dist/cjs/types/index.d.ts.map +1 -1
  44. package/dist/esm/constants/claude.d.ts +1 -0
  45. package/dist/esm/constants/claude.d.ts.map +1 -1
  46. package/dist/esm/constants/claude.js +2 -0
  47. package/dist/esm/constants/claude.js.map +1 -1
  48. package/dist/esm/constants/xai.d.ts +9 -0
  49. package/dist/esm/constants/xai.d.ts.map +1 -1
  50. package/dist/esm/constants/xai.js +24 -1
  51. package/dist/esm/constants/xai.js.map +1 -1
  52. package/dist/esm/services/ChatServiceFactory.d.ts +9 -0
  53. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  54. package/dist/esm/services/ChatServiceFactory.js +63 -0
  55. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  56. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  57. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +2 -1
  58. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  59. package/dist/esm/services/providers/openai/OpenAIChatService.d.ts +5 -1
  60. package/dist/esm/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
  61. package/dist/esm/services/providers/openai/OpenAIChatService.js +3 -1
  62. package/dist/esm/services/providers/openai/OpenAIChatService.js.map +1 -1
  63. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  64. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js +17 -1
  65. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  66. package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts +4 -1
  67. package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  68. package/dist/esm/services/providers/openai/openaiRequestBuilder.js +21 -1
  69. package/dist/esm/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  70. package/dist/esm/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.d.ts.map +1 -1
  71. package/dist/esm/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js +18 -1
  72. package/dist/esm/services/providers/openaiCompatible/OpenAICompatibleChatServiceProvider.js.map +1 -1
  73. package/dist/esm/services/providers/xai/XAIChatService.d.ts.map +1 -1
  74. package/dist/esm/services/providers/xai/XAIChatService.js +2 -2
  75. package/dist/esm/services/providers/xai/XAIChatService.js.map +1 -1
  76. package/dist/esm/services/providers/xai/XAIChatServiceProvider.d.ts.map +1 -1
  77. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js +3 -2
  78. package/dist/esm/services/providers/xai/XAIChatServiceProvider.js.map +1 -1
  79. package/dist/esm/types/capabilities.d.ts +15 -0
  80. package/dist/esm/types/capabilities.d.ts.map +1 -0
  81. package/dist/esm/types/capabilities.js +2 -0
  82. package/dist/esm/types/capabilities.js.map +1 -0
  83. package/dist/esm/types/index.d.ts +1 -0
  84. package/dist/esm/types/index.d.ts.map +1 -1
  85. package/dist/umd/aituber-onair-chat.js +129 -9
  86. package/dist/umd/aituber-onair-chat.min.js +7 -7
  87. package/package.json +1 -1
@@ -90,6 +90,7 @@ var AITuberOnAirChat = (() => {
90
90
  MODEL_CLAUDE_4_8_OPUS: () => MODEL_CLAUDE_4_8_OPUS,
91
91
  MODEL_CLAUDE_4_OPUS: () => MODEL_CLAUDE_4_OPUS,
92
92
  MODEL_CLAUDE_4_SONNET: () => MODEL_CLAUDE_4_SONNET,
93
+ MODEL_CLAUDE_5_SONNET: () => MODEL_CLAUDE_5_SONNET,
93
94
  MODEL_DEEPSEEK_CHAT: () => MODEL_DEEPSEEK_CHAT,
94
95
  MODEL_DEEPSEEK_REASONER: () => MODEL_DEEPSEEK_REASONER,
95
96
  MODEL_DEEPSEEK_V4_FLASH: () => MODEL_DEEPSEEK_V4_FLASH,
@@ -145,6 +146,7 @@ var AITuberOnAirChat = (() => {
145
146
  MODEL_GROK_4_20_NON_REASONING: () => MODEL_GROK_4_20_NON_REASONING,
146
147
  MODEL_GROK_4_20_REASONING: () => MODEL_GROK_4_20_REASONING,
147
148
  MODEL_GROK_4_3: () => MODEL_GROK_4_3,
149
+ MODEL_GROK_4_5: () => MODEL_GROK_4_5,
148
150
  MODEL_KIMI_K2_5: () => MODEL_KIMI_K2_5,
149
151
  MODEL_KIMI_K2_6: () => MODEL_KIMI_K2_6,
150
152
  MODEL_KIMI_K2_7_CODE: () => MODEL_KIMI_K2_7_CODE,
@@ -228,9 +230,11 @@ var AITuberOnAirChat = (() => {
228
230
  isOpenRouterVisionModel: () => isOpenRouterVisionModel,
229
231
  isResponsesOnlyGPT5Model: () => isResponsesOnlyGPT5Model,
230
232
  isXaiReasoningEffortModel: () => isXaiReasoningEffortModel,
233
+ isXaiReasoningEffortNoneModel: () => isXaiReasoningEffortNoneModel,
231
234
  isXaiVisionModel: () => isXaiVisionModel,
232
235
  isZaiToolStreamModel: () => isZaiToolStreamModel,
233
236
  isZaiVisionModel: () => isZaiVisionModel,
237
+ normalizeXaiReasoningEffort: () => normalizeXaiReasoningEffort,
234
238
  parseOpenAICompatibleOneShot: () => parseOpenAICompatibleOneShot,
235
239
  parseOpenAICompatibleTextStream: () => parseOpenAICompatibleTextStream,
236
240
  parseOpenAICompatibleToolStream: () => parseOpenAICompatibleToolStream,
@@ -372,6 +376,7 @@ var AITuberOnAirChat = (() => {
372
376
  var MODEL_CLAUDE_4_6_OPUS = "claude-opus-4-6";
373
377
  var MODEL_CLAUDE_4_7_OPUS = "claude-opus-4-7";
374
378
  var MODEL_CLAUDE_4_8_OPUS = "claude-opus-4-8";
379
+ var MODEL_CLAUDE_5_SONNET = "claude-sonnet-5";
375
380
  var CLAUDE_VISION_SUPPORTED_MODELS = [
376
381
  MODEL_CLAUDE_3_HAIKU,
377
382
  MODEL_CLAUDE_4_SONNET,
@@ -382,7 +387,8 @@ var AITuberOnAirChat = (() => {
382
387
  MODEL_CLAUDE_4_6_SONNET,
383
388
  MODEL_CLAUDE_4_6_OPUS,
384
389
  MODEL_CLAUDE_4_7_OPUS,
385
- MODEL_CLAUDE_4_8_OPUS
390
+ MODEL_CLAUDE_4_8_OPUS,
391
+ MODEL_CLAUDE_5_SONNET
386
392
  ];
387
393
 
388
394
  // src/constants/openrouter.ts
@@ -490,12 +496,14 @@ var AITuberOnAirChat = (() => {
490
496
 
491
497
  // src/constants/xai.ts
492
498
  var ENDPOINT_XAI_CHAT_COMPLETIONS_API = "https://api.x.ai/v1/chat/completions";
499
+ var MODEL_GROK_4_5 = "grok-4.5";
493
500
  var MODEL_GROK_4_3 = "grok-4.3";
494
501
  var MODEL_GROK_4_20_REASONING = "grok-4.20-0309-reasoning";
495
502
  var MODEL_GROK_4_20_NON_REASONING = "grok-4.20-0309-non-reasoning";
496
503
  var MODEL_GROK_4_1_FAST_REASONING = "grok-4-1-fast-reasoning";
497
504
  var MODEL_GROK_4_1_FAST_NON_REASONING = "grok-4-1-fast-non-reasoning";
498
505
  var XAI_VISION_SUPPORTED_MODELS = [
506
+ MODEL_GROK_4_5,
499
507
  MODEL_GROK_4_3,
500
508
  MODEL_GROK_4_20_REASONING,
501
509
  MODEL_GROK_4_20_NON_REASONING,
@@ -506,10 +514,25 @@ var AITuberOnAirChat = (() => {
506
514
  return XAI_VISION_SUPPORTED_MODELS.includes(model);
507
515
  }
508
516
  function isXaiReasoningEffortModel(model) {
517
+ return model === MODEL_GROK_4_5 || model === MODEL_GROK_4_3;
518
+ }
519
+ function isXaiReasoningEffortNoneModel(model) {
509
520
  return model === MODEL_GROK_4_3;
510
521
  }
511
522
  function getDefaultXaiReasoningEffort(model) {
512
- return isXaiReasoningEffortModel(model) ? "none" : void 0;
523
+ if (model === MODEL_GROK_4_5) {
524
+ return "low";
525
+ }
526
+ return isXaiReasoningEffortNoneModel(model) ? "none" : void 0;
527
+ }
528
+ function normalizeXaiReasoningEffort(model, reasoningEffort) {
529
+ if (!isXaiReasoningEffortModel(model)) {
530
+ return void 0;
531
+ }
532
+ if (reasoningEffort === "none" && !isXaiReasoningEffortNoneModel(model)) {
533
+ return "low";
534
+ }
535
+ return reasoningEffort ?? getDefaultXaiReasoningEffort(model);
513
536
  }
514
537
 
515
538
  // src/constants/kimi.ts
@@ -1817,6 +1840,7 @@ If it's in another language, summarize in that language.
1817
1840
  MODEL_CLAUDE_4_6_OPUS,
1818
1841
  MODEL_CLAUDE_4_7_OPUS,
1819
1842
  MODEL_CLAUDE_4_8_OPUS,
1843
+ MODEL_CLAUDE_5_SONNET,
1820
1844
  MODEL_CLAUDE_3_HAIKU
1821
1845
  ];
1822
1846
  }
@@ -2082,6 +2106,15 @@ If it's in another language, summarize in that language.
2082
2106
  "sakana",
2083
2107
  "plamo"
2084
2108
  ]);
2109
+ function toResponsesTextFormat(responseFormat) {
2110
+ if (responseFormat.type !== "json_schema") {
2111
+ return responseFormat;
2112
+ }
2113
+ return {
2114
+ type: responseFormat.type,
2115
+ ...responseFormat.json_schema
2116
+ };
2117
+ }
2085
2118
  function buildOpenAIRequestBody({
2086
2119
  provider,
2087
2120
  endpoint,
@@ -2094,6 +2127,7 @@ If it's in another language, summarize in that language.
2094
2127
  verbosity,
2095
2128
  reasoning_effort,
2096
2129
  enableReasoningSummary,
2130
+ responseFormat,
2097
2131
  maxTokens
2098
2132
  }) {
2099
2133
  const isResponsesAPI = endpoint === ENDPOINT_OPENAI_RESPONSES_API;
@@ -2154,6 +2188,16 @@ If it's in another language, summarize in that language.
2154
2188
  }
2155
2189
  }
2156
2190
  }
2191
+ if (responseFormat) {
2192
+ if (isResponsesAPI) {
2193
+ body.text = {
2194
+ ...body.text,
2195
+ format: toResponsesTextFormat(responseFormat)
2196
+ };
2197
+ } else {
2198
+ body.response_format = responseFormat;
2199
+ }
2200
+ }
2157
2201
  if (provider === "mistral" && isMistralReasoningEffortModel(model) && reasoning_effort && isMistralReasoningEffort(reasoning_effort)) {
2158
2202
  body.reasoning_effort = reasoning_effort;
2159
2203
  }
@@ -2263,7 +2307,7 @@ If it's in another language, summarize in that language.
2263
2307
  * @param model Name of the model to use
2264
2308
  * @param visionModel Name of the vision model
2265
2309
  */
2266
- constructor(apiKey, model = MODEL_GPT_4O_MINI, visionModel = MODEL_GPT_4O_MINI, tools, endpoint = ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, mcpServers = [], responseLength, verbosity, reasoning_effort, enableReasoningSummary = false, provider = "openai", validateVisionModel = true) {
2310
+ constructor(apiKey, model = MODEL_GPT_4O_MINI, visionModel = MODEL_GPT_4O_MINI, tools, endpoint = ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, mcpServers = [], responseLength, verbosity, reasoning_effort, enableReasoningSummary = false, provider = "openai", validateVisionModel = true, responseFormat) {
2267
2311
  this.provider = provider;
2268
2312
  this.apiKey = apiKey;
2269
2313
  this.model = model;
@@ -2274,6 +2318,7 @@ If it's in another language, summarize in that language.
2274
2318
  this.verbosity = verbosity;
2275
2319
  this.reasoning_effort = reasoning_effort;
2276
2320
  this.enableReasoningSummary = enableReasoningSummary;
2321
+ this.responseFormat = responseFormat;
2277
2322
  if (validateVisionModel && !VISION_SUPPORTED_MODELS.includes(visionModel)) {
2278
2323
  throw new Error(
2279
2324
  `Model ${visionModel} does not support vision capabilities.`
@@ -2420,6 +2465,7 @@ If it's in another language, summarize in that language.
2420
2465
  verbosity: this.verbosity,
2421
2466
  reasoning_effort: this.reasoning_effort,
2422
2467
  enableReasoningSummary: this.enableReasoningSummary,
2468
+ responseFormat: this.responseFormat,
2423
2469
  maxTokens
2424
2470
  });
2425
2471
  const headers = {};
@@ -3866,7 +3912,7 @@ If it's in another language, summarize in that language.
3866
3912
  var OpenAICompatibleChatServiceProvider = class {
3867
3913
  createChatService(options) {
3868
3914
  this.validateRequiredOptions(options);
3869
- return new OpenAIChatService(
3915
+ const serviceArgs = [
3870
3916
  options.apiKey?.trim() ?? "",
3871
3917
  options.model,
3872
3918
  options.visionModel ?? options.model,
@@ -3879,7 +3925,11 @@ If it's in another language, summarize in that language.
3879
3925
  options.enableReasoningSummary,
3880
3926
  this.getProviderName(),
3881
3927
  false
3882
- );
3928
+ ];
3929
+ if (options.responseFormat !== void 0) {
3930
+ serviceArgs.push(options.responseFormat);
3931
+ }
3932
+ return new OpenAIChatService(...serviceArgs);
3883
3933
  }
3884
3934
  getProviderName() {
3885
3935
  return "openai-compatible";
@@ -3966,7 +4016,7 @@ If it's in another language, summarize in that language.
3966
4016
  shouldUseResponsesAPI = preference === "responses";
3967
4017
  }
3968
4018
  const endpoint = optimizedOptions.endpoint || (shouldUseResponsesAPI ? ENDPOINT_OPENAI_RESPONSES_API : ENDPOINT_OPENAI_CHAT_COMPLETIONS_API);
3969
- return new OpenAIChatService(
4019
+ const serviceArgs = [
3970
4020
  optimizedOptions.apiKey,
3971
4021
  modelName,
3972
4022
  visionModel,
@@ -3978,7 +4028,11 @@ If it's in another language, summarize in that language.
3978
4028
  optimizedOptions.reasoning_effort,
3979
4029
  optimizedOptions.enableReasoningSummary,
3980
4030
  this.getProviderName()
3981
- );
4031
+ ];
4032
+ if (optimizedOptions.responseFormat !== void 0) {
4033
+ serviceArgs.push(true, optimizedOptions.responseFormat);
4034
+ }
4035
+ return new OpenAIChatService(...serviceArgs);
3982
4036
  }
3983
4037
  /**
3984
4038
  * Get the provider name
@@ -4761,7 +4815,10 @@ If it's in another language, summarize in that language.
4761
4815
  body.max_tokens = tokenLimit;
4762
4816
  }
4763
4817
  if (this.reasoningEffort && isXaiReasoningEffortModel(model)) {
4764
- body.reasoning_effort = this.reasoningEffort;
4818
+ body.reasoning_effort = normalizeXaiReasoningEffort(
4819
+ model,
4820
+ this.reasoningEffort
4821
+ );
4765
4822
  }
4766
4823
  const tools = this.buildToolsDefinition();
4767
4824
  if (tools.length > 0) {
@@ -4817,7 +4874,10 @@ If it's in another language, summarize in that language.
4817
4874
  tools,
4818
4875
  options.endpoint || ENDPOINT_XAI_CHAT_COMPLETIONS_API,
4819
4876
  options.responseLength,
4820
- options.reasoning_effort ?? getDefaultXaiReasoningEffort(model)
4877
+ normalizeXaiReasoningEffort(
4878
+ model,
4879
+ options.reasoning_effort ?? getDefaultXaiReasoningEffort(model)
4880
+ )
4821
4881
  );
4822
4882
  }
4823
4883
  /**
@@ -4831,6 +4891,7 @@ If it's in another language, summarize in that language.
4831
4891
  */
4832
4892
  getSupportedModels() {
4833
4893
  return [
4894
+ MODEL_GROK_4_5,
4834
4895
  MODEL_GROK_4_3,
4835
4896
  MODEL_GROK_4_20_REASONING,
4836
4897
  MODEL_GROK_4_20_NON_REASONING,
@@ -5127,6 +5188,34 @@ If it's in another language, summarize in that language.
5127
5188
  ];
5128
5189
 
5129
5190
  // src/services/ChatServiceFactory.ts
5191
+ var TOOL_SUPPORTED_PROVIDERS = /* @__PURE__ */ new Set([
5192
+ "openai",
5193
+ "openai-compatible",
5194
+ "openrouter",
5195
+ "gemini",
5196
+ "claude",
5197
+ "zai",
5198
+ "xai",
5199
+ "kimi",
5200
+ "deepseek",
5201
+ "mistral",
5202
+ "sakana",
5203
+ "plamo"
5204
+ ]);
5205
+ var MCP_SUPPORTED_PROVIDERS = /* @__PURE__ */ new Set(["openai", "gemini", "claude"]);
5206
+ var JSON_MODE_SUPPORTED_PROVIDERS = /* @__PURE__ */ new Set([
5207
+ "openai",
5208
+ "openai-compatible",
5209
+ "zai",
5210
+ "kimi"
5211
+ ]);
5212
+ var REASONING_EFFORT_BY_PROVIDER = {
5213
+ openai: ["none", "minimal", "low", "medium", "high", "xhigh"],
5214
+ openrouter: ["none", "minimal", "low", "medium", "high"],
5215
+ mistral: ["low", "medium", "high"],
5216
+ plamo: ["none", "medium"],
5217
+ xai: ["none", "low", "medium", "high"]
5218
+ };
5130
5219
  var ChatServiceFactory = class {
5131
5220
  /**
5132
5221
  * Register a new provider
@@ -5165,6 +5254,37 @@ If it's in another language, summarize in that language.
5165
5254
  const provider = this.providers.get(providerName);
5166
5255
  return provider ? provider.getSupportedModels() : [];
5167
5256
  }
5257
+ /**
5258
+ * Get machine-readable provider capabilities for UI and agent planning.
5259
+ */
5260
+ static getProviderCapabilities(providerName, model) {
5261
+ const provider = this.providers.get(providerName);
5262
+ if (!provider) {
5263
+ return void 0;
5264
+ }
5265
+ const vision = model ? this.getVisionSupportLevelForModel(providerName, model) : provider.getVisionSupportLevel();
5266
+ return {
5267
+ provider: providerName,
5268
+ models: provider.getSupportedModels(),
5269
+ defaultModel: typeof provider.getDefaultModel === "function" ? provider.getDefaultModel() : void 0,
5270
+ text: true,
5271
+ streaming: true,
5272
+ vision,
5273
+ tools: TOOL_SUPPORTED_PROVIDERS.has(providerName),
5274
+ mcp: MCP_SUPPORTED_PROVIDERS.has(providerName),
5275
+ jsonMode: JSON_MODE_SUPPORTED_PROVIDERS.has(providerName),
5276
+ responseLength: true,
5277
+ reasoningEffort: REASONING_EFFORT_BY_PROVIDER[providerName] ?? []
5278
+ };
5279
+ }
5280
+ /**
5281
+ * Get machine-readable capabilities for all registered providers.
5282
+ */
5283
+ static getAllProviderCapabilities() {
5284
+ return this.getAvailableProviders().map((providerName) => this.getProviderCapabilities(providerName)).filter(
5285
+ (capabilities) => capabilities !== void 0
5286
+ );
5287
+ }
5168
5288
  /**
5169
5289
  * Get provider-level vision support status.
5170
5290
  */