@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.
- package/CHANGELOG.md +14 -0
- package/dist/agent/agent.d.ts +2 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/index.cjs +11 -11
- package/dist/agent/index.js +2 -2
- package/dist/agent/input-processor/index.cjs +6 -6
- package/dist/agent/input-processor/index.js +1 -1
- package/dist/ai-tracing/index.cjs +32 -32
- package/dist/ai-tracing/index.js +1 -1
- package/dist/cache/index.cjs +3 -3
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-4VNAMG7K.cjs → chunk-2C5AQMP5.cjs} +6 -6
- package/dist/{chunk-4VNAMG7K.cjs.map → chunk-2C5AQMP5.cjs.map} +1 -1
- package/dist/{chunk-JKLLXBOY.js → chunk-2EMOWXLL.js} +9 -9
- package/dist/{chunk-JKLLXBOY.js.map → chunk-2EMOWXLL.js.map} +1 -1
- package/dist/{chunk-EPMJYNEK.cjs → chunk-2F4RLQ5V.cjs} +4 -4
- package/dist/{chunk-EPMJYNEK.cjs.map → chunk-2F4RLQ5V.cjs.map} +1 -1
- package/dist/{chunk-HNBU4PI7.cjs → chunk-3I3NRXSD.cjs} +4 -4
- package/dist/{chunk-HNBU4PI7.cjs.map → chunk-3I3NRXSD.cjs.map} +1 -1
- package/dist/{chunk-SQQMX4VC.cjs → chunk-4PRV2Y55.cjs} +6 -6
- package/dist/{chunk-SQQMX4VC.cjs.map → chunk-4PRV2Y55.cjs.map} +1 -1
- package/dist/{chunk-7E4ESNZS.cjs → chunk-576KDLXN.cjs} +5 -5
- package/dist/{chunk-7E4ESNZS.cjs.map → chunk-576KDLXN.cjs.map} +1 -1
- package/dist/{chunk-PG6ZNDSR.cjs → chunk-57UPIDGK.cjs} +19 -19
- package/dist/{chunk-PG6ZNDSR.cjs.map → chunk-57UPIDGK.cjs.map} +1 -1
- package/dist/{chunk-5BQOHHCI.js → chunk-5QUE7HZF.js} +4 -4
- package/dist/{chunk-5BQOHHCI.js.map → chunk-5QUE7HZF.js.map} +1 -1
- package/dist/{chunk-CQ73JM2N.cjs → chunk-62I4SVWU.cjs} +10 -10
- package/dist/{chunk-CQ73JM2N.cjs.map → chunk-62I4SVWU.cjs.map} +1 -1
- package/dist/{chunk-COC64XPP.js → chunk-7CJKBCDL.js} +8 -8
- package/dist/{chunk-COC64XPP.js.map → chunk-7CJKBCDL.js.map} +1 -1
- package/dist/chunk-7J5DS33F.js +3 -0
- package/dist/chunk-7J5DS33F.js.map +1 -0
- package/dist/{chunk-RAXBZZKS.js → chunk-A7REAXWA.js} +3 -3
- package/dist/{chunk-RAXBZZKS.js.map → chunk-A7REAXWA.js.map} +1 -1
- package/dist/{chunk-DRVSEV5Y.cjs → chunk-BBTR6DPH.cjs} +8 -8
- package/dist/{chunk-DRVSEV5Y.cjs.map → chunk-BBTR6DPH.cjs.map} +1 -1
- package/dist/{chunk-FV3SA5TI.js → chunk-BMBWTBCL.js} +3 -3
- package/dist/{chunk-FV3SA5TI.js.map → chunk-BMBWTBCL.js.map} +1 -1
- package/dist/{chunk-NHJVMZIL.cjs → chunk-CC4KO56Z.cjs} +19 -19
- package/dist/{chunk-NHJVMZIL.cjs.map → chunk-CC4KO56Z.cjs.map} +1 -1
- package/dist/{chunk-N4PK4MOG.js → chunk-D2ZPF2AK.js} +4 -4
- package/dist/{chunk-N4PK4MOG.js.map → chunk-D2ZPF2AK.js.map} +1 -1
- package/dist/{chunk-3PQNUWJM.js → chunk-EQV2PPN2.js} +2 -4
- package/dist/chunk-EQV2PPN2.js.map +1 -0
- package/dist/chunk-FUVNHPNL.cjs +4 -0
- package/dist/chunk-FUVNHPNL.cjs.map +1 -0
- package/dist/{chunk-F6EJEELE.cjs → chunk-HJQ7ANDX.cjs} +6 -6
- package/dist/{chunk-F6EJEELE.cjs.map → chunk-HJQ7ANDX.cjs.map} +1 -1
- package/dist/{chunk-2GHLV754.cjs → chunk-HV5ND4KF.cjs} +4 -4
- package/dist/{chunk-2GHLV754.cjs.map → chunk-HV5ND4KF.cjs.map} +1 -1
- package/dist/{chunk-HQPFM22N.cjs → chunk-IB27A3HF.cjs} +16 -16
- package/dist/{chunk-HQPFM22N.cjs.map → chunk-IB27A3HF.cjs.map} +1 -1
- package/dist/{chunk-BCWRUNMS.cjs → chunk-K3UPABLX.cjs} +38 -38
- package/dist/{chunk-BCWRUNMS.cjs.map → chunk-K3UPABLX.cjs.map} +1 -1
- package/dist/{chunk-XG3SFWOH.js → chunk-KK5LUATU.js} +3 -3
- package/dist/{chunk-XG3SFWOH.js.map → chunk-KK5LUATU.js.map} +1 -1
- package/dist/{chunk-VWO3JJXC.js → chunk-LYRPXSHB.js} +4 -4
- package/dist/{chunk-VWO3JJXC.js.map → chunk-LYRPXSHB.js.map} +1 -1
- package/dist/{chunk-IAXAPVOP.js → chunk-M24QFL6S.js} +4 -4
- package/dist/{chunk-IAXAPVOP.js.map → chunk-M24QFL6S.js.map} +1 -1
- package/dist/{chunk-5HCVPQTD.js → chunk-M4AX46DS.js} +3 -3
- package/dist/{chunk-5HCVPQTD.js.map → chunk-M4AX46DS.js.map} +1 -1
- package/dist/{chunk-3WFH6YRI.js → chunk-M635OK6I.js} +4 -4
- package/dist/{chunk-3WFH6YRI.js.map → chunk-M635OK6I.js.map} +1 -1
- package/dist/{chunk-UTEH2LCJ.cjs → chunk-NLBX7Q47.cjs} +19 -19
- package/dist/{chunk-UTEH2LCJ.cjs.map → chunk-NLBX7Q47.cjs.map} +1 -1
- package/dist/{chunk-2DGWSOVQ.js → chunk-NMSLDMQ6.js} +3 -3
- package/dist/{chunk-2DGWSOVQ.js.map → chunk-NMSLDMQ6.js.map} +1 -1
- package/dist/{chunk-PJ6HF3KW.js → chunk-NVMKTP4N.js} +3 -3
- package/dist/{chunk-PJ6HF3KW.js.map → chunk-NVMKTP4N.js.map} +1 -1
- package/dist/{chunk-4BEHJSL6.js → chunk-QFKTSGBI.js} +3 -3
- package/dist/{chunk-4BEHJSL6.js.map → chunk-QFKTSGBI.js.map} +1 -1
- package/dist/{chunk-LZBVDMVQ.cjs → chunk-QMDJVXFQ.cjs} +19 -19
- package/dist/{chunk-LZBVDMVQ.cjs.map → chunk-QMDJVXFQ.cjs.map} +1 -1
- package/dist/{chunk-TIBULEK6.cjs → chunk-SZD4WTRW.cjs} +717 -275
- package/dist/chunk-SZD4WTRW.cjs.map +1 -0
- package/dist/{chunk-OBIF7QD5.js → chunk-T2CUZA2P.js} +3 -3
- package/dist/{chunk-OBIF7QD5.js.map → chunk-T2CUZA2P.js.map} +1 -1
- package/dist/{chunk-WHFNGECY.js → chunk-T3JFFQH2.js} +3 -2
- package/dist/chunk-T3JFFQH2.js.map +1 -0
- package/dist/{chunk-BUY5X7DT.js → chunk-TJHEGJNW.js} +4 -4
- package/dist/{chunk-BUY5X7DT.js.map → chunk-TJHEGJNW.js.map} +1 -1
- package/dist/{chunk-KTCBGNCZ.cjs → chunk-UU5L5GDY.cjs} +2 -4
- package/dist/chunk-UU5L5GDY.cjs.map +1 -0
- package/dist/{chunk-S7UXT3V4.cjs → chunk-WM4VQWOZ.cjs} +3 -2
- package/dist/chunk-WM4VQWOZ.cjs.map +1 -0
- package/dist/{chunk-RNIY63FP.cjs → chunk-WMGV4CS3.cjs} +59 -59
- package/dist/{chunk-RNIY63FP.cjs.map → chunk-WMGV4CS3.cjs.map} +1 -1
- package/dist/{chunk-5M6ZTQJN.js → chunk-X6PLOE2T.js} +717 -275
- package/dist/chunk-X6PLOE2T.js.map +1 -0
- package/dist/error/index.cjs +5 -5
- package/dist/error/index.d.ts +2 -1
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +1 -1
- package/dist/eval/index.cjs +3 -3
- package/dist/eval/index.js +1 -1
- package/dist/index.cjs +66 -66
- package/dist/index.js +15 -15
- package/dist/llm/index.cjs +5 -5
- package/dist/llm/index.d.ts +1 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +1 -1
- package/dist/llm/model/gateway-resolver.d.ts +9 -0
- package/dist/llm/model/gateway-resolver.d.ts.map +1 -0
- package/dist/llm/model/gateways/base.d.ts +5 -4
- package/dist/llm/model/gateways/base.d.ts.map +1 -1
- package/dist/llm/model/gateways/index.d.ts +1 -0
- package/dist/llm/model/gateways/index.d.ts.map +1 -1
- package/dist/llm/model/gateways/models-dev.d.ts +3 -2
- package/dist/llm/model/gateways/models-dev.d.ts.map +1 -1
- package/dist/llm/model/gateways/netlify.d.ts +15 -0
- package/dist/llm/model/gateways/netlify.d.ts.map +1 -0
- package/dist/llm/model/openai-compatible.d.ts +8 -3
- package/dist/llm/model/openai-compatible.d.ts.map +1 -1
- package/dist/llm/model/provider-registry.generated.d.ts +8 -370
- package/dist/llm/model/provider-registry.generated.d.ts.map +1 -1
- package/dist/loop/index.cjs +2 -2
- package/dist/loop/index.js +1 -1
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.js +1 -1
- package/dist/memory/index.cjs +4 -4
- package/dist/memory/index.js +1 -1
- package/dist/network/vNext/index.cjs +29 -29
- package/dist/network/vNext/index.js +2 -2
- package/dist/processors/index.cjs +10 -10
- package/dist/processors/index.js +1 -1
- package/dist/relevance/index.cjs +4 -4
- package/dist/relevance/index.js +1 -1
- package/dist/scores/index.cjs +9 -9
- package/dist/scores/index.js +2 -2
- package/dist/scores/scoreTraces/index.cjs +13 -13
- package/dist/scores/scoreTraces/index.js +4 -4
- package/dist/server/index.cjs +7 -7
- package/dist/server/index.js +2 -2
- package/dist/storage/index.cjs +25 -25
- package/dist/storage/index.js +4 -4
- package/dist/stream/index.cjs +4 -4
- package/dist/stream/index.js +1 -1
- package/dist/telemetry/index.cjs +7 -7
- package/dist/telemetry/index.js +1 -1
- package/dist/test-utils/llm-mock.cjs +2 -2
- package/dist/test-utils/llm-mock.js +1 -1
- package/dist/tts/index.cjs +2 -2
- package/dist/tts/index.js +1 -1
- package/dist/utils.cjs +17 -17
- package/dist/utils.js +1 -1
- package/dist/vector/index.cjs +4 -4
- package/dist/vector/index.js +1 -1
- package/dist/voice/index.cjs +4 -4
- package/dist/voice/index.js +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/index.cjs +12 -12
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/legacy/index.cjs +22 -22
- package/dist/workflows/legacy/index.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-3PQNUWJM.js.map +0 -1
- package/dist/chunk-5M6ZTQJN.js.map +0 -1
- package/dist/chunk-KTCBGNCZ.cjs.map +0 -1
- package/dist/chunk-S7UXT3V4.cjs.map +0 -1
- package/dist/chunk-TIBULEK6.cjs.map +0 -1
- 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
|
-
|
|
962
|
-
|
|
963
|
-
|
|
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
|
-
|
|
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
|
-
|
|
989
|
-
|
|
990
|
-
|
|
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
|
-
|
|
1029
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
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
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
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
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
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
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
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: "
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1656
|
+
type: "tool-call",
|
|
1657
|
+
toolCallId: toolCall.id,
|
|
1658
|
+
toolName: toolCall.name,
|
|
1659
|
+
input: toolCall.args || "{}"
|
|
1263
1660
|
});
|
|
1264
|
-
sentStart = true;
|
|
1265
1661
|
}
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
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
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
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
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
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-
|
|
1322
|
-
|
|
1323
|
-
toolName:
|
|
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
|
-
|
|
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
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
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-
|
|
1379
|
-
//# sourceMappingURL=chunk-
|
|
1820
|
+
//# sourceMappingURL=chunk-SZD4WTRW.cjs.map
|
|
1821
|
+
//# sourceMappingURL=chunk-SZD4WTRW.cjs.map
|