@pentoshi/clai 4.1.0 → 4.2.1

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 (266) hide show
  1. package/README.md +14 -0
  2. package/dist/agent/compaction-executor.d.ts +68 -0
  3. package/dist/agent/compaction-executor.js +343 -0
  4. package/dist/agent/compaction-executor.js.map +1 -0
  5. package/dist/agent/context-breakdown.js +2 -0
  6. package/dist/agent/context-breakdown.js.map +1 -1
  7. package/dist/agent/context-manager.d.ts +23 -9
  8. package/dist/agent/context-manager.js +72 -43
  9. package/dist/agent/context-manager.js.map +1 -1
  10. package/dist/agent/events.d.ts +3 -0
  11. package/dist/agent/loop-guard.d.ts +2 -0
  12. package/dist/agent/loop-guard.js +48 -3
  13. package/dist/agent/loop-guard.js.map +1 -1
  14. package/dist/agent/prompt-composer.js +6 -6
  15. package/dist/agent/prompt-composer.js.map +1 -1
  16. package/dist/agent/reliability-policy.d.ts +1 -0
  17. package/dist/agent/reliability-policy.js +6 -3
  18. package/dist/agent/reliability-policy.js.map +1 -1
  19. package/dist/agent/request-accounting.d.ts +97 -0
  20. package/dist/agent/request-accounting.js +207 -0
  21. package/dist/agent/request-accounting.js.map +1 -0
  22. package/dist/agent/request-budget.d.ts +2 -2
  23. package/dist/agent/request-budget.js +2 -4
  24. package/dist/agent/request-budget.js.map +1 -1
  25. package/dist/agent/runner.d.ts +8 -2
  26. package/dist/agent/runner.js +409 -178
  27. package/dist/agent/runner.js.map +1 -1
  28. package/dist/agent/session-title.d.ts +0 -26
  29. package/dist/agent/session-title.js +0 -80
  30. package/dist/agent/session-title.js.map +1 -1
  31. package/dist/agent/tool-history.d.ts +2 -2
  32. package/dist/agent/tool-history.js +19 -6
  33. package/dist/agent/tool-history.js.map +1 -1
  34. package/dist/app/adapters/agent-event-adapter.js +19 -0
  35. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  36. package/dist/app/adapters/current-agent-adapter.js +4 -0
  37. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  38. package/dist/app/commands/catalog.js +24 -0
  39. package/dist/app/commands/catalog.js.map +1 -1
  40. package/dist/app/controllers/cancel-coordinator.d.ts +51 -0
  41. package/dist/app/controllers/cancel-coordinator.js +48 -0
  42. package/dist/app/controllers/cancel-coordinator.js.map +1 -0
  43. package/dist/app/controllers/session-compact-helper.d.ts +19 -2
  44. package/dist/app/controllers/session-compact-helper.js +100 -127
  45. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  46. package/dist/app/controllers/session-context-usage.d.ts +32 -15
  47. package/dist/app/controllers/session-context-usage.js +186 -51
  48. package/dist/app/controllers/session-context-usage.js.map +1 -1
  49. package/dist/app/controllers/session-controller.d.ts +20 -11
  50. package/dist/app/controllers/session-controller.js +111 -90
  51. package/dist/app/controllers/session-controller.js.map +1 -1
  52. package/dist/app/controllers/session-naming.d.ts +31 -0
  53. package/dist/app/controllers/session-naming.js +173 -0
  54. package/dist/app/controllers/session-naming.js.map +1 -0
  55. package/dist/app/controllers/session-persistence.d.ts +2 -2
  56. package/dist/app/controllers/session-persistence.js +3 -6
  57. package/dist/app/controllers/session-persistence.js.map +1 -1
  58. package/dist/app/controllers/session-turn-request.d.ts +2 -1
  59. package/dist/app/controllers/session-turn-request.js +3 -0
  60. package/dist/app/controllers/session-turn-request.js.map +1 -1
  61. package/dist/app/controllers/turn-controller.d.ts +2 -1
  62. package/dist/app/controllers/turn-controller.js +1 -0
  63. package/dist/app/controllers/turn-controller.js.map +1 -1
  64. package/dist/app/events/app-event.d.ts +9 -0
  65. package/dist/app/events/app-event.js.map +1 -1
  66. package/dist/app/ports/agent-port.d.ts +8 -1
  67. package/dist/classic/app/ClassicApp.js +2 -1
  68. package/dist/classic/app/ClassicApp.js.map +1 -1
  69. package/dist/classic/app/app-wiring.js +1 -2
  70. package/dist/classic/app/app-wiring.js.map +1 -1
  71. package/dist/classic/app/wiring-interactions.js +2 -7
  72. package/dist/classic/app/wiring-interactions.js.map +1 -1
  73. package/dist/classic/blocks/tool-lines.js +2 -1
  74. package/dist/classic/blocks/tool-lines.js.map +1 -1
  75. package/dist/classic/input/cancel-ladder.d.ts +2 -19
  76. package/dist/classic/input/cancel-ladder.js +13 -20
  77. package/dist/classic/input/cancel-ladder.js.map +1 -1
  78. package/dist/commands/providers.js +2 -0
  79. package/dist/commands/providers.js.map +1 -1
  80. package/dist/llm/adapters/anthropic-tools.d.ts +31 -14
  81. package/dist/llm/adapters/anthropic-tools.js +124 -29
  82. package/dist/llm/adapters/anthropic-tools.js.map +1 -1
  83. package/dist/llm/adapters/gemini-tools.d.ts +16 -4
  84. package/dist/llm/adapters/gemini-tools.js +117 -16
  85. package/dist/llm/adapters/gemini-tools.js.map +1 -1
  86. package/dist/llm/adapters/openai-tools.d.ts +13 -2
  87. package/dist/llm/adapters/openai-tools.js +58 -11
  88. package/dist/llm/adapters/openai-tools.js.map +1 -1
  89. package/dist/llm/agentrouter.js +68 -45
  90. package/dist/llm/agentrouter.js.map +1 -1
  91. package/dist/llm/anthropic.js +69 -36
  92. package/dist/llm/anthropic.js.map +1 -1
  93. package/dist/llm/aws-mantle.js +70 -32
  94. package/dist/llm/aws-mantle.js.map +1 -1
  95. package/dist/llm/bynara.js +26 -69
  96. package/dist/llm/bynara.js.map +1 -1
  97. package/dist/llm/capabilities.d.ts +2 -1
  98. package/dist/llm/capabilities.js +47 -0
  99. package/dist/llm/capabilities.js.map +1 -1
  100. package/dist/llm/context-snapshot.d.ts +100 -0
  101. package/dist/llm/context-snapshot.js +277 -0
  102. package/dist/llm/context-snapshot.js.map +1 -0
  103. package/dist/llm/context-windows.d.ts +10 -0
  104. package/dist/llm/context-windows.js +129 -0
  105. package/dist/llm/context-windows.js.map +1 -0
  106. package/dist/llm/custom-provider-profile.d.ts +75 -0
  107. package/dist/llm/custom-provider-profile.js +558 -0
  108. package/dist/llm/custom-provider-profile.js.map +1 -0
  109. package/dist/llm/custom-providers.d.ts +13 -1
  110. package/dist/llm/custom-providers.js +77 -25
  111. package/dist/llm/custom-providers.js.map +1 -1
  112. package/dist/llm/effort-fallback.d.ts +44 -0
  113. package/dist/llm/effort-fallback.js +101 -0
  114. package/dist/llm/effort-fallback.js.map +1 -0
  115. package/dist/llm/fireworks.js +4 -0
  116. package/dist/llm/fireworks.js.map +1 -1
  117. package/dist/llm/free.js +4 -0
  118. package/dist/llm/free.js.map +1 -1
  119. package/dist/llm/gemini.d.ts +1 -1
  120. package/dist/llm/gemini.js +89 -51
  121. package/dist/llm/gemini.js.map +1 -1
  122. package/dist/llm/groq.js +4 -0
  123. package/dist/llm/groq.js.map +1 -1
  124. package/dist/llm/hetzner.js +4 -0
  125. package/dist/llm/hetzner.js.map +1 -1
  126. package/dist/llm/http.d.ts +49 -10
  127. package/dist/llm/http.js +417 -153
  128. package/dist/llm/http.js.map +1 -1
  129. package/dist/llm/kimchi.js +4 -0
  130. package/dist/llm/kimchi.js.map +1 -1
  131. package/dist/llm/lightning.js +4 -0
  132. package/dist/llm/lightning.js.map +1 -1
  133. package/dist/llm/meta.d.ts +2 -0
  134. package/dist/llm/meta.js +811 -655
  135. package/dist/llm/meta.js.map +1 -1
  136. package/dist/llm/modal.js +4 -0
  137. package/dist/llm/modal.js.map +1 -1
  138. package/dist/llm/model-families.d.ts +9 -0
  139. package/dist/llm/model-families.js +39 -0
  140. package/dist/llm/model-families.js.map +1 -0
  141. package/dist/llm/nvidia.js +4 -0
  142. package/dist/llm/nvidia.js.map +1 -1
  143. package/dist/llm/ollama.js +44 -40
  144. package/dist/llm/ollama.js.map +1 -1
  145. package/dist/llm/openai.js +4 -0
  146. package/dist/llm/openai.js.map +1 -1
  147. package/dist/llm/openrouter.js +4 -0
  148. package/dist/llm/openrouter.js.map +1 -1
  149. package/dist/llm/operation-ledger.d.ts +60 -0
  150. package/dist/llm/operation-ledger.js +136 -0
  151. package/dist/llm/operation-ledger.js.map +1 -0
  152. package/dist/llm/operation-usage.d.ts +32 -0
  153. package/dist/llm/operation-usage.js +172 -0
  154. package/dist/llm/operation-usage.js.map +1 -0
  155. package/dist/llm/orcarouter.d.ts +7 -0
  156. package/dist/llm/orcarouter.js +166 -0
  157. package/dist/llm/orcarouter.js.map +1 -0
  158. package/dist/llm/provider-profile-layers.d.ts +7 -0
  159. package/dist/llm/provider-profile-layers.js +961 -0
  160. package/dist/llm/provider-profile-layers.js.map +1 -0
  161. package/dist/llm/provider-profile.d.ts +181 -0
  162. package/dist/llm/provider-profile.js +329 -0
  163. package/dist/llm/provider-profile.js.map +1 -0
  164. package/dist/llm/provider-profiles.d.ts +13 -0
  165. package/dist/llm/provider-profiles.js +86 -0
  166. package/dist/llm/provider-profiles.js.map +1 -0
  167. package/dist/llm/provider.d.ts +2 -0
  168. package/dist/llm/provider.js +67 -0
  169. package/dist/llm/provider.js.map +1 -1
  170. package/dist/llm/qwen-cloud.js +4 -0
  171. package/dist/llm/qwen-cloud.js.map +1 -1
  172. package/dist/llm/reasoning-artifacts.d.ts +101 -0
  173. package/dist/llm/reasoning-artifacts.js +440 -0
  174. package/dist/llm/reasoning-artifacts.js.map +1 -0
  175. package/dist/llm/request-fingerprint.d.ts +10 -0
  176. package/dist/llm/request-fingerprint.js +313 -0
  177. package/dist/llm/request-fingerprint.js.map +1 -0
  178. package/dist/llm/request-plan.d.ts +119 -0
  179. package/dist/llm/request-plan.js +279 -0
  180. package/dist/llm/request-plan.js.map +1 -0
  181. package/dist/llm/router.d.ts +19 -1
  182. package/dist/llm/router.js +447 -75
  183. package/dist/llm/router.js.map +1 -1
  184. package/dist/llm/stream-events.d.ts +47 -0
  185. package/dist/llm/stream-events.js +55 -0
  186. package/dist/llm/stream-events.js.map +1 -0
  187. package/dist/llm/stream-terminal.d.ts +30 -0
  188. package/dist/llm/stream-terminal.js +51 -0
  189. package/dist/llm/stream-terminal.js.map +1 -0
  190. package/dist/llm/token-estimate-calibration.d.ts +23 -0
  191. package/dist/llm/token-estimate-calibration.js +140 -0
  192. package/dist/llm/token-estimate-calibration.js.map +1 -0
  193. package/dist/llm/token-usage.d.ts +35 -5
  194. package/dist/llm/token-usage.js +212 -162
  195. package/dist/llm/token-usage.js.map +1 -1
  196. package/dist/llm/tokenrouter.js +8 -2
  197. package/dist/llm/tokenrouter.js.map +1 -1
  198. package/dist/modes/ask.js +11 -5
  199. package/dist/modes/ask.js.map +1 -1
  200. package/dist/noninteractive/start-noninteractive.js +31 -2
  201. package/dist/noninteractive/start-noninteractive.js.map +1 -1
  202. package/dist/noninteractive/stream-blocks.js +15 -4
  203. package/dist/noninteractive/stream-blocks.js.map +1 -1
  204. package/dist/prompts/embedded.js +1 -1
  205. package/dist/prompts/embedded.js.map +1 -1
  206. package/dist/prompts/system.agent.md +6 -0
  207. package/dist/store/config.js +5 -1
  208. package/dist/store/config.js.map +1 -1
  209. package/dist/store/history.d.ts +2 -0
  210. package/dist/store/history.js +19 -10
  211. package/dist/store/history.js.map +1 -1
  212. package/dist/store/keys.js +11 -1
  213. package/dist/store/keys.js.map +1 -1
  214. package/dist/store/plan.js +20 -14
  215. package/dist/store/plan.js.map +1 -1
  216. package/dist/tools/elevated-shell.d.ts +1 -1
  217. package/dist/tools/elevated-shell.js +24 -72
  218. package/dist/tools/elevated-shell.js.map +1 -1
  219. package/dist/tools/nmap-runner.js +30 -36
  220. package/dist/tools/nmap-runner.js.map +1 -1
  221. package/dist/tools/sudo-session.d.ts +83 -0
  222. package/dist/tools/sudo-session.js +124 -0
  223. package/dist/tools/sudo-session.js.map +1 -0
  224. package/dist/tui-v2/app/App.js +9 -24
  225. package/dist/tui-v2/app/App.js.map +1 -1
  226. package/dist/tui-v2/components/status/context-limit-chip.js +2 -2
  227. package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -1
  228. package/dist/tui-v2/components/transcript/intro-card.js +2 -1
  229. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
  230. package/dist/tui-v2/composer/composer-editor.js +2 -1
  231. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  232. package/dist/types.d.ts +156 -1
  233. package/dist/types.js +1 -0
  234. package/dist/types.js.map +1 -1
  235. package/dist/ui-core/bootstrap/composition-root.d.ts +2 -0
  236. package/dist/ui-core/bootstrap/composition-root.js +26 -3
  237. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  238. package/dist/ui-core/commands/picker-commands.js +11 -5
  239. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  240. package/dist/ui-core/commands/session-commands.js +41 -5
  241. package/dist/ui-core/commands/session-commands.js.map +1 -1
  242. package/dist/ui-core/plan/plan-lifecycle.js +3 -2
  243. package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
  244. package/dist/ui-core/rendering/context-limit.js +4 -1
  245. package/dist/ui-core/rendering/context-limit.js.map +1 -1
  246. package/dist/ui-core/rendering/duration.d.ts +2 -1
  247. package/dist/ui-core/rendering/duration.js +13 -5
  248. package/dist/ui-core/rendering/duration.js.map +1 -1
  249. package/dist/ui-core/rendering/intro-header.js +2 -2
  250. package/dist/ui-core/rendering/intro-header.js.map +1 -1
  251. package/dist/ui-core/rendering/theme.d.ts +1 -0
  252. package/dist/ui-core/rendering/theme.js +2 -0
  253. package/dist/ui-core/rendering/theme.js.map +1 -1
  254. package/dist/ui-core/state/transcript-hydrate.js +3 -3
  255. package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
  256. package/dist/ui-core/state/transcript-reducer.d.ts +5 -0
  257. package/dist/ui-core/state/transcript-reducer.js +76 -3
  258. package/dist/ui-core/state/transcript-reducer.js.map +1 -1
  259. package/dist/ui-core/state/transcript-store.d.ts +10 -1
  260. package/dist/ui-core/state/transcript-store.js +22 -1
  261. package/dist/ui-core/state/transcript-store.js.map +1 -1
  262. package/dist/ui-core/state/transcript-types.d.ts +2 -0
  263. package/dist/ui-core/state/transcript-types.js.map +1 -1
  264. package/dist/version.generated.d.ts +2 -2
  265. package/dist/version.generated.js +2 -2
  266. package/package.json +6 -1
@@ -0,0 +1,961 @@
1
+ import { classifyBynaraModel, classifyNvidiaModel } from "./model-families.js";
2
+ export const codeFact = (detail) => ({
3
+ source: "builtin",
4
+ confidence: "exact",
5
+ ...(detail ? { detail } : {}),
6
+ });
7
+ export const providerDoc = (detail) => ({
8
+ source: "builtin",
9
+ confidence: "high",
10
+ detail,
11
+ });
12
+ export const viaGateway = (detail) => ({
13
+ source: "builtin",
14
+ confidence: "inferred",
15
+ detail,
16
+ });
17
+ export const FAMILY_LAYERS = {
18
+ anthropic: {
19
+ evidence: providerDoc("anthropic-messages"),
20
+ transport: { authType: "native", systemPolicy: "provider-system-field" },
21
+ capabilities: {
22
+ tools: "supported",
23
+ images: "supported",
24
+ streamOptions: "unsupported",
25
+ },
26
+ reasoning: {
27
+ control: {
28
+ dialect: "anthropic-thinking",
29
+ status: "supported",
30
+ evidence: providerDoc("anthropic-thinking"),
31
+ },
32
+ acceptedEfforts: ["low", "medium", "high"],
33
+ disable: "supported",
34
+ disableForm: "omit-control",
35
+ outputShapes: ["signed-thinking-block"],
36
+ replayScope: "tool-turn",
37
+ finalTurnPreservation: "unsupported",
38
+ },
39
+ cache: {
40
+ kind: "explicit-breakpoint",
41
+ affinityField: "cache_control",
42
+ cacheAffectingFields: ["system", "messages", "tools", "cache_control"],
43
+ },
44
+ usage: {
45
+ cachedInput: ["usage.cache_read_input_tokens"],
46
+ cacheWrite: ["usage.cache_creation_input_tokens"],
47
+ },
48
+ terminal: { proofs: ["message-stop"], naturalEofAccepted: false },
49
+ },
50
+ gemini: {
51
+ evidence: providerDoc("gemini-generate-content"),
52
+ transport: { authType: "native", systemPolicy: "provider-system-field" },
53
+ capabilities: { tools: "supported", images: "supported" },
54
+ reasoning: {
55
+ control: {
56
+ dialect: "gemini-thinking-config",
57
+ status: "supported",
58
+ evidence: providerDoc("gemini-thinking-config"),
59
+ },
60
+ disable: "supported",
61
+ disableForm: "thinking-budget-zero",
62
+ outputShapes: ["thought-signature"],
63
+ replayScope: "tool-turn",
64
+ finalTurnPreservation: "supported",
65
+ },
66
+ cache: {
67
+ kind: "explicit-breakpoint",
68
+ cacheAffectingFields: ["systemInstruction", "contents", "tools", "cachedContent"],
69
+ },
70
+ usage: {
71
+ cachedInput: ["usageMetadata.cachedContentTokenCount"],
72
+ reasoningOutput: ["usageMetadata.thoughtsTokenCount"],
73
+ },
74
+ terminal: { proofs: ["finish-reason"], naturalEofAccepted: false },
75
+ },
76
+ meta: {
77
+ evidence: providerDoc("meta-responses"),
78
+ transport: { authType: "native", systemPolicy: "provider-system-field" },
79
+ capabilities: { tools: "supported" },
80
+ reasoning: {
81
+ generation: "mandatory",
82
+ generationEvidence: providerDoc("meta-mandatory-reasoning"),
83
+ control: {
84
+ dialect: "meta-reasoning-effort",
85
+ status: "supported",
86
+ evidence: providerDoc("meta-reasoning-effort"),
87
+ },
88
+ acceptedEfforts: ["minimal", "low", "high", "xhigh"],
89
+ disable: "unsupported",
90
+ outputShapes: ["encrypted-reasoning-items"],
91
+ replayScope: "tool-turn",
92
+ finalTurnPreservation: "unsupported",
93
+ },
94
+ outputBudget: {
95
+ sharedReasoningCap: true,
96
+ visibleAnswerReserveTokens: 2048,
97
+ mandatoryReasoningReserveTokens: 2048,
98
+ },
99
+ cache: {
100
+ kind: "automatic-prefix",
101
+ affinityField: "prompt_cache_key",
102
+ cacheAffectingFields: [
103
+ "input",
104
+ "tools",
105
+ "instructions",
106
+ "prompt_cache_key",
107
+ "prompt_cache_retention",
108
+ ],
109
+ },
110
+ usage: {
111
+ cachedInput: ["usage.input_tokens_details.cached_tokens"],
112
+ cacheWrite: ["usage.cache_creation_input_tokens"],
113
+ uncachedInput: ["usage.prompt_cache_miss_tokens"],
114
+ },
115
+ terminal: {
116
+ proofs: ["response-completed", "response-incomplete"],
117
+ naturalEofAccepted: false,
118
+ },
119
+ },
120
+ ollama: {
121
+ evidence: codeFact("ollama-chat"),
122
+ transport: { authType: "none-keyless", systemPolicy: "single-leading" },
123
+ capabilities: { tools: "unknown", images: "unknown" },
124
+ reasoning: {
125
+ control: {
126
+ dialect: "ollama-think",
127
+ status: "unknown",
128
+ evidence: codeFact("think-is-model-scoped"),
129
+ },
130
+ outputShapes: ["ollama-thinking"],
131
+ replayScope: "none",
132
+ },
133
+ terminal: { proofs: ["done-true"], naturalEofAccepted: false },
134
+ },
135
+ openai: {
136
+ evidence: providerDoc("openai-chat-completions"),
137
+ transport: { authType: "bearer", systemPolicy: "developer-fallback" },
138
+ capabilities: {
139
+ tools: "supported",
140
+ images: "supported",
141
+ structuredOutput: "supported",
142
+ streamOptions: "supported",
143
+ },
144
+ reasoning: {
145
+ generation: "optional",
146
+ control: {
147
+ dialect: "openai-effort",
148
+ status: "supported",
149
+ evidence: providerDoc("openai-reasoning-effort"),
150
+ },
151
+ acceptedEfforts: ["minimal", "low", "medium", "high"],
152
+ disable: "supported",
153
+ disableForm: "omit-control",
154
+ replayScope: "none",
155
+ finalTurnPreservation: "unsupported",
156
+ },
157
+ cache: {
158
+ kind: "automatic-prefix",
159
+ cacheAffectingFields: ["messages", "tools", "tool_choice", "images"],
160
+ },
161
+ usage: {
162
+ cachedInput: ["usage.prompt_tokens_details.cached_tokens"],
163
+ reasoningOutput: ["usage.completion_tokens_details.reasoning_tokens"],
164
+ },
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"],
183
+ naturalEofAccepted: false,
184
+ },
185
+ },
186
+ openrouter: {
187
+ evidence: providerDoc("openrouter-reasoning"),
188
+ capabilities: { tools: "supported", images: "unknown" },
189
+ reasoning: {
190
+ control: {
191
+ dialect: "openai-nested-reasoning",
192
+ status: "supported",
193
+ evidence: providerDoc("openrouter-reasoning"),
194
+ },
195
+ acceptedEfforts: ["low", "medium", "high"],
196
+ outputShapes: ["reasoning-content", "structured-details"],
197
+ replayScope: "tool-turn",
198
+ },
199
+ cache: { kind: "unknown", cacheAffectingFields: [] },
200
+ usage: {
201
+ cachedInput: ["usage.prompt_tokens_details.cached_tokens"],
202
+ },
203
+ terminal: {
204
+ proofs: ["done-sentinel", "finish-reason"],
205
+ naturalEofAccepted: false,
206
+ },
207
+ },
208
+ nvidia: {
209
+ evidence: codeFact("nvidia-nim"),
210
+ capabilities: { tools: "supported" },
211
+ reasoning: {
212
+ control: {
213
+ dialect: "chat-template-thinking",
214
+ status: "unknown",
215
+ evidence: codeFact("nvidia-model-families"),
216
+ },
217
+ outputShapes: ["reasoning-content"],
218
+ },
219
+ terminal: {
220
+ proofs: ["done-sentinel", "finish-reason"],
221
+ naturalEofAccepted: false,
222
+ },
223
+ },
224
+ agentrouter: {
225
+ evidence: codeFact("agentrouter-live-verified-2026-07"),
226
+ capabilities: { tools: "supported" },
227
+ reasoning: {
228
+ control: {
229
+ dialect: "openai-effort",
230
+ status: "unknown",
231
+ evidence: codeFact("agentrouter-family-dependent"),
232
+ },
233
+ outputShapes: ["reasoning-content"],
234
+ },
235
+ 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"],
253
+ naturalEofAccepted: false,
254
+ },
255
+ },
256
+ bynara: {
257
+ evidence: codeFact("bynara-route"),
258
+ capabilities: { tools: "supported" },
259
+ reasoning: {
260
+ control: {
261
+ dialect: "openai-effort",
262
+ status: "unknown",
263
+ evidence: codeFact("bynara-model-families"),
264
+ },
265
+ outputShapes: ["reasoning-content"],
266
+ },
267
+ terminal: {
268
+ proofs: ["done-sentinel", "finish-reason"],
269
+ naturalEofAccepted: false,
270
+ },
271
+ },
272
+ "qwen-cloud": {
273
+ evidence: providerDoc("alibaba-model-studio"),
274
+ transport: { authType: "bearer", systemPolicy: "single-leading" },
275
+ capabilities: { tools: "supported", images: "unknown" },
276
+ reasoning: {
277
+ control: {
278
+ dialect: "qwen-enable-thinking",
279
+ status: "supported",
280
+ evidence: providerDoc("alibaba-enable-thinking"),
281
+ },
282
+ disable: "supported",
283
+ disableForm: "enable-thinking-false",
284
+ outputShapes: ["reasoning-content"],
285
+ replayScope: "configurable",
286
+ finalTurnPreservation: "supported",
287
+ },
288
+ terminal: {
289
+ proofs: ["done-sentinel", "finish-reason"],
290
+ naturalEofAccepted: false,
291
+ },
292
+ },
293
+ modal: {
294
+ evidence: providerDoc("modal-proxy-auth"),
295
+ transport: { authType: "proxy-headers", systemPolicy: "single-leading" },
296
+ capabilities: { tools: "unknown", images: "unknown" },
297
+ reasoning: {
298
+ control: {
299
+ dialect: "modal-advertised-effort",
300
+ status: "unknown",
301
+ evidence: providerDoc("modal-deployment-owned"),
302
+ },
303
+ outputShapes: ["reasoning-content"],
304
+ },
305
+ cache: { kind: "unknown", cacheAffectingFields: [] },
306
+ },
307
+ lightning: {
308
+ evidence: codeFact("lightning-catalog"),
309
+ capabilities: { tools: "supported", images: "unknown" },
310
+ reasoning: {
311
+ control: {
312
+ dialect: "openai-effort",
313
+ status: "unknown",
314
+ evidence: codeFact("lightning-catalog-scoped"),
315
+ },
316
+ outputShapes: ["reasoning-content"],
317
+ },
318
+ terminal: {
319
+ proofs: ["done-sentinel", "finish-reason"],
320
+ naturalEofAccepted: false,
321
+ },
322
+ },
323
+ tokenrouter: {
324
+ evidence: codeFact("tokenrouter-unknown-contract"),
325
+ capabilities: { tools: "supported", images: "unknown" },
326
+ reasoning: {
327
+ control: {
328
+ dialect: "none",
329
+ status: "unknown",
330
+ evidence: codeFact("tokenrouter-contract-unknown"),
331
+ },
332
+ outputShapes: ["reasoning-content"],
333
+ },
334
+ cache: { kind: "unknown", cacheAffectingFields: [] },
335
+ terminal: {
336
+ proofs: ["done-sentinel", "finish-reason"],
337
+ naturalEofAccepted: false,
338
+ },
339
+ },
340
+ fireworks: {
341
+ evidence: providerDoc("fireworks-chat-completions"),
342
+ capabilities: { tools: "supported" },
343
+ reasoning: {
344
+ control: {
345
+ dialect: "openai-effort",
346
+ status: "supported",
347
+ evidence: providerDoc("fireworks-reasoning-effort"),
348
+ },
349
+ outputShapes: ["reasoning-content"],
350
+ },
351
+ cache: {
352
+ kind: "affinity-key",
353
+ affinityField: "prompt_cache_key",
354
+ isolationField: "prompt_cache_isolation_key",
355
+ cacheAffectingFields: [
356
+ "messages",
357
+ "tools",
358
+ "allowed_tools",
359
+ "reasoning_effort",
360
+ "reasoning_history",
361
+ "prompt_cache_key",
362
+ "prompt_cache_isolation_key",
363
+ ],
364
+ },
365
+ terminal: {
366
+ proofs: ["done-sentinel", "finish-reason"],
367
+ naturalEofAccepted: false,
368
+ },
369
+ },
370
+ hetzner: {
371
+ evidence: codeFact("hetzner-experiments"),
372
+ capabilities: { tools: "supported" },
373
+ reasoning: {
374
+ control: {
375
+ dialect: "glm-enable-thinking",
376
+ status: "unknown",
377
+ evidence: codeFact("hetzner-stepfun-style"),
378
+ },
379
+ outputShapes: ["reasoning-content"],
380
+ },
381
+ terminal: {
382
+ proofs: ["done-sentinel", "finish-reason"],
383
+ naturalEofAccepted: false,
384
+ },
385
+ },
386
+ orcarouter: {
387
+ evidence: providerDoc("orcarouter-reasoning"),
388
+ capabilities: { tools: "supported", images: "unknown" },
389
+ reasoning: {
390
+ control: {
391
+ dialect: "openai-effort",
392
+ status: "supported",
393
+ evidence: providerDoc("orcarouter-unified-effort"),
394
+ },
395
+ acceptedEfforts: ["low", "medium", "high"],
396
+ outputShapes: ["reasoning-content"],
397
+ replayScope: "tool-turn",
398
+ },
399
+ usage: {
400
+ cachedInput: ["usage.prompt_tokens_details.cached_tokens"],
401
+ },
402
+ terminal: {
403
+ proofs: ["done-sentinel", "finish-reason"],
404
+ naturalEofAccepted: false,
405
+ },
406
+ },
407
+ free: {
408
+ evidence: codeFact("zen-kilo-free-gateways"),
409
+ transport: { authType: "none-keyless", systemPolicy: "single-leading" },
410
+ capabilities: { tools: "supported" },
411
+ reasoning: {
412
+ control: {
413
+ dialect: "none",
414
+ status: "unknown",
415
+ evidence: codeFact("free-gateway-contracts-unknown"),
416
+ },
417
+ outputShapes: ["reasoning-content"],
418
+ },
419
+ terminal: {
420
+ proofs: ["done-sentinel", "finish-reason"],
421
+ naturalEofAccepted: false,
422
+ },
423
+ },
424
+ "aws-mantle": {
425
+ evidence: codeFact("aws-mantle-compatible"),
426
+ capabilities: { tools: "supported" },
427
+ reasoning: {
428
+ control: {
429
+ dialect: "chat-template-thinking",
430
+ status: "unknown",
431
+ evidence: codeFact("aws-mantle-model-scoped"),
432
+ },
433
+ outputShapes: ["reasoning-content"],
434
+ },
435
+ terminal: {
436
+ proofs: ["done-sentinel", "finish-reason"],
437
+ naturalEofAccepted: false,
438
+ },
439
+ },
440
+ };
441
+ const kimiMandatoryLayer = {
442
+ evidence: viaGateway("kimi-k3-k2p7-official-contract"),
443
+ reasoning: {
444
+ generation: "mandatory",
445
+ control: {
446
+ dialect: "none",
447
+ status: "unknown",
448
+ evidence: viaGateway("kimi-toggle-not-sent"),
449
+ },
450
+ replayScope: "all-history",
451
+ finalTurnPreservation: "required",
452
+ },
453
+ outputBudget: {
454
+ sharedReasoningCap: true,
455
+ visibleAnswerReserveTokens: 2048,
456
+ mandatoryReasoningReserveTokens: 4096,
457
+ },
458
+ };
459
+ const kimiConfigurableLayer = {
460
+ evidence: viaGateway("kimi-k2p6-official-contract"),
461
+ reasoning: {
462
+ generation: "optional",
463
+ replayScope: "configurable",
464
+ finalTurnPreservation: "supported",
465
+ },
466
+ };
467
+ const kimiNoPreservationLayer = {
468
+ evidence: viaGateway("kimi-k2p5-official-contract"),
469
+ reasoning: {
470
+ generation: "optional",
471
+ replayScope: "tool-turn",
472
+ finalTurnPreservation: "unsupported",
473
+ },
474
+ };
475
+ const deepseekV4DefaultOn = {
476
+ evidence: viaGateway("deepseek-v4-default-thinking"),
477
+ reasoning: {
478
+ generation: "default-on",
479
+ replayScope: "tool-turn",
480
+ outputShapes: ["reasoning-content"],
481
+ },
482
+ };
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
+ //# sourceMappingURL=provider-profile-layers.js.map