@mastra/core 1.22.0-alpha.3 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/agent/index.cjs +8 -8
  3. package/dist/agent/index.js +1 -1
  4. package/dist/browser/index.cjs +2 -2
  5. package/dist/browser/index.js +1 -1
  6. package/dist/channels/index.cjs +4 -4
  7. package/dist/channels/index.js +1 -1
  8. package/dist/{chunk-VNIQTIMT.cjs → chunk-4CUUOZHE.cjs} +9 -9
  9. package/dist/{chunk-VNIQTIMT.cjs.map → chunk-4CUUOZHE.cjs.map} +1 -1
  10. package/dist/{chunk-TK2OZUMB.js → chunk-7RUFTPIY.js} +4 -4
  11. package/dist/{chunk-TK2OZUMB.js.map → chunk-7RUFTPIY.js.map} +1 -1
  12. package/dist/{chunk-I5Q335YQ.cjs → chunk-AUJ7TUEZ.cjs} +185 -185
  13. package/dist/{chunk-I5Q335YQ.cjs.map → chunk-AUJ7TUEZ.cjs.map} +1 -1
  14. package/dist/{chunk-FVY55BYY.cjs → chunk-CXQ3QR5K.cjs} +48 -48
  15. package/dist/{chunk-FVY55BYY.cjs.map → chunk-CXQ3QR5K.cjs.map} +1 -1
  16. package/dist/{chunk-6HVVLZ5K.js → chunk-DRITAH5L.js} +3 -3
  17. package/dist/{chunk-6HVVLZ5K.js.map → chunk-DRITAH5L.js.map} +1 -1
  18. package/dist/{chunk-HZ7XJDLZ.js → chunk-GYQ22SLZ.js} +4 -4
  19. package/dist/{chunk-HZ7XJDLZ.js.map → chunk-GYQ22SLZ.js.map} +1 -1
  20. package/dist/{chunk-D37I4J42.js → chunk-HPVNBI7J.js} +3 -3
  21. package/dist/{chunk-D37I4J42.js.map → chunk-HPVNBI7J.js.map} +1 -1
  22. package/dist/{chunk-2FNBSEMA.js → chunk-HXX4JDIB.js} +3 -3
  23. package/dist/{chunk-2FNBSEMA.js.map → chunk-HXX4JDIB.js.map} +1 -1
  24. package/dist/{chunk-WMZI4HMZ.cjs → chunk-KLHUYSDF.cjs} +6 -6
  25. package/dist/{chunk-WMZI4HMZ.cjs.map → chunk-KLHUYSDF.cjs.map} +1 -1
  26. package/dist/{chunk-T3BJCDHJ.js → chunk-NLN4DDI6.js} +6 -6
  27. package/dist/{chunk-T3BJCDHJ.js.map → chunk-NLN4DDI6.js.map} +1 -1
  28. package/dist/{chunk-2ZSSN77Q.js → chunk-NMRSL5GT.js} +9 -9
  29. package/dist/{chunk-2ZSSN77Q.js.map → chunk-NMRSL5GT.js.map} +1 -1
  30. package/dist/{chunk-YKCIQLOD.cjs → chunk-NVMXENQS.cjs} +17 -17
  31. package/dist/{chunk-YKCIQLOD.cjs.map → chunk-NVMXENQS.cjs.map} +1 -1
  32. package/dist/{chunk-2C4MPIWQ.cjs → chunk-PJERQ3YG.cjs} +3 -3
  33. package/dist/chunk-PJERQ3YG.cjs.map +1 -0
  34. package/dist/{chunk-ROZCRV4Y.cjs → chunk-QFVPZL25.cjs} +5 -5
  35. package/dist/{chunk-ROZCRV4Y.cjs.map → chunk-QFVPZL25.cjs.map} +1 -1
  36. package/dist/{chunk-GCCEBBVQ.cjs → chunk-RHKFYYB6.cjs} +20 -20
  37. package/dist/{chunk-GCCEBBVQ.cjs.map → chunk-RHKFYYB6.cjs.map} +1 -1
  38. package/dist/{chunk-LHL5KG4Z.js → chunk-TULT7C36.js} +5 -5
  39. package/dist/{chunk-LHL5KG4Z.js.map → chunk-TULT7C36.js.map} +1 -1
  40. package/dist/{chunk-U552IBW4.cjs → chunk-UZVGJ26K.cjs} +77 -77
  41. package/dist/{chunk-U552IBW4.cjs.map → chunk-UZVGJ26K.cjs.map} +1 -1
  42. package/dist/{chunk-WJ3ST7LO.js → chunk-V5FLTMXK.js} +3 -3
  43. package/dist/chunk-V5FLTMXK.js.map +1 -0
  44. package/dist/{chunk-EEQKSBYC.cjs → chunk-VDXTOWVO.cjs} +15 -15
  45. package/dist/{chunk-EEQKSBYC.cjs.map → chunk-VDXTOWVO.cjs.map} +1 -1
  46. package/dist/{chunk-BJV6VYV3.cjs → chunk-VRH5HTH5.cjs} +7 -7
  47. package/dist/{chunk-BJV6VYV3.cjs.map → chunk-VRH5HTH5.cjs.map} +1 -1
  48. package/dist/{chunk-UFIFQ3FR.js → chunk-WTVDTW4F.js} +8 -8
  49. package/dist/{chunk-UFIFQ3FR.js.map → chunk-WTVDTW4F.js.map} +1 -1
  50. package/dist/{chunk-TNE5WKUC.js → chunk-Y7KNCAZY.js} +3 -3
  51. package/dist/{chunk-TNE5WKUC.js.map → chunk-Y7KNCAZY.js.map} +1 -1
  52. package/dist/datasets/index.cjs +11 -11
  53. package/dist/datasets/index.js +1 -1
  54. package/dist/docs/SKILL.md +1 -1
  55. package/dist/docs/assets/SOURCE_MAP.json +128 -128
  56. package/dist/evals/index.cjs +5 -5
  57. package/dist/evals/index.js +2 -2
  58. package/dist/evals/scoreTraces/index.cjs +3 -3
  59. package/dist/evals/scoreTraces/index.js +1 -1
  60. package/dist/harness/index.cjs +7 -7
  61. package/dist/harness/index.js +5 -5
  62. package/dist/index.cjs +2 -2
  63. package/dist/index.js +1 -1
  64. package/dist/llm/index.cjs +20 -20
  65. package/dist/llm/index.js +5 -5
  66. package/dist/loop/index.cjs +14 -14
  67. package/dist/loop/index.js +1 -1
  68. package/dist/mastra/index.cjs +2 -2
  69. package/dist/mastra/index.js +1 -1
  70. package/dist/mastra-33MCZUH4.cjs +12 -0
  71. package/dist/{mastra-SD5JK5YO.cjs.map → mastra-33MCZUH4.cjs.map} +1 -1
  72. package/dist/mastra-RY543V4U.js +3 -0
  73. package/dist/{mastra-P7HM4EN2.js.map → mastra-RY543V4U.js.map} +1 -1
  74. package/dist/memory/index.cjs +17 -17
  75. package/dist/memory/index.js +1 -1
  76. package/dist/models-dev-2BJQPEQJ.js +3 -0
  77. package/dist/{models-dev-47QGZPKZ.js.map → models-dev-2BJQPEQJ.js.map} +1 -1
  78. package/dist/models-dev-OZGJCJIG.cjs +12 -0
  79. package/dist/{models-dev-DULD6ZB3.cjs.map → models-dev-OZGJCJIG.cjs.map} +1 -1
  80. package/dist/netlify-N7PUN3NA.js +3 -0
  81. package/dist/{netlify-26DD6OAQ.js.map → netlify-N7PUN3NA.js.map} +1 -1
  82. package/dist/netlify-TSDN7D7F.cjs +12 -0
  83. package/dist/{netlify-RRQ5LJRU.cjs.map → netlify-TSDN7D7F.cjs.map} +1 -1
  84. package/dist/processor-provider/index.cjs +10 -10
  85. package/dist/processor-provider/index.js +1 -1
  86. package/dist/processors/index.cjs +44 -44
  87. package/dist/processors/index.js +1 -1
  88. package/dist/provider-registry-DBWCMPP3.cjs +40 -0
  89. package/dist/{provider-registry-B5A6S7H2.cjs.map → provider-registry-DBWCMPP3.cjs.map} +1 -1
  90. package/dist/provider-registry-EINTM27D.js +3 -0
  91. package/dist/{provider-registry-ZR2NTKVJ.js.map → provider-registry-EINTM27D.js.map} +1 -1
  92. package/dist/relevance/index.cjs +3 -3
  93. package/dist/relevance/index.js +1 -1
  94. package/dist/stream/index.cjs +8 -8
  95. package/dist/stream/index.js +1 -1
  96. package/dist/tool-loop-agent/index.cjs +4 -4
  97. package/dist/tool-loop-agent/index.js +1 -1
  98. package/dist/workflows/evented/index.cjs +10 -10
  99. package/dist/workflows/evented/index.js +1 -1
  100. package/dist/workflows/index.cjs +24 -24
  101. package/dist/workflows/index.js +1 -1
  102. package/package.json +9 -9
  103. package/dist/chunk-2C4MPIWQ.cjs.map +0 -1
  104. package/dist/chunk-WJ3ST7LO.js.map +0 -1
  105. package/dist/mastra-P7HM4EN2.js +0 -3
  106. package/dist/mastra-SD5JK5YO.cjs +0 -12
  107. package/dist/models-dev-47QGZPKZ.js +0 -3
  108. package/dist/models-dev-DULD6ZB3.cjs +0 -12
  109. package/dist/netlify-26DD6OAQ.js +0 -3
  110. package/dist/netlify-RRQ5LJRU.cjs +0 -12
  111. package/dist/provider-registry-B5A6S7H2.cjs +0 -40
  112. package/dist/provider-registry-ZR2NTKVJ.js +0 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,71 @@
1
1
  # @mastra/core
2
2
 
3
+ ## 1.22.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add browser integration support for agents ([#14938](https://github.com/mastra-ai/mastra/pull/14938))
8
+ - New `browser` property on agents for browser automation toolsets
9
+ - `MastraBrowser` base class with screencast streaming, input injection, and state management
10
+ - `ThreadManager` for browser session isolation per thread
11
+ - Browser tools are automatically available when a browser is configured on an agent
12
+ - New `@mastra/core/browser` export with browser types and utilities
13
+
14
+ - Added agent-level chat channels via Vercel Chat SDK adapters. ([#14642](https://github.com/mastra-ai/mastra/pull/14642))
15
+
16
+ Agents can now communicate over messaging platforms like Slack, Discord, and Telegram using the `channels` configuration option. Each agent manages its own adapters and automatically handles event routing, thread mapping, tool generation, and streaming responses.
17
+
18
+ **Key features:**
19
+ - Configure channels directly on agents with `channels: { adapters: { slack: createSlackAdapter(), discord: createDiscordAdapter() } }`
20
+ - Automatic webhook route generation at `/api/agents/{agentId}/channels/{platform}/webhook`
21
+ - Tool approval buttons with `requireApproval: true` tools rendered as interactive cards
22
+ - Multi-user thread awareness with author prefixes for group conversations
23
+ - Thread subscriptions persisted via Mastra storage (survives restarts)
24
+
25
+ **New exports from `@mastra/core/channels`:**
26
+ - `AgentChannels` — internal class managing Chat SDK instance and event handlers
27
+ - `ChatChannelProcessor` — input processor injecting channel context into prompts
28
+ - `MastraStateAdapter` — StateAdapter backed by Mastra storage
29
+
30
+ - Added expectedTrajectory support to dataset items across all storage backends and API layer. Dataset items can now store trajectory expectations that define expected agent execution steps, ordering, and constraints for trajectory-based evaluation scoring. ([#14902](https://github.com/mastra-ai/mastra/pull/14902))
31
+
32
+ - Added Mastra Gateway as a model router provider. ([#14952](https://github.com/mastra-ai/mastra/pull/14952))
33
+
34
+ The Mastra Gateway enables access to multiple LLM providers through a unified endpoint at server.mastra.ai, supporting both API key and OAuth authentication flows.
35
+
36
+ **New exports:**
37
+ - `MastraGateway` — gateway provider class for routing models through the Mastra Gateway service
38
+ - `MastraGatewayConfig` — configuration type with `apiKey`, `baseUrl`, and `customFetch` options
39
+ - `GATEWAY_AUTH_HEADER` — constant for the custom gateway authentication header (`X-Memory-Gateway-Authorization`)
40
+ - `GatewayRegistry` — manages gateway-based provider discovery with atomic file caching
41
+ - `parseModelString` — utility to parse provider/model ID strings
42
+
43
+ ```ts
44
+ import { MastraGateway } from '@mastra/core/llm';
45
+
46
+ const gateway = new MastraGateway({
47
+ apiKey: process.env.MASTRA_GATEWAY_API_KEY,
48
+ });
49
+ ```
50
+
51
+ ### Patch Changes
52
+
53
+ - Update provider registry and model documentation with latest models and providers ([`81e4259`](https://github.com/mastra-ai/mastra/commit/81e425939b4ceeb4f586e9b6d89c3b1c1f2d2fe7))
54
+
55
+ - **Fixed streamed finish metadata being dropped from final model results** ([#13914](https://github.com/mastra-ai/mastra/pull/13914))
56
+
57
+ Provider-specific metadata from streamed `finish` events is now preserved consistently across final output results, buffered steps, and `onFinish` callbacks. This improves compatibility with providers like Anthropic and Google/Gemini when they attach cache, reasoning, or other finish-time metadata during streaming.
58
+
59
+ - Fixed providerMetadata (e.g. Gemini thoughtSignature) being lost on assistant file parts during multi-turn conversations. This resolves 'Image part is missing a thought_signature' errors when round-tripping model-generated images with Gemini 3.x models. ([#14972](https://github.com/mastra-ai/mastra/pull/14972))
60
+
61
+ - Fixed `LocalSandbox` `execute_command` with a relative `cwd` (e.g. `"."` or `"./subdir"`) resolving against the server's working directory instead of the sandbox's configured `workingDirectory`. ([#14964](https://github.com/mastra-ai/mastra/pull/14964))
62
+
63
+ - Fixed tool result persistence so savePerStep keeps raw tool output while prompt messages still use stored model output. ([#14966](https://github.com/mastra-ai/mastra/pull/14966))
64
+
65
+ - Fixed skill path resolution when disambiguating same-named skills. The `skill` tool now correctly resolves skills by path when the location includes the `/SKILL.md` suffix. Fixes #14918. ([#14951](https://github.com/mastra-ai/mastra/pull/14951))
66
+
67
+ - Fixed thread titles not persisting when generated during async buffered observation. Titles now update immediately when the observer produces them, rather than being lost until activation. ([#14992](https://github.com/mastra-ai/mastra/pull/14992))
68
+
3
69
  ## 1.22.0-alpha.3
4
70
 
5
71
  ## 1.22.0-alpha.2
@@ -1,37 +1,37 @@
1
1
  'use strict';
2
2
 
3
- var chunkEEQKSBYC_cjs = require('../chunk-EEQKSBYC.cjs');
3
+ var chunkVDXTOWVO_cjs = require('../chunk-VDXTOWVO.cjs');
4
4
  var chunkXB5NKHYR_cjs = require('../chunk-XB5NKHYR.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Agent", {
9
9
  enumerable: true,
10
- get: function () { return chunkEEQKSBYC_cjs.Agent; }
10
+ get: function () { return chunkVDXTOWVO_cjs.Agent; }
11
11
  });
12
12
  Object.defineProperty(exports, "TripWire", {
13
13
  enumerable: true,
14
- get: function () { return chunkEEQKSBYC_cjs.TripWire; }
14
+ get: function () { return chunkVDXTOWVO_cjs.TripWire; }
15
15
  });
16
16
  Object.defineProperty(exports, "isSupportedLanguageModel", {
17
17
  enumerable: true,
18
- get: function () { return chunkEEQKSBYC_cjs.isSupportedLanguageModel; }
18
+ get: function () { return chunkVDXTOWVO_cjs.isSupportedLanguageModel; }
19
19
  });
20
20
  Object.defineProperty(exports, "resolveThreadIdFromArgs", {
21
21
  enumerable: true,
22
- get: function () { return chunkEEQKSBYC_cjs.resolveThreadIdFromArgs; }
22
+ get: function () { return chunkVDXTOWVO_cjs.resolveThreadIdFromArgs; }
23
23
  });
24
24
  Object.defineProperty(exports, "supportedLanguageModelSpecifications", {
25
25
  enumerable: true,
26
- get: function () { return chunkEEQKSBYC_cjs.supportedLanguageModelSpecifications; }
26
+ get: function () { return chunkVDXTOWVO_cjs.supportedLanguageModelSpecifications; }
27
27
  });
28
28
  Object.defineProperty(exports, "tryGenerateWithJsonFallback", {
29
29
  enumerable: true,
30
- get: function () { return chunkEEQKSBYC_cjs.tryGenerateWithJsonFallback; }
30
+ get: function () { return chunkVDXTOWVO_cjs.tryGenerateWithJsonFallback; }
31
31
  });
32
32
  Object.defineProperty(exports, "tryStreamWithJsonFallback", {
33
33
  enumerable: true,
34
- get: function () { return chunkEEQKSBYC_cjs.tryStreamWithJsonFallback; }
34
+ get: function () { return chunkVDXTOWVO_cjs.tryStreamWithJsonFallback; }
35
35
  });
36
36
  Object.defineProperty(exports, "MessageList", {
37
37
  enumerable: true,
@@ -1,4 +1,4 @@
1
- export { Agent, TripWire, isSupportedLanguageModel, resolveThreadIdFromArgs, supportedLanguageModelSpecifications, tryGenerateWithJsonFallback, tryStreamWithJsonFallback } from '../chunk-LHL5KG4Z.js';
1
+ export { Agent, TripWire, isSupportedLanguageModel, resolveThreadIdFromArgs, supportedLanguageModelSpecifications, tryGenerateWithJsonFallback, tryStreamWithJsonFallback } from '../chunk-TULT7C36.js';
2
2
  export { MessageList, TypeDetector, aiV5ModelMessageToV2PromptMessage, convertMessages } from '../chunk-HGR2ESKV.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkEEQKSBYC_cjs = require('../chunk-EEQKSBYC.cjs');
3
+ var chunkVDXTOWVO_cjs = require('../chunk-VDXTOWVO.cjs');
4
4
  var chunkDKK77FIJ_cjs = require('../chunk-DKK77FIJ.cjs');
5
5
  var chunkHBO2PK7W_cjs = require('../chunk-HBO2PK7W.cjs');
6
6
  var events = require('events');
@@ -1037,7 +1037,7 @@ To fix this, either:
1037
1037
  */
1038
1038
  getInputProcessors(configuredProcessors = []) {
1039
1039
  const hasProcessor = configuredProcessors.some(
1040
- (p) => !chunkEEQKSBYC_cjs.isProcessorWorkflow(p) && "id" in p && p.id === "browser-context"
1040
+ (p) => !chunkVDXTOWVO_cjs.isProcessorWorkflow(p) && "id" in p && p.id === "browser-context"
1041
1041
  );
1042
1042
  if (hasProcessor) return [];
1043
1043
  return [new BrowserContextProcessor()];
@@ -1,4 +1,4 @@
1
- import { isProcessorWorkflow } from '../chunk-LHL5KG4Z.js';
1
+ import { isProcessorWorkflow } from '../chunk-TULT7C36.js';
2
2
  import { MastraBase } from '../chunk-DNW46JHP.js';
3
3
  import { RegisteredLogger } from '../chunk-M3LRSDLL.js';
4
4
  import { EventEmitter } from 'events';
@@ -1,20 +1,20 @@
1
1
  'use strict';
2
2
 
3
- var chunkEEQKSBYC_cjs = require('../chunk-EEQKSBYC.cjs');
3
+ var chunkVDXTOWVO_cjs = require('../chunk-VDXTOWVO.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "AgentChannels", {
8
8
  enumerable: true,
9
- get: function () { return chunkEEQKSBYC_cjs.AgentChannels; }
9
+ get: function () { return chunkVDXTOWVO_cjs.AgentChannels; }
10
10
  });
11
11
  Object.defineProperty(exports, "ChatChannelProcessor", {
12
12
  enumerable: true,
13
- get: function () { return chunkEEQKSBYC_cjs.ChatChannelProcessor; }
13
+ get: function () { return chunkVDXTOWVO_cjs.ChatChannelProcessor; }
14
14
  });
15
15
  Object.defineProperty(exports, "MastraStateAdapter", {
16
16
  enumerable: true,
17
- get: function () { return chunkEEQKSBYC_cjs.MastraStateAdapter; }
17
+ get: function () { return chunkVDXTOWVO_cjs.MastraStateAdapter; }
18
18
  });
19
19
  //# sourceMappingURL=index.cjs.map
20
20
  //# sourceMappingURL=index.cjs.map
@@ -1,3 +1,3 @@
1
- export { AgentChannels, ChatChannelProcessor, MastraStateAdapter } from '../chunk-LHL5KG4Z.js';
1
+ export { AgentChannels, ChatChannelProcessor, MastraStateAdapter } from '../chunk-TULT7C36.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunk2C4MPIWQ_cjs = require('./chunk-2C4MPIWQ.cjs');
3
+ var chunkPJERQ3YG_cjs = require('./chunk-PJERQ3YG.cjs');
4
4
  var chunkOF675HEC_cjs = require('./chunk-OF675HEC.cjs');
5
5
  var chunk4U7ZLI36_cjs = require('./chunk-4U7ZLI36.cjs');
6
6
 
7
7
  // src/llm/model/gateways/netlify.ts
8
- var NetlifyGateway = class extends chunk2C4MPIWQ_cjs.MastraModelGateway {
8
+ var NetlifyGateway = class extends chunkPJERQ3YG_cjs.MastraModelGateway {
9
9
  id = "netlify";
10
10
  name = "Netlify AI Gateway";
11
11
  tokenCache = new chunkOF675HEC_cjs.InMemoryServerCache();
@@ -128,12 +128,12 @@ var NetlifyGateway = class extends chunk2C4MPIWQ_cjs.MastraModelGateway {
128
128
  headers
129
129
  }) {
130
130
  const baseURL = await this.buildUrl(`${providerId}/${modelId}`);
131
- const mastraHeaders = { "User-Agent": chunk2C4MPIWQ_cjs.MASTRA_USER_AGENT, ...headers };
131
+ const mastraHeaders = { "User-Agent": chunkPJERQ3YG_cjs.MASTRA_USER_AGENT, ...headers };
132
132
  switch (providerId) {
133
133
  case "openai":
134
- return chunk2C4MPIWQ_cjs.createOpenAI({ apiKey, baseURL, headers: mastraHeaders }).responses(modelId);
134
+ return chunkPJERQ3YG_cjs.createOpenAI({ apiKey, baseURL, headers: mastraHeaders }).responses(modelId);
135
135
  case "gemini":
136
- return chunk2C4MPIWQ_cjs.createGoogleGenerativeAI({
136
+ return chunkPJERQ3YG_cjs.createGoogleGenerativeAI({
137
137
  baseURL: `${baseURL}/v1beta/`,
138
138
  apiKey,
139
139
  headers: {
@@ -142,7 +142,7 @@ var NetlifyGateway = class extends chunk2C4MPIWQ_cjs.MastraModelGateway {
142
142
  }
143
143
  }).chat(modelId);
144
144
  case "anthropic":
145
- return chunk2C4MPIWQ_cjs.createAnthropic({
145
+ return chunkPJERQ3YG_cjs.createAnthropic({
146
146
  apiKey,
147
147
  baseURL: `${baseURL}/v1/`,
148
148
  headers: {
@@ -151,7 +151,7 @@ var NetlifyGateway = class extends chunk2C4MPIWQ_cjs.MastraModelGateway {
151
151
  }
152
152
  })(modelId);
153
153
  default:
154
- return chunk2C4MPIWQ_cjs.createOpenAICompatible({
154
+ return chunkPJERQ3YG_cjs.createOpenAICompatible({
155
155
  name: providerId,
156
156
  apiKey,
157
157
  baseURL,
@@ -163,5 +163,5 @@ var NetlifyGateway = class extends chunk2C4MPIWQ_cjs.MastraModelGateway {
163
163
  };
164
164
 
165
165
  exports.NetlifyGateway = NetlifyGateway;
166
- //# sourceMappingURL=chunk-VNIQTIMT.cjs.map
167
- //# sourceMappingURL=chunk-VNIQTIMT.cjs.map
166
+ //# sourceMappingURL=chunk-4CUUOZHE.cjs.map
167
+ //# sourceMappingURL=chunk-4CUUOZHE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/llm/model/gateways/netlify.ts"],"names":["MastraModelGateway","InMemoryServerCache","MastraError","MASTRA_USER_AGENT","createOpenAI","createGoogleGenerativeAI","createAnthropic","createOpenAICompatible"],"mappings":"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","file":"chunk-VNIQTIMT.cjs","sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic-v5';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google-v5';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible-v5';\nimport { createOpenAI } from '@ai-sdk/openai-v5';\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';\nimport { MASTRA_USER_AGENT } from './constants.js';\n\ninterface NetlifyProviderResponse {\n token_env_var: string;\n url_env_var: string;\n models: string[];\n}\ninterface NetlifyResponse {\n providers: Record<string, NetlifyProviderResponse>;\n}\n\ninterface NetlifyTokenResponse {\n token: string;\n url: string;\n expires_at: number;\n}\n\ninterface CachedToken {\n token: string;\n url: string;\n expiresAt: number;\n}\n\ninterface TokenData {\n token: string;\n url: string;\n}\n\nexport class NetlifyGateway extends MastraModelGateway {\n readonly id = 'netlify';\n readonly name = 'Netlify AI Gateway';\n private tokenCache = new InMemoryServerCache();\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n const response = await fetch('https://api.netlify.com/api/v1/ai-gateway/providers');\n if (!response.ok) {\n throw new Error(`Failed to fetch from Netlify: ${response.statusText}`);\n }\n const data = (await response.json()) as NetlifyResponse;\n const config: ProviderConfig = {\n apiKeyEnvVar: ['NETLIFY_TOKEN', 'NETLIFY_SITE_ID'],\n apiKeyHeader: 'Authorization',\n name: `Netlify`,\n gateway: `netlify`,\n models: [],\n docUrl: 'https://docs.netlify.com/build/ai-gateway/overview/',\n };\n // Convert Netlify format to our standard format\n for (const [providerId, provider] of Object.entries(data.providers)) {\n for (const model of provider.models) {\n config.models.push(`${providerId}/${model}`);\n }\n }\n // Return with gateway ID as key - registry generator will detect this and avoid doubling the prefix\n return { netlify: config };\n }\n\n async buildUrl(routerId: string, envVars?: typeof process.env): Promise<string> {\n // Check for Netlify site ID first (for token exchange)\n const siteId = envVars?.['NETLIFY_SITE_ID'] || process.env['NETLIFY_SITE_ID'];\n const netlifyToken = envVars?.['NETLIFY_TOKEN'] || process.env['NETLIFY_TOKEN'];\n\n if (!netlifyToken) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_TOKEN',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_TOKEN environment variable required for model: ${routerId}`,\n });\n }\n\n if (!siteId) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_SITE_ID',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_SITE_ID environment variable required for model: ${routerId}`,\n });\n }\n\n try {\n const tokenData = await this.getOrFetchToken(siteId, netlifyToken);\n return tokenData.url.endsWith(`/`) ? tokenData.url.substring(0, tokenData.url.length - 1) : tokenData.url;\n } catch (error) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_TOKEN_ERROR',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Failed to get Netlify AI Gateway token for model ${routerId}: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n /**\n * Get cached token or fetch a new site-specific AI Gateway token from Netlify\n */\n private async getOrFetchToken(siteId: string, netlifyToken: string): Promise<TokenData> {\n const cacheKey = `netlify-token:${siteId}:${netlifyToken}`;\n\n // Check cache first\n const cached = (await this.tokenCache.get(cacheKey)) as CachedToken | undefined;\n if (cached && cached.expiresAt > Date.now() / 1000 + 60) {\n // Return cached token if it won't expire in the next minute\n return { token: cached.token, url: cached.url };\n }\n\n // Fetch new token\n const response = await fetch(`https://api.netlify.com/api/v1/sites/${siteId}/ai-gateway/token`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${netlifyToken}`,\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get Netlify AI Gateway token: ${response.status} ${error}`);\n }\n\n const tokenResponse = (await response.json()) as NetlifyTokenResponse;\n\n // Cache the token - InMemoryServerCache will handle the TTL\n await this.tokenCache.set(cacheKey, {\n token: tokenResponse.token,\n url: tokenResponse.url,\n expiresAt: tokenResponse.expires_at,\n });\n\n return { token: tokenResponse.token, url: tokenResponse.url };\n }\n\n /**\n * Get cached token or fetch a new site-specific AI Gateway token from Netlify\n */\n async getApiKey(modelId: string): Promise<string> {\n const siteId = process.env['NETLIFY_SITE_ID'];\n const netlifyToken = process.env['NETLIFY_TOKEN'];\n\n if (!netlifyToken) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_TOKEN',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_TOKEN environment variable required for model: ${modelId}`,\n });\n }\n\n if (!siteId) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_SITE_ID',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_SITE_ID environment variable required for model: ${modelId}`,\n });\n }\n\n try {\n return (await this.getOrFetchToken(siteId, netlifyToken)).token;\n } catch (error) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_TOKEN_ERROR',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Failed to get Netlify AI Gateway token for model ${modelId}: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n 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 baseURL = await this.buildUrl(`${providerId}/${modelId}`);\n\n const mastraHeaders = { 'User-Agent': MASTRA_USER_AGENT, ...headers };\n\n switch (providerId) {\n case 'openai':\n return createOpenAI({ apiKey, baseURL, headers: mastraHeaders }).responses(modelId);\n case 'gemini':\n return createGoogleGenerativeAI({\n baseURL: `${baseURL}/v1beta/`,\n apiKey,\n headers: {\n 'user-agent': 'google-genai-sdk/',\n ...mastraHeaders,\n },\n }).chat(modelId);\n case 'anthropic':\n return createAnthropic({\n apiKey,\n baseURL: `${baseURL}/v1/`,\n headers: {\n 'anthropic-version': '2023-06-01',\n ...mastraHeaders,\n },\n })(modelId);\n default:\n return createOpenAICompatible({\n name: providerId,\n apiKey,\n baseURL,\n headers: mastraHeaders,\n supportsStructuredOutputs: true,\n }).chatModel(modelId);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/llm/model/gateways/netlify.ts"],"names":["MastraModelGateway","InMemoryServerCache","MastraError","MASTRA_USER_AGENT","createOpenAI","createGoogleGenerativeAI","createAnthropic","createOpenAICompatible"],"mappings":"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","file":"chunk-4CUUOZHE.cjs","sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic-v5';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google-v5';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible-v5';\nimport { createOpenAI } from '@ai-sdk/openai-v5';\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';\nimport { MASTRA_USER_AGENT } from './constants.js';\n\ninterface NetlifyProviderResponse {\n token_env_var: string;\n url_env_var: string;\n models: string[];\n}\ninterface NetlifyResponse {\n providers: Record<string, NetlifyProviderResponse>;\n}\n\ninterface NetlifyTokenResponse {\n token: string;\n url: string;\n expires_at: number;\n}\n\ninterface CachedToken {\n token: string;\n url: string;\n expiresAt: number;\n}\n\ninterface TokenData {\n token: string;\n url: string;\n}\n\nexport class NetlifyGateway extends MastraModelGateway {\n readonly id = 'netlify';\n readonly name = 'Netlify AI Gateway';\n private tokenCache = new InMemoryServerCache();\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n const response = await fetch('https://api.netlify.com/api/v1/ai-gateway/providers');\n if (!response.ok) {\n throw new Error(`Failed to fetch from Netlify: ${response.statusText}`);\n }\n const data = (await response.json()) as NetlifyResponse;\n const config: ProviderConfig = {\n apiKeyEnvVar: ['NETLIFY_TOKEN', 'NETLIFY_SITE_ID'],\n apiKeyHeader: 'Authorization',\n name: `Netlify`,\n gateway: `netlify`,\n models: [],\n docUrl: 'https://docs.netlify.com/build/ai-gateway/overview/',\n };\n // Convert Netlify format to our standard format\n for (const [providerId, provider] of Object.entries(data.providers)) {\n for (const model of provider.models) {\n config.models.push(`${providerId}/${model}`);\n }\n }\n // Return with gateway ID as key - registry generator will detect this and avoid doubling the prefix\n return { netlify: config };\n }\n\n async buildUrl(routerId: string, envVars?: typeof process.env): Promise<string> {\n // Check for Netlify site ID first (for token exchange)\n const siteId = envVars?.['NETLIFY_SITE_ID'] || process.env['NETLIFY_SITE_ID'];\n const netlifyToken = envVars?.['NETLIFY_TOKEN'] || process.env['NETLIFY_TOKEN'];\n\n if (!netlifyToken) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_TOKEN',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_TOKEN environment variable required for model: ${routerId}`,\n });\n }\n\n if (!siteId) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_SITE_ID',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_SITE_ID environment variable required for model: ${routerId}`,\n });\n }\n\n try {\n const tokenData = await this.getOrFetchToken(siteId, netlifyToken);\n return tokenData.url.endsWith(`/`) ? tokenData.url.substring(0, tokenData.url.length - 1) : tokenData.url;\n } catch (error) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_TOKEN_ERROR',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Failed to get Netlify AI Gateway token for model ${routerId}: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n /**\n * Get cached token or fetch a new site-specific AI Gateway token from Netlify\n */\n private async getOrFetchToken(siteId: string, netlifyToken: string): Promise<TokenData> {\n const cacheKey = `netlify-token:${siteId}:${netlifyToken}`;\n\n // Check cache first\n const cached = (await this.tokenCache.get(cacheKey)) as CachedToken | undefined;\n if (cached && cached.expiresAt > Date.now() / 1000 + 60) {\n // Return cached token if it won't expire in the next minute\n return { token: cached.token, url: cached.url };\n }\n\n // Fetch new token\n const response = await fetch(`https://api.netlify.com/api/v1/sites/${siteId}/ai-gateway/token`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${netlifyToken}`,\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get Netlify AI Gateway token: ${response.status} ${error}`);\n }\n\n const tokenResponse = (await response.json()) as NetlifyTokenResponse;\n\n // Cache the token - InMemoryServerCache will handle the TTL\n await this.tokenCache.set(cacheKey, {\n token: tokenResponse.token,\n url: tokenResponse.url,\n expiresAt: tokenResponse.expires_at,\n });\n\n return { token: tokenResponse.token, url: tokenResponse.url };\n }\n\n /**\n * Get cached token or fetch a new site-specific AI Gateway token from Netlify\n */\n async getApiKey(modelId: string): Promise<string> {\n const siteId = process.env['NETLIFY_SITE_ID'];\n const netlifyToken = process.env['NETLIFY_TOKEN'];\n\n if (!netlifyToken) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_TOKEN',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_TOKEN environment variable required for model: ${modelId}`,\n });\n }\n\n if (!siteId) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_NO_SITE_ID',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Missing NETLIFY_SITE_ID environment variable required for model: ${modelId}`,\n });\n }\n\n try {\n return (await this.getOrFetchToken(siteId, netlifyToken)).token;\n } catch (error) {\n throw new MastraError({\n id: 'NETLIFY_GATEWAY_TOKEN_ERROR',\n domain: 'LLM',\n category: 'UNKNOWN',\n text: `Failed to get Netlify AI Gateway token for model ${modelId}: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n 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 baseURL = await this.buildUrl(`${providerId}/${modelId}`);\n\n const mastraHeaders = { 'User-Agent': MASTRA_USER_AGENT, ...headers };\n\n switch (providerId) {\n case 'openai':\n return createOpenAI({ apiKey, baseURL, headers: mastraHeaders }).responses(modelId);\n case 'gemini':\n return createGoogleGenerativeAI({\n baseURL: `${baseURL}/v1beta/`,\n apiKey,\n headers: {\n 'user-agent': 'google-genai-sdk/',\n ...mastraHeaders,\n },\n }).chat(modelId);\n case 'anthropic':\n return createAnthropic({\n apiKey,\n baseURL: `${baseURL}/v1/`,\n headers: {\n 'anthropic-version': '2023-06-01',\n ...mastraHeaders,\n },\n })(modelId);\n default:\n return createOpenAICompatible({\n name: providerId,\n apiKey,\n baseURL,\n headers: mastraHeaders,\n supportsStructuredOutputs: true,\n }).chatModel(modelId);\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { validateAndSaveScore } from './chunk-TNE5WKUC.js';
2
- import { isSupportedLanguageModel } from './chunk-LHL5KG4Z.js';
1
+ import { validateAndSaveScore } from './chunk-Y7KNCAZY.js';
2
+ import { isSupportedLanguageModel } from './chunk-TULT7C36.js';
3
3
  import { EntityType } from './chunk-LQY5E2LW.js';
4
4
  import { RequestContext } from './chunk-JGOH7RWL.js';
5
5
  import { MastraError } from './chunk-FJEVLHJT.js';
@@ -1360,5 +1360,5 @@ var DatasetsManager = class {
1360
1360
  };
1361
1361
 
1362
1362
  export { Dataset, DatasetsManager, compareExperiments, computeMean, computeScorerStats, executeTarget, isRegression, resolveScorers, runExperiment, runScorersForItem };
1363
- //# sourceMappingURL=chunk-TK2OZUMB.js.map
1364
- //# sourceMappingURL=chunk-TK2OZUMB.js.map
1363
+ //# sourceMappingURL=chunk-7RUFTPIY.js.map
1364
+ //# sourceMappingURL=chunk-7RUFTPIY.js.map