@pentoshi/clai 4.2.2 → 4.4.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 (204) hide show
  1. package/README.md +15 -17
  2. package/dist/agent/compaction-summary.d.ts +1 -1
  3. package/dist/agent/compaction-summary.js +1 -1
  4. package/dist/agent/compaction-summary.js.map +1 -1
  5. package/dist/agent/runner.js +12 -13
  6. package/dist/agent/runner.js.map +1 -1
  7. package/dist/agent/tool-output-formatting.d.ts +6 -0
  8. package/dist/agent/tool-output-formatting.js +126 -40
  9. package/dist/agent/tool-output-formatting.js.map +1 -1
  10. package/dist/app/adapters/agent-event-adapter.d.ts +4 -0
  11. package/dist/app/adapters/agent-event-adapter.js +28 -3
  12. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  13. package/dist/app/commands/catalog.js +8 -26
  14. package/dist/app/commands/catalog.js.map +1 -1
  15. package/dist/app/commands/registry.js +0 -1
  16. package/dist/app/commands/registry.js.map +1 -1
  17. package/dist/app/controllers/session-controller.d.ts +3 -0
  18. package/dist/app/controllers/session-controller.js +18 -25
  19. package/dist/app/controllers/session-controller.js.map +1 -1
  20. package/dist/app/controllers/session-persistence.d.ts +4 -1
  21. package/dist/app/controllers/session-persistence.js +23 -5
  22. package/dist/app/controllers/session-persistence.js.map +1 -1
  23. package/dist/app/controllers/session-responder.d.ts +1 -0
  24. package/dist/app/controllers/session-responder.js +8 -0
  25. package/dist/app/controllers/session-responder.js.map +1 -1
  26. package/dist/app/controllers/session-usage-ledger.d.ts +63 -0
  27. package/dist/app/controllers/session-usage-ledger.js +232 -0
  28. package/dist/app/controllers/session-usage-ledger.js.map +1 -0
  29. package/dist/app/events/app-event.d.ts +2 -0
  30. package/dist/app/events/app-event.js.map +1 -1
  31. package/dist/classic/app/ClassicApp.js +2 -1
  32. package/dist/classic/app/ClassicApp.js.map +1 -1
  33. package/dist/classic/app/use-feed.js +2 -1
  34. package/dist/classic/app/use-feed.js.map +1 -1
  35. package/dist/classic/chrome/toast-rows.d.ts +1 -0
  36. package/dist/classic/chrome/toast-rows.js +18 -0
  37. package/dist/classic/chrome/toast-rows.js.map +1 -1
  38. package/dist/commands/providers.js +0 -4
  39. package/dist/commands/providers.js.map +1 -1
  40. package/dist/index.js +6 -4
  41. package/dist/index.js.map +1 -1
  42. package/dist/llm/adapters/openai-tools.d.ts +1 -0
  43. package/dist/llm/adapters/openai-tools.js +4 -1
  44. package/dist/llm/adapters/openai-tools.js.map +1 -1
  45. package/dist/llm/agentrouter.js +2 -0
  46. package/dist/llm/agentrouter.js.map +1 -1
  47. package/dist/llm/aws-mantle.js +2 -0
  48. package/dist/llm/aws-mantle.js.map +1 -1
  49. package/dist/llm/bynara.js +2 -0
  50. package/dist/llm/bynara.js.map +1 -1
  51. package/dist/llm/capabilities.d.ts +19 -0
  52. package/dist/llm/capabilities.js +165 -79
  53. package/dist/llm/capabilities.js.map +1 -1
  54. package/dist/llm/catalog-facts.d.ts +23 -0
  55. package/dist/llm/catalog-facts.js +253 -0
  56. package/dist/llm/catalog-facts.js.map +1 -0
  57. package/dist/llm/catalog-prefetch.d.ts +5 -0
  58. package/dist/llm/catalog-prefetch.js +38 -0
  59. package/dist/llm/catalog-prefetch.js.map +1 -0
  60. package/dist/llm/context-windows.d.ts +2 -0
  61. package/dist/llm/context-windows.js +20 -6
  62. package/dist/llm/context-windows.js.map +1 -1
  63. package/dist/llm/custom-profile-resolver.d.ts +5 -0
  64. package/dist/llm/custom-profile-resolver.js +8 -0
  65. package/dist/llm/custom-profile-resolver.js.map +1 -0
  66. package/dist/llm/custom-provider-profile.d.ts +7 -2
  67. package/dist/llm/custom-provider-profile.js +40 -10
  68. package/dist/llm/custom-provider-profile.js.map +1 -1
  69. package/dist/llm/custom-providers.js +2 -0
  70. package/dist/llm/custom-providers.js.map +1 -1
  71. package/dist/llm/effort-fallback.js +3 -0
  72. package/dist/llm/effort-fallback.js.map +1 -1
  73. package/dist/llm/fireworks.js +2 -0
  74. package/dist/llm/fireworks.js.map +1 -1
  75. package/dist/llm/free.js +2 -0
  76. package/dist/llm/free.js.map +1 -1
  77. package/dist/llm/hetzner.js +2 -0
  78. package/dist/llm/hetzner.js.map +1 -1
  79. package/dist/llm/http.d.ts +21 -2
  80. package/dist/llm/http.js +133 -141
  81. package/dist/llm/http.js.map +1 -1
  82. package/dist/llm/key-rotation.d.ts +1 -0
  83. package/dist/llm/key-rotation.js +8 -0
  84. package/dist/llm/key-rotation.js.map +1 -1
  85. package/dist/llm/learned-capabilities.d.ts +22 -0
  86. package/dist/llm/learned-capabilities.js +147 -0
  87. package/dist/llm/learned-capabilities.js.map +1 -0
  88. package/dist/llm/lightning.js +2 -0
  89. package/dist/llm/lightning.js.map +1 -1
  90. package/dist/llm/modal.js +2 -0
  91. package/dist/llm/modal.js.map +1 -1
  92. package/dist/llm/model-families.d.ts +20 -0
  93. package/dist/llm/model-families.js +227 -19
  94. package/dist/llm/model-families.js.map +1 -1
  95. package/dist/llm/nvidia.js +2 -0
  96. package/dist/llm/nvidia.js.map +1 -1
  97. package/dist/llm/openai.js +2 -0
  98. package/dist/llm/openai.js.map +1 -1
  99. package/dist/llm/openrouter.js +2 -0
  100. package/dist/llm/openrouter.js.map +1 -1
  101. package/dist/llm/orcarouter.js +2 -0
  102. package/dist/llm/orcarouter.js.map +1 -1
  103. package/dist/llm/provider-model-layers.d.ts +3 -0
  104. package/dist/llm/provider-model-layers.js +522 -0
  105. package/dist/llm/provider-model-layers.js.map +1 -0
  106. package/dist/llm/provider-profile-layers.d.ts +4 -1
  107. package/dist/llm/provider-profile-layers.js +22 -536
  108. package/dist/llm/provider-profile-layers.js.map +1 -1
  109. package/dist/llm/provider-profile.d.ts +14 -1
  110. package/dist/llm/provider-profile.js +23 -0
  111. package/dist/llm/provider-profile.js.map +1 -1
  112. package/dist/llm/provider-profiles.d.ts +5 -1
  113. package/dist/llm/provider-profiles.js +178 -5
  114. package/dist/llm/provider-profiles.js.map +1 -1
  115. package/dist/llm/provider.js +0 -15
  116. package/dist/llm/provider.js.map +1 -1
  117. package/dist/llm/qwen-cloud.js +2 -0
  118. package/dist/llm/qwen-cloud.js.map +1 -1
  119. package/dist/llm/reasoning-artifacts.d.ts +1 -0
  120. package/dist/llm/reasoning-artifacts.js +7 -5
  121. package/dist/llm/reasoning-artifacts.js.map +1 -1
  122. package/dist/llm/reasoning-controls.d.ts +16 -0
  123. package/dist/llm/reasoning-controls.js +210 -0
  124. package/dist/llm/reasoning-controls.js.map +1 -0
  125. package/dist/llm/reasoning-errors.d.ts +4 -0
  126. package/dist/llm/reasoning-errors.js +45 -0
  127. package/dist/llm/reasoning-errors.js.map +1 -0
  128. package/dist/llm/request-plan.d.ts +8 -6
  129. package/dist/llm/request-plan.js +47 -13
  130. package/dist/llm/request-plan.js.map +1 -1
  131. package/dist/llm/route-dialect-registry.d.ts +8 -0
  132. package/dist/llm/route-dialect-registry.js +33 -0
  133. package/dist/llm/route-dialect-registry.js.map +1 -0
  134. package/dist/llm/route-vocabulary.d.ts +2 -0
  135. package/dist/llm/route-vocabulary.js +23 -0
  136. package/dist/llm/route-vocabulary.js.map +1 -0
  137. package/dist/llm/router.d.ts +2 -0
  138. package/dist/llm/router.js +70 -20
  139. package/dist/llm/router.js.map +1 -1
  140. package/dist/llm/stream-terminal.js +2 -1
  141. package/dist/llm/stream-terminal.js.map +1 -1
  142. package/dist/llm/tokenrouter.js +2 -0
  143. package/dist/llm/tokenrouter.js.map +1 -1
  144. package/dist/store/config.d.ts +11 -0
  145. package/dist/store/config.js +21 -3
  146. package/dist/store/config.js.map +1 -1
  147. package/dist/store/history.d.ts +1 -0
  148. package/dist/store/history.js +7 -0
  149. package/dist/store/history.js.map +1 -1
  150. package/dist/store/keys.d.ts +1 -1
  151. package/dist/store/keys.js +1 -1
  152. package/dist/store/scope.d.ts +8 -0
  153. package/dist/store/scope.js +138 -1
  154. package/dist/store/scope.js.map +1 -1
  155. package/dist/store/session-workspace.d.ts +1 -0
  156. package/dist/store/session-workspace.js +21 -1
  157. package/dist/store/session-workspace.js.map +1 -1
  158. package/dist/tools/definitions.js +5 -10
  159. package/dist/tools/definitions.js.map +1 -1
  160. package/dist/tools/interactive-session-tools.js +5 -5
  161. package/dist/tools/interactive-session-tools.js.map +1 -1
  162. package/dist/tools/output-selection.js +47 -3
  163. package/dist/tools/output-selection.js.map +1 -1
  164. package/dist/tools/registry.js +2 -2
  165. package/dist/tools/registry.js.map +1 -1
  166. package/dist/tools/web/content-encoding.d.ts +6 -0
  167. package/dist/tools/web/content-encoding.js +57 -0
  168. package/dist/tools/web/content-encoding.js.map +1 -0
  169. package/dist/tools/web/fetch-core.js +23 -1
  170. package/dist/tools/web/fetch-core.js.map +1 -1
  171. package/dist/tui-v2/components/picker/picker.js +1 -1
  172. package/dist/tui-v2/components/picker/picker.js.map +1 -1
  173. package/dist/types.d.ts +2 -1
  174. package/dist/types.js +0 -2
  175. package/dist/types.js.map +1 -1
  176. package/dist/ui-core/bootstrap/composition-root.js +8 -2
  177. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  178. package/dist/ui-core/commands/command-handlers.js +3 -3
  179. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  180. package/dist/ui-core/commands/config-commands.js +17 -14
  181. package/dist/ui-core/commands/config-commands.js.map +1 -1
  182. package/dist/ui-core/commands/picker-commands.js +34 -11
  183. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  184. package/dist/ui-core/commands/session-commands.d.ts +3 -3
  185. package/dist/ui-core/commands/session-commands.js +64 -17
  186. package/dist/ui-core/commands/session-commands.js.map +1 -1
  187. package/dist/ui-core/rendering/format-help.js +2 -2
  188. package/dist/ui-core/rendering/format-help.js.map +1 -1
  189. package/dist/ui-core/rendering/format-usage.d.ts +6 -0
  190. package/dist/ui-core/rendering/format-usage.js +116 -0
  191. package/dist/ui-core/rendering/format-usage.js.map +1 -0
  192. package/dist/ui-core/state/transcript-reducer.js +78 -19
  193. package/dist/ui-core/state/transcript-reducer.js.map +1 -1
  194. package/dist/ui-core/state/transcript-types.d.ts +1 -0
  195. package/dist/ui-core/state/transcript-types.js.map +1 -1
  196. package/dist/version.generated.d.ts +2 -2
  197. package/dist/version.generated.js +2 -2
  198. package/package.json +1 -2
  199. package/dist/llm/groq.d.ts +0 -24
  200. package/dist/llm/groq.js +0 -155
  201. package/dist/llm/groq.js.map +0 -1
  202. package/dist/llm/kimchi.d.ts +0 -2
  203. package/dist/llm/kimchi.js +0 -96
  204. package/dist/llm/kimchi.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { classifyBynaraModel, classifyNvidiaModel } from "./model-families.js";
1
+ import { CHAT_COMPLETIONS_TERMINAL_PROOFS } from "./provider-profile.js";
2
2
  export const codeFact = (detail) => ({
3
3
  source: "builtin",
4
4
  confidence: "exact",
@@ -163,23 +163,7 @@ export const FAMILY_LAYERS = {
163
163
  reasoningOutput: ["usage.completion_tokens_details.reasoning_tokens"],
164
164
  },
165
165
  terminal: {
166
- proofs: ["done-sentinel", "finish-reason"],
167
- naturalEofAccepted: false,
168
- },
169
- },
170
- groq: {
171
- evidence: codeFact("groq-route"),
172
- capabilities: { tools: "supported", streamOptions: "supported" },
173
- reasoning: {
174
- control: {
175
- dialect: "groq-model-specific",
176
- status: "unknown",
177
- evidence: codeFact("groq-model-specific-controls"),
178
- },
179
- },
180
- cache: { kind: "unknown", cacheAffectingFields: [] },
181
- terminal: {
182
- proofs: ["done-sentinel", "finish-reason"],
166
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
183
167
  naturalEofAccepted: false,
184
168
  },
185
169
  },
@@ -195,13 +179,14 @@ export const FAMILY_LAYERS = {
195
179
  acceptedEfforts: ["low", "medium", "high"],
196
180
  outputShapes: ["reasoning-content", "structured-details"],
197
181
  replayScope: "tool-turn",
182
+ replayOptIn: "openrouter-reasoning-context",
198
183
  },
199
184
  cache: { kind: "unknown", cacheAffectingFields: [] },
200
185
  usage: {
201
186
  cachedInput: ["usage.prompt_tokens_details.cached_tokens"],
202
187
  },
203
188
  terminal: {
204
- proofs: ["done-sentinel", "finish-reason"],
189
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
205
190
  naturalEofAccepted: false,
206
191
  },
207
192
  },
@@ -217,7 +202,7 @@ export const FAMILY_LAYERS = {
217
202
  outputShapes: ["reasoning-content"],
218
203
  },
219
204
  terminal: {
220
- proofs: ["done-sentinel", "finish-reason"],
205
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
221
206
  naturalEofAccepted: false,
222
207
  },
223
208
  },
@@ -233,23 +218,7 @@ export const FAMILY_LAYERS = {
233
218
  outputShapes: ["reasoning-content"],
234
219
  },
235
220
  terminal: {
236
- proofs: ["done-sentinel", "finish-reason"],
237
- naturalEofAccepted: false,
238
- },
239
- },
240
- kimchi: {
241
- evidence: codeFact("kimchi-gateway"),
242
- capabilities: { tools: "supported" },
243
- reasoning: {
244
- control: {
245
- dialect: "none",
246
- status: "unknown",
247
- evidence: viaGateway("kimi-contract-via-gateway"),
248
- },
249
- outputShapes: ["reasoning-content"],
250
- },
251
- terminal: {
252
- proofs: ["done-sentinel", "finish-reason"],
221
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
253
222
  naturalEofAccepted: false,
254
223
  },
255
224
  },
@@ -265,7 +234,7 @@ export const FAMILY_LAYERS = {
265
234
  outputShapes: ["reasoning-content"],
266
235
  },
267
236
  terminal: {
268
- proofs: ["done-sentinel", "finish-reason"],
237
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
269
238
  naturalEofAccepted: false,
270
239
  },
271
240
  },
@@ -286,7 +255,7 @@ export const FAMILY_LAYERS = {
286
255
  finalTurnPreservation: "supported",
287
256
  },
288
257
  terminal: {
289
- proofs: ["done-sentinel", "finish-reason"],
258
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
290
259
  naturalEofAccepted: false,
291
260
  },
292
261
  },
@@ -316,7 +285,7 @@ export const FAMILY_LAYERS = {
316
285
  outputShapes: ["reasoning-content"],
317
286
  },
318
287
  terminal: {
319
- proofs: ["done-sentinel", "finish-reason"],
288
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
320
289
  naturalEofAccepted: false,
321
290
  },
322
291
  },
@@ -325,15 +294,15 @@ export const FAMILY_LAYERS = {
325
294
  capabilities: { tools: "supported", images: "unknown" },
326
295
  reasoning: {
327
296
  control: {
328
- dialect: "none",
329
- status: "unknown",
330
- evidence: codeFact("tokenrouter-contract-unknown"),
297
+ dialect: "openai-effort",
298
+ status: "supported",
299
+ evidence: providerDoc("tokenrouter-reasoning-effort-validated"),
331
300
  },
332
301
  outputShapes: ["reasoning-content"],
333
302
  },
334
303
  cache: { kind: "unknown", cacheAffectingFields: [] },
335
304
  terminal: {
336
- proofs: ["done-sentinel", "finish-reason"],
305
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
337
306
  naturalEofAccepted: false,
338
307
  },
339
308
  },
@@ -363,7 +332,7 @@ export const FAMILY_LAYERS = {
363
332
  ],
364
333
  },
365
334
  terminal: {
366
- proofs: ["done-sentinel", "finish-reason"],
335
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
367
336
  naturalEofAccepted: false,
368
337
  },
369
338
  },
@@ -379,7 +348,7 @@ export const FAMILY_LAYERS = {
379
348
  outputShapes: ["reasoning-content"],
380
349
  },
381
350
  terminal: {
382
- proofs: ["done-sentinel", "finish-reason"],
351
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
383
352
  naturalEofAccepted: false,
384
353
  },
385
354
  },
@@ -400,7 +369,7 @@ export const FAMILY_LAYERS = {
400
369
  cachedInput: ["usage.prompt_tokens_details.cached_tokens"],
401
370
  },
402
371
  terminal: {
403
- proofs: ["done-sentinel", "finish-reason"],
372
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
404
373
  naturalEofAccepted: false,
405
374
  },
406
375
  },
@@ -417,7 +386,7 @@ export const FAMILY_LAYERS = {
417
386
  outputShapes: ["reasoning-content"],
418
387
  },
419
388
  terminal: {
420
- proofs: ["done-sentinel", "finish-reason"],
389
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
421
390
  naturalEofAccepted: false,
422
391
  },
423
392
  },
@@ -433,20 +402,15 @@ export const FAMILY_LAYERS = {
433
402
  outputShapes: ["reasoning-content"],
434
403
  },
435
404
  terminal: {
436
- proofs: ["done-sentinel", "finish-reason"],
405
+ proofs: CHAT_COMPLETIONS_TERMINAL_PROOFS,
437
406
  naturalEofAccepted: false,
438
407
  },
439
408
  },
440
409
  };
441
- const kimiMandatoryLayer = {
410
+ export const kimiMandatoryLayer = {
442
411
  evidence: viaGateway("kimi-k3-k2p7-official-contract"),
443
412
  reasoning: {
444
413
  generation: "mandatory",
445
- control: {
446
- dialect: "none",
447
- status: "unknown",
448
- evidence: viaGateway("kimi-toggle-not-sent"),
449
- },
450
414
  replayScope: "all-history",
451
415
  finalTurnPreservation: "required",
452
416
  },
@@ -456,7 +420,7 @@ const kimiMandatoryLayer = {
456
420
  mandatoryReasoningReserveTokens: 4096,
457
421
  },
458
422
  };
459
- const kimiConfigurableLayer = {
423
+ export const kimiConfigurableLayer = {
460
424
  evidence: viaGateway("kimi-k2p6-official-contract"),
461
425
  reasoning: {
462
426
  generation: "optional",
@@ -464,7 +428,7 @@ const kimiConfigurableLayer = {
464
428
  finalTurnPreservation: "supported",
465
429
  },
466
430
  };
467
- const kimiNoPreservationLayer = {
431
+ export const kimiNoPreservationLayer = {
468
432
  evidence: viaGateway("kimi-k2p5-official-contract"),
469
433
  reasoning: {
470
434
  generation: "optional",
@@ -472,7 +436,7 @@ const kimiNoPreservationLayer = {
472
436
  finalTurnPreservation: "unsupported",
473
437
  },
474
438
  };
475
- const deepseekV4DefaultOn = {
439
+ export const deepseekV4DefaultOn = {
476
440
  evidence: viaGateway("deepseek-v4-default-thinking"),
477
441
  reasoning: {
478
442
  generation: "default-on",
@@ -480,482 +444,4 @@ const deepseekV4DefaultOn = {
480
444
  outputShapes: ["reasoning-content"],
481
445
  },
482
446
  };
483
- function nvidiaModelLayer(model) {
484
- switch (classifyNvidiaModel(model)) {
485
- case "kimi-thinking":
486
- return {
487
- evidence: codeFact("nim-kimi-thinking"),
488
- reasoning: {
489
- generation: "default-on",
490
- control: {
491
- dialect: "kimi-template-thinking",
492
- status: "supported",
493
- evidence: codeFact("nim-kimi-thinking"),
494
- },
495
- disable: "supported",
496
- disableForm: "template-thinking-false",
497
- replayScope: "tool-turn",
498
- },
499
- };
500
- case "deepseek-v4":
501
- return {
502
- evidence: codeFact("nim-deepseek-v4"),
503
- reasoning: {
504
- generation: "default-on",
505
- control: {
506
- dialect: "chat-template-thinking",
507
- status: "supported",
508
- evidence: codeFact("nim-deepseek-v4"),
509
- },
510
- acceptedEfforts: ["none", "high"],
511
- disable: "supported",
512
- disableForm: "template-thinking-false",
513
- replayScope: "tool-turn",
514
- outputShapes: ["reasoning-content"],
515
- },
516
- };
517
- case "thinking":
518
- return {
519
- evidence: codeFact("nim-chat-template-thinking"),
520
- reasoning: {
521
- generation: "default-on",
522
- control: {
523
- dialect: "chat-template-thinking",
524
- status: "supported",
525
- evidence: codeFact("nim-chat-template-thinking"),
526
- },
527
- disable: "supported",
528
- disableForm: "template-thinking-false",
529
- },
530
- };
531
- case "nemotron-3":
532
- return {
533
- evidence: codeFact("nim-nemotron-3"),
534
- reasoning: {
535
- control: {
536
- dialect: "nemotron-reasoning-budget",
537
- status: "supported",
538
- evidence: codeFact("nim-nemotron-3"),
539
- },
540
- disable: "supported",
541
- disableForm: "template-enable-thinking-false",
542
- },
543
- };
544
- case "glm-thinking":
545
- return {
546
- evidence: codeFact("nim-glm-thinking"),
547
- reasoning: {
548
- control: {
549
- dialect: "glm-enable-thinking",
550
- status: "supported",
551
- evidence: codeFact("nim-glm-thinking"),
552
- },
553
- disable: "supported",
554
- disableForm: "template-enable-thinking-false",
555
- },
556
- };
557
- case "enable-thinking":
558
- return {
559
- evidence: codeFact("nim-gemma-enable-thinking"),
560
- reasoning: {
561
- control: {
562
- dialect: "glm-enable-thinking",
563
- status: "supported",
564
- evidence: codeFact("nim-gemma-enable-thinking"),
565
- },
566
- disable: "supported",
567
- disableForm: "template-enable-thinking-false",
568
- },
569
- };
570
- case "effort-only":
571
- if (/gpt-oss/i.test(model)) {
572
- return {
573
- evidence: codeFact("nim-gpt-oss-effort"),
574
- reasoning: {
575
- generation: "default-on",
576
- control: {
577
- dialect: "openai-effort",
578
- status: "supported",
579
- evidence: codeFact("nim-gpt-oss-effort"),
580
- },
581
- acceptedEfforts: ["low", "medium", "high"],
582
- disable: "unsupported",
583
- disableForm: "effort-minimal-floor",
584
- },
585
- };
586
- }
587
- return {
588
- evidence: codeFact("nim-effort-only"),
589
- reasoning: {
590
- generation: "default-on",
591
- control: {
592
- dialect: "openai-effort",
593
- status: "supported",
594
- evidence: codeFact("nim-effort-only"),
595
- },
596
- acceptedEfforts: ["none", "low", "medium", "high"],
597
- disable: "supported",
598
- disableForm: "effort-none",
599
- },
600
- };
601
- default:
602
- return {
603
- evidence: codeFact("nim-no-thinking-knob"),
604
- reasoning: {
605
- generation: "unknown",
606
- control: {
607
- dialect: "none",
608
- status: "unsupported",
609
- evidence: codeFact("nim-no-thinking-knob"),
610
- },
611
- },
612
- };
613
- }
614
- }
615
- function bynaraModelLayer(model) {
616
- switch (classifyBynaraModel(model)) {
617
- case "kimi":
618
- return {
619
- evidence: codeFact("bynara-kimi"),
620
- reasoning: {
621
- generation: "default-on",
622
- control: {
623
- dialect: "kimi-template-thinking",
624
- status: "supported",
625
- evidence: codeFact("bynara-kimi"),
626
- },
627
- acceptedEfforts: ["low", "high"],
628
- disable: "supported",
629
- disableForm: "template-thinking-false",
630
- replayScope: "tool-turn",
631
- },
632
- };
633
- case "deepseek":
634
- case "agnes":
635
- return {
636
- evidence: codeFact("bynara-effort"),
637
- reasoning: {
638
- generation: "default-on",
639
- control: {
640
- dialect: "openai-effort",
641
- status: "supported",
642
- evidence: codeFact("bynara-effort"),
643
- },
644
- acceptedEfforts: ["none", "low", "medium", "high"],
645
- disable: "supported",
646
- disableForm: "effort-none",
647
- },
648
- };
649
- case "stepfun":
650
- return {
651
- evidence: codeFact("bynara-stepfun"),
652
- reasoning: {
653
- control: {
654
- dialect: "glm-enable-thinking",
655
- status: "supported",
656
- evidence: codeFact("bynara-stepfun"),
657
- },
658
- disable: "supported",
659
- disableForm: "template-enable-thinking-false",
660
- },
661
- };
662
- default:
663
- return undefined;
664
- }
665
- }
666
- function agentrouterModelLayer(model) {
667
- const m = model.toLowerCase();
668
- if (/(?:^|\/)gpt-5|(?:^|\/)o[134](?:\b|-)/.test(m)) {
669
- return {
670
- evidence: codeFact("agentrouter-gpt-effort"),
671
- reasoning: {
672
- generation: "default-on",
673
- control: {
674
- dialect: "openai-effort",
675
- status: "supported",
676
- evidence: codeFact("agentrouter-gpt-effort"),
677
- },
678
- acceptedEfforts: ["minimal", "low", "medium", "high"],
679
- disable: "unsupported",
680
- disableForm: "effort-minimal-floor",
681
- },
682
- };
683
- }
684
- if (/glm/.test(m)) {
685
- return {
686
- evidence: codeFact("agentrouter-glm-disabled"),
687
- reasoning: {
688
- generation: "default-on",
689
- control: {
690
- dialect: "deepseek-thinking",
691
- status: "supported",
692
- evidence: codeFact("agentrouter-glm-disabled"),
693
- },
694
- disable: "supported",
695
- disableForm: "thinking-disabled",
696
- },
697
- };
698
- }
699
- if (/claude/.test(m)) {
700
- return {
701
- evidence: codeFact("agentrouter-claude-effort"),
702
- reasoning: {
703
- generation: "optional",
704
- control: {
705
- dialect: "anthropic-thinking",
706
- status: "supported",
707
- evidence: codeFact("agentrouter-claude-effort"),
708
- },
709
- acceptedEfforts: ["low", "medium", "high"],
710
- disable: "supported",
711
- disableForm: "omit-control",
712
- },
713
- };
714
- }
715
- return undefined;
716
- }
717
- const OPENROUTER_REASONING_PATTERN = /:thinking|deepseek-v4|deepseek-r1|qwen3|kimi-k[23]|claude-(?:opus|sonnet|haiku)-4|gpt-5|(?:^|\/)o[134]|grok.*reasoner/i;
718
- function openrouterModelLayer(model) {
719
- if (/kimi-k3|kimi-k2\.7/.test(model))
720
- return kimiMandatoryLayer;
721
- if (/kimi-k2\.6/.test(model))
722
- return kimiConfigurableLayer;
723
- if (/kimi-k2\.5|kimi-k2(?:\b|-)/.test(model))
724
- return kimiNoPreservationLayer;
725
- if (!OPENROUTER_REASONING_PATTERN.test(model))
726
- return undefined;
727
- return {
728
- evidence: providerDoc("openrouter-reasoning"),
729
- reasoning: {
730
- generation: "default-on",
731
- control: {
732
- dialect: "openai-nested-reasoning",
733
- status: "supported",
734
- evidence: providerDoc("openrouter-reasoning"),
735
- },
736
- acceptedEfforts: ["low", "medium", "high"],
737
- replayScope: "tool-turn",
738
- outputShapes: ["reasoning-content", "structured-details"],
739
- },
740
- };
741
- }
742
- const MODEL_RULES = {
743
- anthropic: [
744
- {
745
- pattern: /claude-(?:opus|sonnet|haiku)-(?:3-7|4|5)|claude-3-7/i,
746
- layer: {
747
- evidence: providerDoc("anthropic-extended-thinking"),
748
- reasoning: { generation: "optional" },
749
- },
750
- },
751
- {
752
- pattern: /claude/i,
753
- layer: {
754
- evidence: providerDoc("anthropic-no-thinking"),
755
- reasoning: {
756
- generation: "none",
757
- control: {
758
- dialect: "none",
759
- status: "unsupported",
760
- evidence: providerDoc("anthropic-no-thinking"),
761
- },
762
- },
763
- },
764
- },
765
- ],
766
- gemini: [
767
- {
768
- pattern: /gemini-(?:2\.5|3|3\.5)/i,
769
- layer: {
770
- evidence: providerDoc("gemini-thinking"),
771
- reasoning: { generation: "optional" },
772
- },
773
- },
774
- ],
775
- ollama: [
776
- {
777
- pattern: /deepseek-r1|qwen3|qwq/i,
778
- layer: {
779
- evidence: codeFact("ollama-think-supported-families"),
780
- reasoning: {
781
- generation: "default-on",
782
- control: {
783
- dialect: "ollama-think",
784
- status: "supported",
785
- evidence: codeFact("ollama-think-supported-families"),
786
- },
787
- disable: "supported",
788
- disableForm: "omit-control",
789
- },
790
- },
791
- },
792
- ],
793
- openai: [
794
- {
795
- pattern: /gpt-5|(?:^|\/)o[134]/i,
796
- layer: {
797
- evidence: providerDoc("openai-reasoning-models"),
798
- reasoning: {
799
- generation: "optional",
800
- acceptedEfforts: ["minimal", "low", "medium", "high"],
801
- disable: "unsupported",
802
- disableForm: "effort-minimal-floor",
803
- },
804
- },
805
- },
806
- {
807
- pattern: /gpt-4o|gpt-4\.1|gpt-4-turbo/i,
808
- layer: {
809
- evidence: providerDoc("openai-non-reasoning"),
810
- reasoning: {
811
- generation: "none",
812
- control: {
813
- dialect: "none",
814
- status: "unsupported",
815
- evidence: providerDoc("openai-non-reasoning"),
816
- },
817
- },
818
- },
819
- },
820
- ],
821
- groq: [
822
- {
823
- pattern: /qwen\/qwen3-32b/i,
824
- layer: {
825
- evidence: codeFact("groq-qwen3-effort"),
826
- reasoning: {
827
- generation: "default-on",
828
- control: {
829
- dialect: "openai-effort",
830
- status: "supported",
831
- evidence: codeFact("groq-qwen3-effort"),
832
- },
833
- acceptedEfforts: ["default", "none"],
834
- disable: "supported",
835
- disableForm: "effort-none",
836
- },
837
- },
838
- },
839
- {
840
- pattern: /openai\/gpt-oss-(?:20b|120b)/i,
841
- layer: {
842
- evidence: codeFact("groq-gpt-oss-effort"),
843
- reasoning: {
844
- generation: "default-on",
845
- control: {
846
- dialect: "openai-effort",
847
- status: "supported",
848
- evidence: codeFact("groq-gpt-oss-effort"),
849
- },
850
- acceptedEfforts: ["low", "medium", "high"],
851
- disable: "unsupported",
852
- disableForm: "effort-minimal-floor",
853
- },
854
- },
855
- },
856
- ],
857
- fireworks: [
858
- {
859
- pattern: /deepseek-v4/i,
860
- layer: {
861
- evidence: providerDoc("fireworks-deepseek-v4"),
862
- reasoning: {
863
- generation: "default-on",
864
- acceptedEfforts: ["none", "high", "max"],
865
- disable: "supported",
866
- disableForm: "effort-none",
867
- replayScope: "tool-turn",
868
- outputShapes: ["reasoning-content"],
869
- },
870
- },
871
- },
872
- {
873
- pattern: /kimi-k3|kimi-k2\.7/i,
874
- layer: kimiMandatoryLayer,
875
- },
876
- {
877
- pattern: /kimi-k2\.6/i,
878
- layer: kimiConfigurableLayer,
879
- },
880
- {
881
- pattern: /kimi/i,
882
- layer: kimiNoPreservationLayer,
883
- },
884
- ],
885
- "qwen-cloud": [
886
- {
887
- pattern: /qwen3/i,
888
- layer: {
889
- evidence: providerDoc("alibaba-qwen3-thinking"),
890
- reasoning: { generation: "default-on" },
891
- },
892
- },
893
- ],
894
- hetzner: [
895
- {
896
- pattern: /qwen/i,
897
- layer: {
898
- evidence: codeFact("hetzner-qwen-thinking"),
899
- reasoning: {
900
- generation: "default-on",
901
- control: {
902
- dialect: "glm-enable-thinking",
903
- status: "supported",
904
- evidence: codeFact("hetzner-qwen-thinking"),
905
- },
906
- disable: "supported",
907
- disableForm: "template-enable-thinking-false",
908
- },
909
- },
910
- },
911
- ],
912
- kimchi: [
913
- { pattern: /kimi-k3|kimi-k2\.7/i, layer: kimiMandatoryLayer },
914
- { pattern: /kimi-k2\.6/i, layer: kimiConfigurableLayer },
915
- { pattern: /kimi/i, layer: kimiNoPreservationLayer },
916
- ],
917
- tokenrouter: [
918
- { pattern: /kimi-k3|kimi-k2\.7/i, layer: kimiMandatoryLayer },
919
- { pattern: /kimi-k2\.6/i, layer: kimiConfigurableLayer },
920
- { pattern: /kimi/i, layer: kimiNoPreservationLayer },
921
- { pattern: /deepseek/i, layer: deepseekV4DefaultOn },
922
- ],
923
- orcarouter: [
924
- { pattern: /kimi-k3|kimi-k2\.7/i, layer: kimiMandatoryLayer },
925
- { pattern: /kimi-k2\.6/i, layer: kimiConfigurableLayer },
926
- { pattern: /kimi/i, layer: kimiNoPreservationLayer },
927
- { pattern: /deepseek/i, layer: deepseekV4DefaultOn },
928
- ],
929
- modal: [
930
- { pattern: /kimi-k3|kimi-k2\.7/i, layer: kimiMandatoryLayer },
931
- { pattern: /kimi-k2\.6/i, layer: kimiConfigurableLayer },
932
- { pattern: /kimi/i, layer: kimiNoPreservationLayer },
933
- { pattern: /deepseek/i, layer: deepseekV4DefaultOn },
934
- ],
935
- lightning: [
936
- { pattern: /kimi-k3|kimi-k2\.7/i, layer: kimiMandatoryLayer },
937
- { pattern: /kimi-k2\.6/i, layer: kimiConfigurableLayer },
938
- { pattern: /kimi/i, layer: kimiNoPreservationLayer },
939
- { pattern: /deepseek/i, layer: deepseekV4DefaultOn },
940
- ],
941
- free: [{ pattern: /deepseek/i, layer: deepseekV4DefaultOn }],
942
- openrouter: [],
943
- };
944
- const AWS_MANTLE_ANTHROPIC_MODEL = /(?:^|[./-])(?:anthropic|claude)(?:[./-]|$)/i;
945
- export function modelLayerFor(provider, model) {
946
- if (provider === "nvidia")
947
- return nvidiaModelLayer(model);
948
- if (provider === "bynara")
949
- return bynaraModelLayer(model);
950
- if (provider === "agentrouter")
951
- return agentrouterModelLayer(model);
952
- if (provider === "openrouter")
953
- return openrouterModelLayer(model);
954
- if (provider === "aws-mantle") {
955
- return AWS_MANTLE_ANTHROPIC_MODEL.test(model)
956
- ? MODEL_RULES.anthropic?.find((rule) => rule.pattern.test(model))?.layer
957
- : nvidiaModelLayer(model);
958
- }
959
- return MODEL_RULES[provider]?.find((rule) => rule.pattern.test(model))?.layer;
960
- }
961
447
  //# sourceMappingURL=provider-profile-layers.js.map