@selesai/code 0.5.14 → 0.5.15

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 (235) hide show
  1. package/dist/bun/cli.d.ts.map +1 -1
  2. package/dist/bun/cli.js +2 -0
  3. package/dist/bun/cli.js.map +1 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +3 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/list-models.d.ts +2 -2
  8. package/dist/cli/list-models.d.ts.map +1 -1
  9. package/dist/cli/list-models.js +3 -3
  10. package/dist/cli/list-models.js.map +1 -1
  11. package/dist/config.d.ts +1 -1
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +2 -2
  14. package/dist/config.js.map +1 -1
  15. package/dist/core/agent-session-auto-handoff.test.d.ts.map +1 -1
  16. package/dist/core/agent-session-auto-handoff.test.js +2 -2
  17. package/dist/core/agent-session-auto-handoff.test.js.map +1 -1
  18. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  19. package/dist/core/agent-session-runtime.js +3 -0
  20. package/dist/core/agent-session-runtime.js.map +1 -1
  21. package/dist/core/agent-session-services.d.ts +3 -6
  22. package/dist/core/agent-session-services.d.ts.map +1 -1
  23. package/dist/core/agent-session-services.js +23 -9
  24. package/dist/core/agent-session-services.js.map +1 -1
  25. package/dist/core/agent-session.d.ts +28 -10
  26. package/dist/core/agent-session.d.ts.map +1 -1
  27. package/dist/core/agent-session.js +136 -90
  28. package/dist/core/agent-session.js.map +1 -1
  29. package/dist/core/auth-storage.d.ts +20 -98
  30. package/dist/core/auth-storage.d.ts.map +1 -1
  31. package/dist/core/auth-storage.js +59 -251
  32. package/dist/core/auth-storage.js.map +1 -1
  33. package/dist/core/built-in-extensions.d.ts +3 -0
  34. package/dist/core/built-in-extensions.d.ts.map +1 -0
  35. package/dist/core/built-in-extensions.js +3 -0
  36. package/dist/core/built-in-extensions.js.map +1 -0
  37. package/dist/core/cache-stats.d.ts +2 -2
  38. package/dist/core/cache-stats.d.ts.map +1 -1
  39. package/dist/core/cache-stats.js +1 -1
  40. package/dist/core/cache-stats.js.map +1 -1
  41. package/dist/core/compaction/branch-summarization.d.ts +8 -2
  42. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  43. package/dist/core/compaction/branch-summarization.js +8 -11
  44. package/dist/core/compaction/branch-summarization.js.map +1 -1
  45. package/dist/core/compaction/compaction.d.ts +19 -3
  46. package/dist/core/compaction/compaction.d.ts.map +1 -1
  47. package/dist/core/compaction/compaction.js +63 -26
  48. package/dist/core/compaction/compaction.js.map +1 -1
  49. package/dist/core/compaction/utils.d.ts +1 -1
  50. package/dist/core/compaction/utils.d.ts.map +1 -1
  51. package/dist/core/compaction/utils.js +6 -17
  52. package/dist/core/compaction/utils.js.map +1 -1
  53. package/dist/core/extensions/loader.d.ts.map +1 -1
  54. package/dist/core/extensions/loader.js +21 -4
  55. package/dist/core/extensions/loader.js.map +1 -1
  56. package/dist/core/extensions/runner.d.ts +4 -1
  57. package/dist/core/extensions/runner.d.ts.map +1 -1
  58. package/dist/core/extensions/runner.js +39 -0
  59. package/dist/core/extensions/runner.js.map +1 -1
  60. package/dist/core/extensions/types.d.ts +24 -3
  61. package/dist/core/extensions/types.d.ts.map +1 -1
  62. package/dist/core/extensions/types.js.map +1 -1
  63. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  64. package/dist/core/extensions/wrapper.js +22 -3
  65. package/dist/core/extensions/wrapper.js.map +1 -1
  66. package/dist/core/keybindings.d.ts +8 -3
  67. package/dist/core/keybindings.d.ts.map +1 -1
  68. package/dist/core/keybindings.js +7 -3
  69. package/dist/core/keybindings.js.map +1 -1
  70. package/dist/core/llama/client.d.ts +61 -0
  71. package/dist/core/llama/client.d.ts.map +1 -0
  72. package/dist/core/llama/client.js +302 -0
  73. package/dist/core/llama/client.js.map +1 -0
  74. package/dist/core/llama/huggingface.d.ts +23 -0
  75. package/dist/core/llama/huggingface.d.ts.map +1 -0
  76. package/dist/core/llama/huggingface.js +141 -0
  77. package/dist/core/llama/huggingface.js.map +1 -0
  78. package/dist/core/llama/index.d.ts +3 -0
  79. package/dist/core/llama/index.d.ts.map +1 -0
  80. package/dist/core/llama/index.js +208 -0
  81. package/dist/core/llama/index.js.map +1 -0
  82. package/dist/core/llama/provider.d.ts +10 -0
  83. package/dist/core/llama/provider.d.ts.map +1 -0
  84. package/dist/core/llama/provider.js +102 -0
  85. package/dist/core/llama/provider.js.map +1 -0
  86. package/dist/core/llama/ui.d.ts +42 -0
  87. package/dist/core/llama/ui.d.ts.map +1 -0
  88. package/dist/core/llama/ui.js +416 -0
  89. package/dist/core/llama/ui.js.map +1 -0
  90. package/dist/core/model-config.d.ts +513 -0
  91. package/dist/core/model-config.d.ts.map +1 -0
  92. package/dist/core/model-config.js +272 -0
  93. package/dist/core/model-config.js.map +1 -0
  94. package/dist/core/model-registry.d.ts +20 -126
  95. package/dist/core/model-registry.d.ts.map +1 -1
  96. package/dist/core/model-registry.js +62 -780
  97. package/dist/core/model-registry.js.map +1 -1
  98. package/dist/core/model-resolver.d.ts +6 -6
  99. package/dist/core/model-resolver.d.ts.map +1 -1
  100. package/dist/core/model-resolver.js +21 -18
  101. package/dist/core/model-resolver.js.map +1 -1
  102. package/dist/core/model-runtime.d.ts +83 -0
  103. package/dist/core/model-runtime.d.ts.map +1 -0
  104. package/dist/core/model-runtime.js +451 -0
  105. package/dist/core/model-runtime.js.map +1 -0
  106. package/dist/core/models-store.d.ts +17 -0
  107. package/dist/core/models-store.d.ts.map +1 -0
  108. package/dist/core/models-store.js +45 -0
  109. package/dist/core/models-store.js.map +1 -0
  110. package/dist/core/package-manager.d.ts.map +1 -1
  111. package/dist/core/package-manager.js +7 -2
  112. package/dist/core/package-manager.js.map +1 -1
  113. package/dist/core/prompt-templates.d.ts +1 -0
  114. package/dist/core/prompt-templates.d.ts.map +1 -1
  115. package/dist/core/prompt-templates.js +4 -4
  116. package/dist/core/prompt-templates.js.map +1 -1
  117. package/dist/core/provider-composer.d.ts +55 -0
  118. package/dist/core/provider-composer.d.ts.map +1 -0
  119. package/dist/core/provider-composer.js +375 -0
  120. package/dist/core/provider-composer.js.map +1 -0
  121. package/dist/core/radius.d.ts +2 -0
  122. package/dist/core/radius.d.ts.map +1 -0
  123. package/dist/core/radius.js +2 -0
  124. package/dist/core/radius.js.map +1 -0
  125. package/dist/core/remote-catalog-provider.d.ts +5 -0
  126. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  127. package/dist/core/remote-catalog-provider.js +102 -0
  128. package/dist/core/remote-catalog-provider.js.map +1 -0
  129. package/dist/core/resource-loader.d.ts.map +1 -1
  130. package/dist/core/resource-loader.js +1 -0
  131. package/dist/core/resource-loader.js.map +1 -1
  132. package/dist/core/runtime-credentials.d.ts +17 -0
  133. package/dist/core/runtime-credentials.d.ts.map +1 -0
  134. package/dist/core/runtime-credentials.js +42 -0
  135. package/dist/core/runtime-credentials.js.map +1 -0
  136. package/dist/core/sdk.d.ts +4 -7
  137. package/dist/core/sdk.d.ts.map +1 -1
  138. package/dist/core/sdk.js +18 -25
  139. package/dist/core/sdk.js.map +1 -1
  140. package/dist/core/session-manager.d.ts +12 -7
  141. package/dist/core/session-manager.d.ts.map +1 -1
  142. package/dist/core/session-manager.js +103 -27
  143. package/dist/core/session-manager.js.map +1 -1
  144. package/dist/core/system-prompt.d.ts.map +1 -1
  145. package/dist/core/system-prompt.js +1 -11
  146. package/dist/core/system-prompt.js.map +1 -1
  147. package/dist/core/tools/read.d.ts.map +1 -1
  148. package/dist/core/tools/read.js +1 -1
  149. package/dist/core/tools/read.js.map +1 -1
  150. package/dist/core/usage-totals.d.ts +19 -0
  151. package/dist/core/usage-totals.d.ts.map +1 -0
  152. package/dist/core/usage-totals.js +52 -0
  153. package/dist/core/usage-totals.js.map +1 -0
  154. package/dist/extensions/index.d.ts +3 -0
  155. package/dist/extensions/index.d.ts.map +1 -0
  156. package/dist/extensions/index.js +9 -0
  157. package/dist/extensions/index.js.map +1 -0
  158. package/dist/extensions/llama/client.d.ts +61 -0
  159. package/dist/extensions/llama/client.d.ts.map +1 -0
  160. package/dist/extensions/llama/client.js +309 -0
  161. package/dist/extensions/llama/client.js.map +1 -0
  162. package/dist/extensions/llama/huggingface.d.ts +23 -0
  163. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  164. package/dist/extensions/llama/huggingface.js +146 -0
  165. package/dist/extensions/llama/huggingface.js.map +1 -0
  166. package/dist/extensions/llama/index.d.ts +3 -0
  167. package/dist/extensions/llama/index.d.ts.map +1 -0
  168. package/dist/extensions/llama/index.js +211 -0
  169. package/dist/extensions/llama/index.js.map +1 -0
  170. package/dist/extensions/llama/provider.d.ts +10 -0
  171. package/dist/extensions/llama/provider.d.ts.map +1 -0
  172. package/dist/extensions/llama/provider.js +106 -0
  173. package/dist/extensions/llama/provider.js.map +1 -0
  174. package/dist/extensions/llama/ui.d.ts +42 -0
  175. package/dist/extensions/llama/ui.d.ts.map +1 -0
  176. package/dist/extensions/llama/ui.js +420 -0
  177. package/dist/extensions/llama/ui.js.map +1 -0
  178. package/dist/extensions/tokenin-onboarding.ts +3 -3
  179. package/dist/index.d.ts +4 -3
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +3 -3
  182. package/dist/index.js.map +1 -1
  183. package/dist/main.d.ts.map +1 -1
  184. package/dist/main.js +21 -19
  185. package/dist/main.js.map +1 -1
  186. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  187. package/dist/modes/interactive/components/assistant-message.js +22 -10
  188. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  189. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/custom-editor.js +1 -1
  191. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  192. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  193. package/dist/modes/interactive/components/footer.js +24 -23
  194. package/dist/modes/interactive/components/footer.js.map +1 -1
  195. package/dist/modes/interactive/components/login-dialog.d.ts +5 -5
  196. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  197. package/dist/modes/interactive/components/login-dialog.js +17 -8
  198. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  199. package/dist/modes/interactive/components/model-selector.d.ts +11 -4
  200. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  201. package/dist/modes/interactive/components/model-selector.js +72 -41
  202. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  203. package/dist/modes/interactive/components/oauth-selector.d.ts +4 -4
  204. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  205. package/dist/modes/interactive/components/oauth-selector.js +14 -27
  206. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  207. package/dist/modes/interactive/components/tree-selector.d.ts +5 -0
  208. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  209. package/dist/modes/interactive/components/tree-selector.js +49 -12
  210. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  211. package/dist/modes/interactive/interactive-mode.d.ts +8 -5
  212. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  213. package/dist/modes/interactive/interactive-mode.js +253 -225
  214. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  215. package/dist/modes/rpc/rpc-client.d.ts +4 -0
  216. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  217. package/dist/modes/rpc/rpc-client.js +7 -0
  218. package/dist/modes/rpc/rpc-client.js.map +1 -1
  219. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  220. package/dist/modes/rpc/rpc-mode.js +6 -2
  221. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  222. package/dist/modes/rpc/rpc-types.d.ts +11 -0
  223. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  224. package/dist/modes/rpc/rpc-types.js.map +1 -1
  225. package/dist/package-manager-cli.d.ts.map +1 -1
  226. package/dist/package-manager-cli.js +67 -5
  227. package/dist/package-manager-cli.js.map +1 -1
  228. package/dist/utils/clipboard-native.d.ts +1 -0
  229. package/dist/utils/clipboard-native.d.ts.map +1 -1
  230. package/dist/utils/clipboard-native.js.map +1 -1
  231. package/dist/utils/clipboard.d.ts +2 -0
  232. package/dist/utils/clipboard.d.ts.map +1 -1
  233. package/dist/utils/clipboard.js +13 -0
  234. package/dist/utils/clipboard.js.map +1 -1
  235. package/package.json +4 -4
@@ -0,0 +1,513 @@
1
+ /** Immutable, credential-blind models.json snapshot. */
2
+ import { type Static, Type } from "typebox";
3
+ declare const ModelDefinitionSchema: Type.TObject<{
4
+ id: Type.TString;
5
+ name: Type.TOptional<Type.TString>;
6
+ api: Type.TOptional<Type.TString>;
7
+ baseUrl: Type.TOptional<Type.TString>;
8
+ reasoning: Type.TOptional<Type.TBoolean>;
9
+ thinkingLevelMap: Type.TOptional<Type.TObject<{
10
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
11
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
12
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
13
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
14
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
15
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
16
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
17
+ }>>;
18
+ input: Type.TOptional<Type.TArray<Type.TUnion<[Type.TLiteral<"text">, Type.TLiteral<"image">]>>>;
19
+ cost: Type.TOptional<Type.TObject<{
20
+ input: Type.TNumber;
21
+ output: Type.TNumber;
22
+ cacheRead: Type.TNumber;
23
+ cacheWrite: Type.TNumber;
24
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
25
+ input: Type.TNumber;
26
+ output: Type.TNumber;
27
+ cacheRead: Type.TNumber;
28
+ cacheWrite: Type.TNumber;
29
+ inputTokensAbove: Type.TNumber;
30
+ }>>>;
31
+ }>>;
32
+ contextWindow: Type.TOptional<Type.TNumber>;
33
+ maxTokens: Type.TOptional<Type.TNumber>;
34
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
35
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
36
+ supportsStore: Type.TOptional<Type.TBoolean>;
37
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
38
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
39
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
40
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
41
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
42
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
43
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
44
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
45
+ thinkingFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openrouter">, Type.TLiteral<"together">, Type.TLiteral<"deepseek">, Type.TLiteral<"zai">, Type.TLiteral<"qwen">, Type.TLiteral<"chat-template">, Type.TLiteral<"qwen-chat-template">, Type.TLiteral<"string-thinking">, Type.TLiteral<"ant-ling">]>>;
46
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
47
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
48
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
49
+ }>]>>>;
50
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
51
+ openRouterRouting: Type.TOptional<Type.TObject<{
52
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
53
+ require_parameters: Type.TOptional<Type.TBoolean>;
54
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
55
+ zdr: Type.TOptional<Type.TBoolean>;
56
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
57
+ order: Type.TOptional<Type.TArray<Type.TString>>;
58
+ only: Type.TOptional<Type.TArray<Type.TString>>;
59
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
60
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
61
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
62
+ by: Type.TOptional<Type.TString>;
63
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
64
+ }>]>>;
65
+ max_price: Type.TOptional<Type.TObject<{
66
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
67
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
68
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
69
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
70
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
71
+ }>>;
72
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
73
+ p50: Type.TOptional<Type.TNumber>;
74
+ p75: Type.TOptional<Type.TNumber>;
75
+ p90: Type.TOptional<Type.TNumber>;
76
+ p99: Type.TOptional<Type.TNumber>;
77
+ }>]>>;
78
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
79
+ p50: Type.TOptional<Type.TNumber>;
80
+ p75: Type.TOptional<Type.TNumber>;
81
+ p90: Type.TOptional<Type.TNumber>;
82
+ p99: Type.TOptional<Type.TNumber>;
83
+ }>]>>;
84
+ }>>;
85
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
86
+ only: Type.TOptional<Type.TArray<Type.TString>>;
87
+ order: Type.TOptional<Type.TArray<Type.TString>>;
88
+ }>>;
89
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
90
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
91
+ deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
92
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
93
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
94
+ }>, Type.TObject<{
95
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
96
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
97
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
98
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
99
+ }>, Type.TObject<{
100
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
101
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
102
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
103
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
104
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
105
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
106
+ }>]>>;
107
+ }>;
108
+ declare const ModelOverrideSchema: Type.TObject<{
109
+ name: Type.TOptional<Type.TString>;
110
+ reasoning: Type.TOptional<Type.TBoolean>;
111
+ thinkingLevelMap: Type.TOptional<Type.TObject<{
112
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
113
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
114
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
115
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
116
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
117
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
118
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
119
+ }>>;
120
+ input: Type.TOptional<Type.TArray<Type.TUnion<[Type.TLiteral<"text">, Type.TLiteral<"image">]>>>;
121
+ cost: Type.TOptional<Type.TObject<{
122
+ input: Type.TOptional<Type.TNumber>;
123
+ output: Type.TOptional<Type.TNumber>;
124
+ cacheRead: Type.TOptional<Type.TNumber>;
125
+ cacheWrite: Type.TOptional<Type.TNumber>;
126
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
127
+ input: Type.TNumber;
128
+ output: Type.TNumber;
129
+ cacheRead: Type.TNumber;
130
+ cacheWrite: Type.TNumber;
131
+ inputTokensAbove: Type.TNumber;
132
+ }>>>;
133
+ }>>;
134
+ contextWindow: Type.TOptional<Type.TNumber>;
135
+ maxTokens: Type.TOptional<Type.TNumber>;
136
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
137
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
138
+ supportsStore: Type.TOptional<Type.TBoolean>;
139
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
140
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
141
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
142
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
143
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
144
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
145
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
146
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
147
+ thinkingFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openrouter">, Type.TLiteral<"together">, Type.TLiteral<"deepseek">, Type.TLiteral<"zai">, Type.TLiteral<"qwen">, Type.TLiteral<"chat-template">, Type.TLiteral<"qwen-chat-template">, Type.TLiteral<"string-thinking">, Type.TLiteral<"ant-ling">]>>;
148
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
149
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
150
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
151
+ }>]>>>;
152
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
153
+ openRouterRouting: Type.TOptional<Type.TObject<{
154
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
155
+ require_parameters: Type.TOptional<Type.TBoolean>;
156
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
157
+ zdr: Type.TOptional<Type.TBoolean>;
158
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
159
+ order: Type.TOptional<Type.TArray<Type.TString>>;
160
+ only: Type.TOptional<Type.TArray<Type.TString>>;
161
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
162
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
163
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
164
+ by: Type.TOptional<Type.TString>;
165
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
166
+ }>]>>;
167
+ max_price: Type.TOptional<Type.TObject<{
168
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
169
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
170
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
171
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
172
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
173
+ }>>;
174
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
175
+ p50: Type.TOptional<Type.TNumber>;
176
+ p75: Type.TOptional<Type.TNumber>;
177
+ p90: Type.TOptional<Type.TNumber>;
178
+ p99: Type.TOptional<Type.TNumber>;
179
+ }>]>>;
180
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
181
+ p50: Type.TOptional<Type.TNumber>;
182
+ p75: Type.TOptional<Type.TNumber>;
183
+ p90: Type.TOptional<Type.TNumber>;
184
+ p99: Type.TOptional<Type.TNumber>;
185
+ }>]>>;
186
+ }>>;
187
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
188
+ only: Type.TOptional<Type.TArray<Type.TString>>;
189
+ order: Type.TOptional<Type.TArray<Type.TString>>;
190
+ }>>;
191
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
192
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
193
+ deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
194
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
195
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
196
+ }>, Type.TObject<{
197
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
198
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
199
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
200
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
201
+ }>, Type.TObject<{
202
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
203
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
204
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
205
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
206
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
207
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
208
+ }>]>>;
209
+ }>;
210
+ declare const ProviderConfigSchema: Type.TObject<{
211
+ name: Type.TOptional<Type.TString>;
212
+ baseUrl: Type.TOptional<Type.TString>;
213
+ apiKey: Type.TOptional<Type.TString>;
214
+ api: Type.TOptional<Type.TString>;
215
+ oauth: Type.TOptional<Type.TLiteral<"radius">>;
216
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
217
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
218
+ supportsStore: Type.TOptional<Type.TBoolean>;
219
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
220
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
221
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
222
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
223
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
224
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
225
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
226
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
227
+ thinkingFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openrouter">, Type.TLiteral<"together">, Type.TLiteral<"deepseek">, Type.TLiteral<"zai">, Type.TLiteral<"qwen">, Type.TLiteral<"chat-template">, Type.TLiteral<"qwen-chat-template">, Type.TLiteral<"string-thinking">, Type.TLiteral<"ant-ling">]>>;
228
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
229
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
230
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
231
+ }>]>>>;
232
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
233
+ openRouterRouting: Type.TOptional<Type.TObject<{
234
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
235
+ require_parameters: Type.TOptional<Type.TBoolean>;
236
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
237
+ zdr: Type.TOptional<Type.TBoolean>;
238
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
239
+ order: Type.TOptional<Type.TArray<Type.TString>>;
240
+ only: Type.TOptional<Type.TArray<Type.TString>>;
241
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
242
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
243
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
244
+ by: Type.TOptional<Type.TString>;
245
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
246
+ }>]>>;
247
+ max_price: Type.TOptional<Type.TObject<{
248
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
249
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
250
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
251
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
252
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
253
+ }>>;
254
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
255
+ p50: Type.TOptional<Type.TNumber>;
256
+ p75: Type.TOptional<Type.TNumber>;
257
+ p90: Type.TOptional<Type.TNumber>;
258
+ p99: Type.TOptional<Type.TNumber>;
259
+ }>]>>;
260
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
261
+ p50: Type.TOptional<Type.TNumber>;
262
+ p75: Type.TOptional<Type.TNumber>;
263
+ p90: Type.TOptional<Type.TNumber>;
264
+ p99: Type.TOptional<Type.TNumber>;
265
+ }>]>>;
266
+ }>>;
267
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
268
+ only: Type.TOptional<Type.TArray<Type.TString>>;
269
+ order: Type.TOptional<Type.TArray<Type.TString>>;
270
+ }>>;
271
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
272
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
273
+ deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
274
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
275
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
276
+ }>, Type.TObject<{
277
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
278
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
279
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
280
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
281
+ }>, Type.TObject<{
282
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
283
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
284
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
285
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
286
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
287
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
288
+ }>]>>;
289
+ authHeader: Type.TOptional<Type.TBoolean>;
290
+ models: Type.TOptional<Type.TArray<Type.TObject<{
291
+ id: Type.TString;
292
+ name: Type.TOptional<Type.TString>;
293
+ api: Type.TOptional<Type.TString>;
294
+ baseUrl: Type.TOptional<Type.TString>;
295
+ reasoning: Type.TOptional<Type.TBoolean>;
296
+ thinkingLevelMap: Type.TOptional<Type.TObject<{
297
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
298
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
299
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
300
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
301
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
302
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
303
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
304
+ }>>;
305
+ input: Type.TOptional<Type.TArray<Type.TUnion<[Type.TLiteral<"text">, Type.TLiteral<"image">]>>>;
306
+ cost: Type.TOptional<Type.TObject<{
307
+ input: Type.TNumber;
308
+ output: Type.TNumber;
309
+ cacheRead: Type.TNumber;
310
+ cacheWrite: Type.TNumber;
311
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
312
+ input: Type.TNumber;
313
+ output: Type.TNumber;
314
+ cacheRead: Type.TNumber;
315
+ cacheWrite: Type.TNumber;
316
+ inputTokensAbove: Type.TNumber;
317
+ }>>>;
318
+ }>>;
319
+ contextWindow: Type.TOptional<Type.TNumber>;
320
+ maxTokens: Type.TOptional<Type.TNumber>;
321
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
322
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
323
+ supportsStore: Type.TOptional<Type.TBoolean>;
324
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
325
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
326
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
327
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
328
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
329
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
330
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
331
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
332
+ thinkingFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openrouter">, Type.TLiteral<"together">, Type.TLiteral<"deepseek">, Type.TLiteral<"zai">, Type.TLiteral<"qwen">, Type.TLiteral<"chat-template">, Type.TLiteral<"qwen-chat-template">, Type.TLiteral<"string-thinking">, Type.TLiteral<"ant-ling">]>>;
333
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
334
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
335
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
336
+ }>]>>>;
337
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
338
+ openRouterRouting: Type.TOptional<Type.TObject<{
339
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
340
+ require_parameters: Type.TOptional<Type.TBoolean>;
341
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
342
+ zdr: Type.TOptional<Type.TBoolean>;
343
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
344
+ order: Type.TOptional<Type.TArray<Type.TString>>;
345
+ only: Type.TOptional<Type.TArray<Type.TString>>;
346
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
347
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
348
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
349
+ by: Type.TOptional<Type.TString>;
350
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
351
+ }>]>>;
352
+ max_price: Type.TOptional<Type.TObject<{
353
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
354
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
355
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
356
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
357
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
358
+ }>>;
359
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
360
+ p50: Type.TOptional<Type.TNumber>;
361
+ p75: Type.TOptional<Type.TNumber>;
362
+ p90: Type.TOptional<Type.TNumber>;
363
+ p99: Type.TOptional<Type.TNumber>;
364
+ }>]>>;
365
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
366
+ p50: Type.TOptional<Type.TNumber>;
367
+ p75: Type.TOptional<Type.TNumber>;
368
+ p90: Type.TOptional<Type.TNumber>;
369
+ p99: Type.TOptional<Type.TNumber>;
370
+ }>]>>;
371
+ }>>;
372
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
373
+ only: Type.TOptional<Type.TArray<Type.TString>>;
374
+ order: Type.TOptional<Type.TArray<Type.TString>>;
375
+ }>>;
376
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
377
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
378
+ deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
379
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
380
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
381
+ }>, Type.TObject<{
382
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
383
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
384
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
385
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
386
+ }>, Type.TObject<{
387
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
388
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
389
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
390
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
391
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
392
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
393
+ }>]>>;
394
+ }>>>;
395
+ modelOverrides: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
396
+ name: Type.TOptional<Type.TString>;
397
+ reasoning: Type.TOptional<Type.TBoolean>;
398
+ thinkingLevelMap: Type.TOptional<Type.TObject<{
399
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
400
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
401
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
402
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
403
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
404
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
405
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
406
+ }>>;
407
+ input: Type.TOptional<Type.TArray<Type.TUnion<[Type.TLiteral<"text">, Type.TLiteral<"image">]>>>;
408
+ cost: Type.TOptional<Type.TObject<{
409
+ input: Type.TOptional<Type.TNumber>;
410
+ output: Type.TOptional<Type.TNumber>;
411
+ cacheRead: Type.TOptional<Type.TNumber>;
412
+ cacheWrite: Type.TOptional<Type.TNumber>;
413
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
414
+ input: Type.TNumber;
415
+ output: Type.TNumber;
416
+ cacheRead: Type.TNumber;
417
+ cacheWrite: Type.TNumber;
418
+ inputTokensAbove: Type.TNumber;
419
+ }>>>;
420
+ }>>;
421
+ contextWindow: Type.TOptional<Type.TNumber>;
422
+ maxTokens: Type.TOptional<Type.TNumber>;
423
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
424
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
425
+ supportsStore: Type.TOptional<Type.TBoolean>;
426
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
427
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
428
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
429
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
430
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
431
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
432
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
433
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
434
+ thinkingFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openrouter">, Type.TLiteral<"together">, Type.TLiteral<"deepseek">, Type.TLiteral<"zai">, Type.TLiteral<"qwen">, Type.TLiteral<"chat-template">, Type.TLiteral<"qwen-chat-template">, Type.TLiteral<"string-thinking">, Type.TLiteral<"ant-ling">]>>;
435
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
436
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
437
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
438
+ }>]>>>;
439
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
440
+ openRouterRouting: Type.TOptional<Type.TObject<{
441
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
442
+ require_parameters: Type.TOptional<Type.TBoolean>;
443
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
444
+ zdr: Type.TOptional<Type.TBoolean>;
445
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
446
+ order: Type.TOptional<Type.TArray<Type.TString>>;
447
+ only: Type.TOptional<Type.TArray<Type.TString>>;
448
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
449
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
450
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
451
+ by: Type.TOptional<Type.TString>;
452
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
453
+ }>]>>;
454
+ max_price: Type.TOptional<Type.TObject<{
455
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
456
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
457
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
458
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
459
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
460
+ }>>;
461
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
462
+ p50: Type.TOptional<Type.TNumber>;
463
+ p75: Type.TOptional<Type.TNumber>;
464
+ p90: Type.TOptional<Type.TNumber>;
465
+ p99: Type.TOptional<Type.TNumber>;
466
+ }>]>>;
467
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
468
+ p50: Type.TOptional<Type.TNumber>;
469
+ p75: Type.TOptional<Type.TNumber>;
470
+ p90: Type.TOptional<Type.TNumber>;
471
+ p99: Type.TOptional<Type.TNumber>;
472
+ }>]>>;
473
+ }>>;
474
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
475
+ only: Type.TOptional<Type.TArray<Type.TString>>;
476
+ order: Type.TOptional<Type.TArray<Type.TString>>;
477
+ }>>;
478
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
479
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
480
+ deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
481
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
482
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
483
+ }>, Type.TObject<{
484
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
485
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
486
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
487
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
488
+ }>, Type.TObject<{
489
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
490
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
491
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
492
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
493
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
494
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
495
+ }>]>>;
496
+ }>>>;
497
+ }>;
498
+ export type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;
499
+ export type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;
500
+ export type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;
501
+ /** One immutable load of models.json. */
502
+ export declare class ModelConfig {
503
+ private readonly providers;
504
+ private readonly error;
505
+ private constructor();
506
+ static loadMerged(modelsJsonPaths: readonly string[]): Promise<ModelConfig>;
507
+ static load(modelsJsonPath: string | undefined): Promise<ModelConfig>;
508
+ getProvider(providerId: string): ModelsJsonProvider | undefined;
509
+ getProviderIds(): readonly string[];
510
+ getError(): string | undefined;
511
+ }
512
+ export {};
513
+ //# sourceMappingURL=model-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../src/core/model-config.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAGxD,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAgJ5C,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAazB,CAAC;AAEH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBvB,CAAC;AAEH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWxB,CAAC;AAOH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACnE,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACzE,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAqCrE,yCAAyC;AACzC,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C,OAAO,eAGN;IAED,OAAa,UAAU,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAahF;IAED,OAAa,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAuC1E;IAED,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAE9D;IAED,cAAc,IAAI,SAAS,MAAM,EAAE,CAElC;IAED,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7B;CACD","sourcesContent":["/** Immutable, credential-blind models.json snapshot. */\n\nimport { readFile } from \"node:fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { stripJsonComments } from \"../utils/json.ts\";\nimport { normalizePath } from \"../utils/paths.ts\";\n\nconst PercentileCutoffsSchema = Type.Object({\n\tp50: Type.Optional(Type.Number()),\n\tp75: Type.Optional(Type.Number()),\n\tp90: Type.Optional(Type.Number()),\n\tp99: Type.Optional(Type.Number()),\n});\n\nconst OpenRouterRoutingSchema = Type.Object({\n\tallow_fallbacks: Type.Optional(Type.Boolean()),\n\trequire_parameters: Type.Optional(Type.Boolean()),\n\tdata_collection: Type.Optional(Type.Union([Type.Literal(\"deny\"), Type.Literal(\"allow\")])),\n\tzdr: Type.Optional(Type.Boolean()),\n\tenforce_distillable_text: Type.Optional(Type.Boolean()),\n\torder: Type.Optional(Type.Array(Type.String())),\n\tonly: Type.Optional(Type.Array(Type.String())),\n\tignore: Type.Optional(Type.Array(Type.String())),\n\tquantizations: Type.Optional(Type.Array(Type.String())),\n\tsort: Type.Optional(\n\t\tType.Union([\n\t\t\tType.String(),\n\t\t\tType.Object({\n\t\t\t\tby: Type.Optional(Type.String()),\n\t\t\t\tpartition: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n\t\t\t}),\n\t\t]),\n\t),\n\tmax_price: Type.Optional(\n\t\tType.Object({\n\t\t\tprompt: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\tcompletion: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\timage: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\taudio: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\trequest: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t}),\n\t),\n\tpreferred_min_throughput: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n\tpreferred_max_latency: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n});\n\nconst VercelGatewayRoutingSchema = Type.Object({\n\tonly: Type.Optional(Type.Array(Type.String())),\n\torder: Type.Optional(Type.Array(Type.String())),\n});\n\nconst ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);\nconst ThinkingLevelMapSchema = Type.Object({\n\toff: Type.Optional(ThinkingLevelMapValueSchema),\n\tminimal: Type.Optional(ThinkingLevelMapValueSchema),\n\tlow: Type.Optional(ThinkingLevelMapValueSchema),\n\tmedium: Type.Optional(ThinkingLevelMapValueSchema),\n\thigh: Type.Optional(ThinkingLevelMapValueSchema),\n\txhigh: Type.Optional(ThinkingLevelMapValueSchema),\n\tmax: Type.Optional(ThinkingLevelMapValueSchema),\n});\n\nconst ChatTemplateKwargScalarSchema = Type.Union([Type.String(), Type.Number(), Type.Boolean(), Type.Null()]);\nconst ChatTemplateKwargVariableSchema = Type.Object({\n\t$var: Type.Union([Type.Literal(\"thinking.enabled\"), Type.Literal(\"thinking.effort\")]),\n\tomitWhenOff: Type.Optional(Type.Boolean()),\n});\nconst ChatTemplateKwargSchema = Type.Union([ChatTemplateKwargScalarSchema, ChatTemplateKwargVariableSchema]);\n\nconst OpenAICompletionsCompatSchema = Type.Object({\n\tsupportsStore: Type.Optional(Type.Boolean()),\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\trequiresReasoningContentOnAssistantMessages: Type.Optional(Type.Boolean()),\n\tthinkingFormat: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai\"),\n\t\t\tType.Literal(\"openrouter\"),\n\t\t\tType.Literal(\"together\"),\n\t\t\tType.Literal(\"deepseek\"),\n\t\t\tType.Literal(\"zai\"),\n\t\t\tType.Literal(\"qwen\"),\n\t\t\tType.Literal(\"chat-template\"),\n\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\tType.Literal(\"string-thinking\"),\n\t\t\tType.Literal(\"ant-ling\"),\n\t\t]),\n\t),\n\tchatTemplateKwargs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tcacheControlFormat: Type.Optional(Type.Literal(\"anthropic\")),\n\topenRouterRouting: Type.Optional(OpenRouterRoutingSchema),\n\tvercelGatewayRouting: Type.Optional(VercelGatewayRoutingSchema),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tdeferredToolsMode: Type.Optional(Type.Literal(\"kimi\")),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n});\n\nconst OpenAIResponsesCompatSchema = Type.Object({\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsupportsToolSearch: Type.Optional(Type.Boolean()),\n});\n\nconst AnthropicMessagesCompatSchema = Type.Object({\n\tsupportsEagerToolInputStreaming: Type.Optional(Type.Boolean()),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tsupportsCacheControlOnTools: Type.Optional(Type.Boolean()),\n\tforceAdaptiveThinking: Type.Optional(Type.Boolean()),\n\tsupportsToolReferences: Type.Optional(Type.Boolean()),\n});\n\nconst ProviderCompatSchema = Type.Union([\n\tOpenAICompletionsCompatSchema,\n\tOpenAIResponsesCompatSchema,\n\tAnthropicMessagesCompatSchema,\n]);\n\nconst ModelCostRatesSchema = {\n\tinput: Type.Number(),\n\toutput: Type.Number(),\n\tcacheRead: Type.Number(),\n\tcacheWrite: Type.Number(),\n};\nconst ModelCostTierSchema = Type.Object({\n\tinputTokensAbove: Type.Number(),\n\t...ModelCostRatesSchema,\n});\nconst ModelCostSchema = Type.Object({\n\t...ModelCostRatesSchema,\n\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n});\n\nconst ModelDefinitionSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(ModelCostSchema),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ModelOverrideSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Optional(Type.Number()),\n\t\t\toutput: Type.Optional(Type.Number()),\n\t\t\tcacheRead: Type.Optional(Type.Number()),\n\t\t\tcacheWrite: Type.Optional(Type.Number()),\n\t\t\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n\t\t}),\n\t),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ProviderConfigSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\tapiKey: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\toauth: Type.Optional(Type.Literal(\"radius\")),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n\tauthHeader: Type.Optional(Type.Boolean()),\n\tmodels: Type.Optional(Type.Array(ModelDefinitionSchema)),\n\tmodelOverrides: Type.Optional(Type.Record(Type.String(), ModelOverrideSchema)),\n});\n\nconst ModelsConfigSchema = Type.Object({\n\tproviders: Type.Record(Type.String(), ProviderConfigSchema),\n});\nconst validateModelsConfig = Compile(ModelsConfigSchema);\n\nexport type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;\nexport type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;\nexport type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;\ntype ModelsJson = Static<typeof ModelsConfigSchema>;\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\nfunction deepFreeze<T>(value: T): T {\n\tif (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n\tfor (const child of Object.values(value)) deepFreeze(child);\n\treturn Object.freeze(value);\n}\n\nfunction mergeProviderConfig(base: ModelsJsonProvider, override: ModelsJsonProvider): ModelsJsonProvider {\n\tconst models = new Map((base.models ?? []).map((model) => [model.id, model]));\n\tfor (const model of override.models ?? []) {\n\t\tmodels.set(model.id, { ...models.get(model.id), ...model });\n\t}\n\treturn deepFreeze({\n\t\t...base,\n\t\t...override,\n\t\theaders: { ...base.headers, ...override.headers },\n\t\tcompat: { ...base.compat, ...override.compat },\n\t\tmodelOverrides: { ...base.modelOverrides, ...override.modelOverrides },\n\t\tmodels: [...models.values()],\n\t});\n}\n\n/** One immutable load of models.json. */\nexport class ModelConfig {\n\tprivate readonly providers: ReadonlyMap<string, ModelsJsonProvider>;\n\tprivate readonly error: string | undefined;\n\n\tprivate constructor(providers: ReadonlyMap<string, ModelsJsonProvider>, error?: string) {\n\t\tthis.providers = providers;\n\t\tthis.error = error;\n\t}\n\n\tstatic async loadMerged(modelsJsonPaths: readonly string[]): Promise<ModelConfig> {\n\t\tconst configs = await Promise.all(modelsJsonPaths.map((path) => ModelConfig.load(path)));\n\t\tconst providers = new Map<string, ModelsJsonProvider>();\n\t\tconst errors: string[] = [];\n\t\tfor (const config of configs) {\n\t\t\tif (config.error) errors.push(config.error);\n\t\t\tfor (const providerId of config.getProviderIds()) {\n\t\t\t\tconst provider = config.getProvider(providerId)!;\n\t\t\t\tconst previous = providers.get(providerId);\n\t\t\t\tproviders.set(providerId, previous ? mergeProviderConfig(previous, provider) : provider);\n\t\t\t}\n\t\t}\n\t\treturn new ModelConfig(providers, errors.length > 0 ? errors.join(\"\\n\\n\") : undefined);\n\t}\n\n\tstatic async load(modelsJsonPath: string | undefined): Promise<ModelConfig> {\n\t\tif (!modelsJsonPath) return new ModelConfig(new Map());\n\t\tconst path = normalizePath(modelsJsonPath);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(path, \"utf-8\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return new ModelConfig(new Map());\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to load models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(content));\n\t\t} catch (error) {\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to parse models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!validateModelsConfig.Check(parsed)) {\n\t\t\tconst errors =\n\t\t\t\tvalidateModelsConfig\n\t\t\t\t\t.Errors(parsed)\n\t\t\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t\t\t.join(\"\\n\") || \"Unknown schema error\";\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${errors}\\n\\nFile: ${path}`);\n\t\t}\n\n\t\tconst config = parsed as ModelsJson;\n\t\tconst providers = new Map<string, ModelsJsonProvider>();\n\t\tfor (const [providerId, provider] of Object.entries(config.providers)) {\n\t\t\tproviders.set(providerId, deepFreeze(structuredClone(provider)));\n\t\t}\n\t\treturn new ModelConfig(providers);\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn this.providers.get(providerId);\n\t}\n\n\tgetProviderIds(): readonly string[] {\n\t\treturn [...this.providers.keys()];\n\t}\n\n\tgetError(): string | undefined {\n\t\treturn this.error;\n\t}\n}\n"]}