@mastra/mcp-docs-server 1.3.0-alpha.1 → 1.3.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.docs/docs/evals/datasets.md +15 -1
  2. package/.docs/docs/evals/experiments.md +1 -1
  3. package/.docs/docs/harness/signals.md +31 -0
  4. package/.docs/docs/mastra-platform/environments.md +4 -5
  5. package/.docs/docs/mastra-platform/system-environment-variables.md +4 -5
  6. package/.docs/docs/memory/memory-processors.md +7 -1
  7. package/.docs/docs/memory/message-history.md +3 -1
  8. package/.docs/docs/memory/observational-memory.md +3 -1
  9. package/.docs/docs/observability/feedback.md +2 -2
  10. package/.docs/integrations/agentic-ui/ai-sdk-ui.md +1 -1
  11. package/.docs/integrations/databases/clickhouse.md +2 -2
  12. package/.docs/integrations/deploy/inngest.md +1 -1
  13. package/.docs/models/gateways/netlify.md +1 -5
  14. package/.docs/models/gateways/openrouter.md +2 -2
  15. package/.docs/models/gateways/vercel.md +4 -2
  16. package/.docs/models/index.md +1 -1
  17. package/.docs/models/providers/edenai.md +4 -4
  18. package/.docs/models/providers/kilo.md +10 -10
  19. package/.docs/models/providers/llmgateway-providers.md +2 -2
  20. package/.docs/models/providers/llmgateway.md +1 -1
  21. package/.docs/models/providers/nano-gpt.md +5 -1
  22. package/.docs/models/providers/opencode-go.md +3 -2
  23. package/.docs/models/providers/opencode.md +2 -1
  24. package/.docs/reference/agents/agent.md +53 -2
  25. package/.docs/reference/ai-sdk/chat-route.md +9 -3
  26. package/.docs/reference/cli/mastra.md +1 -1
  27. package/.docs/reference/client-js/agents.md +46 -0
  28. package/.docs/reference/client-js/datasets.md +3 -3
  29. package/.docs/reference/client-js/observability.md +1 -1
  30. package/.docs/reference/datasets/datasets-manager.md +1 -1
  31. package/.docs/reference/datasets/deleteExperiment.md +6 -2
  32. package/.docs/reference/datasets/purgeItem.md +9 -1
  33. package/.docs/reference/evals/create-classifier-scorer.md +200 -0
  34. package/.docs/reference/index.md +3 -0
  35. package/.docs/reference/memory/memory-class.md +2 -0
  36. package/.docs/reference/observability/feedback.md +25 -12
  37. package/.docs/reference/observability/tracing/interfaces.md +3 -3
  38. package/.docs/reference/observability/tracing/trace-query.md +29 -2
  39. package/.docs/reference/processors/memory-input-filter.md +59 -0
  40. package/.docs/reference/processors/model-selection-processor.md +225 -0
  41. package/.docs/reference/pubsub/redis-streams.md +3 -1
  42. package/.docs/reference/server/routes.md +48 -16
  43. package/.docs/reference/storage/retention.md +9 -7
  44. package/package.json +4 -4
@@ -121,6 +121,20 @@ await dataset.addItems({
121
121
  })
122
122
  ```
123
123
 
124
+ ### Stored field values
125
+
126
+ In-memory, LibSQL, PostgreSQL, MySQL, MongoDB, and Spanner dataset storage preserve JSON `null` in `input`, `groundTruth`, and `expectedTrajectory`, along with empty strings, arrays, and objects. Omitted optional JSON fields remain absent when serialized. Dataset schemas still determine which values an item accepts.
127
+
128
+ Snapshot validation doesn't override database restrictions. MongoDB rejects object property names containing NUL (`\u0000`), even in valid JSON. A batch insert containing such keys fails without storing any items or advancing the dataset version.
129
+
130
+ For configuration updates, `null` clears schemas, tags, target type, target IDs, or scorer IDs. These adapters return cleared settings as `undefined`, while preserving empty arrays and objects. An item update with `scorerIds: null` removes its scorer override, whereas `scorerIds: []` disables scoring for that item. Omitted update fields leave existing values unchanged.
131
+
132
+ Retries with the same `externalId` retain the original item's representation. For backward compatibility, insert operations treat omitted and `null` payload fields as equivalent when comparing a retry with an existing item. For example, inserting an item without `groundTruth` and retrying with `groundTruth: null` returns the original item with no ground truth. Use an item update to store an explicit `null` instead.
133
+
134
+ Unset configuration now reads as `undefined` where some adapters previously returned `null`, so serialized responses omit those properties. Use nullish checks such as `value ?? fallback` rather than relying on an explicit `null` property. LibSQL also returns an omitted dataset description as `undefined`, matching its declared type.
135
+
136
+ Older LibSQL, PostgreSQL, MySQL, and Spanner writes stored optional JSON `null` values as SQL `NULL`, so those values remain indistinguishable from omitted fields. Older MongoDB writes stored omitted optional payload fields as BSON `null`. The storage fixes preserve new writes but don't reconstruct previously lost distinctions.
137
+
124
138
  ## Validate snapshot artifacts
125
139
 
126
140
  Use `createDatasetSnapshot()` and `parseDatasetSnapshot()` from `@mastra/core/datasets` to create and validate a versioned JSON artifact. These are pure format utilities: they don't export from storage, import a dataset, allocate portable identities, or change Studio's JSON importer.
@@ -156,7 +170,7 @@ The artifact includes configuration, complete authored item payloads, portable U
156
170
 
157
171
  Each item requires `createdAt` and `updatedAt` as UTC ISO 8601 strings with millisecond precision, matching `Date.toISOString()` for four-digit years. Both timestamps are included in the integrity digest. They represent the item's actual dates, not transfer provenance: an importer must preserve them as the destination item's `createdAt` and `updatedAt`, rather than replacing them with import time. An importer records transfer time in a separate receipt, while later edits in the destination update `updatedAt` normally. Implementing storage import remains outside the scope of these format helpers.
158
172
 
159
- This preservation applies to the supplied artifact content. Storage adapters may already have normalized values before capture. Format validation neither recovers those distinctions nor guarantees that ordinary dataset CRUD operations can restore them.
173
+ This preservation applies to the supplied artifact content. Storage adapters may already have normalized values before capture. Format validation neither recovers those distinctions nor guarantees that ordinary dataset CRUD operations can restore them. PostgreSQL JSONB, for example, rejects strings containing the NUL character (`\u0000`) even though they're valid in an artifact. Validate destination storage restrictions before writing artifact contents.
160
174
 
161
175
  Both helpers throw a Zod validation error for invalid content or size options. `datasetSnapshotContentSchema.safeParse()` validates unsigned content and identity uniqueness, while `datasetSnapshotSchema.safeParse()` additionally checks the digest. These schemas don't enforce a byte limit. Use `parseDatasetSnapshot()` for untrusted text to enforce a size budget before parsing and reject duplicate JSON property names.
162
176
 
@@ -45,7 +45,7 @@ In the **Experiments** tab, select **Compare** and choose two or more experiment
45
45
 
46
46
  ## Delete experiments
47
47
 
48
- In Studio, open the global **Experiments** list and select **Delete Experiment** from a row, or delete the experiment from its details page. The global list also lets you delete experiments orphaned by dataset deletion, which no longer have a dataset details page.
48
+ In Studio, open the global **Experiments** list and select **Delete experiment** on a row, or open the experiment and select **Delete Experiment**. The global list also lets you delete experiments orphaned by dataset deletion, which no longer have a dataset details page.
49
49
 
50
50
  Deleting an experiment permanently removes its result records, plus the observability traces it produced and their associated spans, scores, feedback, metrics, and logs. A storage adapter without trace deletion support leaves the traces in place, logs a warning, and still deletes the experiment with its result records.
51
51
 
@@ -90,6 +90,37 @@ agent.queueMessage('Also check whether the tests need updates.', {
90
90
 
91
91
  When the thread is idle, `queueMessage()` starts a run immediately. When the thread is active, it preserves turn order by starting a new run after the active run completes.
92
92
 
93
+ ### Cancel pending input
94
+
95
+ Use [`cancelQueuedMessages()`](https://mastra.ai/reference/agents/agent) to remove selected pending input without stopping the active run. Cancellation is scoped to the memory thread, including input submitted by other Agents sharing the same runtime and PubSub instance.
96
+
97
+ The thread must still have a pending message to cancel. This example assumes a run is active when you queue the message. An idle thread starts the message immediately instead.
98
+
99
+ ```typescript
100
+ const queued = agent.queueMessage('Also check the tests.', thread)
101
+ await queued.accepted
102
+
103
+ const { cancelledSignalIds } = agent.cancelQueuedMessages({
104
+ ...thread,
105
+ signalIds: [queued.signal.id],
106
+ })
107
+ console.log(cancelledSignalIds)
108
+ ```
109
+
110
+ Only IDs removed locally by this call appear in `cancelledSignalIds`. Mastra still publishes every requested ID through PubSub, even when none are pending locally, so other processes subscribed to the thread can cancel their matching pending input. Because that propagation is asynchronous, the result doesn't confirm remote cancellation, and input that has already been handed to execution is out of reach. Cancellation doesn't delete saved messages, notification records, or state updates, and it never revokes an earlier acceptance acknowledgement.
111
+
112
+ ### Stop the run and clear pending input
113
+
114
+ By default, aborting a thread preserves its queued input. To clear pending signals before stopping the active run, pass `clearPendingSignals: true`:
115
+
116
+ ```typescript
117
+ subscription.abort({ clearPendingSignals: true })
118
+ ```
119
+
120
+ Without a subscription, use `agent.abortThreadStream({ ...thread, clearPendingSignals: true })`. Existing listeners stay subscribed after cancellation, and later messages can still start a new run.
121
+
122
+ With a shared PubSub backend, the runtime receives remote signals, cancellation, and abort requests independently of `subscribeToThread()` observers. Clear-on-abort sends the clear flag to a remote active owner through PubSub, but it doesn't clear every process's local queues. Neither operation cancels continuations created by `continueWithMessages()`.
123
+
93
124
  ## Signal context
94
125
 
95
126
  ### Control low-level signal behavior
@@ -46,13 +46,12 @@ All `mastra env` commands resolve their project from `MASTRA_PROJECT_ID`, the `-
46
46
 
47
47
  ## Environment variables
48
48
 
49
- An environment resolves its variables from three scopes:
49
+ An environment resolves its variables from two scopes:
50
50
 
51
51
  - **Managed variables**: Injected by attached [hosted databases](https://mastra.ai/docs/mastra-platform/database) (for example `TURSO_DATABASE_URL`) and by the platform itself. The platform defines these, and you can't edit them. See [System environment variables](https://mastra.ai/docs/mastra-platform/system-environment-variables) for the full list.
52
- - **Environment-scoped variables**: Stored on one environment through the dashboard. Use these for values that differ between environments, like API keys for staging and production services.
53
- - **Project-scoped variables**: Stored on the project and shared by all environments.
52
+ - **Environment-scoped variables**: Stored on each environment through the dashboard. When you apply one variable to several environments, each environment keeps its own copy. Use these for values that differ between environments, like API keys for staging and production services.
54
53
 
55
- Environment-scoped and project-scoped variables together are the stored variables described on the [Deploy](https://mastra.ai/docs/mastra-platform/deploy) page.
54
+ Environment-scoped variables are the stored variables described on the [Deploy](https://mastra.ai/docs/mastra-platform/deploy) page. A deploy of one environment uses only that environment's variables. Projects still on the [legacy pipeline](https://mastra.ai/docs/mastra-platform/deploy) store their variables on the project instead, and every deploy of that project uses them.
56
55
 
57
56
  Variables are applied when a deploy starts. To apply changed variables to a running service without a full redeploy:
58
57
 
@@ -60,7 +59,7 @@ Variables are applied when a deploy starts. To apply changed variables to a runn
60
59
  mastra env restart staging
61
60
  ```
62
61
 
63
- To see the full set an environment's deploys actually run with, environment-scoped and project-scoped values merged, with managed variables listed by name, pull them into a local env file:
62
+ To see the set an environment's deploys actually run with, with managed variables listed by name, pull them into a local env file. Each environment is pulled on its own, so the file never mixes in another environment's values:
64
63
 
65
64
  ```bash
66
65
  mastra env vars pull staging --output .env.staging
@@ -45,16 +45,15 @@ Values are resolved at deploy time and never stored in your project. An environm
45
45
 
46
46
  A deploy resolves variables in this order, last one wins:
47
47
 
48
- 1. Variables you stored on the project.
49
- 2. Variables you stored on the environment.
50
- 3. Managed database variables for that environment.
51
- 4. Platform variables.
48
+ 1. Variables you stored on the environment being deployed. Other environments' variables are never read. Projects still on the [legacy pipeline](https://mastra.ai/docs/mastra-platform/deploy) use the variables stored on the project instead.
49
+ 2. Managed database variables for that environment.
50
+ 3. Platform variables.
52
51
 
53
52
  System values are applied last, so they win on a name collision. Your stored value stays on the record and keeps showing in the dashboard, but the running service never sees it. The Environment Variables page marks these rows with a warning icon so you can tell which of your values are being shadowed.
54
53
 
55
54
  A database attached to a single environment shadows a project-wide database of the same provider, but only inside that environment. To point one environment at a different database, attach an [environment-scoped database](https://mastra.ai/docs/mastra-platform/database) rather than overwriting the connection variable by hand.
56
55
 
57
- To see what an environment runs with, pull the merged set into a local file:
56
+ To see what an environment runs with, pull its variables into a local file:
58
57
 
59
58
  ```bash
60
59
  mastra env vars pull staging --output .env.staging
@@ -14,6 +14,12 @@ Memory processors are [processors](https://mastra.ai/docs/agents/processors) tha
14
14
 
15
15
  Mastra automatically adds these processors when memory is enabled:
16
16
 
17
+ ### `MemoryInputFilter`
18
+
19
+ Trims client-echoed history before memory loaders run. For an existing thread, it keeps only the current user turn or new tool results. For an empty thread, it keeps the full initial input and removes provider item metadata from assistant parts that could refer to items that don't exist in storage.
20
+
21
+ This processor runs first so `MessageHistory`, `SemanticRecall`, and Observational Memory receive only the new input they need.
22
+
17
23
  ### `MessageHistory`
18
24
 
19
25
  Retrieves message history and persists new messages.
@@ -206,7 +212,7 @@ Understanding the execution order is important when combining guardrails with me
206
212
  [Memory Processors] → [Your inputProcessors]
207
213
  ```
208
214
 
209
- 1. **Memory processors run FIRST**: `WorkingMemory`, `MessageHistory`, `SemanticRecall`
215
+ 1. **Memory processors run FIRST**: `MemoryInputFilter`, then `WorkingMemory`, `MessageHistory`, and `SemanticRecall`
210
216
  2. **Your input processors run AFTER**: guardrails, filters, validators
211
217
 
212
218
  As a result, memory loads message history before your processors can validate or filter the input.
@@ -12,7 +12,9 @@ You can also retrieve message history to display past conversations in your UI.
12
12
 
13
13
  > **Warning:** When you use memory with a client application, send **only the new message** from the client instead of the full conversation history.
14
14
  >
15
- > Sending the full history is redundant because Mastra loads messages from storage, and it can cause message ordering bugs when client-side timestamps conflict with stored timestamps.
15
+ > Sending the full history is redundant because Mastra loads messages from storage. Mastra filters client-echoed history before loading stored messages and uses the stored copy as the base when message IDs match, preserving stored timestamps and provider metadata while retaining new tool results.
16
+ >
17
+ > If you assemble the request input yourself and need it processed exactly as sent, set `retainFullInput: true` on `memory.options` for that call, or in the memory constructor options to apply it agent-wide. This disables the filtering described above. History still loads underneath. Every input message that isn't already stored is saved to the thread, including few-shot examples.
16
18
  >
17
19
  > For an AI SDK example, see [Using Mastra Memory](https://mastra.ai/integrations/agentic-ui/ai-sdk-ui).
18
20
 
@@ -92,7 +92,9 @@ See [configuration options](https://mastra.ai/reference/memory/observational-mem
92
92
 
93
93
  > **Warning:** When you use OM with a client application, send **only the new message** from the client instead of the full conversation history.
94
94
  >
95
- > Observational memory still relies on stored conversation history. Sending the full history is redundant and can cause message ordering bugs when client-side timestamps conflict with stored timestamps.
95
+ > Observational memory still relies on stored conversation history. Sending the full history is redundant and can cause message ordering bugs when client-side timestamps conflict with stored timestamps. Mastra filters client-echoed history before loading stored messages and uses the stored copy as the base when message IDs match, preserving stored timestamps and provider metadata while retaining new tool results.
96
+ >
97
+ > If you assemble the request input yourself and need it processed exactly as sent, set `retainFullInput: true` on `memory.options` for that call, or in the memory constructor options to apply it agent-wide. This disables that filtering. History still loads underneath. Every input message that isn't already stored is saved to the thread, including few-shot examples.
96
98
  >
97
99
  > For an AI SDK example, see [Using Mastra Memory](https://mastra.ai/integrations/agentic-ui/ai-sdk-ui).
98
100
 
@@ -122,7 +122,7 @@ await observability!.listFeedback({
122
122
 
123
123
  ## Delete feedback
124
124
 
125
- Use `deleteFeedback()` to hide feedback records from reads by id. This is useful when a comment contains sensitive data. Each request accepts at most 1,000 `feedbackIds`, and deletion is idempotent. The optional `organizationId` field filters by organization, and the optional `resourceId` field filters by resource. You can supply either filter independently or use both together. In Studio, each comment on a trace or span Feedback tab has a delete action.
125
+ Use `deleteFeedback()` to delete feedback records by id. This is useful when a comment contains sensitive data. Each request accepts at most 1,000 `feedbackIds`, and deletion is idempotent. The optional `organizationId` field filters by organization, and the optional `resourceId` field filters by resource. You can supply either filter independently or use both together. In Studio, each comment on a trace or span **Feedback** tab has a delete action. Deleting a trace with `deleteTraces()` also deletes the feedback linked to it. See [Deleting traces](https://mastra.ai/reference/client-js/observability).
126
126
 
127
127
  ```typescript
128
128
  await observability!.deleteFeedback({
@@ -130,7 +130,7 @@ await observability!.deleteFeedback({
130
130
  })
131
131
  ```
132
132
 
133
- Deleted records also disappear from feedback analytics. ClickHouse uses a lightweight delete to hide rows without guaranteeing immediate physical removal, so open-source deployments must configure an [observability retention period](https://mastra.ai/reference/storage/retention) to physically purge them. Configure retention for every observability signal to expire deletion requests after the signal rows they protect. If any signal is unbounded, deletion requests also remain unbounded to prevent deleted data from being reintroduced. Delete APIs intentionally leave cursor-only delta rows untouched. These rows contain identifiers rather than feedback payloads and expire within two days.
133
+ Deleted records also disappear from feedback analytics. ClickHouse uses a lightweight delete to hide rows without guaranteeing immediate physical removal, so open-source deployments must configure an [observability retention period](https://mastra.ai/reference/storage/retention) to physically purge them. Configure retention for every observability signal to expire deletion requests after the signal rows they protect. If any signal is unbounded, deletion requests also remain unbounded to prevent deleted data from being reintroduced. On ClickHouse, delete APIs leave the separate delta cursor table untouched. Its rows contain identifiers rather than feedback payloads and expire within two days.
134
134
 
135
135
  ## Query feedback analytics
136
136
 
@@ -247,7 +247,7 @@ Use [`prepareSendMessagesRequest`](https://ai-sdk.dev/docs/reference/ai-sdk-ui/u
247
247
 
248
248
  When your agent has [memory](https://mastra.ai/docs/memory/overview) configured, Mastra loads conversation history from storage on the server. Send only the new message from the client instead of the full conversation history.
249
249
 
250
- Sending the full history is redundant and can cause message-ordering bugs because client-side timestamps can conflict with the timestamps stored in your database.
250
+ Sending the full history is redundant and can cause message-ordering bugs because client-side timestamps can conflict with the timestamps stored in your database. Mastra filters echoed history before loading stored messages and keeps the stored copy as the base when message IDs match, so the stored timestamps, provider metadata, and reasoning are preserved and only new tool results are layered on top.
251
251
 
252
252
  ```typescript
253
253
  import { useChat } from '@ai-sdk/react'
@@ -89,7 +89,7 @@ export const mastra = new Mastra({
89
89
 
90
90
  Trace deletion cascades to spans, trace roots and branches, metrics, logs, scores, and feedback linked by trace ID. Signals without a trace ID are preserved. Mastra records the deletion predicate, then waits for ClickHouse lightweight delete masks to be applied. Normal reads no longer return the rows matched by that operation when the call resolves.
91
91
 
92
- Lightweight deletion is a hide-only operation that marks rows with ClickHouse's `_row_exists` mask. Physical removal depends on merges and deployment-configured retention TTLs. `ObservabilityStorageClickhouseVNext` applies retention only when you provide a `RetentionConfig`; Mastra OSS doesn't configure a default retention TTL.
92
+ Lightweight deletion is a hide-only operation that marks rows with ClickHouse's `_row_exists` mask. Physical removal depends on merges and deployment-configured retention TTLs. `ObservabilityStorageClickhouseVNext` applies retention only when you pass the `retention` option. Mastra doesn't configure a default retention TTL.
93
93
 
94
94
  When all five observability signals have finite retention, Mastra also applies a TTL to deletion requests so they outlive the signal rows they protect. If any signal is unbounded, deletion requests remain unbounded. See [storage retention](https://mastra.ai/reference/storage/retention) for how the deletion-request TTL is calculated.
95
95
 
@@ -275,7 +275,7 @@ Don't set `replication` on ClickHouse Cloud. Cloud rewrites `MergeTree` to `Shar
275
275
 
276
276
  ### Observability domain options
277
277
 
278
- `ObservabilityStorageClickhouse` and `ObservabilityStorageClickhouseVNext` accept the same connection options as `ClickhouseStore` (`url`, `username`, `password`, or a pre-configured `client`).
278
+ `ObservabilityStorageClickhouse` and `ObservabilityStorageClickhouseVNext` accept the same connection options as `ClickhouseStore` (`url`, `username`, `password`, or a pre-configured `client`). `ObservabilityStorageClickhouseVNext` also accepts `retention`, the per-signal TTL in days described in [ClickHouse native TTL](https://mastra.ai/reference/storage/retention), and `traceQuery`, the execution limits for [advanced trace queries](https://mastra.ai/reference/observability/tracing/trace-query).
279
279
 
280
280
  ## Hosting options
281
281
 
@@ -643,7 +643,7 @@ const workflow = createWorkflow({
643
643
  })
644
644
  ```
645
645
 
646
- `retries` defaults to `0`. Errors thrown by your step code are retried per step with `retryConfig` or the step's `retries` option, not at the function level. `createInngestAgent()` accepts the same `retries` option and applies it to every Inngest function the durable agent creates.
646
+ `retries` defaults to `0`. Errors thrown by your step code are retried per step with `retryConfig` or the step's `retries` option, not at the function level. `createInngestAgent()` accepts the same `retries` option and applies it to every Inngest function the durable agent creates. All durable agents share these functions, so the `retries` value of the first agent registered with Mastra applies to every durable agent. Set the same value on each agent to avoid confusion.
647
647
 
648
648
  A nested workflow runs as its own Inngest function and uses its own `retries` setting. It doesn't inherit the parent's value, so set `retries` on each nested workflow that should recover from a failed request.
649
649
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # Netlify
6
6
 
7
- Netlify AI Gateway provides unified access to multiple providers with built-in caching and observability. Access 268 models through Mastra's model router.
7
+ Netlify AI Gateway provides unified access to multiple providers with built-in caching and observability. Access 264 models through Mastra's model router.
8
8
 
9
9
  Learn more in the [Netlify documentation](https://docs.netlify.com/build/ai-gateway/overview/).
10
10
 
@@ -168,7 +168,6 @@ ANTHROPIC_API_KEY=ant-...
168
168
  | `openrouter/inclusionai/ling-3.0-flash-fin:free` |
169
169
  | `openrouter/inclusionai/ling-3.0-flash-sante:free` |
170
170
  | `openrouter/inclusionai/ling-3.0-flash-vl` |
171
- | `openrouter/inclusionai/ling-3.0-flash-vl:free` |
172
171
  | `openrouter/inference-net/schematron-v2-small` |
173
172
  | `openrouter/inference-net/schematron-v2-turbo` |
174
173
  | `openrouter/mancer/weaver` |
@@ -188,14 +187,11 @@ ANTHROPIC_API_KEY=ant-...
188
187
  | `openrouter/minimax/minimax-m2.5` |
189
188
  | `openrouter/minimax/minimax-m2.7` |
190
189
  | `openrouter/minimax/minimax-m3` |
191
- | `openrouter/mistralai/devstral-2512` |
192
190
  | `openrouter/mistralai/ministral-14b-2512` |
193
191
  | `openrouter/mistralai/ministral-3b-2512` |
194
192
  | `openrouter/mistralai/ministral-8b-2512` |
195
193
  | `openrouter/mistralai/mistral-large-2407` |
196
- | `openrouter/mistralai/mistral-medium-3` |
197
194
  | `openrouter/mistralai/mistral-medium-3-5` |
198
- | `openrouter/mistralai/mistral-medium-3.1` |
199
195
  | `openrouter/mistralai/mistral-nemo` |
200
196
  | `openrouter/mistralai/mistral-saba` |
201
197
  | `openrouter/mistralai/mistral-small-24b-instruct-2501` |
@@ -59,6 +59,8 @@ ANTHROPIC_API_KEY=ant-...
59
59
  | `aion-labs/aion-2.0` |
60
60
  | `aion-labs/aion-3.0` |
61
61
  | `aion-labs/aion-3.0-mini` |
62
+ | `aion-labs/aion-3.5` |
63
+ | `aion-labs/aion-3.5-mini` |
62
64
  | `aion-labs/aion-rp-llama-3.1-8b` |
63
65
  | `amazon/nova-2-lite-v1` |
64
66
  | `amazon/nova-lite-v1` |
@@ -153,7 +155,6 @@ ANTHROPIC_API_KEY=ant-...
153
155
  | `inclusionai/ling-3.0-flash-fin:free` |
154
156
  | `inclusionai/ling-3.0-flash-sante:free` |
155
157
  | `inclusionai/ling-3.0-flash-vl` |
156
- | `inclusionai/ling-3.0-flash-vl:free` |
157
158
  | `inference-net/schematron-v2-small` |
158
159
  | `inference-net/schematron-v2-turbo` |
159
160
  | `kwaipilot/kat-coder-pro-v2.5` |
@@ -185,7 +186,6 @@ ANTHROPIC_API_KEY=ant-...
185
186
  | `minimax/minimax-m2.7` |
186
187
  | `minimax/minimax-m3` |
187
188
  | `mistralai/codestral-2508` |
188
- | `mistralai/devstral-2512` |
189
189
  | `mistralai/ministral-14b-2512` |
190
190
  | `mistralai/ministral-3b-2512` |
191
191
  | `mistralai/ministral-8b-2512` |
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ![Vercel logo](https://models.dev/logos/vercel.svg)Vercel
6
6
 
7
- Vercel aggregates models from multiple providers with enhanced features like rate limiting and failover. Access 385 models through Mastra's model router.
7
+ Vercel aggregates models from multiple providers with enhanced features like rate limiting and failover. Access 387 models through Mastra's model router.
8
8
 
9
9
  Learn more in the [Vercel documentation](https://ai-sdk.dev/providers/ai-sdk-providers).
10
10
 
@@ -169,6 +169,8 @@ ANTHROPIC_API_KEY=ant-...
169
169
  | `google/gemini-3.6-flash` |
170
170
  | `google/gemini-3.7-flash` |
171
171
  | `google/gemini-3.8-flash` |
172
+ | `google/gemini-3.8-flash-lite-tts` |
173
+ | `google/gemini-3.8-flash-tts` |
172
174
  | `google/gemini-3.8-live` |
173
175
  | `google/gemini-3.8-live-extended-thinking` |
174
176
  | `google/gemini-embedding-001` |
@@ -192,7 +194,6 @@ ANTHROPIC_API_KEY=ant-...
192
194
  | `inclusionai/ling-3.0-flash-sante` |
193
195
  | `inclusionai/ling-3.0-flash-sante-free` |
194
196
  | `inclusionai/ling-3.0-flash-vl` |
195
- | `inclusionai/ling-3.0-flash-vl-free` |
196
197
  | `inference-net/schematron-v2-small` |
197
198
  | `inference-net/schematron-v2-turbo` |
198
199
  | `interfaze/interfaze-beta` |
@@ -351,6 +352,7 @@ ANTHROPIC_API_KEY=ant-...
351
352
  | `recraft/recraft-v4` |
352
353
  | `recraft/recraft-v4-pro` |
353
354
  | `recraft/recraft-v4.1` |
355
+ | `recraft/recraft-v4.1-flash` |
354
356
  | `recraft/recraft-v4.1-pro` |
355
357
  | `recraft/recraft-v4.1-utility` |
356
358
  | `recraft/recraft-v4.1-utility-pro` |
@@ -4,7 +4,7 @@
4
4
 
5
5
  # Model Providers
6
6
 
7
- Mastra provides a unified interface for working with LLMs across multiple providers, giving you access to 7579 models from 210 providers through a single API.
7
+ Mastra provides a unified interface for working with LLMs across multiple providers, giving you access to 7583 models from 210 providers through a single API.
8
8
 
9
9
  ## Features
10
10
 
@@ -163,8 +163,8 @@ for await (const chunk of stream) {
163
163
  | `edenai/groq/openai/gpt-oss-20b` | 131K | | | | | | $0.07 | $0.30 |
164
164
  | `edenai/groq/openai/gpt-oss-safeguard-20b` | 131K | | | | | | $0.07 | $0.30 |
165
165
  | `edenai/infomaniak/mistralai/Ministral-3-14B-Instruct-2512` | 100K | | | | | | $0.34 | $0.46 |
166
- | `edenai/ionos/meta-llama/Llama-3.3-70B-Instruct` | 128K | | | | | | $0.75 | $0.75 |
167
- | `edenai/ionos/openai/gpt-oss-120b` | 131K | | | | | | $0.17 | $0.75 |
166
+ | `edenai/ionos/meta-llama/Llama-3.3-70B-Instruct` | 128K | | | | | | $0.74 | $0.74 |
167
+ | `edenai/ionos/openai/gpt-oss-120b` | 131K | | | | | | $0.17 | $0.74 |
168
168
  | `edenai/minimax/MiniMax-M2` | 205K | | | | | | $0.30 | $1 |
169
169
  | `edenai/minimax/MiniMax-M2.1` | 205K | | | | | | $0.30 | $1 |
170
170
  | `edenai/minimax/MiniMax-M2.5` | 205K | | | | | | $0.30 | $1 |
@@ -263,9 +263,9 @@ for await (const chunk of stream) {
263
263
  | `edenai/qwen/qwen3.8-max` | 1.0M | | | | | | $2 | $6 |
264
264
  | `edenai/qwen/qwen3.8-max-0902` | 1.0M | | | | | | $2 | $6 |
265
265
  | `edenai/qwen/qwq-plus` | 131K | | | | | | $0.80 | $2 |
266
- | `edenai/scaleway/deepseek-v4-flash-0731` | 256K | | | | | | $0.46 | $0.92 |
266
+ | `edenai/scaleway/deepseek-v4-flash-0731` | 256K | | | | | | $0.46 | $0.91 |
267
267
  | `edenai/scaleway/gemma-3-27b-it` | 40K | | | | | | $0.29 | $0.57 |
268
- | `edenai/scaleway/gpt-oss-120b` | 128K | | | | | | $0.17 | $0.69 |
268
+ | `edenai/scaleway/gpt-oss-120b` | 128K | | | | | | $0.17 | $0.68 |
269
269
  | `edenai/scaleway/llama-3.3-70b-instruct` | 128K | | | | | | $1 | $1 |
270
270
  | `edenai/tensorx/deepseek/deepseek-v4-flash-0731` | 1.0M | | | | | | $0.25 | $0.30 |
271
271
  | `edenai/tensorx/deepseek/deepseek-v4-pro-0813` | 1.0M | | | | | | $2 | $4 |
@@ -43,7 +43,7 @@ for await (const chunk of stream) {
43
43
  | `kilo/~anthropic/claude-opus-latest` | 1.0M | | | | | | $4 | $20 |
44
44
  | `kilo/~anthropic/claude-sonnet-latest` | 1.0M | | | | | | $2 | $10 |
45
45
  | `kilo/~deepseek/deepseek-flash-latest` | 1.0M | | | | | | $0.10 | $0.50 |
46
- | `kilo/~deepseek/deepseek-pro-latest` | 1.0M | | | | | | $0.40 | $4 |
46
+ | `kilo/~deepseek/deepseek-pro-latest` | 1.0M | | | | | | $0.40 | $1 |
47
47
  | `kilo/~deepseek/deepseek-v4-flash-latest` | 1.0M | | | | | | $0.04 | $0.55 |
48
48
  | `kilo/~google/gemini-flash-latest` | 1.0M | | | | | | $0.75 | $4 |
49
49
  | `kilo/~google/gemini-pro-latest` | 1.0M | | | | | | $2 | $12 |
@@ -55,10 +55,12 @@ for await (const chunk of stream) {
55
55
  | `kilo/~openai/gpt-terra-latest` | 1.1M | | | | | | $2 | $12 |
56
56
  | `kilo/~x-ai/grok-latest` | 500K | | | | | | $2 | $5 |
57
57
  | `kilo/~z-ai/glm-flash-latest` | 1.0M | | | | | | $0.07 | $0.25 |
58
- | `kilo/~z-ai/glm-latest` | 1.0M | | | | | | $0.56 | $3 |
58
+ | `kilo/~z-ai/glm-latest` | 1.0M | | | | | | $0.56 | $2 |
59
59
  | `kilo/aion-labs/aion-2.0` | 131K | | | | | | $0.80 | $2 |
60
60
  | `kilo/aion-labs/aion-3.0` | 131K | | | | | | $3 | $6 |
61
61
  | `kilo/aion-labs/aion-3.0-mini` | 131K | | | | | | $0.70 | $1 |
62
+ | `kilo/aion-labs/aion-3.5` | 262K | | | | | | $3 | $6 |
63
+ | `kilo/aion-labs/aion-3.5-mini` | 262K | | | | | | $0.70 | $1 |
62
64
  | `kilo/aion-labs/aion-rp-llama-3.1-8b` | 33K | | | | | | $0.80 | $2 |
63
65
  | `kilo/amazon/nova-2-lite-v1` | 1.0M | | | | | | $0.30 | $3 |
64
66
  | `kilo/amazon/nova-lite-v1` | 300K | | | | | | $0.06 | $0.24 |
@@ -114,7 +116,7 @@ for await (const chunk of stream) {
114
116
  | `kilo/deepseek/deepseek-v4.1-flash` | 1.0M | | | | | | $0.30 | $1 |
115
117
  | `kilo/dots-studio/dots-3-note-preview:free` | 512K | | | | | | — | — |
116
118
  | `kilo/google/gemini-2.5-flash` | 1.0M | | | | | | $0.30 | $3 |
117
- | `kilo/google/gemini-2.5-flash-image` | 33K | | | | | | $0.15 | $1 |
119
+ | `kilo/google/gemini-2.5-flash-image` | 33K | | | | | | $0.30 | $3 |
118
120
  | `kilo/google/gemini-2.5-flash-lite` | 1.0M | | | | | | $0.10 | $0.40 |
119
121
  | `kilo/google/gemini-2.5-pro` | 1.0M | | | | | | $1 | $10 |
120
122
  | `kilo/google/gemini-2.5-pro-preview` | 1.0M | | | | | | $1 | $10 |
@@ -125,7 +127,7 @@ for await (const chunk of stream) {
125
127
  | `kilo/google/gemini-3.1-flash-image-preview` | 66K | | | | | | $0.50 | $3 |
126
128
  | `kilo/google/gemini-3.1-flash-lite` | 1.0M | | | | | | $0.13 | $0.75 |
127
129
  | `kilo/google/gemini-3.1-flash-lite-image` | 66K | | | | | | $0.25 | $2 |
128
- | `kilo/google/gemini-3.1-flash-lite-preview` | 1.0M | | | | | | $0.13 | $0.75 |
130
+ | `kilo/google/gemini-3.1-flash-lite-preview` | 1.0M | | | | | | $0.25 | $2 |
129
131
  | `kilo/google/gemini-3.1-pro-preview` | 1.0M | | | | | | $1 | $6 |
130
132
  | `kilo/google/gemini-3.1-pro-preview-customtools` | 1.0M | | | | | | $2 | $12 |
131
133
  | `kilo/google/gemini-3.5-flash` | 1.0M | | | | | | $0.75 | $5 |
@@ -150,8 +152,7 @@ for await (const chunk of stream) {
150
152
  | `kilo/inclusionai/ling-3.0-flash-fin` | 262K | | | | | | $0.06 | $0.18 |
151
153
  | `kilo/inclusionai/ling-3.0-flash-fin:free` | 262K | | | | | | — | — |
152
154
  | `kilo/inclusionai/ling-3.0-flash-sante:free` | 262K | | | | | | — | — |
153
- | `kilo/inclusionai/ling-3.0-flash-vl` | 131K | | | | | | $0.06 | $0.18 |
154
- | `kilo/inclusionai/ling-3.0-flash-vl:free` | 262K | | | | | | — | — |
155
+ | `kilo/inclusionai/ling-3.0-flash-vl` | 131K | | | | | | $0.07 | $0.22 |
155
156
  | `kilo/inference-net/schematron-v2-small` | 128K | | | | | | $0.05 | $0.23 |
156
157
  | `kilo/inference-net/schematron-v2-turbo` | 128K | | | | | | $0.03 | $0.15 |
157
158
  | `kilo/kilo-auto/balanced` | 1.0M | | | | | | $0.33 | $2 |
@@ -188,7 +189,6 @@ for await (const chunk of stream) {
188
189
  | `kilo/minimax/minimax-m2.7` | 205K | | | | | | $0.30 | $1 |
189
190
  | `kilo/minimax/minimax-m3` | 524K | | | | | | $0.30 | $1 |
190
191
  | `kilo/mistralai/codestral-2508` | 256K | | | | | | $0.30 | $0.90 |
191
- | `kilo/mistralai/devstral-2512` | 262K | | | | | | $0.40 | $2 |
192
192
  | `kilo/mistralai/ministral-14b-2512` | 262K | | | | | | $0.20 | $0.20 |
193
193
  | `kilo/mistralai/ministral-3b-2512` | 131K | | | | | | $0.10 | $0.10 |
194
194
  | `kilo/mistralai/ministral-8b-2512` | 262K | | | | | | $0.15 | $0.15 |
@@ -209,8 +209,8 @@ for await (const chunk of stream) {
209
209
  | `kilo/moonshotai/kimi-k2-0905` | 262K | | | | | | $0.60 | $3 |
210
210
  | `kilo/moonshotai/kimi-k2-thinking` | 262K | | | | | | $0.60 | $3 |
211
211
  | `kilo/moonshotai/kimi-k2.5` | 262K | | | | | | $0.60 | $3 |
212
- | `kilo/moonshotai/kimi-k2.6` | 262K | | | | | | $0.80 | $3 |
213
- | `kilo/moonshotai/kimi-k2.7-code` | 262K | | | | | | $0.95 | $4 |
212
+ | `kilo/moonshotai/kimi-k2.6` | 262K | | | | | | $0.95 | $4 |
213
+ | `kilo/moonshotai/kimi-k2.7-code` | 262K | | | | | | $0.71 | $3 |
214
214
  | `kilo/moonshotai/kimi-k3` | 1.0M | | | | | | $3 | $15 |
215
215
  | `kilo/morph/morph-v3-fast` | 82K | | | | | | $0.80 | $1 |
216
216
  | `kilo/morph/morph-v3-large` | 262K | | | | | | $0.90 | $2 |
@@ -385,7 +385,7 @@ for await (const chunk of stream) {
385
385
  | `kilo/tencent/hy-mt2-1.8b` | 8K | | | | | | $0.04 | $0.18 |
386
386
  | `kilo/tencent/hy-mt2-30b-a3b` | 8K | | | | | | $0.07 | $0.29 |
387
387
  | `kilo/tencent/hy-mt2-7b` | 8K | | | | | | $0.07 | $0.29 |
388
- | `kilo/tencent/hy3` | 262K | | | | | | $0.13 | $0.53 |
388
+ | `kilo/tencent/hy3` | 262K | | | | | | $0.08 | $0.33 |
389
389
  | `kilo/tencent/hy3-preview` | 262K | | | | | | $0.18 | $0.60 |
390
390
  | `kilo/tencent/hy4-preview` | 1.0M | | | | | | $0.83 | $3 |
391
391
  | `kilo/thedrummer/cydonia-24b-v4.1` | 131K | | | | | | $0.30 | $0.50 |
@@ -218,8 +218,8 @@ for await (const chunk of stream) {
218
218
  | `llmgateway-providers/fireworks/deepseek-v4.1-flash` | 1.0M | | | | | | $0.22 | $0.66 |
219
219
  | `llmgateway-providers/fireworks/kimi-k3` | 1.0M | | | | | | $3 | $15 |
220
220
  | `llmgateway-providers/fireworks/kimi-k3-fast` | 1.0M | | | | | | $5 | $23 |
221
- | `llmgateway-providers/gonka24/deepseek-v4-flash` | 390K | | | | | | $0.05 | $0.10 |
222
- | `llmgateway-providers/gonka24/glm-5.3-flash` | 200K | | | | | | $0.07 | $0.19 |
221
+ | `llmgateway-providers/gonka24/deepseek-v4-flash` | 390K | | | | | | $0.07 | $0.12 |
222
+ | `llmgateway-providers/gonka24/glm-5.3-flash` | 200K | | | | | | $0.15 | $0.30 |
223
223
  | `llmgateway-providers/gonka24/minimax-m2.7` | 205K | | | | | | $0.08 | $0.32 |
224
224
  | `llmgateway-providers/google-ai-studio/gemini-2.5-flash` | 1.0M | | | | | | $0.30 | $3 |
225
225
  | `llmgateway-providers/google-ai-studio/gemini-2.5-flash-lite` | 1.0M | | | | | | $0.10 | $0.40 |
@@ -97,7 +97,7 @@ for await (const chunk of stream) {
97
97
  | `llmgateway/glm-5.2` | 1.0M | | | | | | $0.80 | $3 |
98
98
  | `llmgateway/glm-5.2-fast` | 1.0M | | | | | | $2 | $7 |
99
99
  | `llmgateway/glm-5.3` | 1.0M | | | | | | $1 | $4 |
100
- | `llmgateway/glm-5.3-flash` | 1.0M | | | | | | $0.07 | $0.19 |
100
+ | `llmgateway/glm-5.3-flash` | 1.0M | | | | | | $0.09 | $0.25 |
101
101
  | `llmgateway/glm-5v-turbo` | 200K | | | | | | $1 | $4 |
102
102
  | `llmgateway/gpt-3.5-turbo` | 16K | | | | | | $0.50 | $2 |
103
103
  | `llmgateway/gpt-4` | 8K | | | | | | $30 | $60 |
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ![NanoGPT logo](https://models.dev/logos/nano-gpt.svg)NanoGPT
6
6
 
7
- Access 586 NanoGPT models through Mastra's model router. Authentication is handled automatically using the `NANO_GPT_API_KEY` environment variable.
7
+ Access 590 NanoGPT models through Mastra's model router. Authentication is handled automatically using the `NANO_GPT_API_KEY` environment variable.
8
8
 
9
9
  Learn more in the [NanoGPT documentation](https://docs.nano-gpt.com).
10
10
 
@@ -46,6 +46,8 @@ for await (const chunk of stream) {
46
46
  | `nano-gpt/aion-labs/aion-2.0` | 131K | | | | | | $0.80 | $2 |
47
47
  | `nano-gpt/aion-labs/aion-3.0` | 131K | | | | | | $3 | $6 |
48
48
  | `nano-gpt/aion-labs/aion-3.0-mini` | 131K | | | | | | $0.70 | $1 |
49
+ | `nano-gpt/aion-labs/aion-3.5` | 262K | | | | | | $3 | $6 |
50
+ | `nano-gpt/aion-labs/aion-3.5-mini` | 262K | | | | | | $0.70 | $1 |
49
51
  | `nano-gpt/aion-labs/aion-rp-llama-3.1-8b` | 33K | | | | | | $0.80 | $2 |
50
52
  | `nano-gpt/amazon/nova-2-lite-v1` | 1.0M | | | | | | $0.51 | $4 |
51
53
  | `nano-gpt/amazon/nova-lite-v1` | 300K | | | | | | $0.06 | $0.24 |
@@ -568,6 +570,8 @@ for await (const chunk of stream) {
568
570
  | `nano-gpt/unsloth/gemma-3-12b-it` | 131K | | | | | | $0.27 | $0.27 |
569
571
  | `nano-gpt/unsloth/gemma-3-27b-it` | 128K | | | | | | $0.30 | $0.30 |
570
572
  | `nano-gpt/unsloth/gemma-3-4b-it` | 128K | | | | | | $0.20 | $0.20 |
573
+ | `nano-gpt/upstage/solar-mini4` | 524K | | | | | | $0.05 | $0.20 |
574
+ | `nano-gpt/upstage/solar-mini4:thinking` | 524K | | | | | | $0.05 | $0.20 |
571
575
  | `nano-gpt/upstage/solar-pro-3` | 131K | | | | | | $0.15 | $0.60 |
572
576
  | `nano-gpt/upstage/solar-pro4` | 524K | | | | | | $0.03 | $0.12 |
573
577
  | `nano-gpt/upstage/solar-pro4:thinking` | 524K | | | | | | $0.03 | $0.12 |
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ![OpenCode Go logo](https://models.dev/logos/opencode-go.svg)OpenCode Go
6
6
 
7
- Access 39 OpenCode Go models through Mastra's model router. Authentication is handled automatically using the `OPENCODE_API_KEY` environment variable.
7
+ Access 40 OpenCode Go models through Mastra's model router. Authentication is handled automatically using the `OPENCODE_API_KEY` environment variable.
8
8
 
9
9
  Learn more in the [OpenCode Go documentation](https://opencode.ai/docs/go).
10
10
 
@@ -68,6 +68,7 @@ for await (const chunk of stream) {
68
68
  | `opencode-go/qwen3.7-plus` | 1.0M | | | | | | $0.40 | $2 |
69
69
  | `opencode-go/qwen3.8-flash` | 1.0M | | | | | | $0.15 | $0.47 |
70
70
  | `opencode-go/qwen3.8-max` | 1.0M | | | | | | $2 | $6 |
71
+ | `opencode-go/space-bunny-free` | 1.0M | | | | | | — | — |
71
72
 
72
73
  Model availability, capabilities, context windows, and pricing are sourced from [models.dev](https://models.dev) and may change.
73
74
 
@@ -99,7 +100,7 @@ const agent = new Agent({
99
100
  model: ({ requestContext }) => {
100
101
  const useAdvanced = requestContext.task === "complex";
101
102
  return useAdvanced
102
- ? "opencode-go/qwen3.8-max"
103
+ ? "opencode-go/space-bunny-free"
103
104
  : "opencode-go/deepseek-v4-flash";
104
105
  }
105
106
  });
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ![OpenCode Zen logo](https://models.dev/logos/opencode.svg)OpenCode Zen
6
6
 
7
- Access 109 OpenCode Zen models through Mastra's model router. Authentication is handled automatically using the `OPENCODE_API_KEY` environment variable.
7
+ Access 110 OpenCode Zen models through Mastra's model router. Authentication is handled automatically using the `OPENCODE_API_KEY` environment variable.
8
8
 
9
9
  Learn more in the [OpenCode Zen documentation](https://opencode.ai/docs/zen).
10
10
 
@@ -113,6 +113,7 @@ for await (const chunk of stream) {
113
113
  | `opencode/qwen3.5-plus` | 262K | | | | | | $0.20 | $1 |
114
114
  | `opencode/qwen3.6-plus` | 262K | | | | | | $0.50 | $3 |
115
115
  | `opencode/qwen3.8-flash` | 1.0M | | | | | | $0.15 | $0.47 |
116
+ | `opencode/space-bunny-free` | 1.0M | | | | | | — | — |
116
117
 
117
118
  Model availability, capabilities, context windows, and pricing are sourced from [models.dev](https://models.dev) and may change.
118
119