@mastra/mcp-docs-server 1.2.19-alpha.16 → 1.2.19-alpha.19

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 (35) hide show
  1. package/.docs/docs/mastra-platform/api.md +54 -0
  2. package/.docs/docs/mastra-platform/observability.md +3 -1
  3. package/.docs/docs/observability/feedback.md +14 -0
  4. package/.docs/docs/sandbox/overview.md +43 -0
  5. package/.docs/docs/server/middleware.md +26 -0
  6. package/.docs/docs/subagents.md +6 -6
  7. package/.docs/integrations/channels/github.md +56 -9
  8. package/.docs/integrations/sandboxes/daytona.md +52 -0
  9. package/.docs/integrations/sandboxes/e2b-desktop.md +128 -0
  10. package/.docs/integrations/sandboxes/e2b.md +4 -0
  11. package/.docs/integrations/sandboxes/vercel.md +2 -2
  12. package/.docs/integrations.md +1 -0
  13. package/.docs/models/environment-variables.md +1 -0
  14. package/.docs/models/gateways/netlify.md +1 -2
  15. package/.docs/models/gateways/openrouter.md +1 -3
  16. package/.docs/models/index.md +1 -1
  17. package/.docs/models/providers/agnes.md +7 -6
  18. package/.docs/models/providers/edenai.md +5 -3
  19. package/.docs/models/providers/evroc.md +3 -2
  20. package/.docs/models/providers/hyper.md +3 -3
  21. package/.docs/models/providers/inceptron.md +1 -1
  22. package/.docs/models/providers/kilo.md +8 -10
  23. package/.docs/models/providers/llmgateway-providers.md +4 -3
  24. package/.docs/models/providers/nano-gpt.md +3 -1
  25. package/.docs/models/providers/opencode-go.md +2 -2
  26. package/.docs/models/providers/pendra.md +78 -0
  27. package/.docs/models/providers.md +1 -0
  28. package/.docs/reference/cli/mastra.md +10 -4
  29. package/.docs/reference/client-js/observability.md +1 -1
  30. package/.docs/reference/observability/feedback.md +4 -0
  31. package/.docs/reference/workspace/local-sandbox.md +2 -0
  32. package/.docs/reference/workspace/platform-sandbox.md +3 -1
  33. package/.docs/reference/workspace/sandbox.md +114 -2
  34. package/CHANGELOG.md +14 -0
  35. package/package.json +4 -4
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ![Agnes AI logo](https://models.dev/logos/agnes.svg)Agnes AI
4
4
 
5
- Access 2 Agnes AI models through Mastra's model router. Authentication is handled automatically using the `AGNES_API_KEY` environment variable.
5
+ Access 3 Agnes AI models through Mastra's model router. Authentication is handled automatically using the `AGNES_API_KEY` environment variable.
6
6
 
7
7
  Learn more in the [Agnes AI documentation](https://agnes-ai.com/doc).
8
8
 
@@ -34,10 +34,11 @@ for await (const chunk of stream) {
34
34
 
35
35
  ## Models
36
36
 
37
- | Model | Context | Tools | Reasoning | Image | Audio | Video | Input $/1M | Output $/1M |
38
- | ----------------------- | ------- | ----- | --------- | ----- | ----- | ----- | ---------- | ----------- |
39
- | `agnes/agnes-2.0-flash` | 512K | | | | | | — | — |
40
- | `agnes/agnes-2.5-flash` | 512K | | | | | | — | — |
37
+ | Model | Context | Tools | Reasoning | Image | Audio | Video | Input $/1M | Output $/1M |
38
+ | --------------------------- | ------- | ----- | --------- | ----- | ----- | ----- | ---------- | ----------- |
39
+ | `agnes/agnes-2.0-flash` | 512K | | | | | | — | — |
40
+ | `agnes/agnes-2.5-flash` | 512K | | | | | | — | — |
41
+ | `agnes/agnes-2.5-pro-alpha` | 1.0M | | | | | | $0.45 | $0.90 |
41
42
 
42
43
  ## Advanced configuration
43
44
 
@@ -67,7 +68,7 @@ const agent = new Agent({
67
68
  model: ({ requestContext }) => {
68
69
  const useAdvanced = requestContext.task === "complex";
69
70
  return useAdvanced
70
- ? "agnes/agnes-2.5-flash"
71
+ ? "agnes/agnes-2.5-pro-alpha"
71
72
  : "agnes/agnes-2.0-flash";
72
73
  }
73
74
  });
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ![Eden AI logo](https://models.dev/logos/edenai.svg)Eden AI
4
4
 
5
- Access 231 Eden AI models through Mastra's model router. Authentication is handled automatically using the `EDENAI_API_KEY` environment variable.
5
+ Access 233 Eden AI models through Mastra's model router. Authentication is handled automatically using the `EDENAI_API_KEY` environment variable.
6
6
 
7
7
  Learn more in the [Eden AI documentation](https://docs.edenai.co).
8
8
 
@@ -198,8 +198,8 @@ for await (const chunk of stream) {
198
198
  | `edenai/perplexityai/sonar-deep-research` | 128K | | | | | | $2 | $8 |
199
199
  | `edenai/perplexityai/sonar-pro` | 200K | | | | | | $3 | $15 |
200
200
  | `edenai/perplexityai/sonar-reasoning-pro` | 128K | | | | | | $2 | $8 |
201
- | `edenai/qwen/deepseek-v4-flash-0731` | 1.0M | | | | | | $0.35 | $1 |
202
- | `edenai/qwen/deepseek-v4-pro-0813` | 1.0M | | | | | | $1 | $3 |
201
+ | `edenai/qwen/deepseek-v4-flash-0731` | 1.0M | | | | | | $0.18 | $0.53 |
202
+ | `edenai/qwen/deepseek-v4-pro-0813` | 1.0M | | | | | | $0.58 | $2 |
203
203
  | `edenai/qwen/qwen-max` | 33K | | | | | | $2 | $6 |
204
204
  | `edenai/qwen/qwen-vl-max` | 131K | | | | | | $0.80 | $3 |
205
205
  | `edenai/qwen/qwen-vl-plus` | 131K | | | | | | $0.21 | $0.63 |
@@ -208,8 +208,10 @@ for await (const chunk of stream) {
208
208
  | `edenai/qwen/qwen3-coder-480b-a35b-instruct` | 262K | | | | | | $2 | $8 |
209
209
  | `edenai/qwen/qwen3-coder-flash` | 1.0M | | | | | | $0.30 | $2 |
210
210
  | `edenai/qwen/qwen3-coder-next` | 262K | | | | | | $0.30 | $2 |
211
+ | `edenai/qwen/qwen3-coder-next@eu` | 262K | | | | | | $0.30 | $2 |
211
212
  | `edenai/qwen/qwen3-coder-plus` | 1.0M | | | | | | $1 | $5 |
212
213
  | `edenai/qwen/qwen3-max` | 262K | | | | | | $1 | $6 |
214
+ | `edenai/qwen/qwen3-max@eu` | 262K | | | | | | $1 | $6 |
213
215
  | `edenai/qwen/qwen3-next-80b-a3b-instruct` | 131K | | | | | | $0.15 | $1 |
214
216
  | `edenai/qwen/qwen3-next-80b-a3b-thinking` | 131K | | | | | | $0.15 | $1 |
215
217
  | `edenai/qwen/qwen3-vl-235b-a22b-instruct` | 131K | | | | | | $0.40 | $2 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ![evroc logo](https://models.dev/logos/evroc.svg)evroc
4
4
 
5
- Access 15 evroc models through Mastra's model router. Authentication is handled automatically using the `EVROC_API_KEY` environment variable.
5
+ Access 16 evroc models through Mastra's model router. Authentication is handled automatically using the `EVROC_API_KEY` environment variable.
6
6
 
7
7
  Learn more in the [evroc documentation](https://docs.evroc.com/products/think/overview.html).
8
8
 
@@ -49,7 +49,8 @@ for await (const chunk of stream) {
49
49
  | `evroc/openai/whisper-large-v3-turbo` | 448 | | | | | | $0.00 | $0.00 |
50
50
  | `evroc/Qwen/Qwen3-Embedding-8B` | 41K | | | | | | $0.12 | $0.12 |
51
51
  | `evroc/Qwen/Qwen3-Reranker-4B` | 32K | | | | | | $0.06 | — |
52
- | `evroc/Qwen/Qwen3.6-35B-A3B-FP8` | 262K | | | | | | $0.34 | $1 |
52
+ | `evroc/Qwen/Qwen3.6-35B-A3B` | 262K | | | | | | $0.34 | $1 |
53
+ | `evroc/Qwen/Qwen3.8-27B` | 262K | | | | | | $0.87 | $4 |
53
54
  | `evroc/zai-org/GLM-5.2` | 524K | | | | | | $1 | $6 |
54
55
 
55
56
  ## Advanced configuration
@@ -40,11 +40,11 @@ for await (const chunk of stream) {
40
40
  | `hyper/deepseek-v4-flash-0731` | 1.0M | | | | | | $0.44 | $1 |
41
41
  | `hyper/deepseek-v4-pro` | 1.0M | | | | | | $2 | $5 |
42
42
  | `hyper/deepseek-v4-pro-0813` | 1.0M | | | | | | $1 | $4 |
43
- | `hyper/gemma-4-26b-a4b-it` | 256K | | | | | | $0.11 | $0.41 |
44
- | `hyper/glm-5` | 203K | | | | | | $0.86 | $3 |
43
+ | `hyper/gemma-4-26b-a4b-it` | 256K | | | | | | $0.12 | $0.42 |
44
+ | `hyper/glm-5` | 203K | | | | | | $0.91 | $3 |
45
45
  | `hyper/glm-5.1` | 203K | | | | | | $1 | $4 |
46
46
  | `hyper/glm-5.2` | 1.0M | | | | | | $2 | $5 |
47
- | `hyper/gpt-oss-120b` | 128K | | | | | | $0.18 | $0.68 |
47
+ | `hyper/gpt-oss-120b` | 128K | | | | | | $0.19 | $0.70 |
48
48
  | `hyper/kimi-k2.5` | 262K | | | | | | $0.54 | $3 |
49
49
  | `hyper/kimi-k2.6` | 262K | | | | | | $1 | $4 |
50
50
  | `hyper/kimi-k2.7-code` | 262K | | | | | | $1 | $4 |
@@ -39,7 +39,7 @@ for await (const chunk of stream) {
39
39
  | `inceptron/deepseek-ai/DeepSeek-V4-Flash-0731` | 1.0M | | | | | | $0.13 | $0.28 |
40
40
  | `inceptron/moonshotai/Kimi-K2.6` | 262K | | | | | | $0.57 | $3 |
41
41
  | `inceptron/moonshotai/Kimi-K2.7-Code` | 262K | | | | | | $0.67 | $3 |
42
- | `inceptron/zai-org/GLM-5.2` | 1.0M | | | | | | $0.75 | $3 |
42
+ | `inceptron/zai-org/GLM-5.2` | 1.0M | | | | | | $0.75 | $2 |
43
43
 
44
44
  ## Advanced configuration
45
45
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ![Kilo Gateway logo](https://models.dev/logos/kilo.svg)Kilo Gateway
4
4
 
5
- Access 367 Kilo Gateway models through Mastra's model router. Authentication is handled automatically using the `KILO_API_KEY` environment variable.
5
+ Access 365 Kilo Gateway models through Mastra's model router. Authentication is handled automatically using the `KILO_API_KEY` environment variable.
6
6
 
7
7
  Learn more in the [Kilo Gateway documentation](https://kilo.ai).
8
8
 
@@ -40,10 +40,10 @@ for await (const chunk of stream) {
40
40
  | `kilo/~anthropic/claude-haiku-latest` | 200K | | | | | | $1 | $5 |
41
41
  | `kilo/~anthropic/claude-opus-latest` | 1.0M | | | | | | $5 | $25 |
42
42
  | `kilo/~anthropic/claude-sonnet-latest` | 1.0M | | | | | | $2 | $10 |
43
- | `kilo/~deepseek/deepseek-v4-flash-latest` | 1.0M | | | | | | $0.04 | $0.10 |
43
+ | `kilo/~deepseek/deepseek-v4-flash-latest` | 1.0M | | | | | | $0.04 | $0.08 |
44
44
  | `kilo/~google/gemini-flash-latest` | 1.0M | | | | | | $0.38 | $2 |
45
45
  | `kilo/~google/gemini-pro-latest` | 1.0M | | | | | | $2 | $12 |
46
- | `kilo/~moonshotai/kimi-latest` | 1.0M | | | | | | $3 | $14 |
46
+ | `kilo/~moonshotai/kimi-latest` | 1.0M | | | | | | $3 | $13 |
47
47
  | `kilo/~openai/gpt-latest` | 1.1M | | | | | | $2 | $10 |
48
48
  | `kilo/~openai/gpt-mini-latest` | 400K | | | | | | $0.75 | $5 |
49
49
  | `kilo/~x-ai/grok-latest` | 500K | | | | | | $2 | $6 |
@@ -114,7 +114,7 @@ for await (const chunk of stream) {
114
114
  | `kilo/google/gemini-2.5-pro-preview` | 1.0M | | | | | | $1 | $10 |
115
115
  | `kilo/google/gemini-2.5-pro-preview-05-06` | 1.0M | | | | | | $1 | $10 |
116
116
  | `kilo/google/gemini-3-flash-preview` | 1.0M | | | | | | $0.50 | $3 |
117
- | `kilo/google/gemini-3-pro-image` | 66K | | | | | | $2 | $12 |
117
+ | `kilo/google/gemini-3-pro-image` | 131K | | | | | | $2 | $12 |
118
118
  | `kilo/google/gemini-3-pro-image-preview` | 66K | | | | | | $2 | $12 |
119
119
  | `kilo/google/gemini-3.1-flash-image` | 131K | | | | | | $0.50 | $3 |
120
120
  | `kilo/google/gemini-3.1-flash-image-preview` | 66K | | | | | | $0.50 | $3 |
@@ -131,7 +131,6 @@ for await (const chunk of stream) {
131
131
  | `kilo/google/gemma-3-12b-it` | 131K | | | | | | $0.05 | $0.15 |
132
132
  | `kilo/google/gemma-3-27b-it` | 131K | | | | | | $0.08 | $0.16 |
133
133
  | `kilo/google/gemma-3-4b-it` | 131K | | | | | | $0.05 | $0.10 |
134
- | `kilo/google/gemma-3n-e4b-it` | 33K | | | | | | $0.06 | $0.12 |
135
134
  | `kilo/google/gemma-4-26b-a4b-it` | 262K | | | | | | $0.04 | $0.22 |
136
135
  | `kilo/google/gemma-4-31b-it` | 262K | | | | | | $0.08 | $0.35 |
137
136
  | `kilo/google/lyria-3-clip-preview` | 1.0M | | | | | | — | — |
@@ -157,9 +156,9 @@ for await (const chunk of stream) {
157
156
  | `kilo/meta-llama/llama-3.1-8b-instruct` | 131K | | | | | | $0.02 | $0.04 |
158
157
  | `kilo/meta-llama/llama-3.2-1b-instruct` | 60K | | | | | | $0.03 | $0.20 |
159
158
  | `kilo/meta-llama/llama-3.2-3b-instruct` | 131K | | | | | | $0.05 | $0.33 |
160
- | `kilo/meta-llama/llama-3.3-70b-instruct` | 131K | | | | | | $0.10 | $0.32 |
159
+ | `kilo/meta-llama/llama-3.3-70b-instruct` | 128K | | | | | | $0.10 | $0.32 |
161
160
  | `kilo/meta-llama/llama-4-maverick` | 1.0M | | | | | | $0.20 | $0.70 |
162
- | `kilo/meta-llama/llama-4-scout` | 328K | | | | | | $0.10 | $0.30 |
161
+ | `kilo/meta-llama/llama-4-scout` | 131K | | | | | | $0.10 | $0.30 |
163
162
  | `kilo/meta-llama/llama-guard-4-12b` | 164K | | | | | | $0.18 | $0.18 |
164
163
  | `kilo/meta/muse-glimmer-30b` | 131K | | | | | | $0.30 | $1 |
165
164
  | `kilo/meta/muse-spark-1.1` | 1.0M | | | | | | $1 | $4 |
@@ -173,7 +172,7 @@ for await (const chunk of stream) {
173
172
  | `kilo/minimax/minimax-m2-her` | 66K | | | | | | $0.30 | $1 |
174
173
  | `kilo/minimax/minimax-m2.1` | 205K | | | | | | $0.30 | $1 |
175
174
  | `kilo/minimax/minimax-m2.5` | 200K | | | | | | $0.30 | $1 |
176
- | `kilo/minimax/minimax-m2.7` | 197K | | | | | | $0.30 | $1 |
175
+ | `kilo/minimax/minimax-m2.7` | 205K | | | | | | $0.30 | $1 |
177
176
  | `kilo/minimax/minimax-m2.7:free` | 197K | | | | | | — | — |
178
177
  | `kilo/minimax/minimax-m3` | 524K | | | | | | $0.30 | $1 |
179
178
  | `kilo/minimax/minimax-m3:free` | 1.0M | | | | | | — | — |
@@ -299,8 +298,7 @@ for await (const chunk of stream) {
299
298
  | `kilo/qwen/qwen-2.5-coder-32b-instruct` | 33K | | | | | | $0.66 | $1 |
300
299
  | `kilo/qwen/qwen-plus` | 1.0M | | | | | | $0.26 | $0.78 |
301
300
  | `kilo/qwen/qwen-plus-2025-07-28` | 1.0M | | | | | | $0.26 | $0.78 |
302
- | `kilo/qwen/qwen-plus-2025-07-28:thinking` | 1.0M | | | | | | $0.26 | $0.78 |
303
- | `kilo/qwen/qwen2.5-vl-72b-instruct` | 128K | | | | | | $0.80 | $1 |
301
+ | `kilo/qwen/qwen2.5-vl-72b-instruct` | 32K | | | | | | $0.25 | $0.75 |
304
302
  | `kilo/qwen/qwen3-14b` | 41K | | | | | | $0.23 | $0.91 |
305
303
  | `kilo/qwen/qwen3-235b-a22b` | 131K | | | | | | $0.46 | $2 |
306
304
  | `kilo/qwen/qwen3-235b-a22b-2507` | 262K | | | | | | $0.15 | $0.60 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ![LLM Gateway logo](https://models.dev/logos/llmgateway-providers.svg)LLM Gateway
4
4
 
5
- Access 377 LLM Gateway models through Mastra's model router. Authentication is handled automatically using the `LLMGATEWAY_API_KEY` environment variable.
5
+ Access 378 LLM Gateway models through Mastra's model router. Authentication is handled automatically using the `LLMGATEWAY_API_KEY` environment variable.
6
6
 
7
7
  Learn more in the [LLM Gateway documentation](https://llmgateway.io/docs).
8
8
 
@@ -133,11 +133,12 @@ for await (const chunk of stream) {
133
133
  | `llmgateway-providers/azure/o3` | 200K | | | | | | $2 | $8 |
134
134
  | `llmgateway-providers/azure/o3-mini` | 200K | | | | | | $1 | $4 |
135
135
  | `llmgateway-providers/azure/o4-mini` | 200K | | | | | | $1 | $4 |
136
- | `llmgateway-providers/baidu/deepseek-v4-flash` | 1.0M | | | | | | $0.14 | $0.28 |
137
- | `llmgateway-providers/baidu/deepseek-v4-pro` | 1.0M | | | | | | $2 | $3 |
136
+ | `llmgateway-providers/baidu/deepseek-v4-flash` | 1.0M | | | | | | $0.44 | $1 |
137
+ | `llmgateway-providers/baidu/deepseek-v4-pro` | 1.0M | | | | | | $1 | $4 |
138
138
  | `llmgateway-providers/baidu/glm-5` | 203K | | | | | | $1 | $3 |
139
139
  | `llmgateway-providers/baidu/glm-5.1` | 203K | | | | | | $1 | $4 |
140
140
  | `llmgateway-providers/baidu/glm-5.2` | 1.0M | | | | | | $1 | $4 |
141
+ | `llmgateway-providers/baidu/glm-5.3` | 1.0M | | | | | | $1 | $4 |
141
142
  | `llmgateway-providers/baidu/kimi-k2.6` | 262K | | | | | | $0.95 | $4 |
142
143
  | `llmgateway-providers/bytedance/deepseek-v3.2` | 131K | | | | | | $0.28 | $0.42 |
143
144
  | `llmgateway-providers/bytedance/deepseek-v4-flash` | 1.0M | | | | | | $0.44 | $1 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ![NanoGPT logo](https://models.dev/logos/nano-gpt.svg)NanoGPT
4
4
 
5
- Access 606 NanoGPT models through Mastra's model router. Authentication is handled automatically using the `NANO_GPT_API_KEY` environment variable.
5
+ Access 608 NanoGPT models through Mastra's model router. Authentication is handled automatically using the `NANO_GPT_API_KEY` environment variable.
6
6
 
7
7
  Learn more in the [NanoGPT documentation](https://docs.nano-gpt.com).
8
8
 
@@ -472,6 +472,8 @@ for await (const chunk of stream) {
472
472
  | `nano-gpt/qwen/Qwen3.6-35B-A3B:thinking` | 262K | | | | | | $0.11 | $0.80 |
473
473
  | `nano-gpt/qwen/qwen3.8-27b-obliterated` | 262K | | | | | | $0.18 | $0.50 |
474
474
  | `nano-gpt/qwen/qwen3.8-27b-obliterated:thinking` | 262K | | | | | | $0.18 | $0.50 |
475
+ | `nano-gpt/qwen/qwen3.8-27b-uncensored` | 262K | | | | | | $0.18 | $0.50 |
476
+ | `nano-gpt/qwen/qwen3.8-27b-uncensored:thinking` | 262K | | | | | | $0.18 | $0.50 |
475
477
  | `nano-gpt/qwen25-vl-72b-instruct` | 32K | | | | | | $0.70 | $0.70 |
476
478
  | `nano-gpt/qwen3-30b-a3b-instruct-2507` | 256K | | | | | | $0.20 | $0.50 |
477
479
  | `nano-gpt/qwen3-coder-30b-a3b-instruct` | 128K | | | | | | $0.10 | $0.40 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ![OpenCode Go logo](https://models.dev/logos/opencode-go.svg)OpenCode Go
4
4
 
5
- Access 29 OpenCode Go models through Mastra's model router. Authentication is handled automatically using the `OPENCODE_API_KEY` environment variable.
5
+ Access 30 OpenCode Go models through Mastra's model router. Authentication is handled automatically using the `OPENCODE_API_KEY` environment variable.
6
6
 
7
7
  Learn more in the [OpenCode Go documentation](https://opencode.ai/docs/zen).
8
8
 
@@ -43,7 +43,7 @@ for await (const chunk of stream) {
43
43
  | `opencode-go/glm-5.2` | 1.0M | | | | | | $1 | $4 |
44
44
  | `opencode-go/glm-5.3` | 1.0M | | | | | | $1 | $4 |
45
45
  | `opencode-go/gpt-5.6-luna` | 1.1M | | | | | | $0.20 | $1 |
46
- | `opencode-go/grok-4.5` | 500K | | | | | | $2 | $6 |
46
+ | `opencode-go/grok-4.6` | 500K | | | | | | $2 | $6 |
47
47
  | `opencode-go/hy3` | 256K | | | | | | $0.02 | $0.07 |
48
48
  | `opencode-go/kimi-k2.6` | 262K | | | | | | $0.95 | $4 |
49
49
  | `opencode-go/kimi-k2.7-code` | 262K | | | | | | $0.95 | $4 |
@@ -0,0 +1,78 @@
1
+ > Discover all available pages from the documentation index: https://mastra.ai/llms.txt
2
+
3
+ # ![Pendra logo](https://models.dev/logos/pendra.svg)Pendra
4
+
5
+ Access 6 Pendra models through Mastra's model router. Authentication is handled automatically using the `PENDRA_API_KEY` environment variable.
6
+
7
+ Learn more in the [Pendra documentation](https://pendra.ai/docs/integrations/opencode).
8
+
9
+ ```bash
10
+ PENDRA_API_KEY=your-api-key
11
+ ```
12
+
13
+ ```typescript
14
+ import { Agent } from "@mastra/core/agent";
15
+
16
+ const agent = new Agent({
17
+ id: "my-agent",
18
+ name: "My Agent",
19
+ instructions: "You are a helpful assistant",
20
+ model: "pendra/deepseek-v4-flash"
21
+ });
22
+
23
+ // Generate a response
24
+ const response = await agent.generate("Hello!");
25
+
26
+ // Stream a response
27
+ const stream = await agent.stream("Tell me a story");
28
+ for await (const chunk of stream) {
29
+ console.log(chunk);
30
+ }
31
+ ```
32
+
33
+ > **Note:** Mastra uses the OpenAI-compatible `/chat/completions` endpoint. Some provider-specific features may not be available. Check the [Pendra documentation](https://pendra.ai/docs/integrations/opencode) for details.
34
+
35
+ ## Models
36
+
37
+ | Model | Context | Tools | Reasoning | Image | Audio | Video | Input $/1M | Output $/1M |
38
+ | -------------------------- | ------- | ----- | --------- | ----- | ----- | ----- | ---------- | ----------- |
39
+ | `pendra/deepseek-v4-flash` | 1.0M | | | | | | — | — |
40
+ | `pendra/glm-4.7-flash` | 200K | | | | | | — | — |
41
+ | `pendra/gpt-oss:120b` | 131K | | | | | | — | — |
42
+ | `pendra/llama3.3:70b` | 128K | | | | | | — | — |
43
+ | `pendra/qwen3-coder:30b` | 262K | | | | | | — | — |
44
+ | `pendra/qwen3.6:27b` | 262K | | | | | | — | — |
45
+
46
+ ## Advanced configuration
47
+
48
+ ### Custom headers
49
+
50
+ ```typescript
51
+ const agent = new Agent({
52
+ id: "custom-agent",
53
+ name: "custom-agent",
54
+ model: {
55
+ url: "https://api.pendra.ai/api/v1",
56
+ id: "pendra/deepseek-v4-flash",
57
+ apiKey: process.env.PENDRA_API_KEY,
58
+ headers: {
59
+ "X-Custom-Header": "value"
60
+ }
61
+ }
62
+ });
63
+ ```
64
+
65
+ ### Dynamic model selection
66
+
67
+ ```typescript
68
+ const agent = new Agent({
69
+ id: "dynamic-agent",
70
+ name: "Dynamic Agent",
71
+ model: ({ requestContext }) => {
72
+ const useAdvanced = requestContext.task === "complex";
73
+ return useAdvanced
74
+ ? "pendra/qwen3.6:27b"
75
+ : "pendra/deepseek-v4-flash";
76
+ }
77
+ });
78
+ ```
@@ -125,6 +125,7 @@ Direct access to individual AI model providers. Each provider offers unique mode
125
125
  - [Opper](https://mastra.ai/models/providers/opper)
126
126
  - [OrcaRouter](https://mastra.ai/models/providers/orcarouter)
127
127
  - [OVHcloud AI Endpoints](https://mastra.ai/models/providers/ovhcloud)
128
+ - [Pendra](https://mastra.ai/models/providers/pendra)
128
129
  - [Perplexity](https://mastra.ai/models/providers/perplexity)
129
130
  - [Perplexity Agent](https://mastra.ai/models/providers/perplexity-agent)
130
131
  - [Pioneer](https://mastra.ai/models/providers/pioneer)
@@ -1100,9 +1100,9 @@ For runtime commands, the command resolves the target server in this order:
1100
1100
  2. `http://localhost:4111` for a local `mastra dev` server.
1101
1101
  3. `.mastra-project.json` for a Mastra platform project.
1102
1102
 
1103
- Automatic platform auth is only used when the CLI resolves a Mastra platform target from `.mastra-project.json`. Localhost targets and explicit `--url` targets don't receive automatic credentials. Headers passed with `--header` are sent to any target, including localhost.
1103
+ Automatic Platform authentication is used when the CLI resolves a project from `.mastra-project.json` or recognizes an explicit Mastra-hosted Studio, Factory, or observability URL. Localhost and arbitrary explicit `--url` targets don't receive automatic credentials. Headers passed with `--header` are sent to any target, including localhost.
1104
1104
 
1105
- For observability commands (`trace`, `log`, `score`, and `metric`), the CLI targets `https://observability.mastra.ai` by default instead of a project deployment URL. Trace Intelligence commands (`learning`) work the same way but target `https://output.signals.mastra.ai`. Both resolve credentials in this order:
1105
+ For observability commands (`trace`, `log`, `score`, and `metric`), the CLI targets the United States endpoint at `https://observability.mastra.ai` by default instead of a project deployment URL. Trace Intelligence commands (`learning`) work the same way but target `https://output.signals.mastra.ai`. When the CLI selects either hosted target automatically, it resolves credentials in this order:
1106
1106
 
1107
1107
  1. Explicit `Authorization` and `X-Mastra-Project-Id` headers passed with `--header`.
1108
1108
  2. `MASTRA_PLATFORM_ACCESS_TOKEN` and `MASTRA_PROJECT_ID` from your environment.
@@ -1111,7 +1111,13 @@ For observability commands (`trace`, `log`, `score`, and `metric`), the CLI targ
1111
1111
 
1112
1112
  Learning commands also send `X-Mastra-Organization-Id`, resolved from an explicit `--header`, `MASTRA_ORGANIZATION_ID` in your environment, or `.mastra-project.json`, in that order.
1113
1113
 
1114
- Use `--url` and `--header` when you need to override the default hosted observability target or credentials.
1114
+ European Union observability data is stored at `https://observability.eu.mastra.ai`. Pass that trusted host with `--url`; it uses the same Platform credential resolution as the default United States endpoint:
1115
+
1116
+ ```bash
1117
+ mastra api --url https://observability.eu.mastra.ai trace list
1118
+ ```
1119
+
1120
+ Use `--url` and `--header` when you need to override another target or its credentials.
1115
1121
 
1116
1122
  ### Flags
1117
1123
 
@@ -1527,7 +1533,7 @@ mastra api metric label-values '{"metricName":"latency_ms","labelKey":"model","p
1527
1533
 
1528
1534
  #### Observability with `curl`
1529
1535
 
1530
- You can call the hosted observability API directly with your platform access token and project ID:
1536
+ You can call the hosted observability API directly with your platform access token and project ID. The examples below use the United States host. Substitute `https://observability.eu.mastra.ai` for a European Union environment. The [hosted feedback query API](https://mastra.ai/docs/mastra-platform/api) documents feedback endpoints that don't have CLI commands:
1531
1537
 
1532
1538
  ```bash
1533
1539
  curl -sS "https://observability.mastra.ai/api/observability/traces?page=0&perPage=20" \
@@ -92,7 +92,7 @@ const scores = await mastraClient.listScoresBySpan({
92
92
 
93
93
  ## Feedback
94
94
 
95
- Feedback methods create, list, and query human-in-the-loop signals such as ratings, thumbs, comments, and corrections. See the [feedback guide](https://mastra.ai/docs/observability/feedback) for examples and the [feedback reference](https://mastra.ai/reference/observability/feedback) for full schemas.
95
+ Feedback methods create, list, and query human-in-the-loop signals such as ratings, thumbs, comments, and corrections through the target Mastra runtime and its configured observability storage. They don't call the hosted Mastra Platform feedback query API. See the [feedback guide](https://mastra.ai/docs/observability/feedback) for examples and the [feedback reference](https://mastra.ai/reference/observability/feedback) for full schemas.
96
96
 
97
97
  ### Creating feedback
98
98
 
@@ -54,6 +54,8 @@ await mastra.observability.addFeedback?.({
54
54
 
55
55
  **feedback** (`FeedbackInput`): Feedback payload to add.
56
56
 
57
+ Without `correlationContext`, the method looks up `traceId` in configured observability storage. If the trace or requested span isn't found, Mastra logs a warning and drops the feedback event. Configure `MastraStorageExporter` when adding feedback by ID after execution, including when `MastraPlatformExporter` handles remote export.
58
+
57
59
  ### `createFeedback(args)`
58
60
 
59
61
  Creates one feedback record through the observability storage domain. Storage-level calls write directly to the store, so include `timestamp`.
@@ -375,6 +377,8 @@ Use `FeedbackFilter` in `listFeedback()` and OLAP query `filters`.
375
377
 
376
378
  ## HTTP routes
377
379
 
380
+ These routes belong to a Mastra runtime and use its configured observability storage. They're separate from the [unversioned Mastra Platform feedback query API](https://mastra.ai/docs/mastra-platform/api), which doesn't provide a feedback creation route.
381
+
378
382
  | Method | Path | Purpose | Permission |
379
383
  | ------ | ----------------------------------------- | ---------------------------- | -------------------- |
380
384
  | `GET` | `/api/observability/feedback` | List feedback records | None derived |
@@ -54,6 +54,8 @@ const response = await agent.generate('Run npm install')
54
54
 
55
55
  **nativeSandbox** (`NativeSandboxConfig`): Configuration for native sandboxing (see NativeSandboxConfig below).
56
56
 
57
+ `start()` reports `{ outcome: 'created' }` when the working directory didn't exist yet and `{ outcome: 'connected' }` when it reattaches to an existing directory. See [`start()`](https://mastra.ai/reference/workspace/sandbox) for the shared contract.
58
+
57
59
  ## `NativeSandboxConfig`
58
60
 
59
61
  Configuration options for native OS sandboxing (used with `isolation: 'seatbelt'` or `'bwrap'`).
@@ -118,6 +118,8 @@ const result = await sandbox.executeCommand('cat', ['/workspace/state.json'])
118
118
 
119
119
  When `sandboxId` is set, `environmentId` isn't required because the sandbox already exists.
120
120
 
121
+ `start()` reports `{ outcome: 'connected' }` on reattach and `{ outcome: 'created' }` on a fresh provision (including a checkpoint-recovered boot, which is a new VM even when its filesystem was restored). See [`start()`](https://mastra.ai/reference/workspace/sandbox) for the shared contract.
122
+
121
123
  ### Checkpoint recovery
122
124
 
123
125
  The constructor `id` (explicit or auto-generated) is sent to the platform on `POST /sandbox` as an advisory recovery key:
@@ -226,7 +228,7 @@ console.log(result.exitCode)
226
228
 
227
229
  ## Methods
228
230
 
229
- **start** (`() => Promise<void>`): Provision the remote sandbox, or reattach when sandboxId was passed to the constructor. Idempotent once the sandbox is running. A destroyed reattach target falls through to a fresh provision.
231
+ **start** (`() => Promise<SandboxStartResult>`): Provision the remote sandbox, or reattach when sandboxId was passed to the constructor. Idempotent once the sandbox is running. A destroyed reattach target falls through to a fresh provision.
230
232
 
231
233
  **destroy** (`() => Promise<void>`): Tear down the remote sandbox and clear the cached exec lease. A subsequent start() provisions a fresh sandbox (or restores from checkpoint when a stable id is set).
232
234
 
@@ -10,6 +10,8 @@ The `WorkspaceSandbox` interface defines how workspaces execute commands and man
10
10
 
11
11
  **processes** (`SandboxProcessManager`): Background process manager. If not implemented, process management tools won't be available. See SandboxProcessManager reference.
12
12
 
13
+ **computer** (`SandboxComputer`): Computer-use (desktop) capability. If not implemented, computer tools won't be available. See Computer capability.
14
+
13
15
  ## Methods
14
16
 
15
17
  ### `start()`
@@ -17,10 +19,78 @@ The `WorkspaceSandbox` interface defines how workspaces execute commands and man
17
19
  Starts the sandbox and is called automatically by `workspace.init()` or the first `executeCommand()` call.
18
20
 
19
21
  ```typescript
20
- await sandbox.start()
22
+ const result = await sandbox.start()
23
+ // { outcome: 'created' } — a fresh VM was created
24
+ // { outcome: 'connected' } — reconnected to an existing VM
25
+ // undefined — the provider does not report
26
+ ```
27
+
28
+ **Returns:** `void | Promise<SandboxStartResult | void>`
29
+
30
+ A sandbox constructed with a known `id` resolves that id on `start()`: reconnect or resume the sandbox if it exists, create it if not (get-or-create). Providers that support this report a `SandboxStartResult`:
31
+
32
+ **outcome** (`'created' | 'connected'`): 'created' when a brand-new sandbox VM (or working directory) was provisioned; 'connected' when the call reconnected to or resumed an existing one.
33
+
34
+ Providers that predate the contract return `void`, which the base class treats as unknown.
35
+
36
+ Provider implementations plug into the start lifecycle at one of three rungs; the best available wins, and the base class always owns coalescing, status management, the `onStart` hook, and mount processing:
37
+
38
+ 1. **Acquisition primitives**: implement protected `find()` (side-effect-free lookup by logical id, returning a provider-native handle or `undefined`), `connect(handle)` (wake/resume/adopt), and `create()` (provision fresh) without overriding `start()`. The base orchestrates find → connect → `{ outcome: 'connected' }`, else create → `{ outcome: 'created' }`. The outcome is derived structurally from which branch ran. Used by `E2BSandbox`, `DaytonaSandbox`, and `LocalSandbox`.
39
+ 2. **`start()` override returning `SandboxStartResult`**: for providers whose API is a fused get-or-create where decomposition would add round-trips (`PlatformSandbox`, `RailwaySandbox`).
40
+ 3. **`start()` override returning `void`**: legacy providers, where the outcome is unknown.
41
+
42
+ Concurrent `start()` calls on one instance coalesce onto a single in-flight attempt, and joined callers share that attempt's result (all observe `outcome: 'created'` when the shared attempt created the VM). The in-flight slot is cleared when the attempt settles, so a failed start can be retried. While the sandbox is already `running`, `start()` resolves `{ outcome: 'connected' }` without re-invoking the provider.
43
+
44
+ The result is also forwarded to the `onStart` lifecycle hook as `{ sandbox, outcome }`.
45
+
46
+ ### `onStart` (constructor option)
47
+
48
+ `onStart` runs inside the start lifecycle, after the sandbox reaches `running` status and before pending mounts are processed. It fires on every start regardless of trigger, whether an explicit call, a lazy `ensureRunning()` from a command, or a revival after the provider replaced the VM. That makes it the seam for once-per-VM setup: branch on `outcome` and probe or run whatever the environment needs.
49
+
50
+ ```typescript
51
+ new E2BSandbox({
52
+ id: sessionId,
53
+ onStart: async ({ sandbox, outcome }) => {
54
+ if (outcome === 'created') {
55
+ // Fresh VM: run the full setup.
56
+ await runSetup(sandbox)
57
+ return
58
+ }
59
+ // Reconnected: probe, and self-heal if setup never completed.
60
+ const probe = await sandbox.executeCommand('test -d ~/repo/.git')
61
+ if (probe.exitCode !== 0) await runSetup(sandbox)
62
+ },
63
+ })
64
+ ```
65
+
66
+ Semantics:
67
+
68
+ - A thrown error is fatal: `start()` rejects with the hook's error and the sandbox is marked `error`, so a caller never observes a running sandbox whose setup hook failed. Nothing is latched, and the next `start()` (including the one triggered by the next lazy command) retries the hook. `onStop` and `onDestroy` remain non-fatal observers, because teardown proceeds best-effort.
69
+ - `outcome` distinguishes the branches: `'created'` means this start provisioned a fresh VM (run setup), `'connected'` means it reconnected or resumed (setup normally already ran, so probe when the hook must self-heal a crash between create and setup-complete). `undefined` means the provider doesn't report.
70
+ - Keep setup work idempotent. A hook re-runs whenever a probe decides it should, and a checkpoint-recovered fresh VM reports `outcome: 'created'`.
71
+ - The sandbox status flips to `running` before the hook executes (the hook runs commands through the sandbox's own command path), so commands issued concurrently through `ensureRunning()` can interleave with it. Callers awaiting the original `start()` always observe a sandbox whose hook finished.
72
+ - The hook runs before pending filesystem mounts are processed, so it can't rely on mounted paths.
73
+
74
+ ### `setOnStart(update)`
75
+
76
+ Attaches a start hook after construction, for runtimes that receive a sandbox they didn't build. Without it, every host that constructs a sandbox has to accept a hook and pass it to the provider constructor, and a host that forgets leaves setup unrun with no error.
77
+
78
+ The updater receives the hook currently installed, either the `onStart` constructor option or one a previous call left behind, and returns the hook to install. Composing this way means a caller never discards a hook it didn't know about:
79
+
80
+ ```typescript
81
+ sandbox.setOnStart?.(previous => async args => {
82
+ await previous?.(args) // whatever prepared the sandbox runs first
83
+ await mySetup(args)
84
+ })
21
85
  ```
22
86
 
23
- This method prepares the sandbox for command execution.
87
+ Semantics:
88
+
89
+ - Errors stay fatal, exactly as with the constructor option. Because each hook awaits the next, a throw stops the ones sequenced after it.
90
+ - The caller chooses the order. Await `previous` first when your hook needs the workspace it prepares, or last when yours is the one preparing it.
91
+ - Ignoring `previous` replaces the installed hook. That's supported, and it's how a caller takes over setup a runtime installed.
92
+ - Each call wraps the current hook, so attach once per sandbox instance. Attaching on a path that runs per request stacks duplicate work on every start.
93
+ - Only starts that begin after the call see the new hook.
24
94
 
25
95
  ### `stop()`
26
96
 
@@ -127,6 +197,48 @@ const instructions = sandbox.getInstructions?.()
127
197
 
128
198
  **Returns:** `string`
129
199
 
200
+ ## Computer capability
201
+
202
+ Sandboxes with a controllable desktop environment implement the optional `SandboxComputer` interface on the `computer` property. When present on a statically configured sandbox, the workspace tools factory registers the `mastra_workspace_computer_*` tools automatically. See [Computer-use tools](https://mastra.ai/docs/sandbox/overview).
203
+
204
+ Coordinates are pixels from the top-left corner of the display. Providers normalize their SDK semantics (key names, scroll units) onto this surface and expose richer native APIs through their own accessors.
205
+
206
+ **screenshot()** (`() => Promise<{ data: Uint8Array; mediaType: "image/png" }>`): Capture the current display as a PNG image.
207
+
208
+ **leftClick(x, y)** (`(x: number, y: number) => Promise<void>`): Left-click at the given coordinates.
209
+
210
+ **rightClick(x, y)** (`(x: number, y: number) => Promise<void>`): Right-click at the given coordinates.
211
+
212
+ **doubleClick(x, y)** (`(x: number, y: number) => Promise<void>`): Double-click (left button) at the given coordinates.
213
+
214
+ **moveMouse(x, y)** (`(x: number, y: number) => Promise<void>`): Move the cursor without clicking.
215
+
216
+ **drag(from, to)** (`(from: ComputerPosition, to: ComputerPosition) => Promise<void>`): Press the left button at from, drag to to, and release.
217
+
218
+ **scroll(direction, amount)** (`(direction: 'up' | 'down', amount: number) => Promise<void>`): Scroll the display by the given amount of ticks.
219
+
220
+ **type(text)** (`(text: string) => Promise<void>`): Type text into the focused element.
221
+
222
+ **press(key)** (`(key: string | string[]) => Promise<void>`): Press a key or key combination. A string presses one key (for example 'Enter'); an array presses a chord (for example \['ctrl', 's']).
223
+
224
+ **getScreenSize()** (`() => Promise<{ width: number; height: number }>`): Get the display dimensions.
225
+
226
+ **getCursorPosition()** (`() => Promise<{ x: number; y: number }>`): Get the current cursor position.
227
+
228
+ **streamUrl()** (`() => Promise<string | null>`): Get a URL for a live view of the desktop, such as noVNC, or null when unavailable. Optional, not all providers expose a viewer.
229
+
230
+ Use the `supportsComputer()` type guard to check for the capability:
231
+
232
+ ```typescript
233
+ import { supportsComputer } from '@mastra/core/workspace'
234
+
235
+ if (supportsComputer(sandbox)) {
236
+ const { data } = await sandbox.computer.screenshot()
237
+ }
238
+ ```
239
+
240
+ `DaytonaSandbox` and `E2BDesktopSandbox` implement this capability. See the [Daytona](https://mastra.ai/integrations/sandboxes/daytona) and [E2B Desktop](https://mastra.ai/integrations/sandboxes/e2b-desktop) integration pages.
241
+
130
242
  ## Related
131
243
 
132
244
  - [SandboxProcessManager reference](https://mastra.ai/reference/workspace/process-manager)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @mastra/mcp-docs-server
2
2
 
3
+ ## 1.2.19-alpha.19
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`48ef1f1`](https://github.com/mastra-ai/mastra/commit/48ef1f1d24eedafbb07f64e659a81b52b67b8bf6), [`63796ba`](https://github.com/mastra-ai/mastra/commit/63796ba0fda60253be17535e68f6bbbf1e6ffa09), [`3c19dce`](https://github.com/mastra-ai/mastra/commit/3c19dcef8e73062a80627a4927eae3ec11145afd)]:
8
+ - @mastra/core@1.62.0-alpha.12
9
+
10
+ ## 1.2.19-alpha.18
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [[`4ff3ee2`](https://github.com/mastra-ai/mastra/commit/4ff3ee2bff7ed07528b4817f8f49639031c72a4d), [`c24754c`](https://github.com/mastra-ai/mastra/commit/c24754c1fb6fe144e5051e536e98c8a18b0214ac), [`45dd6ee`](https://github.com/mastra-ai/mastra/commit/45dd6ee089bd7df0d0c98a10098e483fd388e04a), [`32d3583`](https://github.com/mastra-ai/mastra/commit/32d358332cb8ac2306b83b73cf3536e74dbd435e), [`aca2869`](https://github.com/mastra-ai/mastra/commit/aca2869b2031982f3c4a2f52525c9be7cf123ef8)]:
15
+ - @mastra/core@1.62.0-alpha.11
16
+
3
17
  ## 1.2.19-alpha.16
4
18
 
5
19
  ### Patch Changes