@mastra/core 0.19.0 → 0.19.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/agent/agent.d.ts +2 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/index.cjs +11 -11
  5. package/dist/agent/index.js +2 -2
  6. package/dist/agent/input-processor/index.cjs +6 -6
  7. package/dist/agent/input-processor/index.js +1 -1
  8. package/dist/ai-tracing/index.cjs +32 -32
  9. package/dist/ai-tracing/index.js +1 -1
  10. package/dist/cache/index.cjs +3 -3
  11. package/dist/cache/index.js +1 -1
  12. package/dist/{chunk-4VNAMG7K.cjs → chunk-2C5AQMP5.cjs} +6 -6
  13. package/dist/{chunk-4VNAMG7K.cjs.map → chunk-2C5AQMP5.cjs.map} +1 -1
  14. package/dist/{chunk-JKLLXBOY.js → chunk-2EMOWXLL.js} +9 -9
  15. package/dist/{chunk-JKLLXBOY.js.map → chunk-2EMOWXLL.js.map} +1 -1
  16. package/dist/{chunk-EPMJYNEK.cjs → chunk-2F4RLQ5V.cjs} +4 -4
  17. package/dist/{chunk-EPMJYNEK.cjs.map → chunk-2F4RLQ5V.cjs.map} +1 -1
  18. package/dist/{chunk-HNBU4PI7.cjs → chunk-3I3NRXSD.cjs} +4 -4
  19. package/dist/{chunk-HNBU4PI7.cjs.map → chunk-3I3NRXSD.cjs.map} +1 -1
  20. package/dist/{chunk-SQQMX4VC.cjs → chunk-4PRV2Y55.cjs} +6 -6
  21. package/dist/{chunk-SQQMX4VC.cjs.map → chunk-4PRV2Y55.cjs.map} +1 -1
  22. package/dist/{chunk-7E4ESNZS.cjs → chunk-576KDLXN.cjs} +5 -5
  23. package/dist/{chunk-7E4ESNZS.cjs.map → chunk-576KDLXN.cjs.map} +1 -1
  24. package/dist/{chunk-PG6ZNDSR.cjs → chunk-57UPIDGK.cjs} +19 -19
  25. package/dist/{chunk-PG6ZNDSR.cjs.map → chunk-57UPIDGK.cjs.map} +1 -1
  26. package/dist/{chunk-5BQOHHCI.js → chunk-5QUE7HZF.js} +4 -4
  27. package/dist/{chunk-5BQOHHCI.js.map → chunk-5QUE7HZF.js.map} +1 -1
  28. package/dist/{chunk-CQ73JM2N.cjs → chunk-62I4SVWU.cjs} +10 -10
  29. package/dist/{chunk-CQ73JM2N.cjs.map → chunk-62I4SVWU.cjs.map} +1 -1
  30. package/dist/{chunk-COC64XPP.js → chunk-7CJKBCDL.js} +8 -8
  31. package/dist/{chunk-COC64XPP.js.map → chunk-7CJKBCDL.js.map} +1 -1
  32. package/dist/chunk-7J5DS33F.js +3 -0
  33. package/dist/chunk-7J5DS33F.js.map +1 -0
  34. package/dist/{chunk-RAXBZZKS.js → chunk-A7REAXWA.js} +3 -3
  35. package/dist/{chunk-RAXBZZKS.js.map → chunk-A7REAXWA.js.map} +1 -1
  36. package/dist/{chunk-DRVSEV5Y.cjs → chunk-BBTR6DPH.cjs} +8 -8
  37. package/dist/{chunk-DRVSEV5Y.cjs.map → chunk-BBTR6DPH.cjs.map} +1 -1
  38. package/dist/{chunk-FV3SA5TI.js → chunk-BMBWTBCL.js} +3 -3
  39. package/dist/{chunk-FV3SA5TI.js.map → chunk-BMBWTBCL.js.map} +1 -1
  40. package/dist/{chunk-NHJVMZIL.cjs → chunk-CC4KO56Z.cjs} +19 -19
  41. package/dist/{chunk-NHJVMZIL.cjs.map → chunk-CC4KO56Z.cjs.map} +1 -1
  42. package/dist/{chunk-N4PK4MOG.js → chunk-D2ZPF2AK.js} +4 -4
  43. package/dist/{chunk-N4PK4MOG.js.map → chunk-D2ZPF2AK.js.map} +1 -1
  44. package/dist/{chunk-3PQNUWJM.js → chunk-EQV2PPN2.js} +2 -4
  45. package/dist/chunk-EQV2PPN2.js.map +1 -0
  46. package/dist/chunk-FUVNHPNL.cjs +4 -0
  47. package/dist/chunk-FUVNHPNL.cjs.map +1 -0
  48. package/dist/{chunk-F6EJEELE.cjs → chunk-HJQ7ANDX.cjs} +6 -6
  49. package/dist/{chunk-F6EJEELE.cjs.map → chunk-HJQ7ANDX.cjs.map} +1 -1
  50. package/dist/{chunk-2GHLV754.cjs → chunk-HV5ND4KF.cjs} +4 -4
  51. package/dist/{chunk-2GHLV754.cjs.map → chunk-HV5ND4KF.cjs.map} +1 -1
  52. package/dist/{chunk-HQPFM22N.cjs → chunk-IB27A3HF.cjs} +16 -16
  53. package/dist/{chunk-HQPFM22N.cjs.map → chunk-IB27A3HF.cjs.map} +1 -1
  54. package/dist/{chunk-BCWRUNMS.cjs → chunk-K3UPABLX.cjs} +38 -38
  55. package/dist/{chunk-BCWRUNMS.cjs.map → chunk-K3UPABLX.cjs.map} +1 -1
  56. package/dist/{chunk-XG3SFWOH.js → chunk-KK5LUATU.js} +3 -3
  57. package/dist/{chunk-XG3SFWOH.js.map → chunk-KK5LUATU.js.map} +1 -1
  58. package/dist/{chunk-VWO3JJXC.js → chunk-LYRPXSHB.js} +4 -4
  59. package/dist/{chunk-VWO3JJXC.js.map → chunk-LYRPXSHB.js.map} +1 -1
  60. package/dist/{chunk-IAXAPVOP.js → chunk-M24QFL6S.js} +4 -4
  61. package/dist/{chunk-IAXAPVOP.js.map → chunk-M24QFL6S.js.map} +1 -1
  62. package/dist/{chunk-5HCVPQTD.js → chunk-M4AX46DS.js} +3 -3
  63. package/dist/{chunk-5HCVPQTD.js.map → chunk-M4AX46DS.js.map} +1 -1
  64. package/dist/{chunk-3WFH6YRI.js → chunk-M635OK6I.js} +4 -4
  65. package/dist/{chunk-3WFH6YRI.js.map → chunk-M635OK6I.js.map} +1 -1
  66. package/dist/{chunk-UTEH2LCJ.cjs → chunk-NLBX7Q47.cjs} +19 -19
  67. package/dist/{chunk-UTEH2LCJ.cjs.map → chunk-NLBX7Q47.cjs.map} +1 -1
  68. package/dist/{chunk-2DGWSOVQ.js → chunk-NMSLDMQ6.js} +3 -3
  69. package/dist/{chunk-2DGWSOVQ.js.map → chunk-NMSLDMQ6.js.map} +1 -1
  70. package/dist/{chunk-PJ6HF3KW.js → chunk-NVMKTP4N.js} +3 -3
  71. package/dist/{chunk-PJ6HF3KW.js.map → chunk-NVMKTP4N.js.map} +1 -1
  72. package/dist/{chunk-4BEHJSL6.js → chunk-QFKTSGBI.js} +3 -3
  73. package/dist/{chunk-4BEHJSL6.js.map → chunk-QFKTSGBI.js.map} +1 -1
  74. package/dist/{chunk-LZBVDMVQ.cjs → chunk-QMDJVXFQ.cjs} +19 -19
  75. package/dist/{chunk-LZBVDMVQ.cjs.map → chunk-QMDJVXFQ.cjs.map} +1 -1
  76. package/dist/{chunk-TIBULEK6.cjs → chunk-SZD4WTRW.cjs} +717 -275
  77. package/dist/chunk-SZD4WTRW.cjs.map +1 -0
  78. package/dist/{chunk-OBIF7QD5.js → chunk-T2CUZA2P.js} +3 -3
  79. package/dist/{chunk-OBIF7QD5.js.map → chunk-T2CUZA2P.js.map} +1 -1
  80. package/dist/{chunk-WHFNGECY.js → chunk-T3JFFQH2.js} +3 -2
  81. package/dist/chunk-T3JFFQH2.js.map +1 -0
  82. package/dist/{chunk-BUY5X7DT.js → chunk-TJHEGJNW.js} +4 -4
  83. package/dist/{chunk-BUY5X7DT.js.map → chunk-TJHEGJNW.js.map} +1 -1
  84. package/dist/{chunk-KTCBGNCZ.cjs → chunk-UU5L5GDY.cjs} +2 -4
  85. package/dist/chunk-UU5L5GDY.cjs.map +1 -0
  86. package/dist/{chunk-S7UXT3V4.cjs → chunk-WM4VQWOZ.cjs} +3 -2
  87. package/dist/chunk-WM4VQWOZ.cjs.map +1 -0
  88. package/dist/{chunk-RNIY63FP.cjs → chunk-WMGV4CS3.cjs} +59 -59
  89. package/dist/{chunk-RNIY63FP.cjs.map → chunk-WMGV4CS3.cjs.map} +1 -1
  90. package/dist/{chunk-5M6ZTQJN.js → chunk-X6PLOE2T.js} +717 -275
  91. package/dist/chunk-X6PLOE2T.js.map +1 -0
  92. package/dist/error/index.cjs +5 -5
  93. package/dist/error/index.d.ts +2 -1
  94. package/dist/error/index.d.ts.map +1 -1
  95. package/dist/error/index.js +1 -1
  96. package/dist/eval/index.cjs +3 -3
  97. package/dist/eval/index.js +1 -1
  98. package/dist/index.cjs +66 -66
  99. package/dist/index.js +15 -15
  100. package/dist/llm/index.cjs +5 -5
  101. package/dist/llm/index.d.ts +1 -0
  102. package/dist/llm/index.d.ts.map +1 -1
  103. package/dist/llm/index.js +1 -1
  104. package/dist/llm/model/gateway-resolver.d.ts +9 -0
  105. package/dist/llm/model/gateway-resolver.d.ts.map +1 -0
  106. package/dist/llm/model/gateways/base.d.ts +5 -4
  107. package/dist/llm/model/gateways/base.d.ts.map +1 -1
  108. package/dist/llm/model/gateways/index.d.ts +1 -0
  109. package/dist/llm/model/gateways/index.d.ts.map +1 -1
  110. package/dist/llm/model/gateways/models-dev.d.ts +3 -2
  111. package/dist/llm/model/gateways/models-dev.d.ts.map +1 -1
  112. package/dist/llm/model/gateways/netlify.d.ts +15 -0
  113. package/dist/llm/model/gateways/netlify.d.ts.map +1 -0
  114. package/dist/llm/model/openai-compatible.d.ts +8 -3
  115. package/dist/llm/model/openai-compatible.d.ts.map +1 -1
  116. package/dist/llm/model/provider-registry.generated.d.ts +8 -370
  117. package/dist/llm/model/provider-registry.generated.d.ts.map +1 -1
  118. package/dist/loop/index.cjs +2 -2
  119. package/dist/loop/index.js +1 -1
  120. package/dist/mastra/index.cjs +2 -2
  121. package/dist/mastra/index.js +1 -1
  122. package/dist/memory/index.cjs +4 -4
  123. package/dist/memory/index.js +1 -1
  124. package/dist/network/vNext/index.cjs +29 -29
  125. package/dist/network/vNext/index.js +2 -2
  126. package/dist/processors/index.cjs +10 -10
  127. package/dist/processors/index.js +1 -1
  128. package/dist/relevance/index.cjs +4 -4
  129. package/dist/relevance/index.js +1 -1
  130. package/dist/scores/index.cjs +9 -9
  131. package/dist/scores/index.js +2 -2
  132. package/dist/scores/scoreTraces/index.cjs +13 -13
  133. package/dist/scores/scoreTraces/index.js +4 -4
  134. package/dist/server/index.cjs +7 -7
  135. package/dist/server/index.js +2 -2
  136. package/dist/storage/index.cjs +25 -25
  137. package/dist/storage/index.js +4 -4
  138. package/dist/stream/index.cjs +4 -4
  139. package/dist/stream/index.js +1 -1
  140. package/dist/telemetry/index.cjs +7 -7
  141. package/dist/telemetry/index.js +1 -1
  142. package/dist/test-utils/llm-mock.cjs +2 -2
  143. package/dist/test-utils/llm-mock.js +1 -1
  144. package/dist/tts/index.cjs +2 -2
  145. package/dist/tts/index.js +1 -1
  146. package/dist/utils.cjs +17 -17
  147. package/dist/utils.js +1 -1
  148. package/dist/vector/index.cjs +4 -4
  149. package/dist/vector/index.js +1 -1
  150. package/dist/voice/index.cjs +4 -4
  151. package/dist/voice/index.js +1 -1
  152. package/dist/workflows/evented/index.cjs +10 -10
  153. package/dist/workflows/evented/index.js +1 -1
  154. package/dist/workflows/index.cjs +12 -12
  155. package/dist/workflows/index.js +1 -1
  156. package/dist/workflows/legacy/index.cjs +22 -22
  157. package/dist/workflows/legacy/index.js +1 -1
  158. package/package.json +3 -3
  159. package/dist/chunk-3PQNUWJM.js.map +0 -1
  160. package/dist/chunk-5M6ZTQJN.js.map +0 -1
  161. package/dist/chunk-KTCBGNCZ.cjs.map +0 -1
  162. package/dist/chunk-S7UXT3V4.cjs.map +0 -1
  163. package/dist/chunk-TIBULEK6.cjs.map +0 -1
  164. package/dist/chunk-WHFNGECY.js.map +0 -1
@@ -1,5 +1,8 @@
1
1
  'use strict';
2
2
 
3
+ var chunkUU5L5GDY_cjs = require('./chunk-UU5L5GDY.cjs');
4
+ var chunkWM4VQWOZ_cjs = require('./chunk-WM4VQWOZ.cjs');
5
+
3
6
  // src/llm/model/provider-registry.generated.ts
4
7
  var PROVIDER_REGISTRY = {
5
8
  "moonshotai-cn": {
@@ -8,7 +11,8 @@ var PROVIDER_REGISTRY = {
8
11
  apiKeyHeader: "Authorization",
9
12
  name: "Moonshot AI (China)",
10
13
  models: ["kimi-k2-0711-preview", "kimi-k2-0905-preview", "kimi-k2-turbo-preview"],
11
- docUrl: "https://platform.moonshot.cn/docs/api/chat"
14
+ docUrl: "https://platform.moonshot.cn/docs/api/chat",
15
+ gateway: "models.dev"
12
16
  },
13
17
  lucidquery: {
14
18
  url: "https://lucidquery.com/api/v1/chat/completions",
@@ -16,7 +20,8 @@ var PROVIDER_REGISTRY = {
16
20
  apiKeyHeader: "Authorization",
17
21
  name: "LucidQuery AI",
18
22
  models: ["lucidnova-rf1-100b", "lucidquery-nexus-coder"],
19
- docUrl: "https://lucidquery.com/api/docs"
23
+ docUrl: "https://lucidquery.com/api/docs",
24
+ gateway: "models.dev"
20
25
  },
21
26
  moonshotai: {
22
27
  url: "https://api.moonshot.ai/v1/chat/completions",
@@ -24,7 +29,8 @@ var PROVIDER_REGISTRY = {
24
29
  apiKeyHeader: "Authorization",
25
30
  name: "Moonshot AI",
26
31
  models: ["kimi-k2-0711-preview", "kimi-k2-0905-preview", "kimi-k2-turbo-preview"],
27
- docUrl: "https://platform.moonshot.ai/docs/api/chat"
32
+ docUrl: "https://platform.moonshot.ai/docs/api/chat",
33
+ gateway: "models.dev"
28
34
  },
29
35
  "zai-coding-plan": {
30
36
  url: "https://api.z.ai/api/coding/paas/v4/chat/completions",
@@ -32,7 +38,8 @@ var PROVIDER_REGISTRY = {
32
38
  apiKeyHeader: "Authorization",
33
39
  name: "Z.AI Coding Plan",
34
40
  models: ["glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6"],
35
- docUrl: "https://docs.z.ai/devpack/overview"
41
+ docUrl: "https://docs.z.ai/devpack/overview",
42
+ gateway: "models.dev"
36
43
  },
37
44
  alibaba: {
38
45
  url: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions",
@@ -40,7 +47,8 @@ var PROVIDER_REGISTRY = {
40
47
  apiKeyHeader: "Authorization",
41
48
  name: "Alibaba",
42
49
  models: ["qwen3-coder-plus"],
43
- docUrl: "https://www.alibabacloud.com/help/en/model-studio/models"
50
+ docUrl: "https://www.alibabacloud.com/help/en/model-studio/models",
51
+ gateway: "models.dev"
44
52
  },
45
53
  xai: {
46
54
  url: "https://api.x.ai/v1/chat/completions",
@@ -69,7 +77,8 @@ var PROVIDER_REGISTRY = {
69
77
  "grok-code-fast-1",
70
78
  "grok-vision-beta"
71
79
  ],
72
- docUrl: "https://docs.x.ai/docs/models"
80
+ docUrl: "https://docs.x.ai/docs/models",
81
+ gateway: "models.dev"
73
82
  },
74
83
  nvidia: {
75
84
  url: "https://integrate.api.nvidia.com/v1/chat/completions",
@@ -91,7 +100,8 @@ var PROVIDER_REGISTRY = {
91
100
  "qwen/qwen3-235b-a22b",
92
101
  "qwen/qwen3-coder-480b-a35b-instruct"
93
102
  ],
94
- docUrl: "https://docs.api.nvidia.com/nim/"
103
+ docUrl: "https://docs.api.nvidia.com/nim/",
104
+ gateway: "models.dev"
95
105
  },
96
106
  upstage: {
97
107
  url: "https://api.upstage.ai/chat/completions",
@@ -99,7 +109,8 @@ var PROVIDER_REGISTRY = {
99
109
  apiKeyHeader: "Authorization",
100
110
  name: "Upstage",
101
111
  models: ["solar-mini", "solar-pro2"],
102
- docUrl: "https://developers.upstage.ai/docs/apis/chat"
112
+ docUrl: "https://developers.upstage.ai/docs/apis/chat",
113
+ gateway: "models.dev"
103
114
  },
104
115
  groq: {
105
116
  url: "https://api.groq.com/openai/v1/chat/completions",
@@ -125,7 +136,8 @@ var PROVIDER_REGISTRY = {
125
136
  "qwen-qwq-32b",
126
137
  "qwen/qwen3-32b"
127
138
  ],
128
- docUrl: "https://console.groq.com/docs/models"
139
+ docUrl: "https://console.groq.com/docs/models",
140
+ gateway: "models.dev"
129
141
  },
130
142
  "github-copilot": {
131
143
  url: "https://api.githubcopilot.com/chat/completions",
@@ -145,14 +157,14 @@ var PROVIDER_REGISTRY = {
145
157
  "gpt-4.1",
146
158
  "gpt-4o",
147
159
  "gpt-5",
148
- "gpt-5-codex",
149
160
  "gpt-5-mini",
150
161
  "grok-code-fast-1",
151
162
  "o3",
152
163
  "o3-mini",
153
164
  "o4-mini"
154
165
  ],
155
- docUrl: "https://docs.github.com/en/copilot"
166
+ docUrl: "https://docs.github.com/en/copilot",
167
+ gateway: "models.dev"
156
168
  },
157
169
  mistral: {
158
170
  url: "https://api.mistral.ai/v1/chat/completions",
@@ -180,7 +192,8 @@ var PROVIDER_REGISTRY = {
180
192
  "pixtral-12b",
181
193
  "pixtral-large-latest"
182
194
  ],
183
- docUrl: "https://docs.mistral.ai/getting-started/models/"
195
+ docUrl: "https://docs.mistral.ai/getting-started/models/",
196
+ gateway: "models.dev"
184
197
  },
185
198
  vercel: {
186
199
  url: "https://ai-gateway.vercel.sh/v1/chat/completions",
@@ -230,7 +243,6 @@ var PROVIDER_REGISTRY = {
230
243
  "openai/gpt-4o",
231
244
  "openai/gpt-4o-mini",
232
245
  "openai/gpt-5",
233
- "openai/gpt-5-codex",
234
246
  "openai/gpt-5-mini",
235
247
  "openai/gpt-5-nano",
236
248
  "openai/gpt-oss-120b",
@@ -252,7 +264,8 @@ var PROVIDER_REGISTRY = {
252
264
  "xai/grok-4-fast-non-reasoning",
253
265
  "xai/grok-code-fast-1"
254
266
  ],
255
- docUrl: "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway"
267
+ docUrl: "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway",
268
+ gateway: "models.dev"
256
269
  },
257
270
  deepseek: {
258
271
  url: "https://api.deepseek.com/chat/completions",
@@ -260,7 +273,8 @@ var PROVIDER_REGISTRY = {
260
273
  apiKeyHeader: "Authorization",
261
274
  name: "DeepSeek",
262
275
  models: ["deepseek-chat", "deepseek-reasoner"],
263
- docUrl: "https://platform.deepseek.com/api-docs/pricing"
276
+ docUrl: "https://platform.deepseek.com/api-docs/pricing",
277
+ gateway: "models.dev"
264
278
  },
265
279
  "alibaba-cn": {
266
280
  url: "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
@@ -268,7 +282,8 @@ var PROVIDER_REGISTRY = {
268
282
  apiKeyHeader: "Authorization",
269
283
  name: "Alibaba (China)",
270
284
  models: ["qwen3-coder-plus"],
271
- docUrl: "https://www.alibabacloud.com/help/en/model-studio/models"
285
+ docUrl: "https://www.alibabacloud.com/help/en/model-studio/models",
286
+ gateway: "models.dev"
272
287
  },
273
288
  venice: {
274
289
  url: "https://api.venice.ai/api/v1/chat/completions",
@@ -290,7 +305,8 @@ var PROVIDER_REGISTRY = {
290
305
  "qwen3-4b",
291
306
  "venice-uncensored"
292
307
  ],
293
- docUrl: "https://docs.venice.ai"
308
+ docUrl: "https://docs.venice.ai",
309
+ gateway: "models.dev"
294
310
  },
295
311
  chutes: {
296
312
  url: "https://llm.chutes.ai/v1/chat/completions",
@@ -329,7 +345,8 @@ var PROVIDER_REGISTRY = {
329
345
  "zai-org/GLM-4.5-FP8",
330
346
  "zai-org/GLM-4.5-turbo"
331
347
  ],
332
- docUrl: "https://llm.chutes.ai/v1/models"
348
+ docUrl: "https://llm.chutes.ai/v1/models",
349
+ gateway: "models.dev"
333
350
  },
334
351
  cortecs: {
335
352
  url: "https://api.cortecs.ai/v1/chat/completions",
@@ -348,7 +365,8 @@ var PROVIDER_REGISTRY = {
348
365
  "qwen3-32b",
349
366
  "qwen3-coder-480b-a35b-instruct"
350
367
  ],
351
- docUrl: "https://api.cortecs.ai/v1/models"
368
+ docUrl: "https://api.cortecs.ai/v1/models",
369
+ gateway: "models.dev"
352
370
  },
353
371
  "github-models": {
354
372
  url: "https://models.github.ai/inference/chat/completions",
@@ -412,7 +430,8 @@ var PROVIDER_REGISTRY = {
412
430
  "xai/grok-3",
413
431
  "xai/grok-3-mini"
414
432
  ],
415
- docUrl: "https://docs.github.com/en/github-models"
433
+ docUrl: "https://docs.github.com/en/github-models",
434
+ gateway: "models.dev"
416
435
  },
417
436
  togetherai: {
418
437
  url: "https://api.together.xyz/v1/chat/completions",
@@ -427,7 +446,8 @@ var PROVIDER_REGISTRY = {
427
446
  "moonshotai/Kimi-K2-Instruct",
428
447
  "openai/gpt-oss-120b"
429
448
  ],
430
- docUrl: "https://docs.together.ai/docs/serverless-models"
449
+ docUrl: "https://docs.together.ai/docs/serverless-models",
450
+ gateway: "models.dev"
431
451
  },
432
452
  baseten: {
433
453
  url: "https://inference.baseten.co/v1/chat/completions",
@@ -435,7 +455,8 @@ var PROVIDER_REGISTRY = {
435
455
  apiKeyHeader: "Authorization",
436
456
  name: "Baseten",
437
457
  models: ["Qwen3/Qwen3-Coder-480B-A35B-Instruct", "moonshotai/Kimi-K2-Instruct-0905"],
438
- docUrl: "https://docs.baseten.co/development/model-apis/overview"
458
+ docUrl: "https://docs.baseten.co/development/model-apis/overview",
459
+ gateway: "models.dev"
439
460
  },
440
461
  huggingface: {
441
462
  url: "https://router.huggingface.co/v1/chat/completions",
@@ -454,7 +475,8 @@ var PROVIDER_REGISTRY = {
454
475
  "zai-org/GLM-4.5",
455
476
  "zai-org/GLM-4.5-Air"
456
477
  ],
457
- docUrl: "https://huggingface.co/docs/inference-providers"
478
+ docUrl: "https://huggingface.co/docs/inference-providers",
479
+ gateway: "models.dev"
458
480
  },
459
481
  opencode: {
460
482
  url: "https://opencode.ai/zen/v1/chat/completions",
@@ -468,13 +490,13 @@ var PROVIDER_REGISTRY = {
468
490
  "claude-sonnet-4-5",
469
491
  "code-supernova",
470
492
  "gpt-5",
471
- "gpt-5-codex",
472
493
  "grok-code",
473
494
  "kimi-k2",
474
495
  "qwen3-coder",
475
496
  "qwen3-max"
476
497
  ],
477
- docUrl: "https://opencode.ai/docs"
498
+ docUrl: "https://opencode.ai/docs",
499
+ gateway: "models.dev"
478
500
  },
479
501
  fastrouter: {
480
502
  url: "https://go.fastrouter.ai/api/v1/chat/completions",
@@ -497,7 +519,8 @@ var PROVIDER_REGISTRY = {
497
519
  "qwen/qwen3-coder",
498
520
  "x-ai/grok-4"
499
521
  ],
500
- docUrl: "https://fastrouter.ai/models"
522
+ docUrl: "https://fastrouter.ai/models",
523
+ gateway: "models.dev"
501
524
  },
502
525
  google: {
503
526
  url: "https://generativelanguage.googleapis.com/v1beta/chat/completions",
@@ -524,7 +547,8 @@ var PROVIDER_REGISTRY = {
524
547
  "gemini-flash-lite-latest",
525
548
  "gemini-live-2.5-flash-preview-native-audio"
526
549
  ],
527
- docUrl: "https://ai.google.dev/gemini-api/docs/pricing"
550
+ docUrl: "https://ai.google.dev/gemini-api/docs/pricing",
551
+ gateway: "models.dev"
528
552
  },
529
553
  inception: {
530
554
  url: "https://api.inceptionlabs.ai/v1/chat/completions",
@@ -532,7 +556,8 @@ var PROVIDER_REGISTRY = {
532
556
  apiKeyHeader: "Authorization",
533
557
  name: "Inception",
534
558
  models: ["mercury", "mercury-coder"],
535
- docUrl: "https://platform.inceptionlabs.ai/docs"
559
+ docUrl: "https://platform.inceptionlabs.ai/docs",
560
+ gateway: "models.dev"
536
561
  },
537
562
  wandb: {
538
563
  url: "https://api.inference.wandb.ai/v1/chat/completions",
@@ -551,7 +576,8 @@ var PROVIDER_REGISTRY = {
551
576
  "microsoft/Phi-4-mini-instruct",
552
577
  "moonshotai/Kimi-K2-Instruct"
553
578
  ],
554
- docUrl: "https://weave-docs.wandb.ai/guides/integrations/inference/"
579
+ docUrl: "https://weave-docs.wandb.ai/guides/integrations/inference/",
580
+ gateway: "models.dev"
555
581
  },
556
582
  openai: {
557
583
  url: "https://api.openai.com/v1/chat/completions",
@@ -559,7 +585,6 @@ var PROVIDER_REGISTRY = {
559
585
  apiKeyHeader: "Authorization",
560
586
  name: "OpenAI",
561
587
  models: [
562
- "codex-mini-latest",
563
588
  "gpt-3.5-turbo",
564
589
  "gpt-4",
565
590
  "gpt-4-turbo",
@@ -573,7 +598,6 @@ var PROVIDER_REGISTRY = {
573
598
  "gpt-4o-mini",
574
599
  "gpt-5",
575
600
  "gpt-5-chat-latest",
576
- "gpt-5-codex",
577
601
  "gpt-5-mini",
578
602
  "gpt-5-nano",
579
603
  "o1",
@@ -587,7 +611,8 @@ var PROVIDER_REGISTRY = {
587
611
  "o4-mini",
588
612
  "o4-mini-deep-research"
589
613
  ],
590
- docUrl: "https://platform.openai.com/docs/models"
614
+ docUrl: "https://platform.openai.com/docs/models",
615
+ gateway: "models.dev"
591
616
  },
592
617
  "zhipuai-coding-plan": {
593
618
  url: "https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",
@@ -595,7 +620,8 @@ var PROVIDER_REGISTRY = {
595
620
  apiKeyHeader: "Authorization",
596
621
  name: "Zhipu AI Coding Plan",
597
622
  models: ["glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6"],
598
- docUrl: "https://docs.bigmodel.cn/cn/coding-plan/overview"
623
+ docUrl: "https://docs.bigmodel.cn/cn/coding-plan/overview",
624
+ gateway: "models.dev"
599
625
  },
600
626
  perplexity: {
601
627
  url: "https://api.perplexity.ai/chat/completions",
@@ -603,7 +629,8 @@ var PROVIDER_REGISTRY = {
603
629
  apiKeyHeader: "Authorization",
604
630
  name: "Perplexity",
605
631
  models: ["sonar", "sonar-pro", "sonar-reasoning", "sonar-reasoning-pro"],
606
- docUrl: "https://docs.perplexity.ai"
632
+ docUrl: "https://docs.perplexity.ai",
633
+ gateway: "models.dev"
607
634
  },
608
635
  openrouter: {
609
636
  url: "https://openrouter.ai/api/v1/chat/completions",
@@ -668,7 +695,6 @@ var PROVIDER_REGISTRY = {
668
695
  "openai/gpt-4o-mini",
669
696
  "openai/gpt-5",
670
697
  "openai/gpt-5-chat",
671
- "openai/gpt-5-codex",
672
698
  "openai/gpt-5-mini",
673
699
  "openai/gpt-5-nano",
674
700
  "openai/gpt-oss-120b",
@@ -714,7 +740,8 @@ var PROVIDER_REGISTRY = {
714
740
  "z-ai/glm-4.5-air:free",
715
741
  "z-ai/glm-4.5v"
716
742
  ],
717
- docUrl: "https://openrouter.ai/models"
743
+ docUrl: "https://openrouter.ai/models",
744
+ gateway: "models.dev"
718
745
  },
719
746
  synthetic: {
720
747
  url: "https://api.synthetic.new/v1/chat/completions",
@@ -743,7 +770,8 @@ var PROVIDER_REGISTRY = {
743
770
  "hf:openai/gpt-oss-120b",
744
771
  "hf:zai-org/GLM-4.5"
745
772
  ],
746
- docUrl: "https://synthetic.new/pricing"
773
+ docUrl: "https://synthetic.new/pricing",
774
+ gateway: "models.dev"
747
775
  },
748
776
  deepinfra: {
749
777
  url: "https://api.deepinfra.com/v1/openai/chat/completions",
@@ -756,7 +784,8 @@ var PROVIDER_REGISTRY = {
756
784
  "moonshotai/Kimi-K2-Instruct",
757
785
  "zai-org/GLM-4.5"
758
786
  ],
759
- docUrl: "https://deepinfra.com/models"
787
+ docUrl: "https://deepinfra.com/models",
788
+ gateway: "models.dev"
760
789
  },
761
790
  zhipuai: {
762
791
  url: "https://open.bigmodel.cn/api/paas/v4/chat/completions",
@@ -764,7 +793,8 @@ var PROVIDER_REGISTRY = {
764
793
  apiKeyHeader: "Authorization",
765
794
  name: "Zhipu AI",
766
795
  models: ["glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6"],
767
- docUrl: "https://docs.z.ai/guides/overview/pricing"
796
+ docUrl: "https://docs.z.ai/guides/overview/pricing",
797
+ gateway: "models.dev"
768
798
  },
769
799
  submodel: {
770
800
  url: "https://llm.submodel.ai/v1/chat/completions",
@@ -782,7 +812,8 @@ var PROVIDER_REGISTRY = {
782
812
  "zai-org/GLM-4.5-Air",
783
813
  "zai-org/GLM-4.5-FP8"
784
814
  ],
785
- docUrl: "https://submodel.gitbook.io"
815
+ docUrl: "https://submodel.gitbook.io",
816
+ gateway: "models.dev"
786
817
  },
787
818
  zai: {
788
819
  url: "https://api.z.ai/api/paas/v4/chat/completions",
@@ -790,7 +821,8 @@ var PROVIDER_REGISTRY = {
790
821
  apiKeyHeader: "Authorization",
791
822
  name: "Z.AI",
792
823
  models: ["glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6"],
793
- docUrl: "https://docs.z.ai/guides/overview/pricing"
824
+ docUrl: "https://docs.z.ai/guides/overview/pricing",
825
+ gateway: "models.dev"
794
826
  },
795
827
  inference: {
796
828
  url: "https://inference.net/v1/chat/completions",
@@ -808,7 +840,8 @@ var PROVIDER_REGISTRY = {
808
840
  "qwen/qwen-2.5-7b-vision-instruct",
809
841
  "qwen/qwen3-embedding-4b"
810
842
  ],
811
- docUrl: "https://inference.net/models"
843
+ docUrl: "https://inference.net/models",
844
+ gateway: "models.dev"
812
845
  },
813
846
  requesty: {
814
847
  url: "https://router.requesty.ai/v1/chat/completions",
@@ -830,7 +863,8 @@ var PROVIDER_REGISTRY = {
830
863
  "openai/gpt-5-nano",
831
864
  "openai/o4-mini"
832
865
  ],
833
- docUrl: "https://requesty.ai/solution/llm-routing/models"
866
+ docUrl: "https://requesty.ai/solution/llm-routing/models",
867
+ gateway: "models.dev"
834
868
  },
835
869
  morph: {
836
870
  url: "https://api.morphllm.com/v1/chat/completions",
@@ -838,7 +872,8 @@ var PROVIDER_REGISTRY = {
838
872
  apiKeyHeader: "Authorization",
839
873
  name: "Morph",
840
874
  models: ["auto", "morph-v3-fast", "morph-v3-large"],
841
- docUrl: "https://docs.morphllm.com/api-reference/introduction"
875
+ docUrl: "https://docs.morphllm.com/api-reference/introduction",
876
+ gateway: "models.dev"
842
877
  },
843
878
  lmstudio: {
844
879
  url: "http://127.0.0.1:1234/v1/chat/completions",
@@ -846,7 +881,8 @@ var PROVIDER_REGISTRY = {
846
881
  apiKeyHeader: "Authorization",
847
882
  name: "LMStudio",
848
883
  models: ["openai/gpt-oss-20b", "qwen/qwen3-30b-a3b-2507", "qwen/qwen3-coder-30b"],
849
- docUrl: "https://lmstudio.ai/models"
884
+ docUrl: "https://lmstudio.ai/models",
885
+ gateway: "models.dev"
850
886
  },
851
887
  anthropic: {
852
888
  url: "https://api.anthropic.com/v1/chat/completions",
@@ -866,7 +902,8 @@ var PROVIDER_REGISTRY = {
866
902
  "claude-sonnet-4-20250514",
867
903
  "claude-sonnet-4-5-20250929"
868
904
  ],
869
- docUrl: "https://docs.anthropic.com/en/docs/about-claude/models"
905
+ docUrl: "https://docs.anthropic.com/en/docs/about-claude/models",
906
+ gateway: "models.dev"
870
907
  },
871
908
  "fireworks-ai": {
872
909
  url: "https://api.fireworks.ai/inference/v1/chat/completions",
@@ -885,7 +922,8 @@ var PROVIDER_REGISTRY = {
885
922
  "accounts/fireworks/models/qwen3-235b-a22b",
886
923
  "accounts/fireworks/models/qwen3-coder-480b-a35b-instruct"
887
924
  ],
888
- docUrl: "https://fireworks.ai/docs/"
925
+ docUrl: "https://fireworks.ai/docs/",
926
+ gateway: "models.dev"
889
927
  },
890
928
  modelscope: {
891
929
  url: "https://api-inference.modelscope.cn/v1/chat/completions",
@@ -901,7 +939,8 @@ var PROVIDER_REGISTRY = {
901
939
  "Qwen/Qwen3-Coder-480B-A35B-Instruct",
902
940
  "ZhipuAI/GLM-4.5"
903
941
  ],
904
- docUrl: "https://modelscope.cn/docs/model-service/API-Inference/intro"
942
+ docUrl: "https://modelscope.cn/docs/model-service/API-Inference/intro",
943
+ gateway: "models.dev"
905
944
  },
906
945
  llama: {
907
946
  url: "https://api.llama.com/compat/v1/chat/completions",
@@ -917,7 +956,8 @@ var PROVIDER_REGISTRY = {
917
956
  "llama-4-maverick-17b-128e-instruct-fp8",
918
957
  "llama-4-scout-17b-16e-instruct-fp8"
919
958
  ],
920
- docUrl: "https://llama.developer.meta.com/docs/models"
959
+ docUrl: "https://llama.developer.meta.com/docs/models",
960
+ gateway: "models.dev"
921
961
  },
922
962
  cerebras: {
923
963
  url: "https://api.cerebras.ai/v1/chat/completions",
@@ -925,7 +965,48 @@ var PROVIDER_REGISTRY = {
925
965
  apiKeyHeader: "Authorization",
926
966
  name: "Cerebras",
927
967
  models: ["gpt-oss-120b", "qwen-3-235b-a22b-instruct-2507", "qwen-3-coder-480b"],
928
- docUrl: "https://inference-docs.cerebras.ai/models/overview"
968
+ docUrl: "https://inference-docs.cerebras.ai/models/overview",
969
+ gateway: "models.dev"
970
+ },
971
+ netlify: {
972
+ apiKeyEnvVar: ["NETLIFY_TOKEN", "NETLIFY_SITE_ID"],
973
+ apiKeyHeader: "Authorization",
974
+ name: "Netlify",
975
+ gateway: "netlify",
976
+ models: [
977
+ "anthropic/claude-opus-4-1-20250805",
978
+ "anthropic/claude-opus-4-20250514",
979
+ "anthropic/claude-sonnet-4-20250514",
980
+ "anthropic/claude-3-7-sonnet-20250219",
981
+ "anthropic/claude-3-5-haiku-20241022",
982
+ "anthropic/claude-sonnet-4-5-20250929",
983
+ "anthropic/claude-3-7-sonnet-latest",
984
+ "anthropic/claude-3-5-haiku-latest",
985
+ "anthropic/claude-3-haiku-20240307",
986
+ "gemini/gemini-flash-latest",
987
+ "gemini/gemini-2.5-flash",
988
+ "gemini/gemini-2.5-flash-lite-preview-09-2025",
989
+ "gemini/gemini-2.5-flash-lite",
990
+ "gemini/gemini-2.0-flash",
991
+ "gemini/gemini-2.0-flash-lite",
992
+ "gemini/gemini-2.5-pro",
993
+ "gemini/gemini-2.5-flash-preview-09-2025",
994
+ "gemini/gemini-flash-lite-latest",
995
+ "gemini/gemini-2.5-flash-image-preview",
996
+ "openai/o3",
997
+ "openai/gpt-5-mini",
998
+ "openai/gpt-4.1-nano",
999
+ "openai/o4-mini",
1000
+ "openai/o3-mini",
1001
+ "openai/codex-mini-latest",
1002
+ "openai/gpt-5",
1003
+ "openai/gpt-5-codex",
1004
+ "openai/gpt-5-nano",
1005
+ "openai/gpt-4.1",
1006
+ "openai/gpt-4.1-mini",
1007
+ "openai/gpt-4o",
1008
+ "openai/gpt-4o-mini"
1009
+ ]
929
1010
  }
930
1011
  };
931
1012
  function getProviderConfig(providerId) {
@@ -949,33 +1030,328 @@ function parseModelString(modelString) {
949
1030
  };
950
1031
  }
951
1032
 
1033
+ // src/llm/model/gateways/base.ts
1034
+ var MastraModelGateway = class {
1035
+ };
1036
+
1037
+ // src/llm/model/gateways/models-dev.ts
1038
+ var OPENAI_COMPATIBLE_OVERRIDES = {
1039
+ openai: {
1040
+ url: "https://api.openai.com/v1/chat/completions"
1041
+ },
1042
+ anthropic: {
1043
+ url: "https://api.anthropic.com/v1/chat/completions",
1044
+ apiKeyHeader: "x-api-key"
1045
+ },
1046
+ cerebras: {
1047
+ url: "https://api.cerebras.ai/v1/chat/completions"
1048
+ },
1049
+ xai: {
1050
+ url: "https://api.x.ai/v1/chat/completions"
1051
+ },
1052
+ mistral: {
1053
+ url: "https://api.mistral.ai/v1/chat/completions"
1054
+ },
1055
+ google: {
1056
+ url: "https://generativelanguage.googleapis.com/v1beta/chat/completions"
1057
+ },
1058
+ groq: {
1059
+ url: "https://api.groq.com/openai/v1/chat/completions"
1060
+ },
1061
+ togetherai: {
1062
+ url: "https://api.together.xyz/v1/chat/completions"
1063
+ },
1064
+ deepinfra: {
1065
+ url: "https://api.deepinfra.com/v1/openai/chat/completions"
1066
+ },
1067
+ perplexity: {
1068
+ url: "https://api.perplexity.ai/chat/completions"
1069
+ },
1070
+ vercel: {
1071
+ url: "https://ai-gateway.vercel.sh/v1/chat/completions",
1072
+ apiKeyEnvVar: "AI_GATEWAY_API_KEY"
1073
+ }
1074
+ };
1075
+ var ModelsDevGateway = class extends MastraModelGateway {
1076
+ name = "models.dev";
1077
+ prefix = void 0;
1078
+ // No prefix for registry gateway
1079
+ providerConfigs = {};
1080
+ constructor(providerConfigs) {
1081
+ super();
1082
+ if (providerConfigs) this.providerConfigs = providerConfigs;
1083
+ }
1084
+ async fetchProviders() {
1085
+ console.info("Fetching providers from models.dev API...");
1086
+ const response = await fetch("https://models.dev/api.json");
1087
+ if (!response.ok) {
1088
+ throw new Error(`Failed to fetch from models.dev: ${response.statusText}`);
1089
+ }
1090
+ const data = await response.json();
1091
+ const providerConfigs = {};
1092
+ for (const [providerId, providerInfo] of Object.entries(data)) {
1093
+ if (!providerInfo || typeof providerInfo !== "object" || !providerInfo.models) continue;
1094
+ const normalizedId = providerId;
1095
+ const isOpenAICompatible = providerInfo.npm === "@ai-sdk/openai-compatible" || providerInfo.npm === "@ai-sdk/gateway" || // Vercel AI Gateway is OpenAI-compatible
1096
+ normalizedId in OPENAI_COMPATIBLE_OVERRIDES;
1097
+ const hasApiAndEnv = providerInfo.api && providerInfo.env && providerInfo.env.length > 0;
1098
+ if (isOpenAICompatible || hasApiAndEnv) {
1099
+ const modelIds = Object.keys(providerInfo.models).sort();
1100
+ let url = providerInfo.api || OPENAI_COMPATIBLE_OVERRIDES[normalizedId]?.url;
1101
+ if (url && !url.includes("/chat/completions") && !url.includes("/messages")) {
1102
+ url = url.replace(/\/$/, "") + "/chat/completions";
1103
+ }
1104
+ if (!url) {
1105
+ console.info(`Skipping ${normalizedId}: No API URL available`);
1106
+ continue;
1107
+ }
1108
+ const apiKeyEnvVar = providerInfo.env?.[0] || `${normalizedId.toUpperCase().replace(/-/g, "_")}_API_KEY`;
1109
+ const apiKeyHeader = OPENAI_COMPATIBLE_OVERRIDES[normalizedId]?.apiKeyHeader || "Authorization";
1110
+ providerConfigs[normalizedId] = {
1111
+ url,
1112
+ apiKeyEnvVar,
1113
+ apiKeyHeader,
1114
+ name: providerInfo.name || providerId.charAt(0).toUpperCase() + providerId.slice(1),
1115
+ models: modelIds.filter((id) => !id.includes(`codex`)),
1116
+ // codex requires responses api
1117
+ docUrl: providerInfo.doc,
1118
+ // Include documentation URL if available
1119
+ gateway: `models.dev`
1120
+ };
1121
+ } else {
1122
+ console.info(`Skipped provider ${providerInfo.name}`);
1123
+ }
1124
+ }
1125
+ this.providerConfigs = providerConfigs;
1126
+ console.info(`Found ${Object.keys(providerConfigs).length} OpenAI-compatible providers`);
1127
+ console.info("Providers:", Object.keys(providerConfigs).sort());
1128
+ return providerConfigs;
1129
+ }
1130
+ buildUrl(modelId, envVars) {
1131
+ const [provider, ...modelParts] = modelId.split("/");
1132
+ if (!provider || !modelParts.length) {
1133
+ return false;
1134
+ }
1135
+ const config = this.providerConfigs[provider];
1136
+ if (!config?.url) {
1137
+ return false;
1138
+ }
1139
+ const baseUrlEnvVar = `${provider.toUpperCase().replace(/-/g, "_")}_BASE_URL`;
1140
+ const customBaseUrl = envVars[baseUrlEnvVar];
1141
+ return customBaseUrl || config.url;
1142
+ }
1143
+ buildHeaders(modelId, envVars) {
1144
+ const [provider] = modelId.split("/");
1145
+ if (!provider) {
1146
+ return {};
1147
+ }
1148
+ const config = this.providerConfigs[provider];
1149
+ if (!config) {
1150
+ return {};
1151
+ }
1152
+ const apiKey = typeof config.apiKeyEnvVar === `string` ? envVars[config.apiKeyEnvVar] : void 0;
1153
+ if (!apiKey) {
1154
+ return {};
1155
+ }
1156
+ const headers = {};
1157
+ if (config.apiKeyHeader === "Authorization" || !config.apiKeyHeader) {
1158
+ headers["Authorization"] = `Bearer ${apiKey}`;
1159
+ } else {
1160
+ headers[config.apiKeyHeader] = apiKey;
1161
+ }
1162
+ if (provider === "anthropic") {
1163
+ headers["anthropic-version"] = "2023-06-01";
1164
+ }
1165
+ return headers;
1166
+ }
1167
+ };
1168
+
1169
+ // src/llm/model/gateways/netlify.ts
1170
+ var NetlifyGateway = class extends MastraModelGateway {
1171
+ name = "netlify";
1172
+ prefix = "netlify";
1173
+ // All providers will be prefixed with "netlify/"
1174
+ tokenCache = new chunkUU5L5GDY_cjs.InMemoryServerCache();
1175
+ async fetchProviders() {
1176
+ console.info("Fetching providers from Netlify AI Gateway...");
1177
+ const response = await fetch("https://api.netlify.com/api/v1/ai-gateway/providers");
1178
+ if (!response.ok) {
1179
+ throw new Error(`Failed to fetch from Netlify: ${response.statusText}`);
1180
+ }
1181
+ const data = await response.json();
1182
+ const netlify = {
1183
+ apiKeyEnvVar: ["NETLIFY_TOKEN", "NETLIFY_SITE_ID"],
1184
+ apiKeyHeader: "Authorization",
1185
+ // Netlify uses standard Bearer auth
1186
+ name: `Netlify`,
1187
+ gateway: `netlify`,
1188
+ models: []
1189
+ };
1190
+ for (const [providerId, provider] of Object.entries(data.providers)) {
1191
+ for (const model of provider.models) {
1192
+ netlify.models.push(`${providerId}/${model}`);
1193
+ }
1194
+ }
1195
+ console.info(`Found ${Object.keys(data.providers).length} models via Netlify Gateway`);
1196
+ return { netlify };
1197
+ }
1198
+ async buildUrl(modelId, envVars) {
1199
+ if (!modelId.startsWith(`${this.prefix}/`)) {
1200
+ return false;
1201
+ }
1202
+ const parts = modelId.split("/");
1203
+ if (parts.length < 3) {
1204
+ return false;
1205
+ }
1206
+ const provider = parts[1];
1207
+ if (!provider) {
1208
+ return false;
1209
+ }
1210
+ const siteId = envVars["NETLIFY_SITE_ID"];
1211
+ const netlifyToken = envVars["NETLIFY_TOKEN"];
1212
+ if (!netlifyToken) {
1213
+ throw new chunkWM4VQWOZ_cjs.MastraError({
1214
+ id: "NETLIFY_GATEWAY_NO_TOKEN",
1215
+ domain: "LLM",
1216
+ category: "UNKNOWN",
1217
+ text: `Missing NETLIFY_TOKEN environment variable required for model: ${modelId}`
1218
+ });
1219
+ }
1220
+ if (!siteId) {
1221
+ throw new chunkWM4VQWOZ_cjs.MastraError({
1222
+ id: "NETLIFY_GATEWAY_NO_SITE_ID",
1223
+ domain: "LLM",
1224
+ category: "UNKNOWN",
1225
+ text: `Missing NETLIFY_SITE_ID environment variable required for model: ${modelId}`
1226
+ });
1227
+ }
1228
+ try {
1229
+ const tokenData = await this.getOrFetchToken(siteId, netlifyToken);
1230
+ return `${tokenData.url}chat/completions`;
1231
+ } catch (error) {
1232
+ throw new chunkWM4VQWOZ_cjs.MastraError({
1233
+ id: "NETLIFY_GATEWAY_TOKEN_ERROR",
1234
+ domain: "LLM",
1235
+ category: "UNKNOWN",
1236
+ text: `Failed to get Netlify AI Gateway token for model ${modelId}: ${error instanceof Error ? error.message : String(error)}`
1237
+ });
1238
+ }
1239
+ }
1240
+ /**
1241
+ * Get cached token or fetch a new site-specific AI Gateway token from Netlify
1242
+ */
1243
+ async getOrFetchToken(siteId, netlifyToken) {
1244
+ const cacheKey = `netlify-token:${siteId}:${netlifyToken}`;
1245
+ const cached = await this.tokenCache.get(cacheKey);
1246
+ if (cached && cached.expiresAt > Date.now() / 1e3 + 60) {
1247
+ return { token: cached.token, url: cached.url };
1248
+ }
1249
+ const response = await fetch(`https://api.netlify.com/api/v1/sites/${siteId}/ai-gateway/token`, {
1250
+ method: "GET",
1251
+ headers: {
1252
+ Authorization: `Bearer ${netlifyToken}`
1253
+ }
1254
+ });
1255
+ if (!response.ok) {
1256
+ const error = await response.text();
1257
+ throw new Error(`Failed to get Netlify AI Gateway token: ${response.status} ${error}`);
1258
+ }
1259
+ const tokenResponse = await response.json();
1260
+ await this.tokenCache.set(cacheKey, {
1261
+ token: tokenResponse.token,
1262
+ url: tokenResponse.url,
1263
+ expiresAt: tokenResponse.expires_at
1264
+ });
1265
+ return { token: tokenResponse.token, url: tokenResponse.url };
1266
+ }
1267
+ async buildHeaders(modelId, envVars) {
1268
+ const siteId = envVars["NETLIFY_SITE_ID"];
1269
+ const netlifyToken = envVars["NETLIFY_TOKEN"];
1270
+ if (!netlifyToken) {
1271
+ throw new chunkWM4VQWOZ_cjs.MastraError({
1272
+ id: "NETLIFY_GATEWAY_NO_TOKEN",
1273
+ domain: "LLM",
1274
+ category: "UNKNOWN",
1275
+ text: `Missing NETLIFY_TOKEN environment variable required for model: ${modelId}`
1276
+ });
1277
+ }
1278
+ if (!siteId) {
1279
+ throw new chunkWM4VQWOZ_cjs.MastraError({
1280
+ id: "NETLIFY_GATEWAY_NO_SITE_ID",
1281
+ domain: "LLM",
1282
+ category: "UNKNOWN",
1283
+ text: `Missing NETLIFY_SITE_ID environment variable required for model: ${modelId}`
1284
+ });
1285
+ }
1286
+ try {
1287
+ const tokenData = await this.getOrFetchToken(siteId, netlifyToken);
1288
+ return {
1289
+ Authorization: `Bearer ${tokenData.token}`
1290
+ };
1291
+ } catch (error) {
1292
+ throw new chunkWM4VQWOZ_cjs.MastraError({
1293
+ id: "NETLIFY_GATEWAY_TOKEN_ERROR",
1294
+ domain: "LLM",
1295
+ category: "UNKNOWN",
1296
+ text: `Failed to get Netlify AI Gateway token for model ${modelId}: ${error instanceof Error ? error.message : String(error)}`
1297
+ });
1298
+ }
1299
+ }
1300
+ };
1301
+
1302
+ // src/llm/model/gateway-resolver.ts
1303
+ function getStaticProvidersByGateway(name) {
1304
+ return Object.fromEntries(Object.entries(PROVIDER_REGISTRY).filter(([_provider, config]) => config.gateway === name));
1305
+ }
1306
+ var gateways = [new NetlifyGateway(), new ModelsDevGateway(getStaticProvidersByGateway(`models.dev`))];
1307
+ function findGatewayForModel(modelId) {
1308
+ const prefixedGateway = gateways.find((g) => g.prefix && modelId.startsWith(`${g.prefix}/`));
1309
+ if (prefixedGateway) {
1310
+ return prefixedGateway;
1311
+ }
1312
+ const unprefixedGateways = gateways.filter((g) => !g.prefix);
1313
+ for (const gateway of unprefixedGateways) {
1314
+ return gateway;
1315
+ }
1316
+ return null;
1317
+ }
1318
+ async function resolveModelConfig(modelId, envVars = process.env) {
1319
+ const gateway = findGatewayForModel(modelId);
1320
+ if (!gateway) {
1321
+ return { url: false, headers: {}, resolvedModelId: modelId };
1322
+ }
1323
+ const url = await gateway.buildUrl(modelId, envVars);
1324
+ if (url === false) {
1325
+ return { url: false, headers: {}, resolvedModelId: modelId };
1326
+ }
1327
+ const headers = gateway.buildHeaders ? await gateway.buildHeaders(modelId, envVars) : {};
1328
+ let resolvedModelId = modelId;
1329
+ const prefix = gateway.prefix ? `${gateway.prefix}/` : null;
1330
+ if (prefix && resolvedModelId.startsWith(prefix)) {
1331
+ resolvedModelId = resolvedModelId.substring(prefix.length);
1332
+ }
1333
+ const firstSlashIndex = resolvedModelId.indexOf("/");
1334
+ if (firstSlashIndex !== -1) {
1335
+ resolvedModelId = resolvedModelId.substring(firstSlashIndex + 1);
1336
+ }
1337
+ return { url, headers, resolvedModelId };
1338
+ }
1339
+
952
1340
  // src/llm/model/openai-compatible.ts
953
1341
  function resolveApiKey({ provider, apiKey }) {
954
1342
  if (apiKey) return apiKey;
955
1343
  if (provider) {
956
1344
  const config = getProviderConfig(provider);
957
- if (config?.apiKeyEnvVar) {
1345
+ if (typeof config?.apiKeyEnvVar === `string`) {
958
1346
  return process.env[config.apiKeyEnvVar];
959
1347
  }
960
- }
961
- return void 0;
962
- }
963
- function buildHeaders(apiKey, apiKeyHeader, customHeaders, provider) {
964
- const headers = {
965
- "Content-Type": "application/json",
966
- ...customHeaders
967
- };
968
- if (apiKey) {
969
- if (apiKeyHeader === "x-api-key") {
970
- headers["x-api-key"] = apiKey;
971
- } else {
972
- headers["Authorization"] = `Bearer ${apiKey}`;
1348
+ if (Array.isArray(config?.apiKeyEnvVar)) {
1349
+ for (const key of config.apiKeyEnvVar) {
1350
+ if (process.env[key]) return process.env[key];
1351
+ }
973
1352
  }
974
1353
  }
975
- if (provider === "anthropic") {
976
- headers["anthropic-version"] = "2023-06-01";
977
- }
978
- return headers;
1354
+ return void 0;
979
1355
  }
980
1356
  var OpenAICompatibleModel = class {
981
1357
  specificationVersion = "v2";
@@ -985,9 +1361,9 @@ var OpenAICompatibleModel = class {
985
1361
  supportedUrls = {};
986
1362
  modelId;
987
1363
  provider;
988
- url;
989
- headers;
990
- apiKey;
1364
+ config;
1365
+ fullModelId;
1366
+ // Store the full model ID for gateway resolution
991
1367
  constructor(config) {
992
1368
  let parsedConfig;
993
1369
  if (typeof config === "string") {
@@ -1003,18 +1379,16 @@ var OpenAICompatibleModel = class {
1003
1379
  url: config
1004
1380
  };
1005
1381
  this.provider = "openai-compatible";
1382
+ this.fullModelId = "unknown";
1383
+ this.config = { id: "unknown", url: config };
1006
1384
  } else {
1385
+ this.fullModelId = config;
1007
1386
  const firstSlashIndex = config.indexOf("/");
1008
1387
  if (firstSlashIndex !== -1) {
1009
1388
  const provider = config.substring(0, firstSlashIndex);
1010
1389
  const modelId = config.substring(firstSlashIndex + 1);
1011
- const providerConfig2 = getProviderConfig(provider);
1012
- if (!providerConfig2) {
1013
- throw new Error(`Unknown provider: ${provider}. Use a custom URL instead.`);
1014
- }
1015
1390
  parsedConfig = {
1016
1391
  id: modelId,
1017
- url: providerConfig2.url,
1018
1392
  apiKey: resolveApiKey({ provider })
1019
1393
  };
1020
1394
  this.provider = provider;
@@ -1024,30 +1398,18 @@ var OpenAICompatibleModel = class {
1024
1398
  }
1025
1399
  } else {
1026
1400
  parsedConfig = config;
1401
+ this.fullModelId = config.id;
1027
1402
  const parsed = parseModelString(config.id);
1028
- if (!config.url && parsed.provider) {
1029
- const providerConfig2 = getProviderConfig(parsed.provider);
1030
- if (!providerConfig2) {
1031
- throw new Error(`Unknown provider: ${parsed.provider}. Please provide a URL.`);
1032
- }
1033
- parsedConfig.url = providerConfig2.url;
1403
+ this.provider = parsed.provider || "openai-compatible";
1404
+ if (parsed.provider && parsed.modelId !== config.id) {
1034
1405
  parsedConfig.id = parsed.modelId;
1035
- this.provider = parsed.provider;
1036
- } else {
1037
- this.provider = parsed.provider || "openai-compatible";
1038
1406
  }
1039
1407
  if (!parsedConfig.apiKey) {
1040
1408
  parsedConfig.apiKey = resolveApiKey({ provider: parsed.provider || void 0 });
1041
1409
  }
1042
1410
  }
1043
- if (!parsedConfig.url) {
1044
- throw new Error("URL is required for OpenAI-compatible model");
1045
- }
1046
- const providerConfig = this.provider !== "openai-compatible" ? getProviderConfig(this.provider) : void 0;
1047
1411
  this.modelId = parsedConfig.id;
1048
- this.url = parsedConfig.url;
1049
- this.apiKey = parsedConfig.apiKey;
1050
- this.headers = buildHeaders(parsedConfig.apiKey, providerConfig?.apiKeyHeader, parsedConfig.headers, this.provider);
1412
+ this.config = parsedConfig;
1051
1413
  }
1052
1414
  convertMessagesToOpenAI(messages) {
1053
1415
  return messages.map((msg) => {
@@ -1146,8 +1508,49 @@ var OpenAICompatibleModel = class {
1146
1508
  return "unknown";
1147
1509
  }
1148
1510
  }
1511
+ /**
1512
+ * Resolve URL and headers for the request
1513
+ * This is called fresh for each request to ensure we get the latest values
1514
+ * (e.g., Netlify tokens can expire and need to be refreshed)
1515
+ */
1516
+ async resolveRequestConfig() {
1517
+ const shouldUseGateway = !this.config.url;
1518
+ if (shouldUseGateway) {
1519
+ const { url, headers, resolvedModelId } = await resolveModelConfig(this.fullModelId);
1520
+ if (url === false) {
1521
+ throw new Error(`No gateway can handle model: ${this.fullModelId}`);
1522
+ }
1523
+ const finalHeaders = {
1524
+ "Content-Type": "application/json",
1525
+ ...headers,
1526
+ ...this.config.headers
1527
+ };
1528
+ return { url, headers: finalHeaders, modelId: resolvedModelId };
1529
+ } else {
1530
+ if (!this.config.url) {
1531
+ throw new Error("URL is required for OpenAI-compatible model");
1532
+ }
1533
+ const headers = {
1534
+ "Content-Type": "application/json",
1535
+ ...this.config.headers
1536
+ };
1537
+ if (this.config.apiKey) {
1538
+ const providerConfig = this.provider !== "openai-compatible" ? getProviderConfig(this.provider) : void 0;
1539
+ if (providerConfig?.apiKeyHeader === "x-api-key") {
1540
+ headers["x-api-key"] = this.config.apiKey;
1541
+ } else {
1542
+ headers["Authorization"] = `Bearer ${this.config.apiKey}`;
1543
+ }
1544
+ }
1545
+ return { url: this.config.url, headers, modelId: this.modelId };
1546
+ }
1547
+ }
1149
1548
  validateApiKey() {
1150
- if (!this.apiKey && this.provider !== "openai-compatible") {
1549
+ const willUseGateway = !this.config.url;
1550
+ if (willUseGateway) {
1551
+ return;
1552
+ }
1553
+ if (!this.config.apiKey && this.provider !== "openai-compatible") {
1151
1554
  const providerConfig = getProviderConfig(this.provider);
1152
1555
  if (providerConfig?.apiKeyEnvVar) {
1153
1556
  throw new Error(
@@ -1166,208 +1569,247 @@ var OpenAICompatibleModel = class {
1166
1569
  );
1167
1570
  }
1168
1571
  async doStream(options) {
1169
- this.validateApiKey();
1170
- const { prompt, tools, toolChoice, providerOptions } = options;
1171
- const body = {
1172
- messages: this.convertMessagesToOpenAI(prompt),
1173
- model: this.modelId,
1174
- stream: true,
1175
- ...providerOptions
1176
- };
1177
- const openAITools = this.convertToolsToOpenAI(tools);
1178
- if (openAITools) {
1179
- body.tools = openAITools;
1180
- if (toolChoice) {
1181
- body.tool_choice = toolChoice.type === "none" ? "none" : toolChoice.type === "required" ? "required" : toolChoice.type === "auto" ? "auto" : toolChoice.type === "tool" ? { type: "function", function: { name: toolChoice.toolName } } : "auto";
1182
- }
1572
+ try {
1573
+ this.validateApiKey();
1574
+ } catch (error) {
1575
+ return {
1576
+ stream: new ReadableStream({
1577
+ start(controller) {
1578
+ controller.enqueue({
1579
+ type: "error",
1580
+ error: error instanceof Error ? error.message : String(error)
1581
+ });
1582
+ }
1583
+ }),
1584
+ warnings: []
1585
+ };
1183
1586
  }
1184
- if (options.responseFormat?.type === "json") {
1185
- body.response_format = {
1186
- type: "json_schema",
1187
- json_schema: {
1188
- name: "response",
1189
- strict: true,
1190
- schema: options.responseFormat.schema
1587
+ try {
1588
+ const { url, headers, modelId: resolvedModelId } = await this.resolveRequestConfig();
1589
+ const { prompt, tools, toolChoice, providerOptions } = options;
1590
+ const body = {
1591
+ messages: this.convertMessagesToOpenAI(prompt),
1592
+ model: resolvedModelId,
1593
+ stream: true,
1594
+ ...providerOptions
1595
+ };
1596
+ const openAITools = this.convertToolsToOpenAI(tools);
1597
+ if (openAITools) {
1598
+ body.tools = openAITools;
1599
+ if (toolChoice) {
1600
+ body.tool_choice = toolChoice.type === "none" ? "none" : toolChoice.type === "required" ? "required" : toolChoice.type === "auto" ? "auto" : toolChoice.type === "tool" ? { type: "function", function: { name: toolChoice.toolName } } : "auto";
1191
1601
  }
1602
+ }
1603
+ if (options.responseFormat?.type === "json") {
1604
+ body.response_format = {
1605
+ type: "json_schema",
1606
+ json_schema: {
1607
+ name: "response",
1608
+ strict: true,
1609
+ schema: options.responseFormat.schema
1610
+ }
1611
+ };
1612
+ }
1613
+ const fetchArgs = {
1614
+ method: "POST",
1615
+ headers,
1616
+ body: JSON.stringify(body),
1617
+ signal: options.abortSignal
1192
1618
  };
1193
- }
1194
- const fetchArgs = {
1195
- method: "POST",
1196
- headers: this.headers,
1197
- body: JSON.stringify(body),
1198
- signal: options.abortSignal
1199
- };
1200
- const response = await fetch(this.url, fetchArgs);
1201
- if (!response.ok) {
1202
- const error = await response.text();
1203
- if (response.status === 401 || response.status === 403) {
1204
- const providerConfig = getProviderConfig(this.provider);
1205
- if (providerConfig?.apiKeyEnvVar) {
1206
- throw new Error(
1207
- `Authentication failed for provider "${this.provider}". Please ensure the ${providerConfig.apiKeyEnvVar} environment variable is set with a valid API key.`
1208
- );
1619
+ const response = await fetch(url, fetchArgs);
1620
+ if (!response.ok) {
1621
+ const error = await response.text();
1622
+ if (response.status === 401 || response.status === 403) {
1623
+ const providerConfig = getProviderConfig(this.provider);
1624
+ if (providerConfig?.apiKeyEnvVar) {
1625
+ throw new Error(
1626
+ `Authentication failed for provider "${this.provider}". Please ensure the ${providerConfig.apiKeyEnvVar} environment variable is set with a valid API key.`
1627
+ );
1628
+ }
1209
1629
  }
1630
+ throw new Error(`OpenAI-compatible API error: ${response.status} - ${error}`);
1210
1631
  }
1211
- throw new Error(`OpenAI-compatible API error: ${response.status} - ${error}`);
1212
- }
1213
- const reader = response.body?.getReader();
1214
- if (!reader) {
1215
- throw new Error("Response body is not readable");
1216
- }
1217
- const decoder = new TextDecoder();
1218
- let buffer = "";
1219
- let sentStart = false;
1220
- const toolCallBuffers = /* @__PURE__ */ new Map();
1221
- const mapFinishReason = this.mapFinishReason.bind(this);
1222
- const modelId = this.modelId;
1223
- let isActiveText = false;
1224
- const stream = new ReadableStream({
1225
- async start(controller) {
1226
- try {
1227
- controller.enqueue({
1228
- type: "stream-start",
1229
- warnings: []
1230
- });
1231
- while (true) {
1232
- const { done, value } = await reader.read();
1233
- if (done) {
1234
- for (const [_, toolCall] of toolCallBuffers) {
1235
- if (!toolCall.sent && toolCall.id && toolCall.name && toolCall.args) {
1236
- controller.enqueue({
1237
- type: "tool-call",
1238
- toolCallId: toolCall.id,
1239
- toolName: toolCall.name,
1240
- input: toolCall.args || "{}"
1241
- });
1242
- }
1243
- }
1244
- controller.close();
1245
- break;
1246
- }
1247
- buffer += decoder.decode(value, { stream: true });
1248
- const lines = buffer.split("\n");
1249
- buffer = lines.pop() || "";
1250
- for (const line of lines) {
1251
- if (line.trim() === "" || line.trim() === "data: [DONE]") {
1252
- continue;
1253
- }
1254
- if (line.startsWith("data: ")) {
1255
- try {
1256
- const data = JSON.parse(line.slice(6));
1257
- if (!sentStart && data.id) {
1632
+ const reader = response.body?.getReader();
1633
+ if (!reader) {
1634
+ throw new Error("Response body is not readable");
1635
+ }
1636
+ const decoder = new TextDecoder();
1637
+ let buffer = "";
1638
+ let sentStart = false;
1639
+ const toolCallBuffers = /* @__PURE__ */ new Map();
1640
+ const mapFinishReason = this.mapFinishReason.bind(this);
1641
+ const modelId = this.modelId;
1642
+ let isActiveText = false;
1643
+ const stream = new ReadableStream({
1644
+ async start(controller) {
1645
+ try {
1646
+ controller.enqueue({
1647
+ type: "stream-start",
1648
+ warnings: []
1649
+ });
1650
+ while (true) {
1651
+ const { done, value } = await reader.read();
1652
+ if (done) {
1653
+ for (const [_, toolCall] of toolCallBuffers) {
1654
+ if (!toolCall.sent && toolCall.id && toolCall.name && toolCall.args) {
1258
1655
  controller.enqueue({
1259
- type: "response-metadata",
1260
- id: data.id,
1261
- modelId: data.model || modelId,
1262
- timestamp: new Date(data.created ? data.created * 1e3 : Date.now())
1656
+ type: "tool-call",
1657
+ toolCallId: toolCall.id,
1658
+ toolName: toolCall.name,
1659
+ input: toolCall.args || "{}"
1263
1660
  });
1264
- sentStart = true;
1265
1661
  }
1266
- const choice = data.choices?.[0];
1267
- if (!choice) continue;
1268
- if (choice.delta?.content) {
1269
- if (!isActiveText) {
1270
- controller.enqueue({ type: "text-start", id: "text-1" });
1271
- isActiveText = true;
1662
+ }
1663
+ controller.close();
1664
+ break;
1665
+ }
1666
+ buffer += decoder.decode(value, { stream: true });
1667
+ const lines = buffer.split("\n");
1668
+ buffer = lines.pop() || "";
1669
+ for (const line of lines) {
1670
+ if (line.trim() === "" || line.trim() === "data: [DONE]") {
1671
+ continue;
1672
+ }
1673
+ if (line.startsWith("data: ")) {
1674
+ try {
1675
+ const data = JSON.parse(line.slice(6));
1676
+ if (!sentStart && data.id) {
1677
+ controller.enqueue({
1678
+ type: "response-metadata",
1679
+ id: data.id,
1680
+ modelId: data.model || modelId,
1681
+ timestamp: new Date(data.created ? data.created * 1e3 : Date.now())
1682
+ });
1683
+ sentStart = true;
1272
1684
  }
1273
- controller.enqueue({
1274
- type: "text-delta",
1275
- id: "text-1",
1276
- delta: choice.delta.content
1277
- });
1278
- } else if (isActiveText) {
1279
- controller.enqueue({ type: "text-end", id: "text-1" });
1280
- isActiveText = false;
1281
- }
1282
- if (choice.delta?.tool_calls) {
1283
- for (const toolCall of choice.delta.tool_calls) {
1284
- const index = toolCall.index;
1285
- if (!toolCallBuffers.has(index)) {
1286
- if (toolCall.id && toolCall.function?.name) {
1287
- controller.enqueue({
1288
- type: "tool-input-start",
1289
- id: toolCall.id,
1290
- toolName: toolCall.function.name
1291
- });
1292
- }
1293
- toolCallBuffers.set(index, {
1294
- id: toolCall.id || "",
1295
- name: toolCall.function?.name || "",
1296
- args: ""
1297
- });
1298
- }
1299
- const buffer2 = toolCallBuffers.get(index);
1300
- if (toolCall.id) {
1301
- buffer2.id = toolCall.id;
1302
- }
1303
- if (toolCall.function?.name) {
1304
- buffer2.name = toolCall.function.name;
1685
+ const choice = data.choices?.[0];
1686
+ if (!choice) continue;
1687
+ if (choice.delta?.content) {
1688
+ if (!isActiveText) {
1689
+ controller.enqueue({ type: "text-start", id: "text-1" });
1690
+ isActiveText = true;
1305
1691
  }
1306
- if (toolCall.function?.arguments) {
1307
- buffer2.args += toolCall.function.arguments;
1308
- controller.enqueue({
1309
- type: "tool-input-delta",
1310
- id: buffer2.id,
1311
- delta: toolCall.function.arguments
1312
- });
1313
- try {
1314
- JSON.parse(buffer2.args);
1315
- if (buffer2.id && buffer2.name) {
1316
- controller.enqueue({
1317
- type: "tool-input-end",
1318
- id: buffer2.id
1319
- });
1692
+ controller.enqueue({
1693
+ type: "text-delta",
1694
+ id: "text-1",
1695
+ delta: choice.delta.content
1696
+ });
1697
+ } else if (isActiveText) {
1698
+ controller.enqueue({ type: "text-end", id: "text-1" });
1699
+ isActiveText = false;
1700
+ }
1701
+ if (choice.delta?.tool_calls) {
1702
+ for (const toolCall of choice.delta.tool_calls) {
1703
+ const index = toolCall.index;
1704
+ if (!toolCallBuffers.has(index)) {
1705
+ if (toolCall.id && toolCall.function?.name) {
1320
1706
  controller.enqueue({
1321
- type: "tool-call",
1322
- toolCallId: buffer2.id,
1323
- toolName: buffer2.name,
1324
- input: buffer2.args
1325
- });
1326
- toolCallBuffers.set(index, {
1327
- id: buffer2.id,
1328
- name: buffer2.name,
1329
- args: buffer2.args,
1330
- sent: true
1707
+ type: "tool-input-start",
1708
+ id: toolCall.id,
1709
+ toolName: toolCall.function.name
1331
1710
  });
1332
1711
  }
1333
- } catch {
1712
+ toolCallBuffers.set(index, {
1713
+ id: toolCall.id || "",
1714
+ name: toolCall.function?.name || "",
1715
+ args: ""
1716
+ });
1717
+ }
1718
+ const buffer2 = toolCallBuffers.get(index);
1719
+ if (toolCall.id) {
1720
+ buffer2.id = toolCall.id;
1721
+ }
1722
+ if (toolCall.function?.name) {
1723
+ buffer2.name = toolCall.function.name;
1724
+ }
1725
+ if (toolCall.function?.arguments) {
1726
+ buffer2.args += toolCall.function.arguments;
1727
+ controller.enqueue({
1728
+ type: "tool-input-delta",
1729
+ id: buffer2.id,
1730
+ delta: toolCall.function.arguments
1731
+ });
1732
+ try {
1733
+ JSON.parse(buffer2.args);
1734
+ if (buffer2.id && buffer2.name) {
1735
+ controller.enqueue({
1736
+ type: "tool-input-end",
1737
+ id: buffer2.id
1738
+ });
1739
+ controller.enqueue({
1740
+ type: "tool-call",
1741
+ toolCallId: buffer2.id,
1742
+ toolName: buffer2.name,
1743
+ input: buffer2.args
1744
+ });
1745
+ toolCallBuffers.set(index, {
1746
+ id: buffer2.id,
1747
+ name: buffer2.name,
1748
+ args: buffer2.args,
1749
+ sent: true
1750
+ });
1751
+ }
1752
+ } catch {
1753
+ }
1334
1754
  }
1335
1755
  }
1336
1756
  }
1757
+ if (choice.finish_reason) {
1758
+ toolCallBuffers.clear();
1759
+ controller.enqueue({
1760
+ type: "finish",
1761
+ finishReason: mapFinishReason(choice.finish_reason),
1762
+ usage: data.usage ? {
1763
+ inputTokens: data.usage.prompt_tokens || 0,
1764
+ outputTokens: data.usage.completion_tokens || 0,
1765
+ totalTokens: data.usage.total_tokens || 0
1766
+ } : {
1767
+ inputTokens: 0,
1768
+ outputTokens: 0,
1769
+ totalTokens: 0
1770
+ }
1771
+ });
1772
+ }
1773
+ } catch (e) {
1774
+ console.error("Error parsing SSE data:", e);
1337
1775
  }
1338
- if (choice.finish_reason) {
1339
- toolCallBuffers.clear();
1340
- controller.enqueue({
1341
- type: "finish",
1342
- finishReason: mapFinishReason(choice.finish_reason),
1343
- usage: data.usage ? {
1344
- inputTokens: data.usage.prompt_tokens || 0,
1345
- outputTokens: data.usage.completion_tokens || 0,
1346
- totalTokens: data.usage.total_tokens || 0
1347
- } : {
1348
- inputTokens: 0,
1349
- outputTokens: 0,
1350
- totalTokens: 0
1351
- }
1352
- });
1353
- }
1354
- } catch (e) {
1355
- console.error("Error parsing SSE data:", e);
1356
1776
  }
1357
1777
  }
1358
1778
  }
1779
+ } catch (error) {
1780
+ return {
1781
+ stream: new ReadableStream({
1782
+ start(controller2) {
1783
+ controller2.enqueue({
1784
+ type: "error",
1785
+ error: error instanceof Error ? error.message : String(error)
1786
+ });
1787
+ }
1788
+ }),
1789
+ warnings: []
1790
+ };
1359
1791
  }
1360
- } catch (error) {
1361
- controller.error(error);
1362
1792
  }
1363
- }
1364
- });
1365
- return {
1366
- stream,
1367
- request: { body: JSON.stringify(body) },
1368
- response: { headers: Object.fromEntries(response.headers.entries()) },
1369
- warnings: []
1370
- };
1793
+ });
1794
+ return {
1795
+ stream,
1796
+ request: { body: JSON.stringify(body) },
1797
+ response: { headers: Object.fromEntries(response.headers.entries()) },
1798
+ warnings: []
1799
+ };
1800
+ } catch (error) {
1801
+ return {
1802
+ stream: new ReadableStream({
1803
+ start(controller) {
1804
+ controller.enqueue({
1805
+ type: "error",
1806
+ error: error instanceof Error ? error.message : String(error)
1807
+ });
1808
+ }
1809
+ }),
1810
+ warnings: []
1811
+ };
1812
+ }
1371
1813
  }
1372
1814
  };
1373
1815
 
@@ -1375,5 +1817,5 @@ exports.OpenAICompatibleModel = OpenAICompatibleModel;
1375
1817
  exports.PROVIDER_REGISTRY = PROVIDER_REGISTRY;
1376
1818
  exports.getProviderConfig = getProviderConfig;
1377
1819
  exports.parseModelString = parseModelString;
1378
- //# sourceMappingURL=chunk-TIBULEK6.cjs.map
1379
- //# sourceMappingURL=chunk-TIBULEK6.cjs.map
1820
+ //# sourceMappingURL=chunk-SZD4WTRW.cjs.map
1821
+ //# sourceMappingURL=chunk-SZD4WTRW.cjs.map