@theokit/sdk 5.9.1 → 5.9.2

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 (146) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/{agent-R5RERYFU.js → agent-GZVZXKME.js} +15 -14
  3. package/dist/{agent-R5RERYFU.js.map → agent-GZVZXKME.js.map} +1 -1
  4. package/dist/{agent-5M7WLUWH.cjs → agent-WQ4LLTSY.cjs} +16 -15
  5. package/dist/{agent-5M7WLUWH.cjs.map → agent-WQ4LLTSY.cjs.map} +1 -1
  6. package/dist/agent-session-store-ODD3IZCW.js +6 -0
  7. package/dist/{agent-session-store-AFML3AXC.js.map → agent-session-store-ODD3IZCW.js.map} +1 -1
  8. package/dist/agent-session-store-SVEJHSUA.cjs +23 -0
  9. package/dist/{agent-session-store-MTSIY3MH.cjs.map → agent-session-store-SVEJHSUA.cjs.map} +1 -1
  10. package/dist/auth/index.cjs +8 -7
  11. package/dist/auth/index.cjs.map +1 -1
  12. package/dist/auth/index.js +3 -2
  13. package/dist/auth/index.js.map +1 -1
  14. package/dist/{chunk-TC4RWP3Y.js → chunk-47Z6LP3I.js} +3 -3
  15. package/dist/{chunk-TC4RWP3Y.js.map → chunk-47Z6LP3I.js.map} +1 -1
  16. package/dist/{chunk-TTBIQTO5.cjs → chunk-DLUCTZ56.cjs} +15 -15
  17. package/dist/{chunk-TTBIQTO5.cjs.map → chunk-DLUCTZ56.cjs.map} +1 -1
  18. package/dist/chunk-EHD25JBZ.cjs +10 -0
  19. package/dist/chunk-EHD25JBZ.cjs.map +1 -0
  20. package/dist/{chunk-NOO6GZTZ.js → chunk-EVH3OUMY.js} +13 -12
  21. package/dist/chunk-EVH3OUMY.js.map +1 -0
  22. package/dist/{chunk-5522X223.js → chunk-EXI7EHDN.js} +4 -4
  23. package/dist/{chunk-5522X223.js.map → chunk-EXI7EHDN.js.map} +1 -1
  24. package/dist/{chunk-PSLCVSCS.cjs → chunk-FR6COQXZ.cjs} +6 -6
  25. package/dist/{chunk-PSLCVSCS.cjs.map → chunk-FR6COQXZ.cjs.map} +1 -1
  26. package/dist/{chunk-JOFVLOFY.js → chunk-FTZTZBCU.js} +12 -4
  27. package/dist/chunk-FTZTZBCU.js.map +1 -0
  28. package/dist/{chunk-HOHR75KF.js → chunk-HI3W37FY.js} +4 -3
  29. package/dist/chunk-HI3W37FY.js.map +1 -0
  30. package/dist/chunk-HU666T3Q.cjs +1891 -0
  31. package/dist/chunk-HU666T3Q.cjs.map +1 -0
  32. package/dist/{chunk-53RDNK3H.js → chunk-I2ORT6QD.js} +3 -3
  33. package/dist/{chunk-53RDNK3H.js.map → chunk-I2ORT6QD.js.map} +1 -1
  34. package/dist/{chunk-56BCEM26.cjs → chunk-JU76WCW7.cjs} +90 -89
  35. package/dist/chunk-JU76WCW7.cjs.map +1 -0
  36. package/dist/{chunk-LL4QA3DI.cjs → chunk-KXKT3HSD.cjs} +4 -4
  37. package/dist/{chunk-LL4QA3DI.cjs.map → chunk-KXKT3HSD.cjs.map} +1 -1
  38. package/dist/{chunk-QCIARBLS.js → chunk-M2CCHC66.js} +3 -3
  39. package/dist/{chunk-QCIARBLS.js.map → chunk-M2CCHC66.js.map} +1 -1
  40. package/dist/{chunk-QDQQYRJI.js → chunk-N7KYUNFO.js} +3 -3
  41. package/dist/{chunk-QDQQYRJI.js.map → chunk-N7KYUNFO.js.map} +1 -1
  42. package/dist/{chunk-UNZOJVVC.js → chunk-OZLQ6ZFM.js} +3 -3
  43. package/dist/{chunk-UNZOJVVC.js.map → chunk-OZLQ6ZFM.js.map} +1 -1
  44. package/dist/{chunk-OOM236Z4.js → chunk-PEIV7LOU.js} +18 -17
  45. package/dist/chunk-PEIV7LOU.js.map +1 -0
  46. package/dist/chunk-Q7GYMXVC.js +8 -0
  47. package/dist/chunk-Q7GYMXVC.js.map +1 -0
  48. package/dist/{chunk-ARMFXTY6.cjs → chunk-QY3CIMUV.cjs} +34 -33
  49. package/dist/chunk-QY3CIMUV.cjs.map +1 -0
  50. package/dist/{chunk-B3XXQX6L.cjs → chunk-RX3CFWQ2.cjs} +6 -6
  51. package/dist/{chunk-B3XXQX6L.cjs.map → chunk-RX3CFWQ2.cjs.map} +1 -1
  52. package/dist/chunk-SGC7LSHF.cjs +18 -0
  53. package/dist/{chunk-R3ZQBPA5.cjs.map → chunk-SGC7LSHF.cjs.map} +1 -1
  54. package/dist/{chunk-RA7IE4NK.cjs → chunk-SKDNCTXG.cjs} +4 -3
  55. package/dist/chunk-SKDNCTXG.cjs.map +1 -0
  56. package/dist/chunk-SVCPJRUB.js +1874 -0
  57. package/dist/chunk-SVCPJRUB.js.map +1 -0
  58. package/dist/{chunk-EJROML3Q.js → chunk-TX56N7FR.js} +4 -3
  59. package/dist/chunk-TX56N7FR.js.map +1 -0
  60. package/dist/{chunk-76PIKR4P.cjs → chunk-VZ2JZ2EH.cjs} +5 -5
  61. package/dist/{chunk-76PIKR4P.cjs.map → chunk-VZ2JZ2EH.cjs.map} +1 -1
  62. package/dist/{chunk-T5KOSR5Y.cjs → chunk-X7Z2FEI7.cjs} +8 -8
  63. package/dist/{chunk-T5KOSR5Y.cjs.map → chunk-X7Z2FEI7.cjs.map} +1 -1
  64. package/dist/{chunk-2WXHA33T.js → chunk-XERM7PDQ.js} +3 -3
  65. package/dist/{chunk-2WXHA33T.js.map → chunk-XERM7PDQ.js.map} +1 -1
  66. package/dist/{chunk-MEUBLCM4.cjs → chunk-YEHQ3SIC.cjs} +4 -3
  67. package/dist/chunk-YEHQ3SIC.cjs.map +1 -0
  68. package/dist/{chunk-YIFFF23U.cjs → chunk-ZAM7BJXJ.cjs} +5 -5
  69. package/dist/{chunk-YIFFF23U.cjs.map → chunk-ZAM7BJXJ.cjs.map} +1 -1
  70. package/dist/{chunk-R2C3HXR3.js → chunk-ZDF2IJKC.js} +3 -3
  71. package/dist/{chunk-R2C3HXR3.js.map → chunk-ZDF2IJKC.js.map} +1 -1
  72. package/dist/{chunk-GZV6AVRL.cjs → chunk-ZWACQM5U.cjs} +11 -3
  73. package/dist/chunk-ZWACQM5U.cjs.map +1 -0
  74. package/dist/{compact-session-RBPLUPCK.cjs → compact-session-4QHBBGEY.cjs} +16 -15
  75. package/dist/{compact-session-RBPLUPCK.cjs.map → compact-session-4QHBBGEY.cjs.map} +1 -1
  76. package/dist/{compact-session-2N3ZYJTW.js → compact-session-PVAWTKKL.js} +7 -6
  77. package/dist/{compact-session-2N3ZYJTW.js.map → compact-session-PVAWTKKL.js.map} +1 -1
  78. package/dist/cron.cjs +15 -14
  79. package/dist/cron.js +14 -13
  80. package/dist/eval.cjs +14 -13
  81. package/dist/eval.cjs.map +1 -1
  82. package/dist/eval.js +13 -12
  83. package/dist/eval.js.map +1 -1
  84. package/dist/fs-session-store-LCZBM3LT.js +10 -0
  85. package/dist/{fs-session-store-STZZFXH2.js.map → fs-session-store-LCZBM3LT.js.map} +1 -1
  86. package/dist/{fs-session-store-JHBJFKVV.cjs → fs-session-store-SVEMRE4K.cjs} +5 -5
  87. package/dist/{fs-session-store-JHBJFKVV.cjs.map → fs-session-store-SVEMRE4K.cjs.map} +1 -1
  88. package/dist/{index-manager-ONQJSWX5.js → index-manager-6B2UF5S3.js} +5 -5
  89. package/dist/{index-manager-ONQJSWX5.js.map → index-manager-6B2UF5S3.js.map} +1 -1
  90. package/dist/{index-manager-ZGJN25FD.cjs → index-manager-M3FHJCHQ.cjs} +6 -6
  91. package/dist/{index-manager-ZGJN25FD.cjs.map → index-manager-M3FHJCHQ.cjs.map} +1 -1
  92. package/dist/index.cjs +55 -54
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.cts +30 -3
  95. package/dist/index.d.ts +30 -3
  96. package/dist/index.js +18 -17
  97. package/dist/index.js.map +1 -1
  98. package/dist/{inject-session-YNNOE3O6.js → inject-session-O24XGRR6.js} +5 -5
  99. package/dist/{inject-session-YNNOE3O6.js.map → inject-session-O24XGRR6.js.map} +1 -1
  100. package/dist/{inject-session-3FPXJDJP.cjs → inject-session-OMLFL2V3.cjs} +7 -7
  101. package/dist/{inject-session-3FPXJDJP.cjs.map → inject-session-OMLFL2V3.cjs.map} +1 -1
  102. package/dist/internal/memory/adapters/index.cjs +3 -2
  103. package/dist/internal/memory/adapters/index.js +2 -1
  104. package/dist/internal/memory/storage/index.cjs +32 -32
  105. package/dist/internal/memory/storage/index.js +3 -3
  106. package/dist/internal/persistence/persistence-schema.d.cts +1 -1
  107. package/dist/internal/persistence/persistence-schema.d.ts +1 -1
  108. package/dist/internal/providers/catalog-loader.d.ts +30 -3
  109. package/dist/internal/runtime-fetch.d.ts +1 -0
  110. package/dist/models.cjs +12 -11
  111. package/dist/models.cjs.map +1 -1
  112. package/dist/models.js +4 -3
  113. package/dist/models.js.map +1 -1
  114. package/dist/persistence.cjs +7 -7
  115. package/dist/persistence.js +2 -2
  116. package/dist/providers.cjs +6 -5
  117. package/dist/providers.js +4 -3
  118. package/dist/{session-transcript-VTBTCGQX.js → session-transcript-AR7IBICT.js} +3 -3
  119. package/dist/{session-transcript-VTBTCGQX.js.map → session-transcript-AR7IBICT.js.map} +1 -1
  120. package/dist/{session-transcript-LGHSNVY5.cjs → session-transcript-RACG7BK2.cjs} +16 -16
  121. package/dist/{session-transcript-LGHSNVY5.cjs.map → session-transcript-RACG7BK2.cjs.map} +1 -1
  122. package/dist/subscription/index.cjs +2 -1
  123. package/dist/subscription/index.cjs.map +1 -1
  124. package/dist/subscription/index.js +2 -1
  125. package/dist/subscription/index.js.map +1 -1
  126. package/docs/error-codes.md +13 -13
  127. package/package.json +2 -2
  128. package/dist/agent-session-store-AFML3AXC.js +0 -6
  129. package/dist/agent-session-store-MTSIY3MH.cjs +0 -23
  130. package/dist/chunk-56BCEM26.cjs.map +0 -1
  131. package/dist/chunk-ARMFXTY6.cjs.map +0 -1
  132. package/dist/chunk-EJROML3Q.js.map +0 -1
  133. package/dist/chunk-GZV6AVRL.cjs.map +0 -1
  134. package/dist/chunk-HOHR75KF.js.map +0 -1
  135. package/dist/chunk-JOFVLOFY.js.map +0 -1
  136. package/dist/chunk-MEUBLCM4.cjs.map +0 -1
  137. package/dist/chunk-MFZODA5Y.js +0 -583
  138. package/dist/chunk-MFZODA5Y.js.map +0 -1
  139. package/dist/chunk-NOO6GZTZ.js.map +0 -1
  140. package/dist/chunk-OOM236Z4.js.map +0 -1
  141. package/dist/chunk-R3ZQBPA5.cjs +0 -18
  142. package/dist/chunk-RA7IE4NK.cjs.map +0 -1
  143. package/dist/chunk-YRJA2POB.cjs +0 -601
  144. package/dist/chunk-YRJA2POB.cjs.map +0 -1
  145. package/dist/fs-session-store-STZZFXH2.js +0 -10
  146. package/dist/provider-catalog.json +0 -1295
@@ -0,0 +1,1891 @@
1
+ 'use strict';
2
+
3
+ var chunkNVXXWAU7_cjs = require('./chunk-NVXXWAU7.cjs');
4
+ var chunkSKDNCTXG_cjs = require('./chunk-SKDNCTXG.cjs');
5
+ var chunkNAGPKWOD_cjs = require('./chunk-NAGPKWOD.cjs');
6
+ var chunkUNFBHV46_cjs = require('./chunk-UNFBHV46.cjs');
7
+ var chunk6LHQPOMI_cjs = require('./chunk-6LHQPOMI.cjs');
8
+ var zod = require('zod');
9
+ var os = require('os');
10
+
11
+ // src/internal/providers/registry.ts
12
+ var REGISTRY = chunkNVXXWAU7_cjs.globalSingleton(
13
+ "theokit-sdk.providers.registry",
14
+ () => /* @__PURE__ */ new Map()
15
+ );
16
+ var ALIASES = chunkNVXXWAU7_cjs.globalSingleton("theokit-sdk.providers.aliases", () => /* @__PURE__ */ new Map());
17
+ function registerProvider(profile) {
18
+ if (REGISTRY.has(profile.name)) {
19
+ chunk6LHQPOMI_cjs.diag(`[theokit-sdk] Provider "${profile.name}" overridden by user plugin.
20
+ `);
21
+ }
22
+ REGISTRY.set(profile.name, profile);
23
+ for (const alias of profile.aliases ?? []) {
24
+ const previous = ALIASES.get(alias);
25
+ if (previous !== void 0 && previous !== profile.name) {
26
+ chunk6LHQPOMI_cjs.diag(`[theokit-sdk] Alias "${alias}" collision: was "${previous}", now "${profile.name}".
27
+ `);
28
+ }
29
+ ALIASES.set(alias, profile.name);
30
+ }
31
+ }
32
+ function getProviderProfile(name) {
33
+ const canonical = ALIASES.get(name) ?? name;
34
+ return REGISTRY.get(canonical);
35
+ }
36
+ function listProviders() {
37
+ return Array.from(REGISTRY.values());
38
+ }
39
+ var MODALITIES = ["text", "audio", "image", "video", "pdf"];
40
+ var costSchema = zod.z.object({
41
+ /** USD per 1M tokens (models.dev convention). */
42
+ input: zod.z.number().nonnegative(),
43
+ output: zod.z.number().nonnegative(),
44
+ cache_read: zod.z.number().nonnegative().optional(),
45
+ cache_write: zod.z.number().nonnegative().optional()
46
+ }).loose();
47
+ var limitSchema = zod.z.object({
48
+ context: zod.z.number().positive(),
49
+ input: zod.z.number().positive().optional(),
50
+ output: zod.z.number().positive().optional()
51
+ }).loose();
52
+ var modalitiesSchema = zod.z.object({
53
+ input: zod.z.array(zod.z.enum(MODALITIES)).optional(),
54
+ output: zod.z.array(zod.z.enum(MODALITIES)).optional()
55
+ }).loose();
56
+ var catalogModelSchema = zod.z.object({
57
+ name: zod.z.string().optional(),
58
+ release_date: zod.z.string().optional(),
59
+ attachment: zod.z.boolean().optional(),
60
+ reasoning: zod.z.boolean().optional(),
61
+ temperature: zod.z.boolean().optional(),
62
+ tool_call: zod.z.boolean().optional(),
63
+ /** theokit extension — maps to ModelCapabilities.supportsStructuredOutput. */
64
+ structured_output: zod.z.boolean().optional(),
65
+ /** theokit extension — maps to ModelCapabilities.supportsCacheControl. */
66
+ cache_control: zod.z.boolean().optional(),
67
+ cost: costSchema.optional(),
68
+ limit: limitSchema.optional(),
69
+ modalities: modalitiesSchema.optional(),
70
+ status: zod.z.enum(["alpha", "beta", "deprecated"]).optional()
71
+ }).loose();
72
+ var catalogEntrySchema = zod.z.object({
73
+ id: zod.z.string().min(1),
74
+ displayName: zod.z.string().min(1),
75
+ apiMode: zod.z.enum([
76
+ "chat_completions",
77
+ "anthropic_messages",
78
+ "responses_api",
79
+ "bedrock",
80
+ "bedrock_anthropic"
81
+ ]),
82
+ authType: zod.z.enum([
83
+ "api_key",
84
+ "oauth_device_code",
85
+ "oauth_external",
86
+ "aws_sdk",
87
+ "aws_bearer",
88
+ "gcp_oauth",
89
+ "none"
90
+ ]),
91
+ baseUrl: zod.z.string(),
92
+ envVars: zod.z.array(zod.z.string()),
93
+ fallbackModels: zod.z.array(zod.z.string()),
94
+ capabilities: zod.z.object({
95
+ supportsToolUse: zod.z.boolean(),
96
+ supportsVision: zod.z.boolean(),
97
+ supportsStructuredOutput: zod.z.boolean(),
98
+ supportsStreaming: zod.z.boolean(),
99
+ supportsCacheControl: zod.z.boolean(),
100
+ maxContextTokens: zod.z.number().int().positive().optional(),
101
+ maxOutputTokens: zod.z.number().int().positive().optional()
102
+ }),
103
+ aliases: zod.z.array(zod.z.string()).optional(),
104
+ modelsUrl: zod.z.string().optional(),
105
+ hostname: zod.z.string().optional(),
106
+ extraHeaders: zod.z.record(zod.z.string(), zod.z.string()).optional(),
107
+ models: zod.z.record(zod.z.string(), catalogModelSchema).optional()
108
+ }).loose();
109
+
110
+ // src/internal/providers/provider-catalog.json
111
+ var provider_catalog_default = [
112
+ {
113
+ id: "openai",
114
+ displayName: "OpenAI",
115
+ apiMode: "chat_completions",
116
+ authType: "api_key",
117
+ baseUrl: "https://api.openai.com/v1",
118
+ envVars: ["OPENAI_API_KEY"],
119
+ fallbackModels: ["gpt-4o-mini", "gpt-4o"],
120
+ capabilities: {
121
+ supportsToolUse: true,
122
+ supportsVision: true,
123
+ supportsStructuredOutput: true,
124
+ supportsStreaming: true,
125
+ supportsCacheControl: false
126
+ },
127
+ aliases: ["openai", "openai-chatgpt"],
128
+ models: {
129
+ "gpt-4o-mini": {
130
+ name: "GPT-4o mini",
131
+ release_date: "2024-07-18",
132
+ attachment: true,
133
+ reasoning: false,
134
+ temperature: true,
135
+ tool_call: true,
136
+ structured_output: true,
137
+ cost: {
138
+ input: 0.15,
139
+ output: 0.6,
140
+ cache_read: 0.075
141
+ },
142
+ limit: {
143
+ context: 128e3,
144
+ output: 16384
145
+ },
146
+ modalities: {
147
+ input: ["text", "image"],
148
+ output: ["text"]
149
+ },
150
+ cache_control: false
151
+ },
152
+ "gpt-4o": {
153
+ name: "GPT-4o",
154
+ release_date: "2024-05-13",
155
+ attachment: true,
156
+ reasoning: false,
157
+ temperature: true,
158
+ tool_call: true,
159
+ structured_output: true,
160
+ cost: {
161
+ input: 2.5,
162
+ output: 10,
163
+ cache_read: 1.25
164
+ },
165
+ limit: {
166
+ context: 128e3,
167
+ output: 16384
168
+ },
169
+ modalities: {
170
+ input: ["text", "image"],
171
+ output: ["text"]
172
+ },
173
+ cache_control: false
174
+ },
175
+ "gpt-4-turbo": {
176
+ name: "GPT-4 Turbo",
177
+ release_date: "2023-11-06",
178
+ attachment: true,
179
+ reasoning: false,
180
+ temperature: true,
181
+ tool_call: true,
182
+ structured_output: false,
183
+ cost: {
184
+ input: 10,
185
+ output: 30
186
+ },
187
+ limit: {
188
+ context: 128e3,
189
+ output: 4096
190
+ },
191
+ modalities: {
192
+ input: ["text", "image"],
193
+ output: ["text"]
194
+ },
195
+ cache_control: false
196
+ },
197
+ o1: {
198
+ name: "o1",
199
+ release_date: "2024-12-05",
200
+ attachment: true,
201
+ reasoning: true,
202
+ temperature: false,
203
+ tool_call: true,
204
+ structured_output: true,
205
+ cost: {
206
+ input: 15,
207
+ output: 60,
208
+ cache_read: 7.5
209
+ },
210
+ limit: {
211
+ context: 2e5,
212
+ output: 1e5
213
+ },
214
+ modalities: {
215
+ input: ["text"],
216
+ output: ["text"]
217
+ },
218
+ cache_control: false
219
+ },
220
+ o3: {
221
+ name: "o3",
222
+ release_date: "2025-04-16",
223
+ attachment: true,
224
+ reasoning: true,
225
+ temperature: false,
226
+ tool_call: true,
227
+ structured_output: true,
228
+ cost: {
229
+ input: 2,
230
+ output: 8,
231
+ cache_read: 0.5
232
+ },
233
+ limit: {
234
+ context: 2e5,
235
+ output: 1e5
236
+ },
237
+ modalities: {
238
+ input: ["text"],
239
+ output: ["text"]
240
+ },
241
+ cache_control: false
242
+ },
243
+ "gpt-4.1": {
244
+ name: "GPT-4.1",
245
+ release_date: "2025-04-14",
246
+ attachment: true,
247
+ reasoning: false,
248
+ temperature: true,
249
+ tool_call: true,
250
+ structured_output: true,
251
+ cost: {
252
+ input: 2,
253
+ output: 8,
254
+ cache_read: 0.5
255
+ },
256
+ limit: {
257
+ context: 1047576,
258
+ output: 32768
259
+ },
260
+ modalities: {
261
+ input: ["text", "image"],
262
+ output: ["text"]
263
+ },
264
+ cache_control: false
265
+ },
266
+ "gpt-5.4": {
267
+ limit: {
268
+ context: 4e5,
269
+ output: 128e3
270
+ }
271
+ },
272
+ "gpt-5.4-mini": {
273
+ limit: {
274
+ context: 4e5,
275
+ output: 128e3
276
+ }
277
+ },
278
+ "gpt-5.3": {
279
+ limit: {
280
+ context: 4e5,
281
+ output: 128e3
282
+ }
283
+ },
284
+ "gpt-5.2": {
285
+ limit: {
286
+ context: 4e5,
287
+ output: 128e3
288
+ }
289
+ }
290
+ }
291
+ },
292
+ {
293
+ id: "anthropic",
294
+ displayName: "Anthropic",
295
+ apiMode: "anthropic_messages",
296
+ authType: "api_key",
297
+ baseUrl: "https://api.anthropic.com/v1",
298
+ envVars: ["ANTHROPIC_API_KEY"],
299
+ fallbackModels: ["claude-sonnet-4-20250514", "claude-3-5-haiku-latest"],
300
+ capabilities: {
301
+ supportsToolUse: true,
302
+ supportsVision: true,
303
+ supportsStructuredOutput: false,
304
+ supportsStreaming: true,
305
+ supportsCacheControl: true
306
+ },
307
+ aliases: ["anthropic"],
308
+ models: {
309
+ "claude-3-5-haiku-latest": {
310
+ tool_call: true,
311
+ structured_output: false,
312
+ cache_control: true,
313
+ modalities: {
314
+ input: ["text"]
315
+ },
316
+ limit: {
317
+ context: 2e5,
318
+ output: 8192
319
+ }
320
+ },
321
+ "claude-opus-4-7": {
322
+ name: "Claude Opus 4.7",
323
+ release_date: "2026-04-14",
324
+ attachment: true,
325
+ reasoning: true,
326
+ temperature: false,
327
+ tool_call: true,
328
+ structured_output: true,
329
+ cost: {
330
+ input: 5,
331
+ output: 25,
332
+ cache_read: 0.5,
333
+ cache_write: 6.25
334
+ },
335
+ limit: {
336
+ context: 1e6,
337
+ output: 128e3
338
+ },
339
+ modalities: {
340
+ input: ["text", "image", "pdf"],
341
+ output: ["text"]
342
+ },
343
+ cache_control: true
344
+ },
345
+ "claude-sonnet-4-6": {
346
+ name: "Claude Sonnet 4.6",
347
+ release_date: "2026-02-17",
348
+ attachment: true,
349
+ reasoning: true,
350
+ temperature: true,
351
+ tool_call: true,
352
+ structured_output: true,
353
+ cost: {
354
+ input: 3,
355
+ output: 15,
356
+ cache_read: 0.3,
357
+ cache_write: 3.75
358
+ },
359
+ limit: {
360
+ context: 1e6,
361
+ output: 128e3
362
+ },
363
+ modalities: {
364
+ input: ["text", "image", "pdf"],
365
+ output: ["text"]
366
+ },
367
+ cache_control: true
368
+ },
369
+ "claude-haiku-4-5-20251001": {
370
+ name: "Claude Haiku 4.5",
371
+ release_date: "2025-10-15",
372
+ attachment: true,
373
+ reasoning: true,
374
+ temperature: true,
375
+ tool_call: true,
376
+ structured_output: true,
377
+ cost: {
378
+ input: 1,
379
+ output: 5,
380
+ cache_read: 0.1,
381
+ cache_write: 1.25
382
+ },
383
+ limit: {
384
+ context: 2e5,
385
+ output: 64e3
386
+ },
387
+ modalities: {
388
+ input: ["text", "image", "pdf"],
389
+ output: ["text"]
390
+ },
391
+ cache_control: true
392
+ },
393
+ "claude-opus-4": {
394
+ tool_call: true,
395
+ structured_output: false,
396
+ cache_control: true,
397
+ modalities: {
398
+ input: ["text", "image"]
399
+ },
400
+ limit: {
401
+ context: 2e5,
402
+ output: 32e3
403
+ }
404
+ },
405
+ "claude-sonnet-4": {
406
+ tool_call: true,
407
+ structured_output: false,
408
+ cache_control: true,
409
+ modalities: {
410
+ input: ["text", "image"]
411
+ },
412
+ limit: {
413
+ context: 2e5,
414
+ output: 16e3
415
+ }
416
+ },
417
+ "claude-3-5-sonnet": {
418
+ tool_call: true,
419
+ structured_output: false,
420
+ cache_control: true,
421
+ modalities: {
422
+ input: ["text", "image"]
423
+ },
424
+ limit: {
425
+ context: 2e5,
426
+ output: 8192
427
+ }
428
+ },
429
+ "claude-3-5-sonnet-latest": {
430
+ tool_call: true,
431
+ structured_output: false,
432
+ cache_control: true,
433
+ modalities: {
434
+ input: ["text", "image"]
435
+ },
436
+ limit: {
437
+ context: 2e5,
438
+ output: 8192
439
+ }
440
+ },
441
+ "claude-3-haiku": {
442
+ tool_call: true,
443
+ structured_output: false,
444
+ cache_control: true,
445
+ modalities: {
446
+ input: ["text", "image"]
447
+ },
448
+ limit: {
449
+ context: 2e5,
450
+ output: 4096
451
+ }
452
+ },
453
+ "claude-3-opus": {
454
+ tool_call: true,
455
+ structured_output: false,
456
+ cache_control: true,
457
+ modalities: {
458
+ input: ["text", "image"]
459
+ },
460
+ limit: {
461
+ context: 2e5,
462
+ output: 4096
463
+ }
464
+ },
465
+ "claude-opus-4.1": {
466
+ tool_call: true,
467
+ structured_output: false,
468
+ cache_control: true,
469
+ modalities: {
470
+ input: ["text", "image"]
471
+ },
472
+ limit: {
473
+ context: 2e5,
474
+ output: 32e3
475
+ }
476
+ },
477
+ "claude-sonnet-4.5": {
478
+ tool_call: true,
479
+ structured_output: false,
480
+ cache_control: true,
481
+ modalities: {
482
+ input: ["text", "image"]
483
+ },
484
+ limit: {
485
+ context: 2e5,
486
+ output: 16e3
487
+ }
488
+ },
489
+ "claude-3.5-sonnet": {
490
+ tool_call: true,
491
+ structured_output: false,
492
+ cache_control: true,
493
+ modalities: {
494
+ input: ["text", "image"]
495
+ },
496
+ limit: {
497
+ context: 2e5,
498
+ output: 8192
499
+ }
500
+ }
501
+ }
502
+ },
503
+ {
504
+ id: "openrouter",
505
+ displayName: "OpenRouter",
506
+ apiMode: "chat_completions",
507
+ authType: "api_key",
508
+ baseUrl: "https://openrouter.ai/api/v1",
509
+ envVars: ["OPENROUTER_API_KEY"],
510
+ fallbackModels: ["openai/gpt-4o-mini"],
511
+ capabilities: {
512
+ supportsToolUse: true,
513
+ supportsVision: true,
514
+ supportsStructuredOutput: true,
515
+ supportsStreaming: true,
516
+ supportsCacheControl: false
517
+ },
518
+ aliases: ["openrouter"]
519
+ },
520
+ {
521
+ id: "groq",
522
+ displayName: "Groq",
523
+ apiMode: "chat_completions",
524
+ authType: "api_key",
525
+ baseUrl: "https://api.groq.com/openai/v1",
526
+ envVars: ["GROQ_API_KEY"],
527
+ fallbackModels: ["llama-3.3-70b-versatile"],
528
+ capabilities: {
529
+ supportsToolUse: true,
530
+ supportsVision: true,
531
+ supportsStructuredOutput: true,
532
+ supportsStreaming: true,
533
+ supportsCacheControl: false
534
+ },
535
+ models: {
536
+ "llama-3.3-70b-versatile": {
537
+ name: "Llama 3.3 70B",
538
+ release_date: "2024-12-06",
539
+ attachment: false,
540
+ reasoning: false,
541
+ temperature: true,
542
+ tool_call: true,
543
+ cost: {
544
+ input: 0.59,
545
+ output: 0.79
546
+ },
547
+ limit: {
548
+ context: 131072,
549
+ output: 32768
550
+ },
551
+ modalities: {
552
+ input: ["text"],
553
+ output: ["text"]
554
+ }
555
+ }
556
+ }
557
+ },
558
+ {
559
+ id: "mistral",
560
+ displayName: "Mistral AI",
561
+ apiMode: "chat_completions",
562
+ authType: "api_key",
563
+ baseUrl: "https://api.mistral.ai/v1",
564
+ envVars: ["MISTRAL_API_KEY"],
565
+ fallbackModels: ["mistral-large-latest"],
566
+ capabilities: {
567
+ supportsToolUse: true,
568
+ supportsVision: true,
569
+ supportsStructuredOutput: true,
570
+ supportsStreaming: true,
571
+ supportsCacheControl: false
572
+ },
573
+ models: {
574
+ "mistral-large-latest": {
575
+ name: "Mistral Large (latest)",
576
+ release_date: "2024-11-01",
577
+ attachment: true,
578
+ reasoning: false,
579
+ temperature: true,
580
+ tool_call: true,
581
+ cost: {
582
+ input: 0.5,
583
+ output: 1.5
584
+ },
585
+ limit: {
586
+ context: 262144,
587
+ output: 262144
588
+ },
589
+ modalities: {
590
+ input: ["text", "image"],
591
+ output: ["text"]
592
+ }
593
+ }
594
+ }
595
+ },
596
+ {
597
+ id: "deepseek",
598
+ displayName: "DeepSeek",
599
+ apiMode: "chat_completions",
600
+ authType: "api_key",
601
+ baseUrl: "https://api.deepseek.com/v1",
602
+ envVars: ["DEEPSEEK_API_KEY"],
603
+ fallbackModels: ["deepseek-chat"],
604
+ capabilities: {
605
+ supportsToolUse: true,
606
+ supportsVision: false,
607
+ supportsStructuredOutput: true,
608
+ supportsStreaming: true,
609
+ supportsCacheControl: false
610
+ },
611
+ models: {
612
+ "deepseek-chat": {
613
+ name: "DeepSeek Chat",
614
+ release_date: "2025-12-01",
615
+ attachment: true,
616
+ reasoning: false,
617
+ temperature: true,
618
+ tool_call: true,
619
+ cost: {
620
+ input: 0.14,
621
+ output: 0.28,
622
+ cache_read: 28e-4
623
+ },
624
+ limit: {
625
+ context: 1e6,
626
+ output: 384e3
627
+ },
628
+ modalities: {
629
+ input: ["text"],
630
+ output: ["text"]
631
+ }
632
+ },
633
+ "deepseek-v4-flash": {
634
+ name: "DeepSeek V4 Flash",
635
+ release_date: "2026-04-24",
636
+ attachment: false,
637
+ reasoning: true,
638
+ temperature: true,
639
+ tool_call: true,
640
+ structured_output: false,
641
+ cost: {
642
+ input: 0.14,
643
+ output: 0.28,
644
+ cache_read: 28e-4
645
+ },
646
+ limit: {
647
+ context: 1048576,
648
+ output: 8e3
649
+ },
650
+ modalities: {
651
+ input: ["text"],
652
+ output: ["text"]
653
+ },
654
+ cache_control: false
655
+ },
656
+ "deepseek-v3.2": {
657
+ tool_call: true,
658
+ structured_output: false,
659
+ cache_control: false,
660
+ modalities: {
661
+ input: ["text"]
662
+ },
663
+ limit: {
664
+ context: 131072,
665
+ output: 8e3
666
+ }
667
+ }
668
+ }
669
+ },
670
+ {
671
+ id: "together",
672
+ displayName: "Together AI",
673
+ apiMode: "chat_completions",
674
+ authType: "api_key",
675
+ baseUrl: "https://api.together.xyz/v1",
676
+ envVars: ["TOGETHER_API_KEY"],
677
+ fallbackModels: ["meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo"],
678
+ capabilities: {
679
+ supportsToolUse: true,
680
+ supportsVision: true,
681
+ supportsStructuredOutput: true,
682
+ supportsStreaming: true,
683
+ supportsCacheControl: false
684
+ }
685
+ },
686
+ {
687
+ id: "fireworks",
688
+ displayName: "Fireworks AI",
689
+ apiMode: "chat_completions",
690
+ authType: "api_key",
691
+ baseUrl: "https://api.fireworks.ai/inference/v1",
692
+ envVars: ["FIREWORKS_API_KEY"],
693
+ fallbackModels: ["accounts/fireworks/models/llama-v3p1-70b-instruct"],
694
+ capabilities: {
695
+ supportsToolUse: true,
696
+ supportsVision: true,
697
+ supportsStructuredOutput: true,
698
+ supportsStreaming: true,
699
+ supportsCacheControl: false
700
+ }
701
+ },
702
+ {
703
+ id: "google-gemini",
704
+ displayName: "Google Gemini",
705
+ apiMode: "chat_completions",
706
+ authType: "api_key",
707
+ baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
708
+ envVars: ["GOOGLE_API_KEY", "GEMINI_API_KEY"],
709
+ fallbackModels: ["gemini-2.0-flash"],
710
+ capabilities: {
711
+ supportsToolUse: true,
712
+ supportsVision: true,
713
+ supportsStructuredOutput: true,
714
+ supportsStreaming: true,
715
+ supportsCacheControl: false
716
+ },
717
+ aliases: ["gemini", "google"],
718
+ models: {
719
+ "gemini-2.0-flash": {
720
+ name: "Gemini 2.0 Flash",
721
+ release_date: "2024-12-11",
722
+ attachment: true,
723
+ reasoning: false,
724
+ temperature: true,
725
+ tool_call: true,
726
+ structured_output: true,
727
+ cost: {
728
+ input: 0.1,
729
+ output: 0.4,
730
+ cache_read: 0.025
731
+ },
732
+ limit: {
733
+ context: 1048576,
734
+ output: 8192
735
+ },
736
+ modalities: {
737
+ input: ["text", "image", "audio", "video", "pdf"],
738
+ output: ["text"]
739
+ },
740
+ status: "deprecated"
741
+ },
742
+ "gemini-2.5-flash-lite": {
743
+ name: "Gemini 2.5 Flash-Lite",
744
+ release_date: "2025-06-17",
745
+ attachment: true,
746
+ reasoning: true,
747
+ temperature: true,
748
+ tool_call: true,
749
+ structured_output: true,
750
+ cost: {
751
+ input: 0.1,
752
+ output: 0.4,
753
+ cache_read: 0.01
754
+ },
755
+ limit: {
756
+ context: 1048576,
757
+ output: 8e3
758
+ },
759
+ modalities: {
760
+ input: ["text", "image"],
761
+ output: ["text"]
762
+ },
763
+ cache_control: false
764
+ },
765
+ "gemini-2.5-pro": {
766
+ name: "Gemini 2.5 Pro",
767
+ release_date: "2025-06-17",
768
+ attachment: true,
769
+ reasoning: true,
770
+ temperature: true,
771
+ tool_call: true,
772
+ structured_output: true,
773
+ cost: {
774
+ input: 1.25,
775
+ output: 10,
776
+ cache_read: 0.125
777
+ },
778
+ limit: {
779
+ context: 1048576,
780
+ output: 8e3
781
+ },
782
+ modalities: {
783
+ input: ["text", "image"],
784
+ output: ["text"]
785
+ },
786
+ cache_control: false
787
+ }
788
+ }
789
+ },
790
+ {
791
+ id: "ollama",
792
+ displayName: "Ollama",
793
+ apiMode: "chat_completions",
794
+ authType: "none",
795
+ baseUrl: "http://localhost:11434/v1",
796
+ envVars: [],
797
+ fallbackModels: ["llama3.2"],
798
+ capabilities: {
799
+ supportsToolUse: true,
800
+ supportsVision: true,
801
+ supportsStructuredOutput: true,
802
+ supportsStreaming: true,
803
+ supportsCacheControl: false
804
+ },
805
+ aliases: ["ollama"]
806
+ },
807
+ {
808
+ id: "lmstudio",
809
+ displayName: "LM Studio",
810
+ apiMode: "chat_completions",
811
+ authType: "none",
812
+ baseUrl: "http://localhost:1234/v1",
813
+ envVars: [],
814
+ fallbackModels: ["lmstudio-community/default"],
815
+ capabilities: {
816
+ supportsToolUse: true,
817
+ supportsVision: false,
818
+ supportsStructuredOutput: true,
819
+ supportsStreaming: true,
820
+ supportsCacheControl: false
821
+ },
822
+ aliases: ["lmstudio"]
823
+ },
824
+ {
825
+ id: "llamacpp",
826
+ displayName: "llama.cpp",
827
+ apiMode: "chat_completions",
828
+ authType: "none",
829
+ baseUrl: "http://localhost:8080/v1",
830
+ envVars: [],
831
+ fallbackModels: ["default"],
832
+ capabilities: {
833
+ supportsToolUse: true,
834
+ supportsVision: false,
835
+ supportsStructuredOutput: false,
836
+ supportsStreaming: true,
837
+ supportsCacheControl: false
838
+ },
839
+ aliases: ["llamacpp"]
840
+ },
841
+ {
842
+ id: "bedrock",
843
+ displayName: "AWS Bedrock",
844
+ apiMode: "bedrock",
845
+ authType: "aws_sdk",
846
+ baseUrl: "https://bedrock-runtime.us-east-1.amazonaws.com",
847
+ envVars: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
848
+ fallbackModels: ["anthropic.claude-3-5-sonnet-20241022-v2:0"],
849
+ capabilities: {
850
+ supportsToolUse: true,
851
+ supportsVision: true,
852
+ supportsStructuredOutput: false,
853
+ supportsStreaming: true,
854
+ supportsCacheControl: true
855
+ },
856
+ aliases: ["bedrock"]
857
+ },
858
+ {
859
+ id: "vertex",
860
+ displayName: "Google Vertex AI",
861
+ apiMode: "chat_completions",
862
+ authType: "gcp_oauth",
863
+ baseUrl: "https://us-central1-aiplatform.googleapis.com/v1",
864
+ envVars: ["GOOGLE_APPLICATION_CREDENTIALS"],
865
+ fallbackModels: ["gemini-1.5-pro"],
866
+ capabilities: {
867
+ supportsToolUse: true,
868
+ supportsVision: true,
869
+ supportsStructuredOutput: true,
870
+ supportsStreaming: true,
871
+ supportsCacheControl: false
872
+ },
873
+ aliases: ["vertex"]
874
+ },
875
+ {
876
+ id: "cohere",
877
+ displayName: "Cohere",
878
+ apiMode: "chat_completions",
879
+ authType: "api_key",
880
+ baseUrl: "https://api.cohere.com/v2",
881
+ envVars: ["COHERE_API_KEY"],
882
+ fallbackModels: ["command-r-plus"],
883
+ capabilities: {
884
+ supportsToolUse: true,
885
+ supportsVision: false,
886
+ supportsStructuredOutput: true,
887
+ supportsStreaming: true,
888
+ supportsCacheControl: false
889
+ }
890
+ },
891
+ {
892
+ id: "perplexity",
893
+ displayName: "Perplexity",
894
+ apiMode: "chat_completions",
895
+ authType: "api_key",
896
+ baseUrl: "https://api.perplexity.ai",
897
+ envVars: ["PERPLEXITY_API_KEY"],
898
+ fallbackModels: ["llama-3.1-sonar-large-128k-online"],
899
+ capabilities: {
900
+ supportsToolUse: false,
901
+ supportsVision: false,
902
+ supportsStructuredOutput: false,
903
+ supportsStreaming: true,
904
+ supportsCacheControl: false
905
+ }
906
+ },
907
+ {
908
+ id: "xai",
909
+ displayName: "xAI (Grok)",
910
+ apiMode: "chat_completions",
911
+ authType: "api_key",
912
+ baseUrl: "https://api.x.ai/v1",
913
+ envVars: ["XAI_API_KEY"],
914
+ fallbackModels: ["grok-2"],
915
+ capabilities: {
916
+ supportsToolUse: true,
917
+ supportsVision: true,
918
+ supportsStructuredOutput: true,
919
+ supportsStreaming: true,
920
+ supportsCacheControl: false
921
+ },
922
+ aliases: ["grok"]
923
+ },
924
+ {
925
+ id: "sambanova",
926
+ displayName: "SambaNova",
927
+ apiMode: "chat_completions",
928
+ authType: "api_key",
929
+ baseUrl: "https://api.sambanova.ai/v1",
930
+ envVars: ["SAMBANOVA_API_KEY"],
931
+ fallbackModels: ["Meta-Llama-3.1-70B-Instruct"],
932
+ capabilities: {
933
+ supportsToolUse: true,
934
+ supportsVision: false,
935
+ supportsStructuredOutput: true,
936
+ supportsStreaming: true,
937
+ supportsCacheControl: false
938
+ }
939
+ },
940
+ {
941
+ id: "cerebras",
942
+ displayName: "Cerebras",
943
+ apiMode: "chat_completions",
944
+ authType: "api_key",
945
+ baseUrl: "https://api.cerebras.ai/v1",
946
+ envVars: ["CEREBRAS_API_KEY"],
947
+ fallbackModels: ["llama3.1-70b"],
948
+ capabilities: {
949
+ supportsToolUse: true,
950
+ supportsVision: false,
951
+ supportsStructuredOutput: true,
952
+ supportsStreaming: true,
953
+ supportsCacheControl: false
954
+ }
955
+ },
956
+ {
957
+ id: "deepinfra",
958
+ displayName: "DeepInfra",
959
+ apiMode: "chat_completions",
960
+ authType: "api_key",
961
+ baseUrl: "https://api.deepinfra.com/v1/openai",
962
+ envVars: ["DEEPINFRA_API_KEY"],
963
+ fallbackModels: ["meta-llama/Meta-Llama-3.1-70B-Instruct"],
964
+ capabilities: {
965
+ supportsToolUse: true,
966
+ supportsVision: true,
967
+ supportsStructuredOutput: true,
968
+ supportsStreaming: true,
969
+ supportsCacheControl: false
970
+ }
971
+ },
972
+ {
973
+ id: "huggingface",
974
+ displayName: "Hugging Face",
975
+ apiMode: "chat_completions",
976
+ authType: "api_key",
977
+ baseUrl: "https://api-inference.huggingface.co/v1",
978
+ envVars: ["HF_TOKEN", "HUGGINGFACE_API_KEY"],
979
+ fallbackModels: ["meta-llama/Llama-3.2-3B-Instruct"],
980
+ capabilities: {
981
+ supportsToolUse: true,
982
+ supportsVision: false,
983
+ supportsStructuredOutput: false,
984
+ supportsStreaming: true,
985
+ supportsCacheControl: false
986
+ }
987
+ },
988
+ {
989
+ id: "nvidia",
990
+ displayName: "NVIDIA NIM",
991
+ apiMode: "chat_completions",
992
+ authType: "api_key",
993
+ baseUrl: "https://integrate.api.nvidia.com/v1",
994
+ envVars: ["NVIDIA_API_KEY"],
995
+ fallbackModels: ["meta/llama-3.1-70b-instruct"],
996
+ capabilities: {
997
+ supportsToolUse: true,
998
+ supportsVision: true,
999
+ supportsStructuredOutput: true,
1000
+ supportsStreaming: true,
1001
+ supportsCacheControl: false
1002
+ }
1003
+ },
1004
+ {
1005
+ id: "lepton",
1006
+ displayName: "Lepton AI",
1007
+ apiMode: "chat_completions",
1008
+ authType: "api_key",
1009
+ baseUrl: "https://llama3-1-70b.lepton.run/api/v1",
1010
+ envVars: ["LEPTON_API_KEY"],
1011
+ fallbackModels: ["llama3-1-70b"],
1012
+ capabilities: {
1013
+ supportsToolUse: true,
1014
+ supportsVision: false,
1015
+ supportsStructuredOutput: false,
1016
+ supportsStreaming: true,
1017
+ supportsCacheControl: false
1018
+ }
1019
+ },
1020
+ {
1021
+ id: "anyscale",
1022
+ displayName: "Anyscale",
1023
+ apiMode: "chat_completions",
1024
+ authType: "api_key",
1025
+ baseUrl: "https://api.endpoints.anyscale.com/v1",
1026
+ envVars: ["ANYSCALE_API_KEY"],
1027
+ fallbackModels: ["meta-llama/Meta-Llama-3-70B-Instruct"],
1028
+ capabilities: {
1029
+ supportsToolUse: true,
1030
+ supportsVision: false,
1031
+ supportsStructuredOutput: true,
1032
+ supportsStreaming: true,
1033
+ supportsCacheControl: false
1034
+ }
1035
+ },
1036
+ {
1037
+ id: "replicate",
1038
+ displayName: "Replicate",
1039
+ apiMode: "chat_completions",
1040
+ authType: "api_key",
1041
+ baseUrl: "https://openai-proxy.replicate.com/v1",
1042
+ envVars: ["REPLICATE_API_TOKEN"],
1043
+ fallbackModels: ["meta/meta-llama-3-70b-instruct"],
1044
+ capabilities: {
1045
+ supportsToolUse: false,
1046
+ supportsVision: true,
1047
+ supportsStructuredOutput: false,
1048
+ supportsStreaming: true,
1049
+ supportsCacheControl: false
1050
+ }
1051
+ },
1052
+ {
1053
+ id: "ai21",
1054
+ displayName: "AI21 Labs",
1055
+ apiMode: "chat_completions",
1056
+ authType: "api_key",
1057
+ baseUrl: "https://api.ai21.com/studio/v1",
1058
+ envVars: ["AI21_API_KEY"],
1059
+ fallbackModels: ["jamba-1.5-large"],
1060
+ capabilities: {
1061
+ supportsToolUse: true,
1062
+ supportsVision: false,
1063
+ supportsStructuredOutput: true,
1064
+ supportsStreaming: true,
1065
+ supportsCacheControl: false
1066
+ }
1067
+ },
1068
+ {
1069
+ id: "aleph-alpha",
1070
+ displayName: "Aleph Alpha",
1071
+ apiMode: "chat_completions",
1072
+ authType: "api_key",
1073
+ baseUrl: "https://api.aleph-alpha.com/v1",
1074
+ envVars: ["ALEPH_ALPHA_API_KEY"],
1075
+ fallbackModels: ["luminous-extended"],
1076
+ capabilities: {
1077
+ supportsToolUse: false,
1078
+ supportsVision: false,
1079
+ supportsStructuredOutput: false,
1080
+ supportsStreaming: true,
1081
+ supportsCacheControl: false
1082
+ }
1083
+ },
1084
+ {
1085
+ id: "cloudflare",
1086
+ displayName: "Cloudflare Workers AI",
1087
+ apiMode: "chat_completions",
1088
+ authType: "api_key",
1089
+ baseUrl: "https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/v1",
1090
+ envVars: ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID"],
1091
+ fallbackModels: ["@cf/meta/llama-3.1-70b-instruct"],
1092
+ capabilities: {
1093
+ supportsToolUse: true,
1094
+ supportsVision: false,
1095
+ supportsStructuredOutput: false,
1096
+ supportsStreaming: true,
1097
+ supportsCacheControl: false
1098
+ }
1099
+ },
1100
+ {
1101
+ id: "azure-openai",
1102
+ displayName: "Azure OpenAI",
1103
+ apiMode: "chat_completions",
1104
+ authType: "api_key",
1105
+ baseUrl: "https://{resource}.openai.azure.com/openai/deployments/{deployment}",
1106
+ envVars: ["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT"],
1107
+ fallbackModels: ["gpt-4o"],
1108
+ capabilities: {
1109
+ supportsToolUse: true,
1110
+ supportsVision: true,
1111
+ supportsStructuredOutput: true,
1112
+ supportsStreaming: true,
1113
+ supportsCacheControl: false
1114
+ }
1115
+ },
1116
+ {
1117
+ id: "github-models",
1118
+ displayName: "GitHub Models",
1119
+ apiMode: "chat_completions",
1120
+ authType: "api_key",
1121
+ baseUrl: "https://models.inference.ai.azure.com",
1122
+ envVars: ["GITHUB_TOKEN"],
1123
+ fallbackModels: ["gpt-4o-mini"],
1124
+ capabilities: {
1125
+ supportsToolUse: true,
1126
+ supportsVision: true,
1127
+ supportsStructuredOutput: true,
1128
+ supportsStreaming: true,
1129
+ supportsCacheControl: false
1130
+ }
1131
+ },
1132
+ {
1133
+ id: "hyperbolic",
1134
+ displayName: "Hyperbolic",
1135
+ apiMode: "chat_completions",
1136
+ authType: "api_key",
1137
+ baseUrl: "https://api.hyperbolic.xyz/v1",
1138
+ envVars: ["HYPERBOLIC_API_KEY"],
1139
+ fallbackModels: ["meta-llama/Meta-Llama-3.1-70B-Instruct"],
1140
+ capabilities: {
1141
+ supportsToolUse: true,
1142
+ supportsVision: false,
1143
+ supportsStructuredOutput: true,
1144
+ supportsStreaming: true,
1145
+ supportsCacheControl: false
1146
+ }
1147
+ },
1148
+ {
1149
+ id: "novita",
1150
+ displayName: "Novita AI",
1151
+ apiMode: "chat_completions",
1152
+ authType: "api_key",
1153
+ baseUrl: "https://api.novita.ai/v3/openai",
1154
+ envVars: ["NOVITA_API_KEY"],
1155
+ fallbackModels: ["meta-llama/llama-3.1-70b-instruct"],
1156
+ capabilities: {
1157
+ supportsToolUse: true,
1158
+ supportsVision: false,
1159
+ supportsStructuredOutput: true,
1160
+ supportsStreaming: true,
1161
+ supportsCacheControl: false
1162
+ }
1163
+ },
1164
+ {
1165
+ id: "moonshot",
1166
+ displayName: "Moonshot (Kimi)",
1167
+ apiMode: "chat_completions",
1168
+ authType: "api_key",
1169
+ baseUrl: "https://api.moonshot.cn/v1",
1170
+ envVars: ["MOONSHOT_API_KEY"],
1171
+ fallbackModels: ["moonshot-v1-8k"],
1172
+ capabilities: {
1173
+ supportsToolUse: true,
1174
+ supportsVision: false,
1175
+ supportsStructuredOutput: false,
1176
+ supportsStreaming: true,
1177
+ supportsCacheControl: false
1178
+ }
1179
+ },
1180
+ {
1181
+ id: "qwen",
1182
+ displayName: "Qwen (Alibaba)",
1183
+ apiMode: "chat_completions",
1184
+ authType: "api_key",
1185
+ baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",
1186
+ envVars: ["DASHSCOPE_API_KEY"],
1187
+ fallbackModels: ["qwen-plus"],
1188
+ capabilities: {
1189
+ supportsToolUse: true,
1190
+ supportsVision: true,
1191
+ supportsStructuredOutput: true,
1192
+ supportsStreaming: true,
1193
+ supportsCacheControl: false
1194
+ },
1195
+ aliases: ["dashscope"],
1196
+ models: {
1197
+ "qwen3-coder-30b-a3b-instruct": {
1198
+ tool_call: true,
1199
+ structured_output: false,
1200
+ cache_control: false,
1201
+ modalities: {
1202
+ input: ["text"]
1203
+ },
1204
+ limit: {
1205
+ context: 16e4,
1206
+ output: 8e3
1207
+ }
1208
+ }
1209
+ }
1210
+ },
1211
+ {
1212
+ id: "zhipu",
1213
+ displayName: "Zhipu AI (GLM)",
1214
+ apiMode: "chat_completions",
1215
+ authType: "api_key",
1216
+ baseUrl: "https://open.bigmodel.cn/api/paas/v4",
1217
+ envVars: ["ZHIPU_API_KEY"],
1218
+ fallbackModels: ["glm-4-plus"],
1219
+ capabilities: {
1220
+ supportsToolUse: true,
1221
+ supportsVision: true,
1222
+ supportsStructuredOutput: true,
1223
+ supportsStreaming: true,
1224
+ supportsCacheControl: false
1225
+ },
1226
+ aliases: ["glm", "z-ai"],
1227
+ models: {
1228
+ "glm-4.7-flash": {
1229
+ name: "GLM-4.7-Flash",
1230
+ release_date: "2026-01-19",
1231
+ attachment: false,
1232
+ reasoning: true,
1233
+ temperature: true,
1234
+ tool_call: true,
1235
+ cost: {
1236
+ input: 0,
1237
+ output: 0,
1238
+ cache_read: 0,
1239
+ cache_write: 0
1240
+ },
1241
+ limit: {
1242
+ context: 202752,
1243
+ output: 8e3
1244
+ },
1245
+ modalities: {
1246
+ input: ["text"],
1247
+ output: ["text"]
1248
+ },
1249
+ structured_output: false,
1250
+ cache_control: false
1251
+ }
1252
+ }
1253
+ },
1254
+ {
1255
+ id: "minimax",
1256
+ displayName: "MiniMax",
1257
+ apiMode: "chat_completions",
1258
+ authType: "api_key",
1259
+ baseUrl: "https://api.minimax.chat/v1",
1260
+ envVars: ["MINIMAX_API_KEY"],
1261
+ fallbackModels: ["MiniMax-Text-01"],
1262
+ capabilities: {
1263
+ supportsToolUse: true,
1264
+ supportsVision: false,
1265
+ supportsStructuredOutput: false,
1266
+ supportsStreaming: true,
1267
+ supportsCacheControl: false
1268
+ }
1269
+ },
1270
+ {
1271
+ id: "baichuan",
1272
+ displayName: "Baichuan",
1273
+ apiMode: "chat_completions",
1274
+ authType: "api_key",
1275
+ baseUrl: "https://api.baichuan-ai.com/v1",
1276
+ envVars: ["BAICHUAN_API_KEY"],
1277
+ fallbackModels: ["Baichuan4"],
1278
+ capabilities: {
1279
+ supportsToolUse: true,
1280
+ supportsVision: false,
1281
+ supportsStructuredOutput: false,
1282
+ supportsStreaming: true,
1283
+ supportsCacheControl: false
1284
+ }
1285
+ },
1286
+ {
1287
+ id: "voyage",
1288
+ displayName: "Voyage AI",
1289
+ apiMode: "chat_completions",
1290
+ authType: "api_key",
1291
+ baseUrl: "https://api.voyageai.com/v1",
1292
+ envVars: ["VOYAGE_API_KEY"],
1293
+ fallbackModels: ["voyage-3"],
1294
+ capabilities: {
1295
+ supportsToolUse: false,
1296
+ supportsVision: false,
1297
+ supportsStructuredOutput: false,
1298
+ supportsStreaming: false,
1299
+ supportsCacheControl: false
1300
+ }
1301
+ },
1302
+ {
1303
+ id: "jina",
1304
+ displayName: "Jina AI",
1305
+ apiMode: "chat_completions",
1306
+ authType: "api_key",
1307
+ baseUrl: "https://api.jina.ai/v1",
1308
+ envVars: ["JINA_API_KEY"],
1309
+ fallbackModels: ["jina-embeddings-v3"],
1310
+ capabilities: {
1311
+ supportsToolUse: false,
1312
+ supportsVision: false,
1313
+ supportsStructuredOutput: false,
1314
+ supportsStreaming: false,
1315
+ supportsCacheControl: false
1316
+ }
1317
+ },
1318
+ {
1319
+ id: "helicone",
1320
+ displayName: "Helicone (Gateway)",
1321
+ apiMode: "chat_completions",
1322
+ authType: "api_key",
1323
+ baseUrl: "https://oai.helicone.ai/v1",
1324
+ envVars: ["HELICONE_API_KEY", "OPENAI_API_KEY"],
1325
+ fallbackModels: ["gpt-4o-mini"],
1326
+ capabilities: {
1327
+ supportsToolUse: true,
1328
+ supportsVision: true,
1329
+ supportsStructuredOutput: true,
1330
+ supportsStreaming: true,
1331
+ supportsCacheControl: false
1332
+ },
1333
+ models: {
1334
+ "gpt-4o-mini": {
1335
+ name: "OpenAI GPT-4o-mini",
1336
+ release_date: "2024-07-18",
1337
+ attachment: false,
1338
+ reasoning: false,
1339
+ temperature: true,
1340
+ tool_call: true,
1341
+ cost: {
1342
+ input: 0.15,
1343
+ output: 0.6,
1344
+ cache_read: 0.075
1345
+ },
1346
+ limit: {
1347
+ context: 128e3,
1348
+ output: 16384
1349
+ },
1350
+ modalities: {
1351
+ input: ["text", "image"],
1352
+ output: ["text"]
1353
+ }
1354
+ }
1355
+ }
1356
+ },
1357
+ {
1358
+ id: "portkey",
1359
+ displayName: "Portkey (Gateway)",
1360
+ apiMode: "chat_completions",
1361
+ authType: "api_key",
1362
+ baseUrl: "https://api.portkey.ai/v1",
1363
+ envVars: ["PORTKEY_API_KEY"],
1364
+ fallbackModels: ["gpt-4o-mini"],
1365
+ capabilities: {
1366
+ supportsToolUse: true,
1367
+ supportsVision: true,
1368
+ supportsStructuredOutput: true,
1369
+ supportsStreaming: true,
1370
+ supportsCacheControl: false
1371
+ }
1372
+ },
1373
+ {
1374
+ id: "baseten",
1375
+ displayName: "Baseten",
1376
+ apiMode: "chat_completions",
1377
+ authType: "api_key",
1378
+ baseUrl: "https://bridge.baseten.co/v1",
1379
+ envVars: ["BASETEN_API_KEY"],
1380
+ fallbackModels: ["meta-llama/Meta-Llama-3-70B-Instruct"],
1381
+ capabilities: {
1382
+ supportsToolUse: true,
1383
+ supportsVision: false,
1384
+ supportsStructuredOutput: true,
1385
+ supportsStreaming: true,
1386
+ supportsCacheControl: false
1387
+ }
1388
+ },
1389
+ {
1390
+ id: "modal",
1391
+ displayName: "Modal",
1392
+ apiMode: "chat_completions",
1393
+ authType: "api_key",
1394
+ baseUrl: "https://api.modal.com/v1",
1395
+ envVars: ["MODAL_TOKEN_ID", "MODAL_TOKEN_SECRET"],
1396
+ fallbackModels: ["meta-llama/Meta-Llama-3-70B-Instruct"],
1397
+ capabilities: {
1398
+ supportsToolUse: true,
1399
+ supportsVision: false,
1400
+ supportsStructuredOutput: false,
1401
+ supportsStreaming: true,
1402
+ supportsCacheControl: false
1403
+ }
1404
+ }
1405
+ ];
1406
+
1407
+ // src/internal/providers/catalog-loader.ts
1408
+ var modelInfoIndex = chunkNVXXWAU7_cjs.globalSingleton(
1409
+ "theokit-sdk.providers.model-info-index",
1410
+ () => /* @__PURE__ */ new Map()
1411
+ );
1412
+ var patchedModelKeys = chunkNVXXWAU7_cjs.globalSingleton(
1413
+ "theokit-sdk.providers.model-info-patched",
1414
+ () => /* @__PURE__ */ new Set()
1415
+ );
1416
+ var indexState = chunkNVXXWAU7_cjs.globalSingleton("theokit-sdk.providers.model-info-loaded", () => ({
1417
+ loaded: false
1418
+ }));
1419
+ function getCatalogModelInfo(key) {
1420
+ ensureModelIndexLoaded();
1421
+ return modelInfoIndex.get(key);
1422
+ }
1423
+ function isPatchedModelKey(key) {
1424
+ return patchedModelKeys.has(key);
1425
+ }
1426
+ function patchModelInfo(key, model) {
1427
+ ensureModelIndexLoaded();
1428
+ const existing = modelInfoIndex.get(key);
1429
+ modelInfoIndex.set(key, existing === void 0 ? model : { ...existing, ...model });
1430
+ patchedModelKeys.add(key);
1431
+ }
1432
+ function ensureModelIndexLoaded() {
1433
+ if (indexState.loaded) return;
1434
+ indexState.loaded = true;
1435
+ try {
1436
+ const catalog = loadProviderCatalog();
1437
+ for (const entry of Object.values(catalog)) {
1438
+ indexEntryModels(entry);
1439
+ }
1440
+ } catch (err) {
1441
+ chunk6LHQPOMI_cjs.diag(
1442
+ `[theokit-sdk] WARN: provider catalog unavailable (${err.message}) \u2014 per-model data disabled
1443
+ `
1444
+ );
1445
+ }
1446
+ }
1447
+ function indexEntryModels(entry) {
1448
+ if (entry.models === void 0 || typeof entry.models !== "object") return;
1449
+ for (const [modelId, raw] of Object.entries(entry.models)) {
1450
+ const parsed = catalogModelSchema.safeParse(raw);
1451
+ if (!parsed.success) {
1452
+ chunk6LHQPOMI_cjs.diag(
1453
+ `[theokit-sdk] WARN: Skipping malformed catalog model "${entry.id}/${modelId}": ${parsed.error.issues[0]?.message ?? "invalid"}
1454
+ `
1455
+ );
1456
+ continue;
1457
+ }
1458
+ modelInfoIndex.set(`${entry.id}/${modelId}`, parsed.data);
1459
+ for (const alias of entry.aliases ?? []) {
1460
+ const key = `${alias}/${modelId}`;
1461
+ if (!modelInfoIndex.has(key)) modelInfoIndex.set(key, parsed.data);
1462
+ }
1463
+ }
1464
+ }
1465
+ function validateEntry(raw) {
1466
+ const parsed = catalogEntrySchema.safeParse(raw);
1467
+ return parsed.success ? parsed.data : null;
1468
+ }
1469
+ function loadProviderCatalog(opts) {
1470
+ let entries = [...provider_catalog_default];
1471
+ if (opts?._testInjectMalformed) {
1472
+ entries = [
1473
+ ...entries,
1474
+ { id: "malformed-provider", displayName: "Bad" }
1475
+ ];
1476
+ }
1477
+ const result = {};
1478
+ for (const raw of entries) {
1479
+ const validated = validateEntry(raw);
1480
+ if (validated === null) {
1481
+ chunk6LHQPOMI_cjs.diag(
1482
+ `[theokit-sdk] WARN: Skipping malformed catalog entry: ${JSON.stringify(raw).slice(0, 100)}
1483
+ `
1484
+ );
1485
+ continue;
1486
+ }
1487
+ result[validated.id] = validated;
1488
+ }
1489
+ return result;
1490
+ }
1491
+ var _capabilitiesCache = null;
1492
+ function getCatalogCapabilities(providerId) {
1493
+ if (_capabilitiesCache === null) {
1494
+ const catalog = loadProviderCatalog();
1495
+ _capabilitiesCache = {};
1496
+ for (const entry of Object.values(catalog)) {
1497
+ _capabilitiesCache[entry.id] = entry.capabilities;
1498
+ for (const alias of entry.aliases ?? []) {
1499
+ if (_capabilitiesCache[alias] === void 0) _capabilitiesCache[alias] = entry.capabilities;
1500
+ }
1501
+ }
1502
+ }
1503
+ return _capabilitiesCache[providerId];
1504
+ }
1505
+ function registerCatalogProviders(opts) {
1506
+ const catalog = loadProviderCatalog(opts);
1507
+ for (const entry of Object.values(catalog)) {
1508
+ if (getProviderProfile(entry.id) !== void 0) continue;
1509
+ if (entry.aliases?.some((a) => getProviderProfile(a) !== void 0)) continue;
1510
+ const profile = {
1511
+ name: entry.id,
1512
+ apiMode: entry.apiMode,
1513
+ authType: entry.authType,
1514
+ baseUrl: entry.baseUrl,
1515
+ envVars: entry.envVars,
1516
+ fallbackModels: entry.fallbackModels,
1517
+ displayName: entry.displayName,
1518
+ aliases: entry.aliases,
1519
+ modelsUrl: entry.modelsUrl,
1520
+ hostname: entry.hostname,
1521
+ extraHeaders: entry.extraHeaders
1522
+ };
1523
+ registerProvider(profile);
1524
+ }
1525
+ }
1526
+
1527
+ // src/internal/providers/builtin/anthropic.ts
1528
+ var ANTHROPIC = {
1529
+ name: "anthropic",
1530
+ apiMode: "anthropic_messages",
1531
+ envVars: ["ANTHROPIC_API_KEY"],
1532
+ authType: "api_key",
1533
+ baseUrl: "https://api.anthropic.com",
1534
+ modelsUrl: "https://api.anthropic.com/v1/models",
1535
+ hostname: "api.anthropic.com",
1536
+ fallbackModels: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5-20251001"],
1537
+ // M45 — the Anthropic beta-features header (interleaved thinking + fine-grained tool streaming). An
1538
+ // Anthropic API constant. The
1539
+ // SANCTIONED behavior delta of M45 (ADR D4) — consumed by the anthropic transport's extraHeaders wiring.
1540
+ extraHeaders: {
1541
+ "anthropic-beta": "interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"
1542
+ }
1543
+ };
1544
+
1545
+ // src/internal/providers/builtin/bedrock.ts
1546
+ var BEDROCK = {
1547
+ name: "bedrock",
1548
+ apiMode: "bedrock_anthropic",
1549
+ envVars: ["AWS_BEARER_TOKEN_BEDROCK"],
1550
+ authType: "aws_bearer",
1551
+ baseUrl: "https://bedrock-runtime.us-east-1.amazonaws.com",
1552
+ modelsUrl: void 0,
1553
+ hostname: "bedrock-runtime.amazonaws.com",
1554
+ fallbackModels: [
1555
+ "bedrock/us.anthropic.claude-sonnet-4-5-v1:0",
1556
+ "bedrock/us.anthropic.claude-opus-4-7-v1:0",
1557
+ "bedrock/global.anthropic.claude-haiku-4-5-v1:0"
1558
+ ]
1559
+ };
1560
+ function stripBedrockPrefix(modelId) {
1561
+ return modelId.replace(/^bedrock\//, "");
1562
+ }
1563
+ function inferRegionFromModelId(modelId) {
1564
+ const id = stripBedrockPrefix(modelId);
1565
+ if (id.startsWith("global.")) return "us-east-1";
1566
+ if (id.startsWith("us.")) return process.env.AWS_REGION ?? "us-east-1";
1567
+ if (id.startsWith("eu.")) return process.env.AWS_REGION ?? "eu-west-1";
1568
+ if (id.startsWith("apac.")) return process.env.AWS_REGION ?? "ap-southeast-1";
1569
+ if (id.startsWith("jp.")) return "ap-northeast-1";
1570
+ return void 0;
1571
+ }
1572
+ function resolveBedrockBaseUrl(modelId) {
1573
+ const region = inferRegionFromModelId(modelId) ?? process.env.AWS_REGION ?? "us-east-1";
1574
+ return `https://bedrock-runtime.${region}.amazonaws.com`;
1575
+ }
1576
+
1577
+ // src/internal/providers/builtin/openai-compatible.ts
1578
+ function openAiCompatibleProfile(p) {
1579
+ return {
1580
+ apiMode: "chat_completions",
1581
+ authType: "api_key",
1582
+ fallbackModels: [],
1583
+ ...p
1584
+ };
1585
+ }
1586
+
1587
+ // src/internal/providers/builtin/cerebras.ts
1588
+ var CEREBRAS = openAiCompatibleProfile({
1589
+ name: "cerebras",
1590
+ baseUrl: "https://api.cerebras.ai/v1",
1591
+ envVars: ["CEREBRAS_API_KEY"],
1592
+ fallbackModels: ["gpt-oss-120b", "zai-glm-4.7"],
1593
+ extraHeaders: { "X-Cerebras-3rd-Party-Integration": "theokit" },
1594
+ hostname: "api.cerebras.ai"
1595
+ });
1596
+
1597
+ // src/internal/providers/builtin/cohere.ts
1598
+ var COHERE = openAiCompatibleProfile({
1599
+ name: "cohere",
1600
+ baseUrl: "https://api.cohere.ai/compatibility/v1",
1601
+ envVars: ["COHERE_API_KEY", "CO_API_KEY"],
1602
+ fallbackModels: ["command-a-03-2025"],
1603
+ hostname: "api.cohere.ai"
1604
+ });
1605
+
1606
+ // src/internal/providers/builtin/deepinfra.ts
1607
+ var DEEPINFRA = openAiCompatibleProfile({
1608
+ name: "deepinfra",
1609
+ baseUrl: "https://api.deepinfra.com/v1/openai",
1610
+ envVars: ["DEEPINFRA_API_KEY"],
1611
+ fallbackModels: ["Qwen/Qwen3-32B"],
1612
+ hostname: "api.deepinfra.com"
1613
+ });
1614
+
1615
+ // src/internal/providers/builtin/gemini.ts
1616
+ var GEMINI = {
1617
+ name: "gemini",
1618
+ apiMode: "chat_completions",
1619
+ envVars: ["OPENROUTER_API_KEY"],
1620
+ authType: "api_key",
1621
+ baseUrl: "https://openrouter.ai/api",
1622
+ hostname: "openrouter.ai",
1623
+ fallbackModels: ["google/gemini-2.0-flash-001"]
1624
+ };
1625
+
1626
+ // src/internal/providers/builtin/google.ts
1627
+ var GOOGLE = openAiCompatibleProfile({
1628
+ name: "google",
1629
+ baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
1630
+ envVars: ["GOOGLE_API_KEY", "GEMINI_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"],
1631
+ fallbackModels: ["gemini-2.5-pro", "gemini-2.5-flash"],
1632
+ hostname: "generativelanguage.googleapis.com"
1633
+ });
1634
+
1635
+ // src/internal/providers/builtin/groq.ts
1636
+ var GROQ = openAiCompatibleProfile({
1637
+ name: "groq",
1638
+ baseUrl: "https://api.groq.com/openai/v1",
1639
+ envVars: ["GROQ_API_KEY"],
1640
+ fallbackModels: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant"],
1641
+ hostname: "api.groq.com"
1642
+ });
1643
+
1644
+ // src/internal/providers/builtin/llamacpp.ts
1645
+ var LLAMACPP = {
1646
+ name: "llamacpp",
1647
+ aliases: ["llama-cpp", "llama.cpp"],
1648
+ apiMode: "chat_completions",
1649
+ envVars: ["LLAMACPP_API_KEY"],
1650
+ authType: "none",
1651
+ baseUrl: "http://localhost:8080",
1652
+ modelsUrl: "http://localhost:8080/v1/models",
1653
+ hostname: "localhost",
1654
+ fallbackModels: ["loaded-model"]
1655
+ };
1656
+
1657
+ // src/internal/providers/builtin/lmstudio.ts
1658
+ var LMSTUDIO = {
1659
+ name: "lmstudio",
1660
+ aliases: ["lm-studio", "lm_studio"],
1661
+ apiMode: "chat_completions",
1662
+ envVars: ["LMSTUDIO_API_KEY"],
1663
+ authType: "none",
1664
+ baseUrl: "http://localhost:1234",
1665
+ modelsUrl: "http://localhost:1234/v1/models",
1666
+ hostname: "localhost",
1667
+ fallbackModels: ["loaded-model"]
1668
+ };
1669
+
1670
+ // src/internal/providers/builtin/mistral.ts
1671
+ var MISTRAL = openAiCompatibleProfile({
1672
+ name: "mistral",
1673
+ baseUrl: "https://api.mistral.ai/v1",
1674
+ envVars: ["MISTRAL_API_KEY"],
1675
+ fallbackModels: ["mistral-large-latest", "codestral-latest"],
1676
+ hostname: "api.mistral.ai"
1677
+ });
1678
+
1679
+ // src/internal/providers/builtin/ollama.ts
1680
+ var OLLAMA = {
1681
+ name: "ollama",
1682
+ apiMode: "chat_completions",
1683
+ envVars: ["OLLAMA_API_KEY"],
1684
+ authType: "none",
1685
+ baseUrl: "http://localhost:11434",
1686
+ modelsUrl: "http://localhost:11434/v1/models",
1687
+ hostname: "localhost",
1688
+ fallbackModels: ["llama3.2", "qwen2.5", "mistral"]
1689
+ };
1690
+
1691
+ // src/internal/providers/builtin/openai.ts
1692
+ var OPENAI = {
1693
+ name: "openai",
1694
+ apiMode: "chat_completions",
1695
+ envVars: ["OPENAI_API_KEY"],
1696
+ authType: "api_key",
1697
+ baseUrl: "https://api.openai.com",
1698
+ modelsUrl: "https://api.openai.com/v1/models",
1699
+ hostname: "api.openai.com",
1700
+ fallbackModels: ["gpt-4o", "gpt-4o-mini"]
1701
+ };
1702
+ var DEFAULT_STORE = {
1703
+ home: os.homedir(),
1704
+ dirName: ".theokit",
1705
+ fileName: "auth.json",
1706
+ homeEnvVar: "THEOKIT_AUTH_HOME"
1707
+ };
1708
+ var OPENAI_OAUTH_CONFIG = {
1709
+ provider: "openai",
1710
+ authorizeEndpoint: "https://auth.openai.com/oauth/authorize",
1711
+ tokenEndpoint: "https://auth.openai.com/oauth/token",
1712
+ clientId: "app_EMoamEEZ73f0CkXaXp7hrann",
1713
+ scopes: ["openid", "profile", "email", "offline_access"],
1714
+ redirectUri: "https://auth.openai.com/deviceauth/callback"
1715
+ };
1716
+ function codexFetch() {
1717
+ return (async (input, init) => {
1718
+ const env = process.env;
1719
+ const resolved = await chunkSKDNCTXG_cjs.resolveCredential({
1720
+ provider: "openai",
1721
+ store: DEFAULT_STORE,
1722
+ oauth: OPENAI_OAUTH_CONFIG,
1723
+ env
1724
+ });
1725
+ if (resolved === void 0) {
1726
+ throw new chunkUNFBHV46_cjs.AuthenticationError(
1727
+ 'openai-chatgpt: no ChatGPT credential found \u2014 run the OpenAI device login (e.g. "/login openai") first.',
1728
+ { code: "missing_credential" }
1729
+ );
1730
+ }
1731
+ const accountId = chunkNAGPKWOD_cjs.readStoredOAuth(DEFAULT_STORE, env)?.account_id;
1732
+ const headers = new Headers(init?.headers);
1733
+ headers.set("authorization", `Bearer ${resolved.apiKey}`);
1734
+ if (accountId !== void 0) headers.set("ChatGPT-Account-Id", accountId);
1735
+ return fetch(input, { ...init, headers });
1736
+ });
1737
+ }
1738
+ var OPENAI_CHATGPT = {
1739
+ name: "openai-chatgpt",
1740
+ apiMode: "responses_api",
1741
+ authType: "oauth_device_code",
1742
+ baseUrl: "https://chatgpt.com/backend-api/codex",
1743
+ envVars: [],
1744
+ fallbackModels: [
1745
+ "openai-chatgpt/gpt-5.4",
1746
+ "openai-chatgpt/gpt-5.4-mini",
1747
+ "openai-chatgpt/gpt-5.5"
1748
+ ],
1749
+ // #165 — this shipped as `codex_cli_rs`, another vendor's client identifier. Claiming to be a different
1750
+ // vendor's client is a false statement of identity. Third-party clients send their OWN name against
1751
+ // this same endpoint, which also shows the route is not restricted to the official client.
1752
+ extraHeaders: { originator: "theokit" },
1753
+ // usetheokit/theokit-sdk#383 — carry the model's encrypted reasoning between the rounds of a turn.
1754
+ // On for THIS profile and no other because this is the endpoint the issue measured: OpenAI Codex
1755
+ // sends `include: ["reasoning.encrypted_content"]` with `reasoning.context: "all_turns"` to the
1756
+ // same backend, same model, on the same account, so acceptance is observed rather than assumed.
1757
+ // The issue's measurement — a third of our bytes, 2.8x our tokens — is what this closes together
1758
+ // with `prompt_cache_key`.
1759
+ encryptedReasoning: true,
1760
+ transform: {
1761
+ // Only `fetch` (async) can await the credential refresh; `headers` is sync and cannot.
1762
+ fetch: () => codexFetch()
1763
+ }
1764
+ };
1765
+
1766
+ // src/internal/providers/builtin/openrouter.ts
1767
+ var OPENROUTER = {
1768
+ name: "openrouter",
1769
+ apiMode: "chat_completions",
1770
+ aliases: ["or"],
1771
+ // Ordered fallback (EC-10): OPENROUTER_API_KEY preferred, OPENAI_API_KEY as compat.
1772
+ envVars: ["OPENROUTER_API_KEY", "OPENAI_API_KEY"],
1773
+ authType: "api_key",
1774
+ baseUrl: "https://openrouter.ai/api",
1775
+ modelsUrl: "https://openrouter.ai/api/v1/models",
1776
+ hostname: "openrouter.ai",
1777
+ // M45 — models refreshed (claude-3-haiku retired upstream).
1778
+ fallbackModels: ["openai/gpt-4o-mini", "anthropic/claude-haiku-4-5"],
1779
+ // M45 — OpenRouter app-attribution headers. VALUES are
1780
+ // theokit's own — copying another app's referer would misattribute traffic).
1781
+ extraHeaders: { "HTTP-Referer": "https://usetheo.dev", "X-Title": "theokit" }
1782
+ };
1783
+
1784
+ // src/internal/providers/builtin/perplexity.ts
1785
+ var PERPLEXITY = openAiCompatibleProfile({
1786
+ name: "perplexity",
1787
+ baseUrl: "https://api.perplexity.ai",
1788
+ chatCompletionsPath: "/chat/completions",
1789
+ envVars: ["PERPLEXITY_API_KEY"],
1790
+ fallbackModels: ["sonar-pro", "sonar"],
1791
+ hostname: "api.perplexity.ai"
1792
+ });
1793
+
1794
+ // src/internal/providers/builtin/together.ts
1795
+ var TOGETHER = openAiCompatibleProfile({
1796
+ name: "together",
1797
+ aliases: ["togetherai"],
1798
+ baseUrl: "https://api.together.xyz/v1",
1799
+ envVars: ["TOGETHER_API_KEY"],
1800
+ fallbackModels: ["Qwen/Qwen2.5-7B-Instruct-Turbo"],
1801
+ hostname: "api.together.xyz"
1802
+ });
1803
+
1804
+ // src/internal/providers/builtin/vertex.ts
1805
+ var VERTEX = {
1806
+ name: "vertex",
1807
+ apiMode: "anthropic_messages",
1808
+ // sub-dispatched in selectTransport by profile.name
1809
+ envVars: ["GOOGLE_APPLICATION_CREDENTIALS"],
1810
+ authType: "gcp_oauth",
1811
+ baseUrl: "https://us-central1-aiplatform.googleapis.com",
1812
+ modelsUrl: void 0,
1813
+ hostname: "aiplatform.googleapis.com",
1814
+ fallbackModels: [
1815
+ "vertex/anthropic/claude-sonnet-4-5@20250929",
1816
+ "vertex/google/gemini-2.0-flash-001"
1817
+ ]
1818
+ };
1819
+ function resolveVertexBaseUrl(opts) {
1820
+ const host = opts.location === "global" ? "aiplatform.googleapis.com" : `${opts.location}-aiplatform.googleapis.com`;
1821
+ if (opts.modelDialect === "gemini") {
1822
+ return `https://${host}/v1/projects/${opts.projectId}/locations/${opts.location}/endpoints/openapi`;
1823
+ }
1824
+ return `https://${host}/v1/projects/${opts.projectId}/locations/${opts.location}/publishers/anthropic`;
1825
+ }
1826
+ function inferModelDialect(modelId) {
1827
+ if (modelId.includes("/anthropic/")) return "anthropic";
1828
+ if (modelId.includes("/google/")) return "gemini";
1829
+ return "gemini";
1830
+ }
1831
+ function stripVertexPrefix(modelId) {
1832
+ return modelId.replace(/^vertex\/(anthropic|google)\//, "");
1833
+ }
1834
+
1835
+ // src/internal/providers/builtin/xai.ts
1836
+ var XAI = openAiCompatibleProfile({
1837
+ name: "xai",
1838
+ aliases: ["grok"],
1839
+ baseUrl: "https://api.x.ai/v1",
1840
+ envVars: ["XAI_API_KEY"],
1841
+ fallbackModels: ["grok-4.5", "grok-4.3"],
1842
+ hostname: "api.x.ai"
1843
+ });
1844
+
1845
+ // src/internal/providers/builtin/index.ts
1846
+ var _registeredState = chunkNVXXWAU7_cjs.globalSingleton("theokit-sdk.providers.builtins-registered", () => ({
1847
+ done: false
1848
+ }));
1849
+ function registerBuiltins() {
1850
+ if (_registeredState.done) return;
1851
+ _registeredState.done = true;
1852
+ registerProvider(ANTHROPIC);
1853
+ registerProvider(OPENAI);
1854
+ registerProvider(OPENAI_CHATGPT);
1855
+ registerProvider(OPENROUTER);
1856
+ registerProvider(GEMINI);
1857
+ registerProvider(OLLAMA);
1858
+ registerProvider(LMSTUDIO);
1859
+ registerProvider(LLAMACPP);
1860
+ registerProvider(BEDROCK);
1861
+ registerProvider(VERTEX);
1862
+ registerProvider(GOOGLE);
1863
+ registerProvider(MISTRAL);
1864
+ registerProvider(GROQ);
1865
+ registerProvider(COHERE);
1866
+ registerProvider(DEEPINFRA);
1867
+ registerProvider(TOGETHER);
1868
+ registerProvider(XAI);
1869
+ registerProvider(PERPLEXITY);
1870
+ registerProvider(CEREBRAS);
1871
+ registerCatalogProviders();
1872
+ }
1873
+
1874
+ exports.catalogModelSchema = catalogModelSchema;
1875
+ exports.getCatalogCapabilities = getCatalogCapabilities;
1876
+ exports.getCatalogModelInfo = getCatalogModelInfo;
1877
+ exports.getProviderProfile = getProviderProfile;
1878
+ exports.inferModelDialect = inferModelDialect;
1879
+ exports.inferRegionFromModelId = inferRegionFromModelId;
1880
+ exports.isPatchedModelKey = isPatchedModelKey;
1881
+ exports.listProviders = listProviders;
1882
+ exports.loadProviderCatalog = loadProviderCatalog;
1883
+ exports.patchModelInfo = patchModelInfo;
1884
+ exports.registerBuiltins = registerBuiltins;
1885
+ exports.registerProvider = registerProvider;
1886
+ exports.resolveBedrockBaseUrl = resolveBedrockBaseUrl;
1887
+ exports.resolveVertexBaseUrl = resolveVertexBaseUrl;
1888
+ exports.stripBedrockPrefix = stripBedrockPrefix;
1889
+ exports.stripVertexPrefix = stripVertexPrefix;
1890
+ //# sourceMappingURL=chunk-HU666T3Q.cjs.map
1891
+ //# sourceMappingURL=chunk-HU666T3Q.cjs.map