zuplo 7.9.17 → 7.9.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.
- package/docs/ai-gateway/integrations/claude-code.mdx +4 -4
- package/docs/ai-gateway/integrations/claude-desktop.mdx +9 -9
- package/docs/ai-gateway/integrations/codex.mdx +15 -15
- package/docs/ai-gateway/integrations/github-copilot.mdx +10 -10
- package/docs/ai-gateway/integrations/goose.mdx +2 -2
- package/docs/ai-gateway/user-apps.mdx +8 -8
- package/docs/dev-portal/zudoku/configuration/api-reference.md +16 -3
- package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +7 -0
- package/docs/dev-portal/zudoku/configuration/overview.md +1 -1
- package/docs/dev-portal/zudoku/markdown/frontmatter.md +19 -0
- package/docs/dev-portal/zudoku/openapi-extensions/x-zudoku-request-box-enabled.md +47 -0
- package/docs/dev-portal/zudoku/openapi-extensions/x-zudoku-seo.md +3 -0
- package/docs/policies/_index.md +1 -0
- package/docs/policies/ai-gateway-load-balancing-inbound/doc.md +522 -0
- package/docs/policies/ai-gateway-load-balancing-inbound/intro.md +6 -0
- package/docs/policies/ai-gateway-load-balancing-inbound/schema.json +175 -0
- package/docs/policies/ai-gateway-smart-router-inbound/doc.md +19 -19
- package/docs/policies/ai-gateway-smart-router-inbound/schema.json +10 -10
- package/package.json +5 -5
|
@@ -23,8 +23,8 @@ then get a gateway URL and key in one of two ways:
|
|
|
23
23
|
|
|
24
24
|
- **Use your personal API key (recommended).** Claude Code runs on your own
|
|
25
25
|
machine, so call the project's [User App](../user-apps.mdx). Open the
|
|
26
|
-
[**
|
|
27
|
-
Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
26
|
+
[**My Keys**](https://portal.zuplo.com/+/account/project/ai/home) tab of your
|
|
27
|
+
AI Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
28
28
|
keys**. Your requests count against your own budget.
|
|
29
29
|
- **Use an app.** For a shared or automated setup, and for the
|
|
30
30
|
[Claude subscription](#use-your-claude-subscription) approach,
|
|
@@ -188,7 +188,7 @@ claude -p "Reply with the single word OK"
|
|
|
188
188
|
|
|
189
189
|
With the subscription approach, the first command reports a `claude.ai` login,
|
|
190
190
|
not an API key or auth token. With a personal key, the request appears in your
|
|
191
|
-
usage on the **
|
|
191
|
+
usage on the **My Keys** tab; with an app, it appears in the app's usage in the
|
|
192
192
|
Zuplo Portal.
|
|
193
193
|
|
|
194
194
|
## Troubleshooting
|
|
@@ -196,7 +196,7 @@ Zuplo Portal.
|
|
|
196
196
|
| Error | Fix |
|
|
197
197
|
| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
198
198
|
| `400` `model must use "providerName/model"` | The selected model has no provider prefix. Check `ANTHROPIC_MODEL` and the other `ANTHROPIC_*_MODEL` variables. If you select an exact model ID, add a `modelOverrides` entry for it. Restart after editing. |
|
|
199
|
-
| `403` `This User App route requires a personal API key issued for this User App` | With a personal key: the key is missing, wrong, from another project, or not sent as `Authorization: Bearer`. Create a key on **
|
|
199
|
+
| `403` `This User App route requires a personal API key issued for this User App` | With a personal key: the key is missing, wrong, from another project, or not sent as `Authorization: Bearer`. Create a key on **My Keys** and use the Gateway URL from the same project. |
|
|
200
200
|
| `401` `Invalid Authorization Scheme` | `authScheme` still has its `Bearer` default. Set an explicit empty value. |
|
|
201
201
|
| `401` `Header configured by options.authHeader is missing` | Claude Code didn't send `zp-gateway-api-key`. Check `ANTHROPIC_CUSTOM_HEADERS`. |
|
|
202
202
|
| `401` `credentialPassthrough requires a non-empty Authorization header` | Claude Code isn't signed in. Run `claude` and use `/login`. |
|
|
@@ -20,8 +20,8 @@ then get a gateway URL and key in one of two ways:
|
|
|
20
20
|
|
|
21
21
|
- **Use your personal API key (recommended).** Claude Desktop runs on your own
|
|
22
22
|
machine, so call the project's [User App](../user-apps.mdx). Open the
|
|
23
|
-
[**
|
|
24
|
-
Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
23
|
+
[**My Keys**](https://portal.zuplo.com/+/account/project/ai/home) tab of your
|
|
24
|
+
AI Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
25
25
|
keys**. Your requests count against your own budget.
|
|
26
26
|
- **Use an app.** For a shared setup, such as
|
|
27
27
|
[deploying to a fleet](#deploy-to-a-fleet) with one key,
|
|
@@ -99,16 +99,16 @@ policy on the User App or the app controls which models you can use.
|
|
|
99
99
|
## Verify
|
|
100
100
|
|
|
101
101
|
Send a message in Chat and start a Cowork session. Both appear in your usage on
|
|
102
|
-
the **
|
|
103
|
-
started from the desktop app. Terminal Claude Code sessions use their
|
|
104
|
-
configuration. See [Claude Code](./claude-code.mdx).
|
|
102
|
+
the **My Keys** tab, or in the app's usage if you used an app, as do Code
|
|
103
|
+
sessions started from the desktop app. Terminal Claude Code sessions use their
|
|
104
|
+
own configuration. See [Claude Code](./claude-code.mdx).
|
|
105
105
|
|
|
106
106
|
## Troubleshooting
|
|
107
107
|
|
|
108
|
-
| Error | Fix
|
|
109
|
-
| -------------------------------------------------------------------------------- |
|
|
110
|
-
| `400` `The request body model must use "providerName/model"` | A model list entry has no provider prefix. Give every entry a full `providerName/model` ID.
|
|
111
|
-
| `403` `This User App route requires a personal API key issued for this User App` | With a personal key: the key is missing, wrong, from another project, or not sent as `Authorization: Bearer`. Create a key on **
|
|
108
|
+
| Error | Fix |
|
|
109
|
+
| -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
110
|
+
| `400` `The request body model must use "providerName/model"` | A model list entry has no provider prefix. Give every entry a full `providerName/model` ID. |
|
|
111
|
+
| `403` `This User App route requires a personal API key issued for this User App` | With a personal key: the key is missing, wrong, from another project, or not sent as `Authorization: Bearer`. Create a key on **My Keys** and use the Gateway URL from the same project. |
|
|
112
112
|
|
|
113
113
|
## Deploy to a fleet
|
|
114
114
|
|
|
@@ -24,8 +24,8 @@ get a gateway URL and key in one of two ways:
|
|
|
24
24
|
|
|
25
25
|
- **Use your personal API key (recommended).** Codex runs on your own machine,
|
|
26
26
|
so call the project's [User App](../user-apps.mdx). Open the
|
|
27
|
-
[**
|
|
28
|
-
Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
27
|
+
[**My Keys**](https://portal.zuplo.com/+/account/project/ai/home) tab of your
|
|
28
|
+
AI Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
29
29
|
keys**. Your requests count against your own budget.
|
|
30
30
|
- **Use an app.** For a shared or automated setup, and for the
|
|
31
31
|
[ChatGPT subscription](#use-your-chatgpt-subscription) approach,
|
|
@@ -158,19 +158,19 @@ codex exec "Reply with the single word OK"
|
|
|
158
158
|
```
|
|
159
159
|
|
|
160
160
|
The session header shows `provider: zuplo`. With a personal key, the request
|
|
161
|
-
appears in your usage on the **
|
|
162
|
-
usage in the Zuplo Portal.
|
|
161
|
+
appears in your usage on the **My Keys** tab; with an app, it appears in the
|
|
162
|
+
app's usage in the Zuplo Portal.
|
|
163
163
|
|
|
164
164
|
## Troubleshooting
|
|
165
165
|
|
|
166
|
-
| Error | Fix
|
|
167
|
-
| ------------------------------------------------------------------------------------------ |
|
|
168
|
-
| `400` `The request body model must use "providerName/model"` | Add the provider prefix to `model`. Do not use the `/model` picker.
|
|
169
|
-
| `403` `This User App route requires a personal API key issued for this User App` | With a personal key: the key is missing, wrong, from another project, or not sent as `Authorization: Bearer`. Create a key on **
|
|
170
|
-
| `ERROR: Missing environment variable: ZUPLO_AI_GATEWAY_API_KEY` | Export the variable in the shell that runs Codex.
|
|
171
|
-
| `401` `Authorization Failed` | With an app: the key is wrong. Copy it from the app's **API Key** tab.
|
|
172
|
-
| `401` `Header configured by options.authHeader is missing` | Subscription approach: add the `env_http_headers` line and export `ZUPLO_AI_GATEWAY_API_KEY`.
|
|
173
|
-
| `401` `Invalid Authorization Scheme` | Set `authScheme` to the empty string in the policy JSON.
|
|
174
|
-
| `401` `rejected the credential this app passed through from the caller` `(HTTP 401)` | Your ChatGPT login expired or is invalid. Run `codex login` again.
|
|
175
|
-
| `401` `Missing scopes: api.responses.write` | The app is not in passthrough mode. Configure the API Key Authentication policy as above.
|
|
176
|
-
| Errors mention `api.openai.com` or `not supported when using Codex with a ChatGPT account` | Codex is not using your provider. Set `model_provider = "zuplo"`.
|
|
166
|
+
| Error | Fix |
|
|
167
|
+
| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
168
|
+
| `400` `The request body model must use "providerName/model"` | Add the provider prefix to `model`. Do not use the `/model` picker. |
|
|
169
|
+
| `403` `This User App route requires a personal API key issued for this User App` | With a personal key: the key is missing, wrong, from another project, or not sent as `Authorization: Bearer`. Create a key on **My Keys** and use the Gateway URL from the same project. |
|
|
170
|
+
| `ERROR: Missing environment variable: ZUPLO_AI_GATEWAY_API_KEY` | Export the variable in the shell that runs Codex. |
|
|
171
|
+
| `401` `Authorization Failed` | With an app: the key is wrong. Copy it from the app's **API Key** tab. |
|
|
172
|
+
| `401` `Header configured by options.authHeader is missing` | Subscription approach: add the `env_http_headers` line and export `ZUPLO_AI_GATEWAY_API_KEY`. |
|
|
173
|
+
| `401` `Invalid Authorization Scheme` | Set `authScheme` to the empty string in the policy JSON. |
|
|
174
|
+
| `401` `rejected the credential this app passed through from the caller` `(HTTP 401)` | Your ChatGPT login expired or is invalid. Run `codex login` again. |
|
|
175
|
+
| `401` `Missing scopes: api.responses.write` | The app is not in passthrough mode. Configure the API Key Authentication policy as above. |
|
|
176
|
+
| Errors mention `api.openai.com` or `not supported when using Codex with a ChatGPT account` | Codex is not using your provider. Set `model_provider = "zuplo"`. |
|
|
@@ -23,8 +23,8 @@ such as OpenAI or Anthropic, then get a gateway URL and key in one of two ways:
|
|
|
23
23
|
|
|
24
24
|
- **Use your personal API key (recommended).** Each developer calls the
|
|
25
25
|
project's [User App](../user-apps.mdx) with their own key. Open the
|
|
26
|
-
[**
|
|
27
|
-
Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
26
|
+
[**My Keys**](https://portal.zuplo.com/+/account/project/ai/home) tab of your
|
|
27
|
+
AI Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
28
28
|
keys**. Each developer's requests count against their own budget.
|
|
29
29
|
- **Use an app.** For a shared setup with one key,
|
|
30
30
|
[create a pool](../managing-pools.mdx) and [an app](../managing-apps.mdx) for
|
|
@@ -157,11 +157,11 @@ Copilot reports gateway errors as a retry failure, such as
|
|
|
157
157
|
**GitHub Copilot Chat** channel of VS Code's Output panel, or in the CLI's error
|
|
158
158
|
text.
|
|
159
159
|
|
|
160
|
-
| The gateway responds | Cause | Fix
|
|
161
|
-
| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
|
|
162
|
-
| `403` `This User App route requires a personal API key` | A personal key that's missing, wrong, from another project, or sent as `x-api-key` | VS Code: add `requestHeaders`. CLI: use `COPILOT_PROVIDER_BEARER_TOKEN`. Check the key on **
|
|
163
|
-
| `401` `Header configured by options.authHeader is missing` | With an app key: the key was sent as `x-api-key` | VS Code: add `requestHeaders`. CLI: use `COPILOT_PROVIDER_BEARER_TOKEN`
|
|
164
|
-
| `401` `Invalid Authorization Scheme` | VS Code's `apiKey` was replaced with the key itself, so the key sent was empty | Re-enter the key with **Chat: Manage Language Models**
|
|
165
|
-
| `404` | The `url` stops at the gateway URL | Append `/v1/responses`, `/v1/messages`, or `/v1/chat/completions`
|
|
166
|
-
| `Function tools with reasoning_effort are not supported` | A GPT-5.x model on Chat Completions | VS Code: `"apiType": "responses"`. CLI: use a GPT-4.1 or Claude model
|
|
167
|
-
| `'temperature' does not support 0` or `temperature is deprecated` | The CLI's temperature setting on a GPT-5.x or Claude Sonnet 5 model | Use GPT-4.1, GPT-4o, Claude Sonnet 4.6, or Claude Haiku 4.5
|
|
160
|
+
| The gateway responds | Cause | Fix |
|
|
161
|
+
| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
162
|
+
| `403` `This User App route requires a personal API key` | A personal key that's missing, wrong, from another project, or sent as `x-api-key` | VS Code: add `requestHeaders`. CLI: use `COPILOT_PROVIDER_BEARER_TOKEN`. Check the key on **My Keys** |
|
|
163
|
+
| `401` `Header configured by options.authHeader is missing` | With an app key: the key was sent as `x-api-key` | VS Code: add `requestHeaders`. CLI: use `COPILOT_PROVIDER_BEARER_TOKEN` |
|
|
164
|
+
| `401` `Invalid Authorization Scheme` | VS Code's `apiKey` was replaced with the key itself, so the key sent was empty | Re-enter the key with **Chat: Manage Language Models** |
|
|
165
|
+
| `404` | The `url` stops at the gateway URL | Append `/v1/responses`, `/v1/messages`, or `/v1/chat/completions` |
|
|
166
|
+
| `Function tools with reasoning_effort are not supported` | A GPT-5.x model on Chat Completions | VS Code: `"apiType": "responses"`. CLI: use a GPT-4.1 or Claude model |
|
|
167
|
+
| `'temperature' does not support 0` or `temperature is deprecated` | The CLI's temperature setting on a GPT-5.x or Claude Sonnet 5 model | Use GPT-4.1, GPT-4o, Claude Sonnet 4.6, or Claude Haiku 4.5 |
|
|
@@ -21,8 +21,8 @@ two ways:
|
|
|
21
21
|
|
|
22
22
|
- **Use your personal API key (recommended).** goose runs on your own machine,
|
|
23
23
|
so call the project's [User App](../user-apps.mdx). Open the
|
|
24
|
-
[**
|
|
25
|
-
Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
24
|
+
[**My Keys**](https://portal.zuplo.com/+/account/project/ai/home) tab of your
|
|
25
|
+
AI Gateway project, copy the **Gateway URL**, and create a key under **My API
|
|
26
26
|
keys**. Your requests count against your own budget.
|
|
27
27
|
- **Use an app.** For a shared or automated setup,
|
|
28
28
|
[create a pool](../managing-pools.mdx) and [an app](../managing-apps.mdx) for
|
|
@@ -115,15 +115,15 @@ person has already spent in the current period.
|
|
|
115
115
|
|
|
116
116
|
1. **Create a personal API key.** Open the AI Gateway project in the Zuplo
|
|
117
117
|
Portal and go to the
|
|
118
|
-
[**
|
|
118
|
+
[**My Keys**](https://portal.zuplo.com/+/account/project/ai/home) tab. Under
|
|
119
119
|
**My API keys**, click **New key**, give it a name such as `Laptop CLI`, and
|
|
120
120
|
copy the key.
|
|
121
121
|
|
|
122
|
-
1. **Call the gateway.** Copy the **Gateway URL** shown at the top of the
|
|
123
|
-
**
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
122
|
+
1. **Call the gateway.** Copy the **Gateway URL** shown at the top of the **My
|
|
123
|
+
Keys** tab once the gateway has a production deployment—the User App's `/u/`
|
|
124
|
+
URL—and use it with your personal key in place of the provider's base URL and
|
|
125
|
+
API key. The **My Keys** tab also shows setup steps for common tools such as
|
|
126
|
+
Claude Code and Codex.
|
|
127
127
|
|
|
128
128
|
</Stepper>
|
|
129
129
|
|
|
@@ -147,8 +147,8 @@ Completions**, **Responses**, and **Messages**. The integration guides for
|
|
|
147
147
|
[GitHub Copilot](./integrations/github-copilot.mdx), and
|
|
148
148
|
[goose](./integrations/goose.mdx) start from your Gateway URL and personal key.
|
|
149
149
|
|
|
150
|
-
The **
|
|
151
|
-
no budget is set, it says your requests have no personal spending limit. Once
|
|
150
|
+
The **My Keys** tab also shows your allowance and what you've spent against it.
|
|
151
|
+
If no budget is set, it says your requests have no personal spending limit. Once
|
|
152
152
|
you reach your allowance, the gateway refuses requests with
|
|
153
153
|
`429 Too Many Requests` until the period resets or an Admin raises your budget.
|
|
154
154
|
|
|
@@ -95,7 +95,7 @@ const config = {
|
|
|
95
95
|
// ...
|
|
96
96
|
apis: {
|
|
97
97
|
type: "url",
|
|
98
|
-
input: "https://rickandmorty.zuplo.io/openapi.json",
|
|
98
|
+
input: "https://api.rickandmorty.zuplo.io/openapi.json",
|
|
99
99
|
path: "/api",
|
|
100
100
|
},
|
|
101
101
|
// ...
|
|
@@ -251,6 +251,7 @@ const config = {
|
|
|
251
251
|
],
|
|
252
252
|
disablePlayground: false, // Disable the interactive API playground
|
|
253
253
|
disableSidecar: false, // Disable the sidecar completely
|
|
254
|
+
disableRequestBox: false, // Hide the request box at the top of the sidecar
|
|
254
255
|
disableSecurity: true, // Disable security scheme display and playground auth (default)
|
|
255
256
|
disableMcpAuthInstructions: false, // Hide auth steps in the MCP server card
|
|
256
257
|
showVersionSelect: "if-available", // Control version selector visibility
|
|
@@ -272,6 +273,11 @@ Available options:
|
|
|
272
273
|
identifier) and `label` (display name)
|
|
273
274
|
- `disablePlayground`: Disable the interactive API playground globally
|
|
274
275
|
- `disableSidecar`: Disable the sidecar panel completely
|
|
276
|
+
- `disableRequestBox`: Hide the request box at the top of the sidecar. The box holds the method and
|
|
277
|
+
path, the generated code snippet with its language selector, the auth selector and the button that
|
|
278
|
+
opens the playground, so hiding it also removes the way to open the playground. The request body
|
|
279
|
+
and response examples below it are still shown. Operations can override this with
|
|
280
|
+
[`x-zudoku-request-box-enabled`](../openapi-extensions/x-zudoku-request-box-enabled)
|
|
275
281
|
- `disableSecurity`: Disable OpenAPI security scheme display (auth badges on operations, security
|
|
276
282
|
schemes section on the info page, and the Authorize dialog in the playground). Disabled by default
|
|
277
283
|
(`true`). Set to `false` to enable security scheme support
|
|
@@ -310,6 +316,7 @@ const config = {
|
|
|
310
316
|
examplesLanguage: "shell", // Default language for code examples
|
|
311
317
|
disablePlayground: false, // Disable the interactive API playground
|
|
312
318
|
disableSidecar: false, // Disable the sidecar completely
|
|
319
|
+
disableRequestBox: false, // Hide the request box at the top of the sidecar
|
|
313
320
|
disableSecurity: true, // Disable security scheme display and playground auth (default)
|
|
314
321
|
disableMcpAuthInstructions: false, // Hide auth steps in the MCP server card
|
|
315
322
|
showVersionSelect: "if-available", // Control version selector visibility
|
|
@@ -399,9 +406,14 @@ different levels of your API documentation.
|
|
|
399
406
|
### Operations
|
|
400
407
|
|
|
401
408
|
- `x-zudoku-playground-enabled`: Control playground visibility for an operation (default: `true`)
|
|
409
|
+
- `x-zudoku-request-box-enabled`: Control request box visibility in the sidecar for an operation
|
|
410
|
+
(default: `true`). See
|
|
411
|
+
[`x-zudoku-request-box-enabled`](../openapi-extensions/x-zudoku-request-box-enabled)
|
|
402
412
|
- `x-internal`: Hide an operation from the documentation. Also works on path items and parameters.
|
|
403
413
|
See [`x-internal`](../openapi-extensions/x-internal)
|
|
404
|
-
- `x-explorer-enabled`: Alias for `x-zudoku-playground-enabled` for compatibility
|
|
414
|
+
- `x-explorer-enabled`: Alias for `x-zudoku-playground-enabled` for compatibility
|
|
415
|
+
|
|
416
|
+
Example:
|
|
405
417
|
|
|
406
418
|
```json
|
|
407
419
|
{
|
|
@@ -409,7 +421,8 @@ different levels of your API documentation.
|
|
|
409
421
|
"/users": {
|
|
410
422
|
"get": {
|
|
411
423
|
"summary": "Get users",
|
|
412
|
-
"x-zudoku-playground-enabled": false // Disable playground for this operation
|
|
424
|
+
"x-zudoku-playground-enabled": false, // Disable playground for this operation
|
|
425
|
+
"x-zudoku-request-box-enabled": false // Hide the sidecar request box for this operation
|
|
413
426
|
}
|
|
414
427
|
}
|
|
415
428
|
}
|
|
@@ -114,10 +114,17 @@ export default {
|
|
|
114
114
|
An array of [Rehype](https://github.com/rehypejs/rehype) plugins to transform HTML content. These
|
|
115
115
|
plugins run after Markdown is converted to HTML.
|
|
116
116
|
|
|
117
|
+
For example, to render math with [KaTeX](https://katex.org), add `rehype-katex` together with
|
|
118
|
+
`remark-math`, which parses `$...$` and `$$...$$` math in Markdown. KaTeX also needs its stylesheet,
|
|
119
|
+
which you can import in your `zudoku.config.ts` like any other
|
|
120
|
+
[custom CSS](../customization/colors-theme.mdx#custom-css) (`import "katex/dist/katex.min.css";`).
|
|
121
|
+
|
|
117
122
|
```ts
|
|
118
123
|
import rehypeKatex from "rehype-katex";
|
|
124
|
+
import remarkMath from "remark-math";
|
|
119
125
|
|
|
120
126
|
export default {
|
|
127
|
+
remarkPlugins: [remarkMath],
|
|
121
128
|
rehypePlugins: [rehypeKatex],
|
|
122
129
|
};
|
|
123
130
|
```
|
|
@@ -35,6 +35,25 @@ description: This page explains how to use Zudoku's markdown features.
|
|
|
35
35
|
---
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
### `seo`
|
|
39
|
+
|
|
40
|
+
Overrides the browser title (the HTML `<title>`) and meta description without changing the page
|
|
41
|
+
heading or sidebar label. Use it when the visible title is short but search results need more
|
|
42
|
+
context. Both properties are optional and fall back to `title` and `description`.
|
|
43
|
+
|
|
44
|
+
```md
|
|
45
|
+
---
|
|
46
|
+
title: Location Key
|
|
47
|
+
seo:
|
|
48
|
+
title: Daily Forecasts by Location Key
|
|
49
|
+
description: Get daily weather forecasts for a location key, up to 15 days ahead.
|
|
50
|
+
---
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The site-wide [`metadata.title`](/dev-portal/zudoku/configuration/overview#metadata) template still applies to
|
|
54
|
+
`seo.title`. To do the same for an API tag page, use the
|
|
55
|
+
[`x-zudoku-seo`](/dev-portal/zudoku/openapi-extensions/x-zudoku-seo) extension.
|
|
56
|
+
|
|
38
57
|
### `category`
|
|
39
58
|
|
|
40
59
|
Assigns the page to a specific category for organizational purposes. This will be shown above the
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: x-zudoku-request-box-enabled
|
|
3
|
+
sidebar_icon: square-code
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use `x-zudoku-request-box-enabled` to show or hide the request box at the top of an operation's
|
|
7
|
+
sidecar for a specific operation. By default, the request box is shown for all operations unless
|
|
8
|
+
globally disabled via the [`disableRequestBox`](/dev-portal/zudoku/configuration/api-reference) option.
|
|
9
|
+
|
|
10
|
+
The request box holds the method and path, the generated code snippet (or your
|
|
11
|
+
[`x-code-samples`](./x-code-samples)) with its language selector, the auth selector and the button
|
|
12
|
+
that opens the playground. Hiding it also removes the way to open the playground for that operation.
|
|
13
|
+
The request body and response examples below it are still shown.
|
|
14
|
+
|
|
15
|
+
## Location
|
|
16
|
+
|
|
17
|
+
The extension is added at the **Operation Object** level.
|
|
18
|
+
|
|
19
|
+
| Option | Type | Description |
|
|
20
|
+
| ------------------------------ | --------- | ------------------------------------------------ |
|
|
21
|
+
| `x-zudoku-request-box-enabled` | `boolean` | Show (`true`) or hide (`false`) the request box. |
|
|
22
|
+
|
|
23
|
+
If the extension is not set, the request box visibility falls back to the global `disableRequestBox`
|
|
24
|
+
configuration.
|
|
25
|
+
|
|
26
|
+
## Example
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
paths:
|
|
30
|
+
/users:
|
|
31
|
+
get:
|
|
32
|
+
summary: List users
|
|
33
|
+
x-zudoku-request-box-enabled: true
|
|
34
|
+
responses:
|
|
35
|
+
"200":
|
|
36
|
+
description: Successful response
|
|
37
|
+
/webhooks/trigger:
|
|
38
|
+
post:
|
|
39
|
+
summary: Trigger webhook
|
|
40
|
+
x-zudoku-request-box-enabled: false
|
|
41
|
+
responses:
|
|
42
|
+
"200":
|
|
43
|
+
description: Accepted
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
In this example, `List users` shows the request box while `Trigger webhook` hides it regardless of
|
|
47
|
+
the global setting.
|
|
@@ -41,3 +41,6 @@ tags:
|
|
|
41
41
|
|
|
42
42
|
Both tags show `Location Key` in the sidebar and as the page heading, but each page has its own
|
|
43
43
|
browser title and description.
|
|
44
|
+
|
|
45
|
+
To do the same for a Markdown page, use the [`seo`](/dev-portal/zudoku/markdown/frontmatter#seo) frontmatter
|
|
46
|
+
property.
|
package/docs/policies/_index.md
CHANGED
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
| mcp-token-exchange-inbound | MCP Token Exchange | Resolve a gateway-managed upstream MCP credential and apply it to the request before the normal Zuplo route handler forwards the request. Validation runs lazily inside the policy constructor, which the runtime caches per policy name — so a misconfigured policy fails the first request with a `ConfigurationError` (surfaced in the 500 problem body) rather than crashing boot. | mcp-gateway |
|
|
73
73
|
| mcp-workos-oauth-inbound | MCP WorkOS OAuth | Authenticate MCP gateway requests using a gateway-issued OAuth access token, with browser login delegated to WorkOS. WorkOS-friendly wrapper around `McpOAuthInboundPolicy`. Provide `clientId` and `clientSecret`; the constructor derives the WorkOS OIDC issuer, JWKS URL, authorize URL, and token URL automatically and runs the resulting shape through the same Zod schema as the generic policy. | mcp-gateway |
|
|
74
74
|
| mock-api-inbound | Mock API Response | Returns example responses from the OpenAPI document associated with this route. | api-gateway |
|
|
75
|
+
| ai-gateway-load-balancing-inbound | Model Load Balancing | Spreads AI requests across a list of models. The policy cycles through the list, or keeps requests that share a key, such as a user or a conversation, on the same model. Most requests also get a retry model from the list. A request moves there when the chosen model stays rate limited. Chat completions and embeddings requests also move there when the model returns a server error, can't be reached, or times out. The policy picks the model for every request it handles and ignores the request's own `model`, so the list also limits which models clients can reach. An earlier policy's model selection is never overwritten. | ai-gateway |
|
|
75
76
|
| moesif-inbound | Moesif Analytics & Billing | Moesif is an API analytics and billing service. This policy allows you to send metering calls for each API to their events batch endpoint. | api-gateway |
|
|
76
77
|
| monetization-inbound | Monetization | Monetization inbound policy for API key validation and usage metering. | api-gateway |
|
|
77
78
|
| mtls-auth-inbound | mTLS Auth | Authenticate requests based on the mTLS protocol. | api-gateway |
|