@earendil-works/pi-coding-agent 0.80.7 → 0.80.8

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 (140) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +6 -6
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +2 -0
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/cli/args.d.ts.map +1 -1
  7. package/dist/cli/args.js +1 -1
  8. package/dist/cli/args.js.map +1 -1
  9. package/dist/cli/list-models.d.ts +2 -2
  10. package/dist/cli/list-models.d.ts.map +1 -1
  11. package/dist/cli/list-models.js +3 -3
  12. package/dist/cli/list-models.js.map +1 -1
  13. package/dist/core/agent-session-services.d.ts +3 -6
  14. package/dist/core/agent-session-services.d.ts.map +1 -1
  15. package/dist/core/agent-session-services.js +10 -9
  16. package/dist/core/agent-session-services.js.map +1 -1
  17. package/dist/core/agent-session.d.ts +5 -6
  18. package/dist/core/agent-session.d.ts.map +1 -1
  19. package/dist/core/agent-session.js +57 -30
  20. package/dist/core/agent-session.js.map +1 -1
  21. package/dist/core/auth-storage.d.ts +15 -99
  22. package/dist/core/auth-storage.d.ts.map +1 -1
  23. package/dist/core/auth-storage.js +46 -259
  24. package/dist/core/auth-storage.js.map +1 -1
  25. package/dist/core/cache-stats.d.ts +2 -2
  26. package/dist/core/cache-stats.d.ts.map +1 -1
  27. package/dist/core/cache-stats.js +1 -1
  28. package/dist/core/cache-stats.js.map +1 -1
  29. package/dist/core/extensions/loader.d.ts.map +1 -1
  30. package/dist/core/extensions/loader.js +8 -2
  31. package/dist/core/extensions/loader.js.map +1 -1
  32. package/dist/core/extensions/runner.d.ts +1 -0
  33. package/dist/core/extensions/runner.d.ts.map +1 -1
  34. package/dist/core/extensions/runner.js +3 -0
  35. package/dist/core/extensions/runner.js.map +1 -1
  36. package/dist/core/extensions/types.d.ts +9 -2
  37. package/dist/core/extensions/types.d.ts.map +1 -1
  38. package/dist/core/extensions/types.js.map +1 -1
  39. package/dist/core/model-config.d.ts +507 -0
  40. package/dist/core/model-config.d.ts.map +1 -0
  41. package/dist/core/model-config.js +242 -0
  42. package/dist/core/model-config.js.map +1 -0
  43. package/dist/core/model-registry.d.ts +13 -123
  44. package/dist/core/model-registry.d.ts.map +1 -1
  45. package/dist/core/model-registry.js +44 -747
  46. package/dist/core/model-registry.js.map +1 -1
  47. package/dist/core/model-resolver.d.ts +6 -6
  48. package/dist/core/model-resolver.d.ts.map +1 -1
  49. package/dist/core/model-resolver.js +17 -17
  50. package/dist/core/model-resolver.js.map +1 -1
  51. package/dist/core/model-runtime.d.ts +77 -0
  52. package/dist/core/model-runtime.d.ts.map +1 -0
  53. package/dist/core/model-runtime.js +418 -0
  54. package/dist/core/model-runtime.js.map +1 -0
  55. package/dist/core/models-store.d.ts +17 -0
  56. package/dist/core/models-store.d.ts.map +1 -0
  57. package/dist/core/models-store.js +45 -0
  58. package/dist/core/models-store.js.map +1 -0
  59. package/dist/core/provider-composer.d.ts +55 -0
  60. package/dist/core/provider-composer.d.ts.map +1 -0
  61. package/dist/core/provider-composer.js +375 -0
  62. package/dist/core/provider-composer.js.map +1 -0
  63. package/dist/core/radius.d.ts +0 -19
  64. package/dist/core/radius.d.ts.map +1 -1
  65. package/dist/core/radius.js +0 -28
  66. package/dist/core/radius.js.map +1 -1
  67. package/dist/core/remote-catalog-provider.d.ts +5 -0
  68. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  69. package/dist/core/remote-catalog-provider.js +83 -0
  70. package/dist/core/remote-catalog-provider.js.map +1 -0
  71. package/dist/core/runtime-credentials.d.ts +15 -0
  72. package/dist/core/runtime-credentials.d.ts.map +1 -0
  73. package/dist/core/runtime-credentials.js +36 -0
  74. package/dist/core/runtime-credentials.js.map +1 -0
  75. package/dist/core/sdk.d.ts +3 -6
  76. package/dist/core/sdk.d.ts.map +1 -1
  77. package/dist/core/sdk.js +14 -25
  78. package/dist/core/sdk.js.map +1 -1
  79. package/dist/index.d.ts +2 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +2 -2
  82. package/dist/index.js.map +1 -1
  83. package/dist/main.d.ts.map +1 -1
  84. package/dist/main.js +11 -13
  85. package/dist/main.js.map +1 -1
  86. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  87. package/dist/modes/interactive/components/assistant-message.js +22 -10
  88. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  89. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/footer.js +1 -1
  91. package/dist/modes/interactive/components/footer.js.map +1 -1
  92. package/dist/modes/interactive/components/login-dialog.d.ts +4 -8
  93. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  94. package/dist/modes/interactive/components/login-dialog.js +14 -12
  95. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  96. package/dist/modes/interactive/components/model-selector.d.ts +11 -4
  97. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  98. package/dist/modes/interactive/components/model-selector.js +72 -41
  99. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  100. package/dist/modes/interactive/components/oauth-selector.d.ts +4 -4
  101. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  102. package/dist/modes/interactive/components/oauth-selector.js +14 -27
  103. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  104. package/dist/modes/interactive/interactive-mode.d.ts +6 -3
  105. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  106. package/dist/modes/interactive/interactive-mode.js +154 -142
  107. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  108. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  109. package/dist/modes/rpc/rpc-mode.js +2 -2
  110. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  111. package/dist/package-manager-cli.d.ts.map +1 -1
  112. package/dist/package-manager-cli.js +67 -5
  113. package/dist/package-manager-cli.js.map +1 -1
  114. package/docs/custom-provider.md +6 -11
  115. package/docs/extensions.md +22 -1
  116. package/docs/models.md +1 -0
  117. package/docs/packages.md +1 -0
  118. package/docs/providers.md +13 -1
  119. package/docs/sdk.md +40 -50
  120. package/docs/usage.md +1 -0
  121. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  122. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  123. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  124. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  125. package/examples/extensions/gondolin/package-lock.json +2 -2
  126. package/examples/extensions/gondolin/package.json +1 -1
  127. package/examples/extensions/sandbox/package-lock.json +2 -2
  128. package/examples/extensions/sandbox/package.json +1 -1
  129. package/examples/extensions/with-deps/package-lock.json +2 -2
  130. package/examples/extensions/with-deps/package.json +1 -1
  131. package/examples/sdk/02-custom-model.ts +5 -8
  132. package/examples/sdk/09-api-keys-and-oauth.ts +13 -31
  133. package/examples/sdk/12-full-control.ts +7 -12
  134. package/examples/sdk/README.md +14 -18
  135. package/npm-shrinkwrap.json +12 -12
  136. package/package.json +4 -4
  137. package/dist/core/provider-display-names.d.ts +0 -2
  138. package/dist/core/provider-display-names.d.ts.map +0 -1
  139. package/dist/core/provider-display-names.js +0 -37
  140. package/dist/core/provider-display-names.js.map +0 -1
@@ -0,0 +1,507 @@
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
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
92
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
93
+ }>, Type.TObject<{
94
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
95
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
96
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
97
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
98
+ }>, Type.TObject<{
99
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
100
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
101
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
102
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
103
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
104
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
105
+ }>]>>;
106
+ }>;
107
+ declare const ModelOverrideSchema: Type.TObject<{
108
+ name: Type.TOptional<Type.TString>;
109
+ reasoning: Type.TOptional<Type.TBoolean>;
110
+ thinkingLevelMap: Type.TOptional<Type.TObject<{
111
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
112
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
113
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
114
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
115
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
116
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
117
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
118
+ }>>;
119
+ input: Type.TOptional<Type.TArray<Type.TUnion<[Type.TLiteral<"text">, Type.TLiteral<"image">]>>>;
120
+ cost: Type.TOptional<Type.TObject<{
121
+ input: Type.TOptional<Type.TNumber>;
122
+ output: Type.TOptional<Type.TNumber>;
123
+ cacheRead: Type.TOptional<Type.TNumber>;
124
+ cacheWrite: Type.TOptional<Type.TNumber>;
125
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
126
+ input: Type.TNumber;
127
+ output: Type.TNumber;
128
+ cacheRead: Type.TNumber;
129
+ cacheWrite: Type.TNumber;
130
+ inputTokensAbove: Type.TNumber;
131
+ }>>>;
132
+ }>>;
133
+ contextWindow: Type.TOptional<Type.TNumber>;
134
+ maxTokens: Type.TOptional<Type.TNumber>;
135
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
136
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
137
+ supportsStore: Type.TOptional<Type.TBoolean>;
138
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
139
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
140
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
141
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
142
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
143
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
144
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
145
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
146
+ 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">]>>;
147
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
148
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
149
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
150
+ }>]>>>;
151
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
152
+ openRouterRouting: Type.TOptional<Type.TObject<{
153
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
154
+ require_parameters: Type.TOptional<Type.TBoolean>;
155
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
156
+ zdr: Type.TOptional<Type.TBoolean>;
157
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
158
+ order: Type.TOptional<Type.TArray<Type.TString>>;
159
+ only: Type.TOptional<Type.TArray<Type.TString>>;
160
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
161
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
162
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
163
+ by: Type.TOptional<Type.TString>;
164
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
165
+ }>]>>;
166
+ max_price: Type.TOptional<Type.TObject<{
167
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
168
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
169
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
170
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
171
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
172
+ }>>;
173
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
174
+ p50: Type.TOptional<Type.TNumber>;
175
+ p75: Type.TOptional<Type.TNumber>;
176
+ p90: Type.TOptional<Type.TNumber>;
177
+ p99: Type.TOptional<Type.TNumber>;
178
+ }>]>>;
179
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
180
+ p50: Type.TOptional<Type.TNumber>;
181
+ p75: Type.TOptional<Type.TNumber>;
182
+ p90: Type.TOptional<Type.TNumber>;
183
+ p99: Type.TOptional<Type.TNumber>;
184
+ }>]>>;
185
+ }>>;
186
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
187
+ only: Type.TOptional<Type.TArray<Type.TString>>;
188
+ order: Type.TOptional<Type.TArray<Type.TString>>;
189
+ }>>;
190
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
191
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
192
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
193
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
194
+ }>, Type.TObject<{
195
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
196
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
197
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
198
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
199
+ }>, Type.TObject<{
200
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
201
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
202
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
203
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
204
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
205
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
206
+ }>]>>;
207
+ }>;
208
+ declare const ProviderConfigSchema: Type.TObject<{
209
+ name: Type.TOptional<Type.TString>;
210
+ baseUrl: Type.TOptional<Type.TString>;
211
+ apiKey: Type.TOptional<Type.TString>;
212
+ api: Type.TOptional<Type.TString>;
213
+ oauth: Type.TOptional<Type.TLiteral<"radius">>;
214
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
215
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
216
+ supportsStore: Type.TOptional<Type.TBoolean>;
217
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
218
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
219
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
220
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
221
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
222
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
223
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
224
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
225
+ 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">]>>;
226
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
227
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
228
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
229
+ }>]>>>;
230
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
231
+ openRouterRouting: Type.TOptional<Type.TObject<{
232
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
233
+ require_parameters: Type.TOptional<Type.TBoolean>;
234
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
235
+ zdr: Type.TOptional<Type.TBoolean>;
236
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
237
+ order: Type.TOptional<Type.TArray<Type.TString>>;
238
+ only: Type.TOptional<Type.TArray<Type.TString>>;
239
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
240
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
241
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
242
+ by: Type.TOptional<Type.TString>;
243
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
244
+ }>]>>;
245
+ max_price: Type.TOptional<Type.TObject<{
246
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
247
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
248
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
249
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
250
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
251
+ }>>;
252
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
253
+ p50: Type.TOptional<Type.TNumber>;
254
+ p75: Type.TOptional<Type.TNumber>;
255
+ p90: Type.TOptional<Type.TNumber>;
256
+ p99: Type.TOptional<Type.TNumber>;
257
+ }>]>>;
258
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
259
+ p50: Type.TOptional<Type.TNumber>;
260
+ p75: Type.TOptional<Type.TNumber>;
261
+ p90: Type.TOptional<Type.TNumber>;
262
+ p99: Type.TOptional<Type.TNumber>;
263
+ }>]>>;
264
+ }>>;
265
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
266
+ only: Type.TOptional<Type.TArray<Type.TString>>;
267
+ order: Type.TOptional<Type.TArray<Type.TString>>;
268
+ }>>;
269
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
270
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
271
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
272
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
273
+ }>, Type.TObject<{
274
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
275
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
276
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
277
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
278
+ }>, Type.TObject<{
279
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
280
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
281
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
282
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
283
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
284
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
285
+ }>]>>;
286
+ authHeader: Type.TOptional<Type.TBoolean>;
287
+ models: Type.TOptional<Type.TArray<Type.TObject<{
288
+ id: Type.TString;
289
+ name: Type.TOptional<Type.TString>;
290
+ api: Type.TOptional<Type.TString>;
291
+ baseUrl: Type.TOptional<Type.TString>;
292
+ reasoning: Type.TOptional<Type.TBoolean>;
293
+ thinkingLevelMap: Type.TOptional<Type.TObject<{
294
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
295
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
296
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
297
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
298
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
299
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
300
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
301
+ }>>;
302
+ input: Type.TOptional<Type.TArray<Type.TUnion<[Type.TLiteral<"text">, Type.TLiteral<"image">]>>>;
303
+ cost: Type.TOptional<Type.TObject<{
304
+ input: Type.TNumber;
305
+ output: Type.TNumber;
306
+ cacheRead: Type.TNumber;
307
+ cacheWrite: Type.TNumber;
308
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
309
+ input: Type.TNumber;
310
+ output: Type.TNumber;
311
+ cacheRead: Type.TNumber;
312
+ cacheWrite: Type.TNumber;
313
+ inputTokensAbove: Type.TNumber;
314
+ }>>>;
315
+ }>>;
316
+ contextWindow: Type.TOptional<Type.TNumber>;
317
+ maxTokens: Type.TOptional<Type.TNumber>;
318
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
319
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
320
+ supportsStore: Type.TOptional<Type.TBoolean>;
321
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
322
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
323
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
324
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
325
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
326
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
327
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
328
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
329
+ 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">]>>;
330
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
331
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
332
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
333
+ }>]>>>;
334
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
335
+ openRouterRouting: Type.TOptional<Type.TObject<{
336
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
337
+ require_parameters: Type.TOptional<Type.TBoolean>;
338
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
339
+ zdr: Type.TOptional<Type.TBoolean>;
340
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
341
+ order: Type.TOptional<Type.TArray<Type.TString>>;
342
+ only: Type.TOptional<Type.TArray<Type.TString>>;
343
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
344
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
345
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
346
+ by: Type.TOptional<Type.TString>;
347
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
348
+ }>]>>;
349
+ max_price: Type.TOptional<Type.TObject<{
350
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
351
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
352
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
353
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
354
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
355
+ }>>;
356
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
357
+ p50: Type.TOptional<Type.TNumber>;
358
+ p75: Type.TOptional<Type.TNumber>;
359
+ p90: Type.TOptional<Type.TNumber>;
360
+ p99: Type.TOptional<Type.TNumber>;
361
+ }>]>>;
362
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
363
+ p50: Type.TOptional<Type.TNumber>;
364
+ p75: Type.TOptional<Type.TNumber>;
365
+ p90: Type.TOptional<Type.TNumber>;
366
+ p99: Type.TOptional<Type.TNumber>;
367
+ }>]>>;
368
+ }>>;
369
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
370
+ only: Type.TOptional<Type.TArray<Type.TString>>;
371
+ order: Type.TOptional<Type.TArray<Type.TString>>;
372
+ }>>;
373
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
374
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
375
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
376
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
377
+ }>, Type.TObject<{
378
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
379
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
380
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
381
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
382
+ }>, Type.TObject<{
383
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
384
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
385
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
386
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
387
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
388
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
389
+ }>]>>;
390
+ }>>>;
391
+ modelOverrides: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
392
+ name: Type.TOptional<Type.TString>;
393
+ reasoning: Type.TOptional<Type.TBoolean>;
394
+ thinkingLevelMap: Type.TOptional<Type.TObject<{
395
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
396
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
397
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
398
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
399
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
400
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
401
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
402
+ }>>;
403
+ input: Type.TOptional<Type.TArray<Type.TUnion<[Type.TLiteral<"text">, Type.TLiteral<"image">]>>>;
404
+ cost: Type.TOptional<Type.TObject<{
405
+ input: Type.TOptional<Type.TNumber>;
406
+ output: Type.TOptional<Type.TNumber>;
407
+ cacheRead: Type.TOptional<Type.TNumber>;
408
+ cacheWrite: Type.TOptional<Type.TNumber>;
409
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
410
+ input: Type.TNumber;
411
+ output: Type.TNumber;
412
+ cacheRead: Type.TNumber;
413
+ cacheWrite: Type.TNumber;
414
+ inputTokensAbove: Type.TNumber;
415
+ }>>>;
416
+ }>>;
417
+ contextWindow: Type.TOptional<Type.TNumber>;
418
+ maxTokens: Type.TOptional<Type.TNumber>;
419
+ headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
420
+ compat: Type.TOptional<Type.TUnion<[Type.TObject<{
421
+ supportsStore: Type.TOptional<Type.TBoolean>;
422
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
423
+ supportsReasoningEffort: Type.TOptional<Type.TBoolean>;
424
+ supportsUsageInStreaming: Type.TOptional<Type.TBoolean>;
425
+ maxTokensField: Type.TOptional<Type.TUnion<[Type.TLiteral<"max_completion_tokens">, Type.TLiteral<"max_tokens">]>>;
426
+ requiresToolResultName: Type.TOptional<Type.TBoolean>;
427
+ requiresAssistantAfterToolResult: Type.TOptional<Type.TBoolean>;
428
+ requiresThinkingAsText: Type.TOptional<Type.TBoolean>;
429
+ requiresReasoningContentOnAssistantMessages: Type.TOptional<Type.TBoolean>;
430
+ 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">]>>;
431
+ chatTemplateKwargs: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TString, Type.TNumber, Type.TBoolean, Type.TNull]>, Type.TObject<{
432
+ $var: Type.TUnion<[Type.TLiteral<"thinking.enabled">, Type.TLiteral<"thinking.effort">]>;
433
+ omitWhenOff: Type.TOptional<Type.TBoolean>;
434
+ }>]>>>;
435
+ cacheControlFormat: Type.TOptional<Type.TLiteral<"anthropic">>;
436
+ openRouterRouting: Type.TOptional<Type.TObject<{
437
+ allow_fallbacks: Type.TOptional<Type.TBoolean>;
438
+ require_parameters: Type.TOptional<Type.TBoolean>;
439
+ data_collection: Type.TOptional<Type.TUnion<[Type.TLiteral<"deny">, Type.TLiteral<"allow">]>>;
440
+ zdr: Type.TOptional<Type.TBoolean>;
441
+ enforce_distillable_text: Type.TOptional<Type.TBoolean>;
442
+ order: Type.TOptional<Type.TArray<Type.TString>>;
443
+ only: Type.TOptional<Type.TArray<Type.TString>>;
444
+ ignore: Type.TOptional<Type.TArray<Type.TString>>;
445
+ quantizations: Type.TOptional<Type.TArray<Type.TString>>;
446
+ sort: Type.TOptional<Type.TUnion<[Type.TString, Type.TObject<{
447
+ by: Type.TOptional<Type.TString>;
448
+ partition: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
449
+ }>]>>;
450
+ max_price: Type.TOptional<Type.TObject<{
451
+ prompt: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
452
+ completion: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
453
+ image: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
454
+ audio: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
455
+ request: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
456
+ }>>;
457
+ preferred_min_throughput: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
458
+ p50: Type.TOptional<Type.TNumber>;
459
+ p75: Type.TOptional<Type.TNumber>;
460
+ p90: Type.TOptional<Type.TNumber>;
461
+ p99: Type.TOptional<Type.TNumber>;
462
+ }>]>>;
463
+ preferred_max_latency: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TObject<{
464
+ p50: Type.TOptional<Type.TNumber>;
465
+ p75: Type.TOptional<Type.TNumber>;
466
+ p90: Type.TOptional<Type.TNumber>;
467
+ p99: Type.TOptional<Type.TNumber>;
468
+ }>]>>;
469
+ }>>;
470
+ vercelGatewayRouting: Type.TOptional<Type.TObject<{
471
+ only: Type.TOptional<Type.TArray<Type.TString>>;
472
+ order: Type.TOptional<Type.TArray<Type.TString>>;
473
+ }>>;
474
+ supportsStrictMode: Type.TOptional<Type.TBoolean>;
475
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
476
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
477
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
478
+ }>, Type.TObject<{
479
+ supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
480
+ sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
481
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
482
+ supportsToolSearch: Type.TOptional<Type.TBoolean>;
483
+ }>, Type.TObject<{
484
+ supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
485
+ supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
486
+ sendSessionAffinityHeaders: Type.TOptional<Type.TBoolean>;
487
+ supportsCacheControlOnTools: Type.TOptional<Type.TBoolean>;
488
+ forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
489
+ supportsToolReferences: Type.TOptional<Type.TBoolean>;
490
+ }>]>>;
491
+ }>>>;
492
+ }>;
493
+ export type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;
494
+ export type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;
495
+ export type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;
496
+ /** One immutable load of models.json. */
497
+ export declare class ModelConfig {
498
+ private readonly providers;
499
+ private readonly error;
500
+ private constructor();
501
+ static load(modelsJsonPath: string | undefined): Promise<ModelConfig>;
502
+ getProvider(providerId: string): ModelsJsonProvider | undefined;
503
+ getProviderIds(): readonly string[];
504
+ getError(): string | undefined;
505
+ }
506
+ export {};
507
+ //# 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;AA+I5C,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;AAsBrE,yCAAyC;AACzC,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C,OAAO,eAGN;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\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\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 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"]}