@mastra/core 1.0.0-beta.3 → 1.0.0-beta.5
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 +369 -0
- package/dist/agent/agent.d.ts +2 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.types.d.ts +2 -0
- package/dist/agent/agent.types.d.ts.map +1 -1
- package/dist/agent/index.cjs +9 -9
- package/dist/agent/index.js +2 -2
- package/dist/agent/message-list/index.cjs +3 -3
- package/dist/agent/message-list/index.d.ts +5 -0
- package/dist/agent/message-list/index.d.ts.map +1 -1
- package/dist/agent/message-list/index.js +1 -1
- package/dist/agent/message-list/prompt/attachments-to-parts.d.ts.map +1 -1
- package/dist/agent/types.d.ts +2 -3
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/utils.d.ts.map +1 -1
- package/dist/agent/workflows/prepare-stream/index.d.ts.map +1 -1
- package/dist/agent/workflows/prepare-stream/map-results-step.d.ts.map +1 -1
- package/dist/agent/workflows/prepare-stream/stream-step.d.ts +8 -1
- package/dist/agent/workflows/prepare-stream/stream-step.d.ts.map +1 -1
- package/dist/{chunk-4DWZ4Z6H.js → chunk-3B2OPLGG.js} +13 -7
- package/dist/chunk-3B2OPLGG.js.map +1 -0
- package/dist/{chunk-GRGPQ32U.js → chunk-3ZQ7LX73.js} +13 -13
- package/dist/chunk-3ZQ7LX73.js.map +1 -0
- package/dist/{chunk-VZGBVYXA.cjs → chunk-556MJ7CL.cjs} +33 -27
- package/dist/chunk-556MJ7CL.cjs.map +1 -0
- package/dist/{chunk-HGNRQ3OG.js → chunk-5O52O25J.js} +15 -8
- package/dist/chunk-5O52O25J.js.map +1 -0
- package/dist/{chunk-VU6DVS7J.js → chunk-5SA2EZ33.js} +421 -29
- package/dist/chunk-5SA2EZ33.js.map +1 -0
- package/dist/chunk-6XCINXZ7.cjs +194 -0
- package/dist/chunk-6XCINXZ7.cjs.map +1 -0
- package/dist/{chunk-KOSW5PP5.js → chunk-7ZADRRDW.js} +466 -125
- package/dist/chunk-7ZADRRDW.js.map +1 -0
- package/dist/{chunk-JXESKY4A.js → chunk-B5J5HYDN.js} +7 -5
- package/dist/chunk-B5J5HYDN.js.map +1 -0
- package/dist/chunk-BWYU7D33.js +192 -0
- package/dist/chunk-BWYU7D33.js.map +1 -0
- package/dist/{chunk-MCUX2D5Q.js → chunk-D7CJ4HIQ.js} +263 -24
- package/dist/chunk-D7CJ4HIQ.js.map +1 -0
- package/dist/{chunk-G36A2JRR.cjs → chunk-DQIZ5FFX.cjs} +457 -326
- package/dist/chunk-DQIZ5FFX.cjs.map +1 -0
- package/dist/{chunk-ZPMFINU2.cjs → chunk-HNHZGFZY.cjs} +466 -131
- package/dist/chunk-HNHZGFZY.cjs.map +1 -0
- package/dist/{chunk-3VOUB4ZU.cjs → chunk-IITXXVYI.cjs} +17 -17
- package/dist/chunk-IITXXVYI.cjs.map +1 -0
- package/dist/{chunk-QUKUN6NR.cjs → chunk-ISMGVGUM.cjs} +105 -5
- package/dist/chunk-ISMGVGUM.cjs.map +1 -0
- package/dist/{chunk-OQF4H5Y2.js → chunk-KJIQGPQR.js} +4 -4
- package/dist/{chunk-OQF4H5Y2.js.map → chunk-KJIQGPQR.js.map} +1 -1
- package/dist/{chunk-OWX2PUFH.cjs → chunk-KP42JLXE.cjs} +506 -236
- package/dist/chunk-KP42JLXE.cjs.map +1 -0
- package/dist/{chunk-4RSHBKDJ.cjs → chunk-KWWD3U7G.cjs} +5 -5
- package/dist/chunk-KWWD3U7G.cjs.map +1 -0
- package/dist/{chunk-N4SJ4YX7.cjs → chunk-NHP6ZIDG.cjs} +271 -31
- package/dist/chunk-NHP6ZIDG.cjs.map +1 -0
- package/dist/{chunk-UIZSWUKP.js → chunk-NZAXAFI3.js} +104 -6
- package/dist/chunk-NZAXAFI3.js.map +1 -0
- package/dist/{chunk-O6NA3Z43.cjs → chunk-OUUPUAGA.cjs} +10 -8
- package/dist/chunk-OUUPUAGA.cjs.map +1 -0
- package/dist/{chunk-D6EDHNGV.js → chunk-PC6EKOWK.js} +64 -11
- package/dist/chunk-PC6EKOWK.js.map +1 -0
- package/dist/{chunk-YQ7NLZZ3.cjs → chunk-QGWNF2QJ.cjs} +74 -618
- package/dist/chunk-QGWNF2QJ.cjs.map +1 -0
- package/dist/{chunk-HBJPYQRN.cjs → chunk-RROQ46B6.cjs} +69 -16
- package/dist/chunk-RROQ46B6.cjs.map +1 -0
- package/dist/{chunk-G3OOCXAI.js → chunk-T2CJRA6E.js} +4 -4
- package/dist/chunk-T2CJRA6E.js.map +1 -0
- package/dist/{chunk-T3WZCEC4.js → chunk-T2UNO766.js} +47 -591
- package/dist/chunk-T2UNO766.js.map +1 -0
- package/dist/{chunk-EZVRSZMK.cjs → chunk-U3VE2EVB.cjs} +11 -11
- package/dist/{chunk-EZVRSZMK.cjs.map → chunk-U3VE2EVB.cjs.map} +1 -1
- package/dist/{chunk-4IKJAKCD.cjs → chunk-V537VSV4.cjs} +74 -16
- package/dist/chunk-V537VSV4.cjs.map +1 -0
- package/dist/{chunk-XRIVPHXV.cjs → chunk-VYJXTHII.cjs} +422 -30
- package/dist/chunk-VYJXTHII.cjs.map +1 -0
- package/dist/{chunk-LRSB62Z6.cjs → chunk-X7F4CSGR.cjs} +15 -8
- package/dist/chunk-X7F4CSGR.cjs.map +1 -0
- package/dist/{chunk-CKGIPST2.js → chunk-XBO6W7LZ.js} +462 -193
- package/dist/chunk-XBO6W7LZ.js.map +1 -0
- package/dist/{chunk-KEURQGCQ.js → chunk-XIDKHXNR.js} +74 -17
- package/dist/chunk-XIDKHXNR.js.map +1 -0
- package/dist/{chunk-JTXVR2RA.cjs → chunk-XJQX54QP.cjs} +5 -5
- package/dist/{chunk-JTXVR2RA.cjs.map → chunk-XJQX54QP.cjs.map} +1 -1
- package/dist/{chunk-BAMR7HKO.js → chunk-YDFX3JR2.js} +457 -326
- package/dist/chunk-YDFX3JR2.js.map +1 -0
- package/dist/{chunk-5CWWU22H.js → chunk-ZTTMSCLU.js} +3 -3
- package/dist/{chunk-5CWWU22H.js.map → chunk-ZTTMSCLU.js.map} +1 -1
- package/dist/evals/base.d.ts +1 -1
- package/dist/evals/base.d.ts.map +1 -1
- package/dist/evals/base.test-utils.d.ts +25 -25
- package/dist/evals/index.cjs +4 -4
- package/dist/evals/index.js +1 -1
- package/dist/evals/scoreTraces/index.cjs +3 -3
- package/dist/evals/scoreTraces/index.js +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/dist/integration/index.cjs +2 -2
- package/dist/integration/index.js +1 -1
- package/dist/llm/index.cjs +18 -14
- package/dist/llm/index.d.ts +2 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +5 -5
- package/dist/llm/model/aisdk/v5/model.d.ts.map +1 -1
- package/dist/llm/model/gateway-resolver.d.ts.map +1 -1
- package/dist/llm/model/gateways/azure.d.ts +36 -0
- package/dist/llm/model/gateways/azure.d.ts.map +1 -0
- package/dist/llm/model/gateways/base.d.ts +3 -6
- package/dist/llm/model/gateways/base.d.ts.map +1 -1
- package/dist/llm/model/gateways/index.d.ts +4 -1
- package/dist/llm/model/gateways/index.d.ts.map +1 -1
- package/dist/llm/model/gateways/models-dev.d.ts +2 -2
- package/dist/llm/model/gateways/models-dev.d.ts.map +1 -1
- package/dist/llm/model/gateways/netlify.d.ts +2 -2
- package/dist/llm/model/gateways/netlify.d.ts.map +1 -1
- package/dist/llm/model/model.d.ts.map +1 -1
- package/dist/llm/model/model.loop.d.ts +1 -1
- package/dist/llm/model/model.loop.d.ts.map +1 -1
- package/dist/llm/model/provider-registry.d.ts.map +1 -1
- package/dist/llm/model/provider-types.generated.d.ts +192 -11
- package/dist/llm/model/registry-generator.d.ts +12 -0
- package/dist/llm/model/registry-generator.d.ts.map +1 -1
- package/dist/llm/model/router.d.ts.map +1 -1
- package/dist/loop/index.cjs +2 -2
- package/dist/loop/index.js +1 -1
- package/dist/loop/loop.d.ts.map +1 -1
- package/dist/loop/network/index.d.ts.map +1 -1
- package/dist/loop/test-utils/generateText.d.ts.map +1 -1
- package/dist/loop/test-utils/resultObject.d.ts.map +1 -1
- package/dist/loop/test-utils/streamObject.d.ts.map +1 -1
- package/dist/loop/test-utils/toUIMessageStream.d.ts.map +1 -1
- package/dist/loop/test-utils/utils.d.ts.map +1 -1
- package/dist/loop/types.d.ts +8 -0
- package/dist/loop/types.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/index.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.d.ts +9 -9
- package/dist/mastra/index.d.ts.map +1 -1
- package/dist/mastra/index.js +1 -1
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.d.ts +4 -4
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/types.d.ts +2 -2
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/memory/index.cjs +89 -34
- package/dist/memory/index.cjs.map +1 -1
- package/dist/memory/index.js +85 -30
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/mock.d.ts +9 -13
- package/dist/memory/mock.d.ts.map +1 -1
- package/dist/models-dev-F6MTIYTO.js +3 -0
- package/dist/{models-dev-GCVENVWA.js.map → models-dev-F6MTIYTO.js.map} +1 -1
- package/dist/models-dev-XIVR5EJV.cjs +12 -0
- package/dist/{models-dev-TIBJR6IG.cjs.map → models-dev-XIVR5EJV.cjs.map} +1 -1
- package/dist/netlify-MXBOGAJR.cjs +12 -0
- package/dist/{netlify-NTSNNT6F.cjs.map → netlify-MXBOGAJR.cjs.map} +1 -1
- package/dist/netlify-RX3JXCFQ.js +3 -0
- package/dist/{netlify-O5NJW7CF.js.map → netlify-RX3JXCFQ.js.map} +1 -1
- package/dist/processors/index.cjs +11 -11
- package/dist/processors/index.d.ts +2 -2
- package/dist/processors/index.d.ts.map +1 -1
- package/dist/processors/index.js +1 -1
- package/dist/processors/processors/batch-parts.d.ts +1 -1
- package/dist/processors/processors/batch-parts.d.ts.map +1 -1
- package/dist/processors/processors/language-detector.d.ts +1 -1
- package/dist/processors/processors/language-detector.d.ts.map +1 -1
- package/dist/processors/processors/moderation.d.ts +1 -1
- package/dist/processors/processors/moderation.d.ts.map +1 -1
- package/dist/processors/processors/pii-detector.d.ts +1 -1
- package/dist/processors/processors/pii-detector.d.ts.map +1 -1
- package/dist/processors/processors/prompt-injection-detector.d.ts +1 -1
- package/dist/processors/processors/prompt-injection-detector.d.ts.map +1 -1
- package/dist/processors/processors/structured-output.d.ts +1 -1
- package/dist/processors/processors/structured-output.d.ts.map +1 -1
- package/dist/processors/processors/system-prompt-scrubber.d.ts +1 -1
- package/dist/processors/processors/system-prompt-scrubber.d.ts.map +1 -1
- package/dist/processors/processors/token-limiter.d.ts +1 -1
- package/dist/processors/processors/token-limiter.d.ts.map +1 -1
- package/dist/processors/processors/unicode-normalizer.d.ts +1 -1
- package/dist/processors/processors/unicode-normalizer.d.ts.map +1 -1
- package/dist/provider-registry-3LUCE7FT.js +3 -0
- package/dist/{provider-registry-74GMFZKT.js.map → provider-registry-3LUCE7FT.js.map} +1 -1
- package/dist/provider-registry-NBRXBOQT.cjs +40 -0
- package/dist/{provider-registry-BZP3DIIV.cjs.map → provider-registry-NBRXBOQT.cjs.map} +1 -1
- package/dist/provider-registry.json +400 -22
- package/dist/{registry-generator-JPCV47SC.cjs → registry-generator-DEPPRYYJ.cjs} +21 -6
- package/dist/registry-generator-DEPPRYYJ.cjs.map +1 -0
- package/dist/{registry-generator-XD4FPZTU.js → registry-generator-FLW6NV42.js} +21 -7
- package/dist/registry-generator-FLW6NV42.js.map +1 -0
- package/dist/relevance/index.cjs +2 -2
- package/dist/relevance/index.js +1 -1
- package/dist/server/auth.d.ts +11 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/composite-auth.d.ts +9 -0
- package/dist/server/composite-auth.d.ts.map +1 -0
- package/dist/server/index.cjs +41 -0
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +41 -1
- package/dist/server/index.js.map +1 -1
- package/dist/storage/index.cjs +29 -29
- package/dist/storage/index.js +1 -1
- package/dist/stream/aisdk/v5/compat/prepare-tools.d.ts.map +1 -1
- package/dist/stream/aisdk/v5/output.d.ts.map +1 -1
- package/dist/stream/base/output.d.ts.map +1 -1
- package/dist/stream/index.cjs +11 -11
- package/dist/stream/index.js +2 -2
- package/dist/stream/types.d.ts +7 -2
- package/dist/stream/types.d.ts.map +1 -1
- package/dist/test-utils/llm-mock.cjs +68 -31
- package/dist/test-utils/llm-mock.cjs.map +1 -1
- package/dist/test-utils/llm-mock.d.ts +4 -2
- package/dist/test-utils/llm-mock.d.ts.map +1 -1
- package/dist/test-utils/llm-mock.js +67 -30
- package/dist/test-utils/llm-mock.js.map +1 -1
- package/dist/tools/index.cjs +6 -6
- package/dist/tools/index.js +2 -2
- package/dist/tools/is-vercel-tool.cjs +2 -2
- package/dist/tools/is-vercel-tool.js +1 -1
- package/dist/tools/stream.d.ts +1 -0
- package/dist/tools/stream.d.ts.map +1 -1
- package/dist/tools/tool-builder/builder.d.ts +2 -0
- package/dist/tools/tool-builder/builder.d.ts.map +1 -1
- package/dist/tools/tool.d.ts +6 -6
- package/dist/tools/tool.d.ts.map +1 -1
- package/dist/tools/types.d.ts +6 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/validation.d.ts +13 -1
- package/dist/tools/validation.d.ts.map +1 -1
- package/dist/utils.cjs +22 -22
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -1
- package/dist/vector/filter/index.cjs +7 -189
- package/dist/vector/filter/index.cjs.map +1 -1
- package/dist/vector/filter/index.js +1 -190
- package/dist/vector/filter/index.js.map +1 -1
- package/dist/vector/index.cjs +5 -0
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.ts +1 -0
- package/dist/vector/index.d.ts.map +1 -1
- package/dist/vector/index.js +1 -0
- package/dist/vector/index.js.map +1 -1
- package/dist/vector/types.d.ts +86 -3
- package/dist/vector/types.d.ts.map +1 -1
- package/dist/vector/vector.d.ts +39 -2
- package/dist/vector/vector.d.ts.map +1 -1
- package/dist/voice/aisdk/index.d.ts +3 -0
- package/dist/voice/aisdk/index.d.ts.map +1 -0
- package/dist/voice/aisdk/speech.d.ts +23 -0
- package/dist/voice/aisdk/speech.d.ts.map +1 -0
- package/dist/voice/aisdk/transcription.d.ts +22 -0
- package/dist/voice/aisdk/transcription.d.ts.map +1 -0
- package/dist/voice/composite-voice.d.ts +4 -3
- package/dist/voice/composite-voice.d.ts.map +1 -1
- package/dist/voice/index.cjs +12 -4
- package/dist/voice/index.d.ts +1 -0
- package/dist/voice/index.d.ts.map +1 -1
- package/dist/voice/index.js +1 -1
- package/dist/workflows/default.d.ts.map +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/evented/step-executor.d.ts.map +1 -1
- package/dist/workflows/index.cjs +23 -19
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/types.d.ts +2 -2
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/utils.d.ts +7 -0
- package/dist/workflows/utils.d.ts.map +1 -1
- package/dist/workflows/workflow.d.ts +4 -2
- package/dist/workflows/workflow.d.ts.map +1 -1
- package/package.json +17 -16
- package/src/llm/model/provider-types.generated.d.ts +192 -11
- package/dist/chunk-3VOUB4ZU.cjs.map +0 -1
- package/dist/chunk-4DWZ4Z6H.js.map +0 -1
- package/dist/chunk-4IKJAKCD.cjs.map +0 -1
- package/dist/chunk-4RSHBKDJ.cjs.map +0 -1
- package/dist/chunk-BAMR7HKO.js.map +0 -1
- package/dist/chunk-CKGIPST2.js.map +0 -1
- package/dist/chunk-D6EDHNGV.js.map +0 -1
- package/dist/chunk-G36A2JRR.cjs.map +0 -1
- package/dist/chunk-G3OOCXAI.js.map +0 -1
- package/dist/chunk-GRGPQ32U.js.map +0 -1
- package/dist/chunk-HBJPYQRN.cjs.map +0 -1
- package/dist/chunk-HGNRQ3OG.js.map +0 -1
- package/dist/chunk-JXESKY4A.js.map +0 -1
- package/dist/chunk-KEURQGCQ.js.map +0 -1
- package/dist/chunk-KOSW5PP5.js.map +0 -1
- package/dist/chunk-LRSB62Z6.cjs.map +0 -1
- package/dist/chunk-MCUX2D5Q.js.map +0 -1
- package/dist/chunk-N4SJ4YX7.cjs.map +0 -1
- package/dist/chunk-O6NA3Z43.cjs.map +0 -1
- package/dist/chunk-OWX2PUFH.cjs.map +0 -1
- package/dist/chunk-QUKUN6NR.cjs.map +0 -1
- package/dist/chunk-T3WZCEC4.js.map +0 -1
- package/dist/chunk-UIZSWUKP.js.map +0 -1
- package/dist/chunk-VU6DVS7J.js.map +0 -1
- package/dist/chunk-VZGBVYXA.cjs.map +0 -1
- package/dist/chunk-XRIVPHXV.cjs.map +0 -1
- package/dist/chunk-YQ7NLZZ3.cjs.map +0 -1
- package/dist/chunk-ZPMFINU2.cjs.map +0 -1
- package/dist/models-dev-GCVENVWA.js +0 -3
- package/dist/models-dev-TIBJR6IG.cjs +0 -12
- package/dist/netlify-NTSNNT6F.cjs +0 -12
- package/dist/netlify-O5NJW7CF.js +0 -3
- package/dist/provider-registry-74GMFZKT.js +0 -3
- package/dist/provider-registry-BZP3DIIV.cjs +0 -40
- package/dist/registry-generator-JPCV47SC.cjs.map +0 -1
- package/dist/registry-generator-XD4FPZTU.js.map +0 -1
|
@@ -1,22 +1,237 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
3
|
+
var chunkQGWNF2QJ_cjs = require('./chunk-QGWNF2QJ.cjs');
|
|
4
|
+
var chunkIITXXVYI_cjs = require('./chunk-IITXXVYI.cjs');
|
|
5
|
+
var chunkHNHZGFZY_cjs = require('./chunk-HNHZGFZY.cjs');
|
|
6
|
+
var chunkVYJXTHII_cjs = require('./chunk-VYJXTHII.cjs');
|
|
7
7
|
var chunkTWH4PTDG_cjs = require('./chunk-TWH4PTDG.cjs');
|
|
8
8
|
var chunkJ7O6WENZ_cjs = require('./chunk-J7O6WENZ.cjs');
|
|
9
|
+
var chunkY6ROD72V_cjs = require('./chunk-Y6ROD72V.cjs');
|
|
10
|
+
var azure = require('@ai-sdk/azure');
|
|
9
11
|
var crypto = require('crypto');
|
|
10
12
|
|
|
13
|
+
var AzureOpenAIGateway = class extends chunkHNHZGFZY_cjs.MastraModelGateway {
|
|
14
|
+
constructor(config) {
|
|
15
|
+
super();
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.validateConfig();
|
|
18
|
+
}
|
|
19
|
+
id = "azure-openai";
|
|
20
|
+
name = "azure-openai";
|
|
21
|
+
tokenCache = new chunkY6ROD72V_cjs.InMemoryServerCache();
|
|
22
|
+
validateConfig() {
|
|
23
|
+
if (!this.config.resourceName) {
|
|
24
|
+
throw new chunkTWH4PTDG_cjs.MastraError({
|
|
25
|
+
id: "AZURE_GATEWAY_INVALID_CONFIG",
|
|
26
|
+
domain: "LLM",
|
|
27
|
+
category: "UNKNOWN",
|
|
28
|
+
text: "resourceName is required for Azure OpenAI gateway"
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (!this.config.apiKey) {
|
|
32
|
+
throw new chunkTWH4PTDG_cjs.MastraError({
|
|
33
|
+
id: "AZURE_GATEWAY_INVALID_CONFIG",
|
|
34
|
+
domain: "LLM",
|
|
35
|
+
category: "UNKNOWN",
|
|
36
|
+
text: "apiKey is required for Azure OpenAI gateway"
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const hasDeployments = this.config.deployments && this.config.deployments.length > 0;
|
|
40
|
+
const hasManagement = this.config.management !== void 0;
|
|
41
|
+
if (hasDeployments && hasManagement) {
|
|
42
|
+
console.warn(
|
|
43
|
+
"[AzureOpenAIGateway] Both deployments and management credentials provided. Using static deployments list and ignoring management API."
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
if (hasManagement) {
|
|
47
|
+
this.getManagementCredentials(this.config.management);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async fetchProviders() {
|
|
51
|
+
if (this.config.deployments && this.config.deployments.length > 0) {
|
|
52
|
+
return {
|
|
53
|
+
"azure-openai": {
|
|
54
|
+
apiKeyEnvVar: [],
|
|
55
|
+
apiKeyHeader: "api-key",
|
|
56
|
+
name: "Azure OpenAI",
|
|
57
|
+
models: this.config.deployments,
|
|
58
|
+
docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/",
|
|
59
|
+
gateway: "azure-openai"
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (!this.config.management) {
|
|
64
|
+
return {
|
|
65
|
+
"azure-openai": {
|
|
66
|
+
apiKeyEnvVar: [],
|
|
67
|
+
apiKeyHeader: "api-key",
|
|
68
|
+
name: "Azure OpenAI",
|
|
69
|
+
models: [],
|
|
70
|
+
docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/",
|
|
71
|
+
gateway: "azure-openai"
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const credentials = this.getManagementCredentials(this.config.management);
|
|
77
|
+
const token = await this.getAzureADToken({
|
|
78
|
+
tenantId: credentials.tenantId,
|
|
79
|
+
clientId: credentials.clientId,
|
|
80
|
+
clientSecret: credentials.clientSecret
|
|
81
|
+
});
|
|
82
|
+
const deployments = await this.fetchDeployments(token, {
|
|
83
|
+
subscriptionId: credentials.subscriptionId,
|
|
84
|
+
resourceGroup: credentials.resourceGroup,
|
|
85
|
+
resourceName: this.config.resourceName
|
|
86
|
+
});
|
|
87
|
+
return {
|
|
88
|
+
"azure-openai": {
|
|
89
|
+
apiKeyEnvVar: [],
|
|
90
|
+
apiKeyHeader: "api-key",
|
|
91
|
+
name: "Azure OpenAI",
|
|
92
|
+
models: deployments.map((d) => d.name),
|
|
93
|
+
docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/",
|
|
94
|
+
gateway: "azure-openai"
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
} catch (error) {
|
|
98
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
99
|
+
console.warn(
|
|
100
|
+
`[AzureOpenAIGateway] Deployment discovery failed: ${errorMsg}`,
|
|
101
|
+
"\nReturning fallback configuration. Azure OpenAI can still be used by manually specifying deployment names."
|
|
102
|
+
);
|
|
103
|
+
return {
|
|
104
|
+
"azure-openai": {
|
|
105
|
+
apiKeyEnvVar: [],
|
|
106
|
+
apiKeyHeader: "api-key",
|
|
107
|
+
name: "Azure OpenAI",
|
|
108
|
+
models: [],
|
|
109
|
+
docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/",
|
|
110
|
+
gateway: "azure-openai"
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
getManagementCredentials(management) {
|
|
116
|
+
const { tenantId, clientId, clientSecret, subscriptionId, resourceGroup } = management;
|
|
117
|
+
const missing = [];
|
|
118
|
+
if (!tenantId) missing.push("tenantId");
|
|
119
|
+
if (!clientId) missing.push("clientId");
|
|
120
|
+
if (!clientSecret) missing.push("clientSecret");
|
|
121
|
+
if (!subscriptionId) missing.push("subscriptionId");
|
|
122
|
+
if (!resourceGroup) missing.push("resourceGroup");
|
|
123
|
+
if (missing.length > 0) {
|
|
124
|
+
throw new chunkTWH4PTDG_cjs.MastraError({
|
|
125
|
+
id: "AZURE_MANAGEMENT_CREDENTIALS_MISSING",
|
|
126
|
+
domain: "LLM",
|
|
127
|
+
category: "UNKNOWN",
|
|
128
|
+
text: `Management credentials incomplete. Missing: ${missing.join(", ")}. Required fields: tenantId, clientId, clientSecret, subscriptionId, resourceGroup.`
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
tenantId,
|
|
133
|
+
clientId,
|
|
134
|
+
clientSecret,
|
|
135
|
+
subscriptionId,
|
|
136
|
+
resourceGroup
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async getAzureADToken(credentials) {
|
|
140
|
+
const { tenantId, clientId, clientSecret } = credentials;
|
|
141
|
+
const cacheKey = `azure-mgmt-token:${tenantId}:${clientId}`;
|
|
142
|
+
const cached = await this.tokenCache.get(cacheKey);
|
|
143
|
+
if (cached && cached.expiresAt > Date.now() / 1e3 + 60) {
|
|
144
|
+
return cached.token;
|
|
145
|
+
}
|
|
146
|
+
const tokenEndpoint = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;
|
|
147
|
+
const body = new URLSearchParams({
|
|
148
|
+
grant_type: "client_credentials",
|
|
149
|
+
client_id: clientId,
|
|
150
|
+
client_secret: clientSecret,
|
|
151
|
+
scope: "https://management.azure.com/.default"
|
|
152
|
+
});
|
|
153
|
+
const response = await fetch(tokenEndpoint, {
|
|
154
|
+
method: "POST",
|
|
155
|
+
headers: {
|
|
156
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
157
|
+
},
|
|
158
|
+
body: body.toString()
|
|
159
|
+
});
|
|
160
|
+
if (!response.ok) {
|
|
161
|
+
const error = await response.text();
|
|
162
|
+
throw new chunkTWH4PTDG_cjs.MastraError({
|
|
163
|
+
id: "AZURE_AD_TOKEN_ERROR",
|
|
164
|
+
domain: "LLM",
|
|
165
|
+
category: "UNKNOWN",
|
|
166
|
+
text: `Failed to get Azure AD token: ${response.status} ${error}`
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
const tokenResponse = await response.json();
|
|
170
|
+
const expiresAt = Math.floor(Date.now() / 1e3) + tokenResponse.expires_in;
|
|
171
|
+
await this.tokenCache.set(cacheKey, {
|
|
172
|
+
token: tokenResponse.access_token,
|
|
173
|
+
expiresAt
|
|
174
|
+
});
|
|
175
|
+
return tokenResponse.access_token;
|
|
176
|
+
}
|
|
177
|
+
async fetchDeployments(token, credentials) {
|
|
178
|
+
const { subscriptionId, resourceGroup, resourceName } = credentials;
|
|
179
|
+
let url = `https://management.azure.com/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.CognitiveServices/accounts/${resourceName}/deployments?api-version=2024-10-01`;
|
|
180
|
+
const allDeployments = [];
|
|
181
|
+
while (url) {
|
|
182
|
+
const response = await fetch(url, {
|
|
183
|
+
headers: {
|
|
184
|
+
Authorization: `Bearer ${token}`,
|
|
185
|
+
"Content-Type": "application/json"
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
if (!response.ok) {
|
|
189
|
+
const error = await response.text();
|
|
190
|
+
throw new chunkTWH4PTDG_cjs.MastraError({
|
|
191
|
+
id: "AZURE_DEPLOYMENTS_FETCH_ERROR",
|
|
192
|
+
domain: "LLM",
|
|
193
|
+
category: "UNKNOWN",
|
|
194
|
+
text: `Failed to fetch Azure deployments: ${response.status} ${error}`
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const data = await response.json();
|
|
198
|
+
allDeployments.push(...data.value);
|
|
199
|
+
url = data.nextLink;
|
|
200
|
+
}
|
|
201
|
+
const successfulDeployments = allDeployments.filter((d) => d.properties.provisioningState === "Succeeded");
|
|
202
|
+
return successfulDeployments;
|
|
203
|
+
}
|
|
204
|
+
buildUrl(_routerId, _envVars) {
|
|
205
|
+
return void 0;
|
|
206
|
+
}
|
|
207
|
+
async getApiKey(_modelId) {
|
|
208
|
+
return this.config.apiKey;
|
|
209
|
+
}
|
|
210
|
+
async resolveLanguageModel({
|
|
211
|
+
modelId,
|
|
212
|
+
apiKey
|
|
213
|
+
}) {
|
|
214
|
+
const apiVersion = this.config.apiVersion || "2024-04-01-preview";
|
|
215
|
+
return azure.createAzure({
|
|
216
|
+
resourceName: this.config.resourceName,
|
|
217
|
+
apiKey,
|
|
218
|
+
apiVersion,
|
|
219
|
+
useDeploymentBasedUrls: true
|
|
220
|
+
})(modelId);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
|
|
11
224
|
// src/llm/model/gateways/index.ts
|
|
12
225
|
function findGatewayForModel(gatewayId, gateways) {
|
|
13
|
-
const prefixedGateway = gateways.find(
|
|
226
|
+
const prefixedGateway = gateways.find(
|
|
227
|
+
(g) => g.id !== "models.dev" && (g.id === gatewayId || gatewayId.startsWith(`${g.id}/`))
|
|
228
|
+
);
|
|
14
229
|
if (prefixedGateway) {
|
|
15
230
|
return prefixedGateway;
|
|
16
231
|
}
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
return
|
|
232
|
+
const modelsDevGateway = gateways.find((g) => g.id === "models.dev");
|
|
233
|
+
if (modelsDevGateway) {
|
|
234
|
+
return modelsDevGateway;
|
|
20
235
|
}
|
|
21
236
|
throw new chunkTWH4PTDG_cjs.MastraError({
|
|
22
237
|
id: "MODEL_ROUTER_NO_GATEWAY_FOUND",
|
|
@@ -87,6 +302,9 @@ var AISDKV5LanguageModel = class {
|
|
|
87
302
|
id: toolCall.toolCallId
|
|
88
303
|
});
|
|
89
304
|
controller.enqueue(toolCall);
|
|
305
|
+
} else if (message.type === "tool-result") {
|
|
306
|
+
const toolResult = message;
|
|
307
|
+
controller.enqueue(toolResult);
|
|
90
308
|
} else if (message.type === "text") {
|
|
91
309
|
const text = message;
|
|
92
310
|
const id = `msg_${crypto.randomUUID()}`;
|
|
@@ -132,13 +350,26 @@ var AISDKV5LanguageModel = class {
|
|
|
132
350
|
});
|
|
133
351
|
} else if (message.type === "source") {
|
|
134
352
|
const source = message;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
353
|
+
if (source.sourceType === "url") {
|
|
354
|
+
controller.enqueue({
|
|
355
|
+
type: "source",
|
|
356
|
+
id: source.id,
|
|
357
|
+
sourceType: "url",
|
|
358
|
+
url: source.url,
|
|
359
|
+
title: source.title,
|
|
360
|
+
providerMetadata: source.providerMetadata
|
|
361
|
+
});
|
|
362
|
+
} else {
|
|
363
|
+
controller.enqueue({
|
|
364
|
+
type: "source",
|
|
365
|
+
id: source.id,
|
|
366
|
+
sourceType: "document",
|
|
367
|
+
mediaType: source.mediaType,
|
|
368
|
+
filename: source.filename,
|
|
369
|
+
title: source.title,
|
|
370
|
+
providerMetadata: source.providerMetadata
|
|
371
|
+
});
|
|
372
|
+
}
|
|
142
373
|
}
|
|
143
374
|
}
|
|
144
375
|
controller.enqueue({
|
|
@@ -159,9 +390,9 @@ var AISDKV5LanguageModel = class {
|
|
|
159
390
|
|
|
160
391
|
// src/llm/model/router.ts
|
|
161
392
|
function getStaticProvidersByGateway(name) {
|
|
162
|
-
return Object.fromEntries(Object.entries(
|
|
393
|
+
return Object.fromEntries(Object.entries(chunkVYJXTHII_cjs.PROVIDER_REGISTRY).filter(([_provider, config]) => config.gateway === name));
|
|
163
394
|
}
|
|
164
|
-
var defaultGateways = [new
|
|
395
|
+
var defaultGateways = [new chunkIITXXVYI_cjs.NetlifyGateway(), new chunkQGWNF2QJ_cjs.ModelsDevGateway(getStaticProvidersByGateway(`models.dev`))];
|
|
165
396
|
var ModelRouterLanguageModel = class _ModelRouterLanguageModel {
|
|
166
397
|
specificationVersion = "v2";
|
|
167
398
|
defaultObjectGenerationMode = "json";
|
|
@@ -196,7 +427,8 @@ var ModelRouterLanguageModel = class _ModelRouterLanguageModel {
|
|
|
196
427
|
routerId: normalizedConfig.id
|
|
197
428
|
};
|
|
198
429
|
this.gateway = findGatewayForModel(normalizedConfig.id, [...customGateways || [], ...defaultGateways]);
|
|
199
|
-
const
|
|
430
|
+
const gatewayPrefix = this.gateway.id === "models.dev" ? void 0 : this.gateway.id;
|
|
431
|
+
const parsed = chunkQGWNF2QJ_cjs.parseModelRouterId(normalizedConfig.id, gatewayPrefix);
|
|
200
432
|
this.provider = parsed.providerId || "openai-compatible";
|
|
201
433
|
if (parsed.providerId && parsed.modelId !== normalizedConfig.id) {
|
|
202
434
|
parsedConfig.id = parsed.modelId;
|
|
@@ -225,9 +457,11 @@ var ModelRouterLanguageModel = class _ModelRouterLanguageModel {
|
|
|
225
457
|
})
|
|
226
458
|
};
|
|
227
459
|
}
|
|
460
|
+
const gatewayPrefix = this.gateway.id === "models.dev" ? void 0 : this.gateway.id;
|
|
228
461
|
const model = await this.resolveLanguageModel({
|
|
229
462
|
apiKey,
|
|
230
|
-
|
|
463
|
+
headers: this.config.headers,
|
|
464
|
+
...chunkQGWNF2QJ_cjs.parseModelRouterId(this.config.routerId, gatewayPrefix)
|
|
231
465
|
});
|
|
232
466
|
const aiSDKV5Model = new AISDKV5LanguageModel(model);
|
|
233
467
|
return aiSDKV5Model.doGenerate(options);
|
|
@@ -253,9 +487,11 @@ var ModelRouterLanguageModel = class _ModelRouterLanguageModel {
|
|
|
253
487
|
})
|
|
254
488
|
};
|
|
255
489
|
}
|
|
490
|
+
const gatewayPrefix = this.gateway.id === "models.dev" ? void 0 : this.gateway.id;
|
|
256
491
|
const model = await this.resolveLanguageModel({
|
|
257
492
|
apiKey,
|
|
258
|
-
|
|
493
|
+
headers: this.config.headers,
|
|
494
|
+
...chunkQGWNF2QJ_cjs.parseModelRouterId(this.config.routerId, gatewayPrefix)
|
|
259
495
|
});
|
|
260
496
|
const aiSDKV5Model = new AISDKV5LanguageModel(model);
|
|
261
497
|
return aiSDKV5Model.doStream(options);
|
|
@@ -263,12 +499,15 @@ var ModelRouterLanguageModel = class _ModelRouterLanguageModel {
|
|
|
263
499
|
async resolveLanguageModel({
|
|
264
500
|
modelId,
|
|
265
501
|
providerId,
|
|
266
|
-
apiKey
|
|
502
|
+
apiKey,
|
|
503
|
+
headers
|
|
267
504
|
}) {
|
|
268
|
-
const key = crypto.createHash("sha256").update(
|
|
505
|
+
const key = crypto.createHash("sha256").update(
|
|
506
|
+
this.gateway.id + modelId + providerId + apiKey + (this.config.url || "") + (headers ? JSON.stringify(headers) : "")
|
|
507
|
+
).digest("hex");
|
|
269
508
|
if (_ModelRouterLanguageModel.modelInstances.has(key)) return _ModelRouterLanguageModel.modelInstances.get(key);
|
|
270
509
|
if (this.config.url) {
|
|
271
|
-
const modelInstance2 =
|
|
510
|
+
const modelInstance2 = chunkHNHZGFZY_cjs.createOpenAICompatible({
|
|
272
511
|
name: providerId,
|
|
273
512
|
apiKey,
|
|
274
513
|
baseURL: this.config.url,
|
|
@@ -278,7 +517,7 @@ var ModelRouterLanguageModel = class _ModelRouterLanguageModel {
|
|
|
278
517
|
_ModelRouterLanguageModel.modelInstances.set(key, modelInstance2);
|
|
279
518
|
return modelInstance2;
|
|
280
519
|
}
|
|
281
|
-
const modelInstance = await this.gateway.resolveLanguageModel({ modelId, providerId, apiKey });
|
|
520
|
+
const modelInstance = await this.gateway.resolveLanguageModel({ modelId, providerId, apiKey, headers });
|
|
282
521
|
_ModelRouterLanguageModel.modelInstances.set(key, modelInstance);
|
|
283
522
|
return modelInstance;
|
|
284
523
|
}
|
|
@@ -358,14 +597,14 @@ var ModelRouterEmbeddingModel = class {
|
|
|
358
597
|
this.modelId = normalizedConfig.modelId;
|
|
359
598
|
if (normalizedConfig.url) {
|
|
360
599
|
const apiKey = normalizedConfig.apiKey || "";
|
|
361
|
-
this.providerModel =
|
|
600
|
+
this.providerModel = chunkHNHZGFZY_cjs.createOpenAICompatible({
|
|
362
601
|
name: normalizedConfig.providerId,
|
|
363
602
|
apiKey,
|
|
364
603
|
baseURL: normalizedConfig.url,
|
|
365
604
|
headers: normalizedConfig.headers
|
|
366
605
|
}).textEmbeddingModel(normalizedConfig.modelId);
|
|
367
606
|
} else {
|
|
368
|
-
const registry =
|
|
607
|
+
const registry = chunkVYJXTHII_cjs.GatewayRegistry.getInstance();
|
|
369
608
|
const providerConfig = registry.getProviderConfig(normalizedConfig.providerId);
|
|
370
609
|
if (!providerConfig) {
|
|
371
610
|
throw new Error(`Unknown provider: ${normalizedConfig.providerId}`);
|
|
@@ -387,18 +626,18 @@ var ModelRouterEmbeddingModel = class {
|
|
|
387
626
|
throw new Error(`API key not found for provider ${normalizedConfig.providerId}. Set ${envVarDisplay}`);
|
|
388
627
|
}
|
|
389
628
|
if (normalizedConfig.providerId === "openai") {
|
|
390
|
-
this.providerModel =
|
|
629
|
+
this.providerModel = chunkHNHZGFZY_cjs.createOpenAI({ apiKey }).textEmbeddingModel(
|
|
391
630
|
normalizedConfig.modelId
|
|
392
631
|
);
|
|
393
632
|
} else if (normalizedConfig.providerId === "google") {
|
|
394
|
-
this.providerModel =
|
|
633
|
+
this.providerModel = chunkHNHZGFZY_cjs.createGoogleGenerativeAI({ apiKey }).textEmbedding(
|
|
395
634
|
normalizedConfig.modelId
|
|
396
635
|
);
|
|
397
636
|
} else {
|
|
398
637
|
if (!providerConfig.url) {
|
|
399
638
|
throw new Error(`Provider ${normalizedConfig.providerId} does not have a URL configured`);
|
|
400
639
|
}
|
|
401
|
-
this.providerModel =
|
|
640
|
+
this.providerModel = chunkHNHZGFZY_cjs.createOpenAICompatible({
|
|
402
641
|
name: normalizedConfig.providerId,
|
|
403
642
|
apiKey,
|
|
404
643
|
baseURL: providerConfig.url
|
|
@@ -417,8 +656,9 @@ var ModelRouterEmbeddingModel = class {
|
|
|
417
656
|
}
|
|
418
657
|
};
|
|
419
658
|
|
|
659
|
+
exports.AzureOpenAIGateway = AzureOpenAIGateway;
|
|
420
660
|
exports.ModelRouterEmbeddingModel = ModelRouterEmbeddingModel;
|
|
421
661
|
exports.ModelRouterLanguageModel = ModelRouterLanguageModel;
|
|
422
662
|
exports.resolveModelConfig = resolveModelConfig;
|
|
423
|
-
//# sourceMappingURL=chunk-
|
|
424
|
-
//# sourceMappingURL=chunk-
|
|
663
|
+
//# sourceMappingURL=chunk-NHP6ZIDG.cjs.map
|
|
664
|
+
//# sourceMappingURL=chunk-NHP6ZIDG.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/llm/model/gateways/azure.ts","../src/llm/model/gateways/index.ts","../src/llm/model/aisdk/v5/model.ts","../src/llm/model/router.ts","../src/llm/model/resolve-model.ts","../src/llm/model/embedding-router.ts"],"names":["MastraModelGateway","InMemoryServerCache","MastraError","createAzure","randomUUID","PROVIDER_REGISTRY","NetlifyGateway","ModelsDevGateway","parseModelRouterId","createHash","modelInstance","createOpenAICompatible","RequestContext","GatewayRegistry","createOpenAI","createGoogleGenerativeAI"],"mappings":"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","file":"chunk-NHP6ZIDG.cjs","sourcesContent":["import { createAzure } from '@ai-sdk/azure';\nimport type { LanguageModelV2 } from '@ai-sdk/provider-v5';\nimport { InMemoryServerCache } from '../../../cache/inmemory.js';\nimport { MastraError } from '../../../error/index.js';\nimport { MastraModelGateway } from './base.js';\nimport type { ProviderConfig } from './base.js';\n\ninterface AzureTokenResponse {\n token_type: 'Bearer';\n expires_in: number;\n access_token: string;\n}\n\ninterface AzureDeployment {\n name: string;\n properties: {\n model: {\n name: string;\n version: string;\n format: string;\n };\n provisioningState: string;\n };\n}\n\ninterface AzureDeploymentsResponse {\n value: AzureDeployment[];\n nextLink?: string;\n}\n\ninterface CachedToken {\n token: string;\n expiresAt: number;\n}\n\nexport interface AzureOpenAIGatewayConfig {\n resourceName: string;\n apiKey: string;\n apiVersion?: string;\n deployments?: string[];\n management?: {\n tenantId: string;\n clientId: string;\n clientSecret: string;\n subscriptionId: string;\n resourceGroup: string;\n };\n}\n\nexport class AzureOpenAIGateway extends MastraModelGateway {\n readonly id = 'azure-openai';\n readonly name = 'azure-openai';\n private tokenCache = new InMemoryServerCache();\n\n constructor(private config: AzureOpenAIGatewayConfig) {\n super();\n this.validateConfig();\n }\n\n private validateConfig(): void {\n if (!this.config.resourceName) {\n throw new MastraError({\n id: 'AZURE_GATEWAY_INVALID_CONFIG',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: 'resourceName is required for Azure OpenAI gateway',\n });\n }\n\n if (!this.config.apiKey) {\n throw new MastraError({\n id: 'AZURE_GATEWAY_INVALID_CONFIG',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: 'apiKey is required for Azure OpenAI gateway',\n });\n }\n\n const hasDeployments = this.config.deployments && this.config.deployments.length > 0;\n const hasManagement = this.config.management !== undefined;\n\n if (hasDeployments && hasManagement) {\n console.warn(\n '[AzureOpenAIGateway] Both deployments and management credentials provided. Using static deployments list and ignoring management API.',\n );\n }\n\n if (hasManagement) {\n this.getManagementCredentials(this.config.management!);\n }\n }\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n if (this.config.deployments && this.config.deployments.length > 0) {\n return {\n 'azure-openai': {\n apiKeyEnvVar: [],\n apiKeyHeader: 'api-key',\n name: 'Azure OpenAI',\n models: this.config.deployments,\n docUrl: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/',\n gateway: 'azure-openai',\n },\n };\n }\n\n if (!this.config.management) {\n return {\n 'azure-openai': {\n apiKeyEnvVar: [],\n apiKeyHeader: 'api-key',\n name: 'Azure OpenAI',\n models: [],\n docUrl: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/',\n gateway: 'azure-openai',\n },\n };\n }\n\n try {\n const credentials = this.getManagementCredentials(this.config.management);\n\n const token = await this.getAzureADToken({\n tenantId: credentials.tenantId,\n clientId: credentials.clientId,\n clientSecret: credentials.clientSecret,\n });\n\n const deployments = await this.fetchDeployments(token, {\n subscriptionId: credentials.subscriptionId,\n resourceGroup: credentials.resourceGroup,\n resourceName: this.config.resourceName,\n });\n\n return {\n 'azure-openai': {\n apiKeyEnvVar: [],\n apiKeyHeader: 'api-key',\n name: 'Azure OpenAI',\n models: deployments.map(d => d.name),\n docUrl: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/',\n gateway: 'azure-openai',\n },\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn(\n `[AzureOpenAIGateway] Deployment discovery failed: ${errorMsg}`,\n '\\nReturning fallback configuration. Azure OpenAI can still be used by manually specifying deployment names.',\n );\n\n return {\n 'azure-openai': {\n apiKeyEnvVar: [],\n apiKeyHeader: 'api-key',\n name: 'Azure OpenAI',\n models: [],\n docUrl: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/',\n gateway: 'azure-openai',\n },\n };\n }\n }\n\n private getManagementCredentials(management: NonNullable<AzureOpenAIGatewayConfig['management']>) {\n const { tenantId, clientId, clientSecret, subscriptionId, resourceGroup } = management;\n\n const missing = [];\n if (!tenantId) missing.push('tenantId');\n if (!clientId) missing.push('clientId');\n if (!clientSecret) missing.push('clientSecret');\n if (!subscriptionId) missing.push('subscriptionId');\n if (!resourceGroup) missing.push('resourceGroup');\n\n if (missing.length > 0) {\n throw new MastraError({\n id: 'AZURE_MANAGEMENT_CREDENTIALS_MISSING',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Management credentials incomplete. Missing: ${missing.join(', ')}. Required fields: tenantId, clientId, clientSecret, subscriptionId, resourceGroup.`,\n });\n }\n\n return {\n tenantId,\n clientId,\n clientSecret,\n subscriptionId,\n resourceGroup,\n };\n }\n\n private async getAzureADToken(credentials: {\n tenantId: string;\n clientId: string;\n clientSecret: string;\n }): Promise<string> {\n const { tenantId, clientId, clientSecret } = credentials;\n\n const cacheKey = `azure-mgmt-token:${tenantId}:${clientId}`;\n\n const cached = (await this.tokenCache.get(cacheKey)) as CachedToken | undefined;\n if (cached && cached.expiresAt > Date.now() / 1000 + 60) {\n return cached.token;\n }\n\n const tokenEndpoint = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;\n\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n scope: 'https://management.azure.com/.default',\n });\n\n const response = await fetch(tokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new MastraError({\n id: 'AZURE_AD_TOKEN_ERROR',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Failed to get Azure AD token: ${response.status} ${error}`,\n });\n }\n\n const tokenResponse = (await response.json()) as AzureTokenResponse;\n\n const expiresAt = Math.floor(Date.now() / 1000) + tokenResponse.expires_in;\n\n await this.tokenCache.set(cacheKey, {\n token: tokenResponse.access_token,\n expiresAt,\n });\n\n return tokenResponse.access_token;\n }\n\n private async fetchDeployments(\n token: string,\n credentials: {\n subscriptionId: string;\n resourceGroup: string;\n resourceName: string;\n },\n ): Promise<AzureDeployment[]> {\n const { subscriptionId, resourceGroup, resourceName } = credentials;\n\n let url: string | undefined =\n `https://management.azure.com/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.CognitiveServices/accounts/${resourceName}/deployments?api-version=2024-10-01`;\n\n const allDeployments: AzureDeployment[] = [];\n\n while (url) {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new MastraError({\n id: 'AZURE_DEPLOYMENTS_FETCH_ERROR',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Failed to fetch Azure deployments: ${response.status} ${error}`,\n });\n }\n\n const data = (await response.json()) as AzureDeploymentsResponse;\n\n allDeployments.push(...data.value);\n\n url = data.nextLink;\n }\n\n const successfulDeployments = allDeployments.filter(d => d.properties.provisioningState === 'Succeeded');\n\n return successfulDeployments;\n }\n\n buildUrl(_routerId: string, _envVars?: typeof process.env): undefined {\n return undefined;\n }\n\n async getApiKey(_modelId: string): Promise<string> {\n return this.config.apiKey;\n }\n\n async resolveLanguageModel({\n modelId,\n apiKey,\n }: {\n modelId: string;\n providerId: string;\n apiKey: string;\n }): Promise<LanguageModelV2> {\n const apiVersion = this.config.apiVersion || '2024-04-01-preview';\n\n return createAzure({\n resourceName: this.config.resourceName,\n apiKey,\n apiVersion,\n useDeploymentBasedUrls: true,\n })(modelId);\n }\n}\n","import { MastraError } from '../../../error/index.js';\nimport type { MastraModelGateway } from './base.js';\nexport { MastraModelGateway, type ProviderConfig } from './base.js';\nexport { AzureOpenAIGateway, type AzureOpenAIGatewayConfig } from './azure.js';\nexport { ModelsDevGateway } from './models-dev.js';\nexport { NetlifyGateway } from './netlify.js';\n\n/**\n * Find the gateway that handles a specific model ID based on gateway ID\n * Gateway ID is used as the prefix (e.g., \"netlify\" for netlify gateway)\n * Exception: models.dev is a provider registry and doesn't use a prefix\n */\nexport function findGatewayForModel(gatewayId: string, gateways: MastraModelGateway[]): MastraModelGateway {\n // First, check for gateways whose ID matches the prefix (true gateways like netlify, openrouter, vercel)\n const prefixedGateway = gateways.find(\n (g: MastraModelGateway) => g.id !== 'models.dev' && (g.id === gatewayId || gatewayId.startsWith(`${g.id}/`)),\n );\n if (prefixedGateway) {\n return prefixedGateway;\n }\n\n // Then check models.dev (provider registry without prefix)\n const modelsDevGateway = gateways.find((g: MastraModelGateway) => g.id === 'models.dev');\n if (modelsDevGateway) {\n return modelsDevGateway;\n }\n\n throw new MastraError({\n id: 'MODEL_ROUTER_NO_GATEWAY_FOUND',\n category: 'USER',\n domain: 'MODEL_ROUTER',\n text: `No Mastra model router gateway found for model id ${gatewayId}`,\n });\n}\n","import { randomUUID } from 'crypto';\nimport type { LanguageModelV2, LanguageModelV2CallOptions } from '@ai-sdk/provider-v5';\nimport type { MastraLanguageModelV2 } from '../../shared.types';\n\ntype StreamResult = Awaited<ReturnType<LanguageModelV2['doStream']>>;\n\nexport class AISDKV5LanguageModel implements MastraLanguageModelV2 {\n /**\n * The language model must specify which language model interface version it implements.\n */\n readonly specificationVersion: 'v2' = 'v2';\n /**\n * Name of the provider for logging purposes.\n */\n readonly provider: string;\n /**\n * Provider-specific model ID for logging purposes.\n */\n readonly modelId: string;\n /**\n * Supported URL patterns by media type for the provider.\n *\n * The keys are media type patterns or full media types (e.g. `*\\/*` for everything, `audio/*`, `video/*`, or `application/pdf`).\n * and the values are arrays of regular expressions that match the URL paths.\n * The matching should be against lower-case URLs.\n * Matched URLs are supported natively by the model and are not downloaded.\n * @returns A map of supported URL patterns by media type (as a promise or a plain object).\n */\n supportedUrls: PromiseLike<Record<string, RegExp[]>> | Record<string, RegExp[]>;\n\n #model: LanguageModelV2;\n\n constructor(config: LanguageModelV2) {\n this.#model = config;\n this.provider = this.#model.provider;\n this.modelId = this.#model.modelId;\n this.supportedUrls = this.#model.supportedUrls;\n }\n\n async doGenerate(options: LanguageModelV2CallOptions) {\n const result = await this.#model.doGenerate(options);\n\n return {\n request: result.request!,\n response: result.response as unknown as StreamResult['response'],\n stream: new ReadableStream({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings: result.warnings });\n controller.enqueue({\n type: 'response-metadata',\n id: result.response?.id,\n modelId: result.response?.modelId,\n timestamp: result.response?.timestamp,\n });\n\n for (const message of result.content) {\n if (message.type === 'tool-call') {\n const toolCall = message;\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCall.toolCallId,\n toolName: toolCall.toolName,\n });\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.toolCallId,\n delta: toolCall.input,\n });\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCall.toolCallId,\n });\n controller.enqueue(toolCall);\n } else if (message.type === 'tool-result') {\n const toolResult = message;\n controller.enqueue(toolResult);\n } else if (message.type === 'text') {\n const text = message;\n const id = `msg_${randomUUID()}`;\n controller.enqueue({\n type: 'text-start',\n id,\n providerMetadata: text.providerMetadata,\n });\n controller.enqueue({\n type: 'text-delta',\n id,\n delta: text.text,\n });\n controller.enqueue({\n type: 'text-end',\n id,\n });\n } else if (message.type === 'reasoning') {\n const id = `reasoning_${randomUUID()}`;\n\n const reasoning = message;\n controller.enqueue({\n type: 'reasoning-start',\n id,\n providerMetadata: reasoning.providerMetadata,\n });\n controller.enqueue({\n type: 'reasoning-delta',\n id,\n delta: reasoning.text,\n providerMetadata: reasoning.providerMetadata,\n });\n controller.enqueue({\n type: 'reasoning-end',\n id,\n providerMetadata: reasoning.providerMetadata,\n });\n } else if (message.type === 'file') {\n const file = message;\n controller.enqueue({\n type: 'file',\n mediaType: file.mediaType,\n data: file.data,\n });\n } else if (message.type === 'source') {\n const source = message;\n if (source.sourceType === 'url') {\n controller.enqueue({\n type: 'source',\n id: source.id,\n sourceType: 'url',\n url: source.url,\n title: source.title,\n providerMetadata: source.providerMetadata,\n });\n } else {\n controller.enqueue({\n type: 'source',\n id: source.id,\n sourceType: 'document',\n mediaType: source.mediaType,\n filename: source.filename,\n title: source.title,\n providerMetadata: source.providerMetadata,\n });\n }\n }\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata,\n });\n\n controller.close();\n },\n }),\n };\n }\n\n async doStream(options: LanguageModelV2CallOptions) {\n return await this.#model.doStream(options);\n }\n}\n","import { createHash } from 'node:crypto';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible-v5';\nimport type { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2StreamPart } from '@ai-sdk/provider-v5';\nimport { AISDKV5LanguageModel } from './aisdk/v5/model';\nimport { parseModelRouterId } from './gateway-resolver.js';\nimport type { MastraModelGateway } from './gateways/base.js';\nimport { findGatewayForModel } from './gateways/index.js';\n\nimport { ModelsDevGateway } from './gateways/models-dev.js';\nimport { NetlifyGateway } from './gateways/netlify.js';\nimport type { ModelRouterModelId } from './provider-registry.js';\nimport { PROVIDER_REGISTRY } from './provider-registry.js';\nimport type { MastraLanguageModelV2, OpenAICompatibleConfig } from './shared.types';\n\ntype StreamResult = Awaited<ReturnType<LanguageModelV2['doStream']>>;\n\nfunction getStaticProvidersByGateway(name: string) {\n return Object.fromEntries(Object.entries(PROVIDER_REGISTRY).filter(([_provider, config]) => config.gateway === name));\n}\n\nexport const defaultGateways = [new NetlifyGateway(), new ModelsDevGateway(getStaticProvidersByGateway(`models.dev`))];\n\n/**\n * @deprecated Use defaultGateways instead. This export will be removed in a future version.\n */\nexport const gateways = defaultGateways;\n\nexport class ModelRouterLanguageModel implements MastraLanguageModelV2 {\n readonly specificationVersion = 'v2' as const;\n readonly defaultObjectGenerationMode = 'json' as const;\n readonly supportsStructuredOutputs = true;\n readonly supportsImageUrls = true;\n readonly supportedUrls = {} as Record<string, RegExp[]>;\n\n readonly modelId: string;\n readonly provider: string;\n\n private config: OpenAICompatibleConfig & { routerId: string };\n private gateway: MastraModelGateway;\n\n constructor(config: ModelRouterModelId | OpenAICompatibleConfig, customGateways?: MastraModelGateway[]) {\n // Normalize config to always have an 'id' field for routing\n let normalizedConfig: {\n id: `${string}/${string}`;\n url?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n };\n\n if (typeof config === 'string') {\n normalizedConfig = { id: config as `${string}/${string}` };\n } else if ('providerId' in config && 'modelId' in config) {\n // Convert providerId/modelId to id format\n normalizedConfig = {\n id: `${config.providerId}/${config.modelId}` as `${string}/${string}`,\n url: config.url,\n apiKey: config.apiKey,\n headers: config.headers,\n };\n } else {\n // config has 'id' field\n normalizedConfig = {\n id: config.id,\n url: config.url,\n apiKey: config.apiKey,\n headers: config.headers,\n };\n }\n\n const parsedConfig: {\n id: `${string}/${string}`;\n routerId: string;\n url?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n } = {\n ...normalizedConfig,\n routerId: normalizedConfig.id,\n };\n\n // Resolve gateway once using the normalized ID\n this.gateway = findGatewayForModel(normalizedConfig.id, [...(customGateways || []), ...defaultGateways]);\n // Extract provider from id if present\n // Gateway ID is used as prefix (except for models.dev which is a provider registry)\n const gatewayPrefix = this.gateway.id === 'models.dev' ? undefined : this.gateway.id;\n const parsed = parseModelRouterId(normalizedConfig.id, gatewayPrefix);\n\n this.provider = parsed.providerId || 'openai-compatible';\n\n if (parsed.providerId && parsed.modelId !== normalizedConfig.id) {\n parsedConfig.id = parsed.modelId as `${string}/${string}`;\n }\n\n this.modelId = parsedConfig.id;\n this.config = parsedConfig;\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<StreamResult> {\n let apiKey: string;\n try {\n // If custom URL is provided, skip gateway API key resolution\n // The provider might not be in the registry (e.g., custom providers like ollama)\n if (this.config.url) {\n apiKey = this.config.apiKey || '';\n } else {\n apiKey = this.config.apiKey || (await this.gateway.getApiKey(this.config.routerId));\n }\n } catch (error) {\n // Return an error stream instead of throwing\n return {\n stream: new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: 'error',\n error: error,\n } as LanguageModelV2StreamPart);\n controller.close();\n },\n }),\n };\n }\n\n const gatewayPrefix = this.gateway.id === 'models.dev' ? undefined : this.gateway.id;\n const model = await this.resolveLanguageModel({\n apiKey,\n headers: this.config.headers,\n ...parseModelRouterId(this.config.routerId, gatewayPrefix),\n });\n\n const aiSDKV5Model = new AISDKV5LanguageModel(model);\n return aiSDKV5Model.doGenerate(options);\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<StreamResult> {\n // Validate API key and return error stream if validation fails\n let apiKey: string;\n try {\n // If custom URL is provided, skip gateway API key resolution\n // The provider might not be in the registry (e.g., custom providers like ollama)\n if (this.config.url) {\n apiKey = this.config.apiKey || '';\n } else {\n apiKey = this.config.apiKey || (await this.gateway.getApiKey(this.config.routerId));\n }\n } catch (error) {\n // Return an error stream instead of throwing\n return {\n stream: new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: 'error',\n error: error,\n } as LanguageModelV2StreamPart);\n controller.close();\n },\n }),\n };\n }\n\n const gatewayPrefix = this.gateway.id === 'models.dev' ? undefined : this.gateway.id;\n const model = await this.resolveLanguageModel({\n apiKey,\n headers: this.config.headers,\n ...parseModelRouterId(this.config.routerId, gatewayPrefix),\n });\n\n const aiSDKV5Model = new AISDKV5LanguageModel(model);\n return aiSDKV5Model.doStream(options);\n }\n\n private async resolveLanguageModel({\n modelId,\n providerId,\n apiKey,\n headers,\n }: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n }): Promise<LanguageModelV2> {\n const key = createHash('sha256')\n .update(\n this.gateway.id +\n modelId +\n providerId +\n apiKey +\n (this.config.url || '') +\n (headers ? JSON.stringify(headers) : ''),\n )\n .digest('hex');\n if (ModelRouterLanguageModel.modelInstances.has(key)) return ModelRouterLanguageModel.modelInstances.get(key)!;\n\n // If custom URL is provided, use it directly with openai-compatible\n if (this.config.url) {\n const modelInstance = createOpenAICompatible({\n name: providerId,\n apiKey,\n baseURL: this.config.url,\n headers: this.config.headers,\n supportsStructuredOutputs: true,\n }).chatModel(modelId);\n ModelRouterLanguageModel.modelInstances.set(key, modelInstance);\n return modelInstance;\n }\n\n const modelInstance = await this.gateway.resolveLanguageModel({ modelId, providerId, apiKey, headers });\n ModelRouterLanguageModel.modelInstances.set(key, modelInstance);\n return modelInstance;\n }\n private static modelInstances = new Map<string, LanguageModelV2>();\n}\n","import type { LanguageModelV2 } from '@ai-sdk/provider-v5';\nimport type { Mastra } from '../../mastra';\nimport { RequestContext } from '../../request-context';\nimport { AISDKV5LanguageModel } from './aisdk/v5/model';\nimport { ModelRouterLanguageModel } from './router';\nimport type { MastraModelConfig, OpenAICompatibleConfig, MastraLanguageModel } from './shared.types';\n\n/**\n * Type guard to check if a model config is an OpenAICompatibleConfig object\n * @internal\n */\nexport function isOpenAICompatibleObjectConfig(\n modelConfig:\n | MastraModelConfig\n | (({\n requestContext,\n mastra,\n }: {\n requestContext: RequestContext;\n mastra?: Mastra;\n }) => MastraModelConfig | Promise<MastraModelConfig>),\n): modelConfig is OpenAICompatibleConfig {\n if (typeof modelConfig === 'object' && 'specificationVersion' in modelConfig) return false;\n // Check for OpenAICompatibleConfig - it should have either:\n // 1. 'id' field (but NOT 'model' - that's ModelWithRetries)\n // 2. Both 'providerId' and 'modelId' fields\n if (typeof modelConfig === 'object' && !('model' in modelConfig)) {\n if ('id' in modelConfig) return true;\n if ('providerId' in modelConfig && 'modelId' in modelConfig) return true;\n }\n return false;\n}\n\n/**\n * Resolves a model configuration to a LanguageModel instance.\n * Supports:\n * - Magic strings like \"openai/gpt-4o\"\n * - Config objects like { id: \"openai/gpt-4o\", apiKey: \"...\" }\n * - Direct LanguageModel instances\n * - Dynamic functions that return any of the above\n *\n * @param modelConfig The model configuration\n * @param requestContext Optional request context for dynamic resolution\n * @param mastra Optional Mastra instance for dynamic resolution\n * @returns A resolved LanguageModel instance\n *\n * @example\n * ```typescript\n * // String resolution\n * const model = await resolveModelConfig(\"openai/gpt-4o\");\n *\n * // Config object resolution\n * const model = await resolveModelConfig({\n * id: \"openai/gpt-4o\",\n * apiKey: \"sk-...\"\n * });\n *\n * // Dynamic resolution\n * const model = await resolveModelConfig(\n * ({ requestContext }) => requestContext.get(\"preferredModel\")\n * );\n * ```\n */\nexport async function resolveModelConfig(\n modelConfig:\n | MastraModelConfig\n | (({\n requestContext,\n mastra,\n }: {\n requestContext: RequestContext;\n mastra?: Mastra;\n }) => MastraModelConfig | Promise<MastraModelConfig>),\n requestContext: RequestContext = new RequestContext(),\n mastra?: Mastra,\n): Promise<MastraLanguageModel> {\n // If it's a function, resolve it first\n if (typeof modelConfig === 'function') {\n modelConfig = await modelConfig({ requestContext, mastra });\n }\n\n // Filter out custom language model instances\n // TODO need a better trick, maybme symbol\n if (modelConfig instanceof ModelRouterLanguageModel || modelConfig instanceof AISDKV5LanguageModel) {\n return modelConfig;\n }\n\n // If it's already a LanguageModel, return it\n if (typeof modelConfig === 'object' && 'specificationVersion' in modelConfig) {\n if (modelConfig.specificationVersion === 'v2') {\n return new AISDKV5LanguageModel(modelConfig as LanguageModelV2);\n }\n\n return modelConfig;\n }\n\n const gatewayRecord = mastra?.listGateways();\n const customGateways = gatewayRecord ? Object.values(gatewayRecord) : undefined;\n\n // If it's a string (magic string like \"openai/gpt-4o\") or OpenAICompatibleConfig, create ModelRouterLanguageModel\n if (typeof modelConfig === 'string' || isOpenAICompatibleObjectConfig(modelConfig)) {\n return new ModelRouterLanguageModel(modelConfig, customGateways);\n }\n\n throw new Error('Invalid model configuration provided');\n}\n","import { createGoogleGenerativeAI } from '@ai-sdk/google-v5';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible-v5';\nimport { createOpenAI } from '@ai-sdk/openai-v5';\nimport type { EmbeddingModelV2 } from '@ai-sdk/provider-v5';\n\nimport { GatewayRegistry } from './provider-registry.js';\nimport type { OpenAICompatibleConfig } from './shared.types.js';\n\n/**\n * Information about a known embedding model\n */\nexport interface EmbeddingModelInfo {\n id: string;\n provider: string;\n dimensions: number;\n maxInputTokens: number;\n description?: string;\n}\n\n/**\n * Hardcoded list of known embedding models\n * This is a curated list that provides autocomplete support\n */\nexport const EMBEDDING_MODELS: EmbeddingModelInfo[] = [\n // OpenAI\n {\n id: 'text-embedding-3-small',\n provider: 'openai',\n dimensions: 1536,\n maxInputTokens: 8191,\n description: 'OpenAI text-embedding-3-small model',\n },\n {\n id: 'text-embedding-3-large',\n provider: 'openai',\n dimensions: 3072,\n maxInputTokens: 8191,\n description: 'OpenAI text-embedding-3-large model',\n },\n {\n id: 'text-embedding-ada-002',\n provider: 'openai',\n dimensions: 1536,\n maxInputTokens: 8191,\n description: 'OpenAI text-embedding-ada-002 model',\n },\n // Google\n {\n id: 'gemini-embedding-001',\n provider: 'google',\n dimensions: 768,\n maxInputTokens: 2048,\n description: 'Google gemini-embedding-001 model',\n },\n {\n id: 'text-embedding-004',\n provider: 'google',\n dimensions: 768,\n maxInputTokens: 3072,\n description: 'Google text-embedding-004 model',\n },\n];\n\n/**\n * Type for embedding model IDs in the format \"provider/model\"\n */\nexport type EmbeddingModelId =\n | 'openai/text-embedding-3-small'\n | 'openai/text-embedding-3-large'\n | 'openai/text-embedding-ada-002'\n | 'google/gemini-embedding-001'\n | 'google/text-embedding-004';\n\n/**\n * Check if a model ID is a known embedding model\n */\nexport function isKnownEmbeddingModel(modelId: string): boolean {\n return EMBEDDING_MODELS.some(m => m.id === modelId);\n}\n\n/**\n * Get information about a known embedding model\n */\nexport function getEmbeddingModelInfo(modelId: string): EmbeddingModelInfo | undefined {\n return EMBEDDING_MODELS.find(m => m.id === modelId);\n}\n\n/**\n * Model router for embedding models that uses the provider/model string format.\n * Automatically resolves the correct AI SDK provider and initializes the embedding model.\n *\n * @example\n * ```ts\n * const embedder = new ModelRouterEmbeddingModel('openai/text-embedding-3-small');\n * const result = await embedder.doEmbed({ values: ['hello world'] });\n * ```\n */\nexport class ModelRouterEmbeddingModel<VALUE extends string = string> implements EmbeddingModelV2<VALUE> {\n readonly specificationVersion = 'v2' as const;\n readonly modelId: string;\n readonly provider: string;\n maxEmbeddingsPerCall: number | PromiseLike<number | undefined> = 2048;\n supportsParallelCalls: boolean | PromiseLike<boolean> = true;\n\n private providerModel: EmbeddingModelV2<VALUE>;\n\n constructor(config: string | OpenAICompatibleConfig) {\n // Normalize config to always have provider and model IDs\n let normalizedConfig: {\n providerId: string;\n modelId: string;\n url?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n };\n\n if (typeof config === 'string') {\n // Parse provider/model from string (e.g., \"openai/text-embedding-3-small\")\n const parts = config.split('/');\n if (parts.length !== 2) {\n throw new Error(`Invalid model string format: \"${config}\". Expected format: \"provider/model\"`);\n }\n const [providerId, modelId] = parts as [string, string];\n normalizedConfig = { providerId, modelId };\n } else if ('providerId' in config && 'modelId' in config) {\n normalizedConfig = {\n providerId: config.providerId,\n modelId: config.modelId,\n url: config.url,\n apiKey: config.apiKey,\n headers: config.headers,\n };\n } else {\n // config has 'id' field\n const parts = config.id.split('/');\n if (parts.length !== 2) {\n throw new Error(`Invalid model string format: \"${config.id}\". Expected format: \"provider/model\"`);\n }\n const [providerId, modelId] = parts as [string, string];\n normalizedConfig = {\n providerId,\n modelId,\n url: config.url,\n apiKey: config.apiKey,\n headers: config.headers,\n };\n }\n\n this.provider = normalizedConfig.providerId;\n this.modelId = normalizedConfig.modelId;\n\n // If custom URL is provided, skip provider registry validation\n // and use the provided API key (or empty string if not provided)\n if (normalizedConfig.url) {\n const apiKey = normalizedConfig.apiKey || '';\n this.providerModel = createOpenAICompatible({\n name: normalizedConfig.providerId,\n apiKey,\n baseURL: normalizedConfig.url,\n headers: normalizedConfig.headers,\n }).textEmbeddingModel(normalizedConfig.modelId) as EmbeddingModelV2<VALUE>;\n } else {\n // Get provider config from registry\n const registry = GatewayRegistry.getInstance();\n const providerConfig = registry.getProviderConfig(normalizedConfig.providerId);\n\n if (!providerConfig) {\n throw new Error(`Unknown provider: ${normalizedConfig.providerId}`);\n }\n\n // Get API key from config or environment\n let apiKey = normalizedConfig.apiKey;\n if (!apiKey) {\n const apiKeyEnvVar = providerConfig.apiKeyEnvVar;\n if (Array.isArray(apiKeyEnvVar)) {\n // Try each possible environment variable\n for (const envVar of apiKeyEnvVar) {\n apiKey = process.env[envVar];\n if (apiKey) break;\n }\n } else {\n apiKey = process.env[apiKeyEnvVar];\n }\n }\n\n if (!apiKey) {\n const envVarDisplay = Array.isArray(providerConfig.apiKeyEnvVar)\n ? providerConfig.apiKeyEnvVar.join(' or ')\n : providerConfig.apiKeyEnvVar;\n throw new Error(`API key not found for provider ${normalizedConfig.providerId}. Set ${envVarDisplay}`);\n }\n\n // Initialize the provider model directly in constructor\n if (normalizedConfig.providerId === 'openai') {\n this.providerModel = createOpenAI({ apiKey }).textEmbeddingModel(\n normalizedConfig.modelId,\n ) as EmbeddingModelV2<VALUE>;\n } else if (normalizedConfig.providerId === 'google') {\n this.providerModel = createGoogleGenerativeAI({ apiKey }).textEmbedding(\n normalizedConfig.modelId,\n ) as EmbeddingModelV2<VALUE>;\n } else {\n // Use OpenAI-compatible provider for other providers\n if (!providerConfig.url) {\n throw new Error(`Provider ${normalizedConfig.providerId} does not have a URL configured`);\n }\n this.providerModel = createOpenAICompatible({\n name: normalizedConfig.providerId,\n apiKey,\n baseURL: providerConfig.url,\n }).textEmbeddingModel(normalizedConfig.modelId) as EmbeddingModelV2<VALUE>;\n }\n }\n\n // Copy properties from the provider model if available\n if (this.providerModel.maxEmbeddingsPerCall !== undefined) {\n this.maxEmbeddingsPerCall = this.providerModel.maxEmbeddingsPerCall;\n }\n if (this.providerModel.supportsParallelCalls !== undefined) {\n this.supportsParallelCalls = this.providerModel.supportsParallelCalls;\n }\n }\n\n async doEmbed(\n args: Parameters<EmbeddingModelV2<VALUE>['doEmbed']>[0],\n ): Promise<Awaited<ReturnType<EmbeddingModelV2<VALUE>['doEmbed']>>> {\n return this.providerModel.doEmbed(args);\n }\n}\n"]}
|