zuplo 7.6.1 → 7.6.3

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/ai-gateway/managing-providers.mdx +10 -6
  2. package/docs/ai-gateway/{introduction.mdx → overview.mdx} +7 -7
  3. package/docs/ai-gateway/policies/overview.mdx +1 -1
  4. package/docs/ai-gateway/providers.mdx +31 -2
  5. package/docs/ai-gateway/vertex-ai.mdx +389 -0
  6. package/docs/api-management/{introduction.md → overview.md} +7 -4
  7. package/docs/articles/api-key-administration.mdx +5 -6
  8. package/docs/articles/api-key-consumer-bucket-portal-ui.mdx +5 -5
  9. package/docs/articles/api-key-end-users.mdx +3 -3
  10. package/docs/articles/custom-domains.mdx +1 -1
  11. package/docs/articles/environment-variables.mdx +1 -1
  12. package/docs/articles/feature-flags.mdx +4 -4
  13. package/docs/articles/migrate-from-apigee.md +3 -3
  14. package/docs/articles/migrate-from-aws-api-gateway.md +1 -1
  15. package/docs/articles/migrate-from-azure-apim.md +2 -2
  16. package/docs/articles/migrate-from-kong.md +3 -3
  17. package/docs/articles/migration-overview.md +1 -1
  18. package/docs/articles/monetization-integrations.mdx +2 -2
  19. package/docs/articles/step-3-add-api-key-auth.mdx +1 -1
  20. package/docs/articles/step-5-dynamic-rate-limiting-local.mdx +1 -1
  21. package/docs/articles/step-5-dynamic-rate-limiting.mdx +1 -1
  22. package/docs/articles/version-support-policy.mdx +2 -2
  23. package/docs/cli/create-zuplo-api.mdx +2 -2
  24. package/docs/concepts/ai-gateway.mdx +69 -0
  25. package/docs/concepts/api-keys.md +3 -3
  26. package/docs/concepts/mcp.mdx +63 -0
  27. package/docs/concepts/project-structure.mdx +1 -1
  28. package/docs/dedicated/akamai/ai-powered-applications.mdx +3 -3
  29. package/docs/dev-portal/documenting-mcp-servers.mdx +3 -3
  30. package/docs/dev-portal/{introduction.mdx → overview.mdx} +5 -2
  31. package/docs/dev-portal/zudoku/configuration/api-reference.md +45 -0
  32. package/docs/dev-portal/zudoku/configuration/docs.md +56 -1
  33. package/docs/dev-portal/zudoku/configuration/llms.md +39 -4
  34. package/docs/dev-portal/zudoku/configuration/navigation.mdx +4 -4
  35. package/docs/managed-edge/overview.md +1 -1
  36. package/docs/mcp-gateway/cross-app-access/quickstart.mdx +1 -1
  37. package/docs/mcp-gateway/{introduction.mdx → overview.mdx} +2 -2
  38. package/docs/mcp-gateway/policies/overview.mdx +13 -0
  39. package/docs/mcp-server/custom-tools.mdx +2 -2
  40. package/docs/mcp-server/graphql.mdx +1 -1
  41. package/docs/mcp-server/openai-apps-sdk.mdx +3 -4
  42. package/docs/mcp-server/{introduction.mdx → overview.mdx} +6 -3
  43. package/docs/programmable-api/mcp-sdk.mdx +3 -3
  44. package/package.json +5 -5
@@ -51,9 +51,11 @@ To add a new AI provider to your Zuplo AI Gateway, follow these steps:
51
51
  create an API key for each provider see the
52
52
  [provider documentation](./providers.mdx). The
53
53
  [Zuplo Demo provider](./providers.mdx#zuplo-demo) asks for no API key—your
54
- gateway authenticates to the demo service itself, and
54
+ gateway authenticates to the demo service itself,
55
55
  [Bedrock Mantle](./bedrock-mantle.mdx) additionally asks for an **AWS
56
- Region** and accepts only long-term Bedrock API keys.
56
+ Region** and accepts only long-term Bedrock API keys, and
57
+ [Vertex AI](./vertex-ai.mdx) asks for a **Location** and a **Google Cloud
58
+ Project ID** and takes a service account JSON key file instead of an API key.
57
59
 
58
60
  1. Select the model or models you want to use with this provider. The available
59
61
  models will depend on the selected provider. This can be changed later.
@@ -83,10 +85,12 @@ To modify an existing provider, open
83
85
  and click the **Edit** button next to the provider you want to modify.
84
86
 
85
87
  You can modify the API key and selected models for the provider—and, for
86
- [Bedrock Mantle](./bedrock-mantle.mdx), the AWS Region. The **Provider Name**
87
- isn't editable: it's the routing address in every `providerName/model`
88
- reference, so renaming it would orphan each stored reference to this provider.
89
- After making your changes, click **Save** to apply them.
88
+ [Bedrock Mantle](./bedrock-mantle.mdx), the AWS Region, or for
89
+ [Vertex AI](./vertex-ai.mdx), the Location and Google Cloud Project ID. The
90
+ **Provider Name** isn't editable: it's the routing address in every
91
+ `providerName/model` reference, so renaming it would orphan each stored
92
+ reference to this provider. After making your changes, click **Save** to apply
93
+ them.
90
94
 
91
95
  :::caution
92
96
 
@@ -1,6 +1,6 @@
1
1
  ---
2
- title: Zuplo AI Gateway
3
- sidebar_label: Introduction
2
+ title: AI Gateway overview
3
+ sidebar_label: Overview
4
4
  description:
5
5
  The Zuplo AI Gateway is a proxy between your apps and LLM providers, deployed
6
6
  from your own Git repository, with per-app policy pipelines for cost control,
@@ -76,11 +76,11 @@ usage limits still apply.
76
76
 
77
77
  Configure multiple LLM providers within a single AI Gateway project. Supported
78
78
  providers include OpenAI, Anthropic, Google, Mistral, xAI, Amazon Bedrock
79
- (through [Bedrock Mantle](./bedrock-mantle.mdx)), and OpenAI-compatible custom
80
- providers. See [AI Providers](./providers.mdx) for the full list of providers
81
- and supported capabilities. Apps reference models as `providerName/model`—for
82
- example `openai/gpt-5-mini`—so a single app can use models from several
83
- providers.
79
+ (through [Bedrock Mantle](./bedrock-mantle.mdx)), Google Cloud
80
+ ([Vertex AI](./vertex-ai.mdx)), and OpenAI-compatible custom providers. See
81
+ [AI Providers](./providers.mdx) for the full list of providers and supported
82
+ capabilities. Apps reference models as `providerName/model`—for example
83
+ `openai/gpt-5-mini`—so a single app can use models from several providers.
84
84
 
85
85
  ### Source-Controlled Gateway
86
86
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: AI Gateway policies
2
+ title: AI Gateway policies overview
3
3
  sidebar_label: Overview
4
4
  description: Every policy an AI Gateway app can run, and what each one does.
5
5
  ---
@@ -3,8 +3,8 @@ title: AI Providers
3
3
  sidebar_label: Overview
4
4
  description:
5
5
  The AI providers and capabilities the Zuplo AI Gateway supports, including
6
- OpenAI, Anthropic, Google, Mistral, xAI, and OpenAI-compatible custom
7
- providers.
6
+ OpenAI, Anthropic, Google, Vertex AI, Mistral, xAI, and OpenAI-compatible
7
+ custom providers.
8
8
  ---
9
9
 
10
10
  Zuplo's AI Gateway supports integration with various AI providers, allowing you
@@ -21,6 +21,8 @@ Zuplo currently supports the following AI providers:
21
21
  - xAI (Grok)
22
22
  - [Bedrock Mantle](./bedrock-mantle.mdx)—Amazon Bedrock's compatible-APIs
23
23
  endpoint, serving Claude models and models from many other vendors
24
+ - [Vertex AI](./vertex-ai.mdx)—Google Cloud's managed model platform, serving
25
+ Gemini and Model Garden models on your own Google Cloud project
24
26
  - [Zuplo Demo](#zuplo-demo)—a free, keyless provider for trying the gateway
25
27
  - OpenAI-compatible [Custom Providers](./custom-providers.mdx) (such as Qwen,
26
28
  Kimi, etc)
@@ -35,6 +37,7 @@ The following capabilities are supported across providers:
35
37
  | Mistral | ✅ | ✅ | ❌ | ❌ |
36
38
  | xAI | ✅ | ✅ | ❌ | ❌ |
37
39
  | Bedrock Mantle | ✅ | ❌ | ✅ | ✅ |
40
+ | Vertex AI | ✅ | ✅ | ❌ | ❌ |
38
41
  | Zuplo Demo | ✅ | ❌ | ❌ | ❌ |
39
42
  | OpenAI-compatible (Custom) | ✅ | ✅ | ❌ | ❌ |
40
43
 
@@ -77,6 +80,32 @@ instead of an endpoint URL, and it accepts only long-term Bedrock API keys,
77
80
  which start with `ABSK`. For prerequisites, setup steps, code examples, and
78
81
  troubleshooting, see [Using Bedrock Mantle](./bedrock-mantle.mdx).
79
82
 
83
+ ## Vertex AI
84
+
85
+ **Vertex AI** is Google Cloud's managed model platform. One provider
86
+ configuration serves both the Gemini family and Vertex's Model Garden partner
87
+ models—DeepSeek, Qwen, GLM, Kimi, MiniMax, Gemma, and GPT-OSS—from your own
88
+ Google Cloud project, on your Google Cloud billing.
89
+
90
+ Two things make its setup different from every other provider:
91
+
92
+ - **It authenticates with a service account, not an API key.** Vertex's
93
+ prediction endpoints reject API keys, so the dialog asks for a service account
94
+ JSON key file and the gateway exchanges it for short-lived access tokens.
95
+ - **It needs a Google Cloud project as well as a location.** Vertex endpoints
96
+ are per-location, and the project isn't part of the endpoint, so the dialog
97
+ asks for both.
98
+
99
+ Every Vertex model ID is publisher-qualified, so a model reference has two
100
+ slashes: a provider named `vertexai` serves `vertexai/google/gemini-3.7-flash`
101
+ and `vertexai/qwen/qwen3-coder-480b-a35b-instruct-maas`. Model availability
102
+ varies by location—most Model Garden models are served only from the `global`
103
+ location. Vertex also hosts Anthropic's Claude models, but on a different API
104
+ surface that the gateway doesn't route to.
105
+
106
+ For prerequisites, Google Cloud setup, provider steps, code examples, and
107
+ troubleshooting, see [Using Vertex AI](./vertex-ai.mdx).
108
+
80
109
  ## Zuplo Demo
81
110
 
82
111
  **Zuplo Demo** is a free provider that Zuplo operates so you can try the AI
@@ -0,0 +1,389 @@
1
+ ---
2
+ title: Using Vertex AI
3
+ sidebar_label: Vertex AI
4
+ description:
5
+ Serve Gemini and Model Garden models from your own Google Cloud project
6
+ through one provider configuration—one Vertex AI location, one project ID, and
7
+ one service account key. The gateway mints and refreshes the access tokens
8
+ Vertex requires.
9
+ ---
10
+
11
+ **Vertex AI** is Google Cloud's managed model platform. Adding it as a provider
12
+ serves both the Gemini family and Vertex's Model Garden partner models—DeepSeek,
13
+ Qwen, GLM, Kimi, MiniMax, Gemma, and GPT-OSS—to your [apps](./apps.mdx) through
14
+ the [Universal API](./universal-api.mdx), running on your Google Cloud project
15
+ and your Google Cloud billing.
16
+
17
+ Chat completions go to Vertex's **OpenAI-compatible endpoint**, so the gateway
18
+ forwards OpenAI-shaped requests without translating them. Embeddings work too,
19
+ though Vertex has no OpenAI-compatible embeddings endpoint—the gateway
20
+ translates those onto Vertex's own embedding APIs, which is invisible from your
21
+ app. What sets this provider apart is how you connect it: the endpoint is
22
+ per-location, the Google Cloud project is a separate setting, and the credential
23
+ is a **service account key file**—not an API key.
24
+
25
+ :::caution{title="Vertex AI doesn't accept API keys"}
26
+
27
+ Every other AI Gateway provider takes an API key. Vertex doesn't: its prediction
28
+ endpoints reject API keys outright, answering that they expect an OAuth2 access
29
+ token instead. The provider dialog asks for the JSON key file of a Google Cloud
30
+ service account, and the gateway exchanges it for short-lived access tokens on
31
+ your behalf. Pasting an API key into the field fails validation before the
32
+ provider is saved.
33
+
34
+ :::
35
+
36
+ ## Model references include the publisher prefix
37
+
38
+ Apps reference a provider's models as `providerName/model`. Every Vertex model
39
+ ID is publisher-qualified, so a Vertex model reference has two slashes in it:
40
+
41
+ ```
42
+ vertexai/google/gemini-3.7-flash
43
+ └──┬───┘ └──────────┬──────────┘
44
+ provider model
45
+ ```
46
+
47
+ Everything before the **first** slash is the provider name you chose, and
48
+ everything after it is the model ID exactly as Vertex expects it. The publisher
49
+ isn't always `google`—Model Garden models carry their own vendor's prefix. A
50
+ provider named `vertexai` serves all of these:
51
+
52
+ - `vertexai/google/gemini-3.7-flash`
53
+ - `vertexai/qwen/qwen3-coder-480b-a35b-instruct-maas`
54
+ - `vertexai/deepseek-ai/deepseek-v3.2-maas`
55
+ - `vertexai/zai-org/glm-5-maas`
56
+
57
+ Copy model IDs from the model picker rather than typing them—the `-maas` suffix
58
+ and the publisher prefix are both part of the ID.
59
+
60
+ ## How the gateway calls Vertex AI
61
+
62
+ When no valid cached token exists, the gateway uses the service account key to
63
+ request a short-lived Google OAuth 2.0 access token. It caches and refreshes
64
+ that token, then calls Vertex's OpenAI-compatible endpoint with the token as the
65
+ bearer credential.
66
+
67
+ <Diagram height="h-64">
68
+ <DiagramNode id="app">Your app</DiagramNode>
69
+ <DiagramNode id="gateway" variant="zuplo">
70
+ AI Gateway
71
+ </DiagramNode>
72
+ <DiagramNode id="oauth" variant="orange">
73
+ Google OAuth
74
+ </DiagramNode>
75
+ <DiagramGroup id="gcp" label="Your Google Cloud project">
76
+ <DiagramNode id="compat" variant="blue">
77
+ OpenAI-compatible endpoint
78
+ </DiagramNode>
79
+ <DiagramNode id="embed" variant="green">
80
+ Vertex embedding APIs
81
+ </DiagramNode>
82
+ </DiagramGroup>
83
+ <DiagramEdge from="app" to="gateway" label="Universal API" />
84
+ <DiagramEdge
85
+ from="gateway"
86
+ to="oauth"
87
+ label="service account key → access token"
88
+ lineStyle="dashed"
89
+ />
90
+ <DiagramEdge from="gateway" to="compat" label="chat completions" />
91
+ <DiagramEdge from="gateway" to="embed" label="embeddings" />
92
+ </Diagram>
93
+
94
+ The request URL the gateway builds combines both settings you enter:
95
+
96
+ ```
97
+ https://us-central1-aiplatform.googleapis.com
98
+ /v1/projects/my-project-123/locations/us-central1/endpoints/openapi/chat/completions
99
+ ```
100
+
101
+ The **location** lives in the hostname, which is why the provider dialog asks
102
+ for a location instead of an endpoint URL. The **project** doesn't appear in the
103
+ hostname at all—it appears only in the path—so it can't be derived from the
104
+ endpoint and is a field of its own. That's why the project is required rather
105
+ than optional: without it the gateway would have to guess, and a guess would
106
+ send your traffic and your spend to someone else's Google Cloud project.
107
+
108
+ ## Supported endpoints
109
+
110
+ | Endpoint | Vertex AI models |
111
+ | ---------------------- | ---------------- |
112
+ | `/v1/chat/completions` | ✅ Forwarded |
113
+ | `/v1/embeddings` | ✅ Translated |
114
+ | `/v1/responses` | ❌ |
115
+ | `/v1/messages` | ❌ |
116
+
117
+ Streaming (`stream: true`) works on chat completions.
118
+
119
+ The gateway rejects `/v1/responses` and `/v1/messages` requests for Vertex
120
+ models with a `400` error before any upstream call, because Vertex serves
121
+ neither the OpenAI Responses API nor the Anthropic Messages API.
122
+
123
+ :::note{title="Anthropic models on Vertex aren't supported"}
124
+
125
+ Vertex also hosts Anthropic's Claude models, but on a different API surface than
126
+ the one this provider uses. The gateway can't route to them. To use Claude
127
+ models, add the [Anthropic](./providers.mdx) provider or
128
+ [Bedrock Mantle](./bedrock-mantle.mdx).
129
+
130
+ :::
131
+
132
+ ## Model availability depends on the location
133
+
134
+ Google registers each Vertex model in specific locations, and it changes that
135
+ list over time. Most Model Garden models are served only from the **global**
136
+ location; the Gemini models are more widely available.
137
+
138
+ The model picker doesn't filter by your provider's location, so every model
139
+ stays selectable from every provider. If you call a model that isn't served
140
+ where your provider points, Vertex answers with a `400` that names both:
141
+
142
+ ```
143
+ Publisher model 'publishers/qwen/models/qwen3-coder-480b-a35b-instruct-maas'
144
+ is not available in region 'us-central1'
145
+ ```
146
+
147
+ Set the provider's **Location** to `global` if you plan to use Model Garden
148
+ models, or add a second Vertex provider for a specific region and route to
149
+ whichever one serves the model you want.
150
+
151
+ ## Before you begin
152
+
153
+ You need:
154
+
155
+ - A Google Cloud project with the **Vertex AI API**
156
+ (`aiplatform.googleapis.com`) enabled and billing enabled. Gemini models
157
+ require both.
158
+ - A service account in that project holding the **Vertex AI User**
159
+ (`roles/aiplatform.user`) role, and a **JSON key** for it. The steps are in
160
+ [Set up Google Cloud](#set-up-google-cloud).
161
+ - The project's **project ID**—the readable identifier such as `my-project-123`,
162
+ not the numeric project number.
163
+ - An AI Gateway project in the Zuplo Portal.
164
+ - An AI Gateway [app](./apps.mdx) to call the models from. The app page shows
165
+ the app's API URL, and its API key lives on the app's **API Key** tab.
166
+
167
+ ## Set up Google Cloud
168
+
169
+ Do this before adding the provider—the key file you download in the last step is
170
+ what the provider dialog asks for.
171
+
172
+ <Stepper>
173
+
174
+ 1. In the [Google Cloud console](https://console.cloud.google.com/), select the
175
+ project you want to serve models from and note its **project ID**. The
176
+ console shows the ID next to the project name, alongside the project number;
177
+ the gateway needs the ID.
178
+
179
+ 1. Enable the **Vertex AI API** on the project, under **APIs & Services →
180
+ Library**. Confirm billing is enabled for the project as well.
181
+
182
+ 1. Create a service account under **IAM & Admin → Service Accounts**.
183
+
184
+ 1. Grant that service account the **Vertex AI User** (`roles/aiplatform.user`)
185
+ role **on the same project**. This is the smallest role that can call
186
+ prediction endpoints. Vertex AI Administrator grants more than the gateway
187
+ needs, and Vertex AI Viewer can't make predictions at all.
188
+
189
+ 1. Create a JSON key for the service account: open the service account, go to
190
+ **Keys → Add key → Create new key**, choose **JSON**, and download the file.
191
+ Keep it somewhere safe—Google doesn't let you download it again.
192
+
193
+ </Stepper>
194
+
195
+ :::note
196
+
197
+ Enabling the API and granting the role are separate steps, and missing the first
198
+ one is the most common setup failure. It surfaces as a `403` that talks about
199
+ the Vertex AI API rather than about permissions, which reads like a bad key.
200
+
201
+ :::
202
+
203
+ ## Add the provider
204
+
205
+ Adding or editing providers requires the **Edit** permission, granted to Zuplo
206
+ account and project **Admins**—see
207
+ [Managing Providers](./managing-providers.mdx).
208
+
209
+ <Stepper>
210
+
211
+ 1. Open
212
+ [**Settings → AI Providers**](https://portal.zuplo.com/+/account/project/ai/settings/data-models)
213
+ in your AI Gateway project in the Zuplo Portal.
214
+
215
+ 1. Click the **Add Provider** button.
216
+
217
+ 1. In the **AI Provider** list, select **Vertex AI** from the Default Providers
218
+ group.
219
+
220
+ 1. Review the **Provider Name**, which fills in as `vertexai` (a second
221
+ configuration becomes `vertexai-2`). You can replace it with your own name,
222
+ but only now—the name is permanent after creation, and it's the prefix in
223
+ every model reference: a provider named `vertexai` serves
224
+ `vertexai/google/gemini-3.7-flash`.
225
+
226
+ 1. In **Location**, enter the Vertex AI location to call, such as `us-central1`
227
+ or `europe-west4`. Enter `global` to use Vertex's global endpoint. The
228
+ gateway derives the endpoint from this value—there's no URL to enter.
229
+
230
+ 1. In **Google Cloud Project ID**, enter the project ID you noted earlier, such
231
+ as `my-project-123`. The dialog rejects an all-digits value, which is the
232
+ project number rather than the ID.
233
+
234
+ 1. In **Service Account Key (JSON)**, paste the entire contents of the JSON key
235
+ file you downloaded. Paste it whole—a truncated copy fails validation.
236
+
237
+ 1. Select the models to enable, or click **Select All**. The picker shows
238
+ Google's per-token prices, which the gateway uses to track cost per app. You
239
+ can change the selection later.
240
+
241
+ 1. Click **Create**.
242
+
243
+ </Stepper>
244
+
245
+ :::note
246
+
247
+ Saving provider settings triggers an automatic production deployment of your
248
+ gateway, because provider credentials are part of the deployed gateway. The
249
+ change is live once the deployment completes.
250
+
251
+ :::
252
+
253
+ :::note{title="Prices in the picker are a snapshot"}
254
+
255
+ The per-token prices shown in the model picker are recorded rates, not a live
256
+ read of Google's price list, and some Gemini models are on promotional rates
257
+ that Google marks as temporary. Treat the gateway's cost figures as an estimate
258
+ and your Google Cloud bill as the record.
259
+
260
+ :::
261
+
262
+ When you edit the provider later—see
263
+ [Managing Providers](./managing-providers.mdx)—the **Location** and **Google
264
+ Cloud Project ID** fields show the saved values and stay editable, and you can
265
+ replace the key file. Leave the key field blank to keep the stored key. The
266
+ **Provider Name** doesn't change.
267
+
268
+ ## Verify the provider
269
+
270
+ Once the deployment completes, send a chat completions request to your app's
271
+ [Universal API](./universal-api.mdx) URL—shown at the top of the
272
+ [app page](./apps.mdx)—with the app's API key as the bearer token and one of the
273
+ models you enabled:
274
+
275
+ ```bash
276
+ curl https://my-gateway-main-2e18f50.zuplo.app/config_fe0a04972d2848e0a94ae4b8bcd1497e/v1/chat/completions \
277
+ -H "Authorization: Bearer $ZUPLO_APP_API_KEY" \
278
+ -H "Content-Type: application/json" \
279
+ -d '{
280
+ "model": "vertexai/google/gemini-3.7-flash",
281
+ "messages": [{ "role": "user", "content": "Say hi" }]
282
+ }'
283
+ ```
284
+
285
+ The URL is a sample—replace it with your app's API URL plus
286
+ `/v1/chat/completions`, set `ZUPLO_APP_API_KEY` to the app's API key, and
287
+ substitute any model you enabled for `vertexai/google/gemini-3.7-flash`.
288
+
289
+ A `200` response confirms the provider works; the body carries
290
+ `"provider": "vertex-ai"`—the provider type, not the name you chose. If the
291
+ request fails immediately after you save the provider, the deployment may not
292
+ have finished—retry before debugging further.
293
+
294
+ ## Call the models
295
+
296
+ Use any OpenAI client with your app's URL plus `/v1` as the base URL and the
297
+ app's API key:
298
+
299
+ ```ts
300
+ import OpenAI from "openai";
301
+
302
+ const client = new OpenAI({
303
+ apiKey: process.env.ZUPLO_APP_API_KEY,
304
+ baseURL:
305
+ "https://my-gateway-main-2e18f50.zuplo.app/config_fe0a04972d2848e0a94ae4b8bcd1497e/v1",
306
+ });
307
+
308
+ const response = await client.chat.completions.create({
309
+ model: "vertexai/google/gemini-3.7-flash",
310
+ messages: [{ role: "user", content: "Summarize this ticket." }],
311
+ });
312
+ ```
313
+
314
+ Streaming works the same way—set `stream: true` and read the
315
+ `chat.completion.chunk` events.
316
+
317
+ ### Embeddings
318
+
319
+ Embeddings use the same client and the same `/v1/embeddings` endpoint as any
320
+ other provider:
321
+
322
+ ```ts
323
+ const embeddings = await client.embeddings.create({
324
+ model: "vertexai/google/gemini-embedding-2",
325
+ input: ["first document", "second document"],
326
+ });
327
+ ```
328
+
329
+ `dimensions` and `encoding_format` both work. Two Vertex-specific limits apply,
330
+ and the gateway enforces both before calling Vertex, so you get a `400` rather
331
+ than a partial charge:
332
+
333
+ - **At most 250 inputs per request.** Split larger batches yourself.
334
+ - **Text input only.** Pre-tokenized input—arrays of token IDs, which the OpenAI
335
+ API also accepts—is rejected, because Vertex has no way to represent it. Send
336
+ the original text.
337
+
338
+ ## Troubleshooting
339
+
340
+ **The dialog rejects your credential.** Vertex uses a service account, not an
341
+ API key. The field takes the whole JSON key file downloaded from **IAM & Admin →
342
+ Service Accounts → Keys**. The dialog also rejects a workload identity
343
+ federation configuration—its `type` is `external_account` rather than
344
+ `service_account`—and a file whose `private_key` isn't a PEM-encoded key. Paste
345
+ the file exactly as downloaded, keeping the `\n` escapes intact.
346
+
347
+ **The dialog rejects your project ID.** Project IDs are 6 to 30 characters:
348
+ lowercase letters, digits, and hyphens, starting with a letter and not ending in
349
+ one. An all-digits value is the project number, which the Google Cloud console
350
+ shows next to the ID; the gateway needs the ID.
351
+
352
+ **A request fails with a `403` about the Vertex AI API.** The API isn't enabled
353
+ on the project. Enable **Vertex AI API** under **APIs & Services → Library** and
354
+ confirm the project has billing enabled. This error names the API rather than
355
+ permissions, so it's easy to mistake for a credential problem.
356
+
357
+ **A request fails with a permission error.** The service account is missing the
358
+ **Vertex AI User** (`roles/aiplatform.user`) role, or holds it on a different
359
+ project than the one configured on the provider. Grant the role on the same
360
+ project you entered as the **Google Cloud Project ID**.
361
+
362
+ **A request fails with `400` saying the model isn't available in the region.**
363
+ The model isn't served from your provider's location. Most Model Garden models
364
+ are global-only—see
365
+ [Model availability](#model-availability-depends-on-the-location). Set the
366
+ provider's **Location** to `global`, or use a provider that points at a location
367
+ serving that model.
368
+
369
+ **An embeddings request fails with `400` about the input.** The gateway accepts
370
+ at most 250 inputs per request and text input only. See
371
+ [Embeddings](#embeddings).
372
+
373
+ **A `/v1/responses` or `/v1/messages` request fails with `400`.** Vertex's
374
+ OpenAI-compatible endpoint serves neither API. Use `/v1/chat/completions`, or
375
+ another provider for those endpoints—see
376
+ [Supported endpoints](#supported-endpoints).
377
+
378
+ ## Next steps
379
+
380
+ - [AI Providers](./providers.mdx)—the capability matrix across every supported
381
+ provider.
382
+ - [Universal API](./universal-api.mdx)—the endpoints every app serves and how
383
+ model references work.
384
+ - [Managing Providers](./managing-providers.mdx)—edit models, keys, the
385
+ location, and the project, and understand when changes deploy.
386
+ - [AI Gateway Apps](./apps.mdx)—create the apps that call your Vertex-backed
387
+ models.
388
+ - [Model Filtering policy](../policies/ai-gateway-model-filtering-v2-inbound.mdx)—control
389
+ which models each app can call.
@@ -1,6 +1,9 @@
1
1
  ---
2
- title: Zuplo API Management
3
- sidebar_label: Introduction
2
+ title: API Management overview
3
+ sidebar_label: Overview
4
+ description:
5
+ Secure, transform, and operate APIs with Zuplo's programmable gateway,
6
+ built-in policies, analytics, and developer tooling.
4
7
  ---
5
8
 
6
9
  The Zuplo Gateway is a fully-managed, lightweight API management platform
@@ -11,8 +14,8 @@ engineering team, Zuplo makes it easy to:
11
14
  - [Add authentication and access control](../articles/step-3-add-api-key-auth.mdx)
12
15
  - [Implement rate limiting](../articles/step-2-add-rate-limiting.mdx)
13
16
  - Write custom logic to run at the gateway layer
14
- - Build a [rich developer portal](../dev-portal/introduction.mdx) with
15
- self-serve tools for auth and monetization
17
+ - Build a [rich developer portal](../dev-portal/overview.mdx) with self-serve
18
+ tools for auth and monetization
16
19
 
17
20
  Zuplo delivers the core benefits of API management without the overhead of
18
21
  legacy platforms. That means no expensive licensing, training requirements, or
@@ -28,12 +28,11 @@ Once a consumer is created, view or copy its API Key using the icons shown.
28
28
 
29
29
  ![A consumer row with icons to view and copy its API key](../../public/media/api-key-administration/image-5.png)
30
30
 
31
- If you're using the Zuplo [Developer Portal](../dev-portal/introduction.mdx),
32
- we've an integration with the API Key API that allows developers to access their
33
- API keys, create new ones and delete them. To enable this, you must assign one
34
- or more managers, via e-mail, to be a manager for your API Key Consumer. This is
35
- optional if you aren't using the
36
- [Developer Portal](../dev-portal/introduction.mdx).
31
+ If you're using the Zuplo [Developer Portal](../dev-portal/overview.mdx), we've
32
+ an integration with the API Key API that allows developers to access their API
33
+ keys, create new ones and delete them. To enable this, you must assign one or
34
+ more managers, via e-mail, to be a manager for your API Key Consumer. This is
35
+ optional if you aren't using the [Developer Portal](../dev-portal/overview.mdx).
37
36
 
38
37
  You can assign managers from your project's
39
38
  [Services](https://portal.zuplo.com/+/account/project/services) page in the
@@ -101,11 +101,11 @@ the API Key Authentication policy's `bucketId` option takes.
101
101
 
102
102
  ### Consumer form fields
103
103
 
104
- | Field | Required | Runtime value | Notes |
105
- | ---------------- | -------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
106
- | **Subject** | Yes | `request.user.sub` | Unique within the bucket. Identifies the consumer in logs and policy code. |
107
- | **Key managers** | No | n/a | Comma-separated emails of users who can manage this consumer's keys via the [Developer Portal](../dev-portal/introduction.mdx). |
108
- | **Metadata** | No | `request.user.data` | Valid JSON object. Plan info, customer IDs, anything your policies need at runtime. |
104
+ | Field | Required | Runtime value | Notes |
105
+ | ---------------- | -------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------- |
106
+ | **Subject** | Yes | `request.user.sub` | Unique within the bucket. Identifies the consumer in logs and policy code. |
107
+ | **Key managers** | No | n/a | Comma-separated emails of users who can manage this consumer's keys via the [Developer Portal](../dev-portal/overview.mdx). |
108
+ | **Metadata** | No | `request.user.data` | Valid JSON object. Plan info, customer IDs, anything your policies need at runtime. |
109
109
 
110
110
  :::tip
111
111
 
@@ -52,9 +52,9 @@ keys or create new keys for your consumers manually.
52
52
 
53
53
  ## Zuplo Developer Portal
54
54
 
55
- If you publish a [Zuplo Developer Portal](../dev-portal/introduction.mdx) for
56
- your API consumers, you can let authenticated users manage their own keys
57
- without contacting your team.
55
+ If you publish a [Zuplo Developer Portal](../dev-portal/overview.mdx) for your
56
+ API consumers, you can let authenticated users manage their own keys without
57
+ contacting your team.
58
58
 
59
59
  By default, a consumer's keys are visible to any signed-in user whose email
60
60
  matches a manager email assigned to that consumer. Consumers can copy and rotate
@@ -20,7 +20,7 @@ Zuplo supports two types of custom domains that can be configured separately:
20
20
  2. **Developer Portal Custom Domain**: For your developer documentation site
21
21
  (for example, `docs.example.com`). This domain uses the CNAME
22
22
  `cname.zuplodocs.com`. Learn more about the Developer Portal in the
23
- [Developer Portal documentation](/docs/dev-portal/introduction).
23
+ [Developer Portal documentation](/docs/dev-portal/overview).
24
24
 
25
25
  Both types of custom domains can be managed from the same Custom Domains section
26
26
  in your project settings and follow a similar configuration process.
@@ -72,7 +72,7 @@ Environment variables can't start with `ZUPLO_` or `__ZUPLO`. The same
72
72
  restriction applies to names beginning with `ZUDOKU_`.
73
73
 
74
74
  If you need a variable that's exposed to the
75
- [Developer Portal](../dev-portal/introduction.mdx) build, prefix it with
75
+ [Developer Portal](../dev-portal/overview.mdx) build, prefix it with
76
76
  `ZUPLO_PUBLIC_` (or `ZUDOKU_PUBLIC_`). Public-prefixed variables are bundled
77
77
  into the portal's static output and **must not contain secrets**, as they're
78
78
  visible to anyone who loads the page.
@@ -398,10 +398,10 @@ reads with the patterns above.
398
398
  ## Gate an MCP server with flags
399
399
 
400
400
  If you're fronting an MCP server with the
401
- [MCP Gateway](../mcp-gateway/introduction.mdx), the same policies apply — MCP
402
- routes run the standard inbound policy chain before the handler. Add your
403
- feature-gate policy to the MCP route to control access per user or plan, for
404
- example to make MCP access a paid-tier feature or to turn off a beta server.
401
+ [MCP Gateway](../mcp-gateway/overview.mdx), the same policies apply — MCP routes
402
+ run the standard inbound policy chain before the handler. Add your feature-gate
403
+ policy to the MCP route to control access per user or plan, for example to make
404
+ MCP access a paid-tier feature or to turn off a beta server.
405
405
 
406
406
  For curating _which tools_ a server exposes, start with the static
407
407
  [capability filtering](../mcp-gateway/capability-filtering.mdx) policy, which
@@ -84,7 +84,7 @@ Zuplo has a video walkthrough of the Apigee to Zuplo migration process:
84
84
  | Environment | [Environment](./environments.md) |
85
85
  | API Product | API key with [metadata](./api-key-management.md) |
86
86
  | Developer App | [API key consumer](./api-key-management.md) |
87
- | Apigee Developer Portal | [Zuplo Developer Portal](../dev-portal/introduction.md) |
87
+ | Apigee Developer Portal | [Zuplo Developer Portal](../dev-portal/overview.mdx) |
88
88
  | VerifyAPIKey policy | [API Key Authentication](../policies/api-key-inbound.md) |
89
89
  | OAuthV2 policy | [JWT authentication policies](../policies/open-id-jwt-auth-inbound.md) |
90
90
  | SpikeArrest | [Rate Limiting](../policies/rate-limit-inbound.md) |
@@ -306,7 +306,7 @@ export default async function (
306
306
  ### Step 5: Migrate your developer portal
307
307
 
308
308
  Apigee's Drupal-based developer portal requires significant setup and
309
- maintenance. Zuplo's [Developer Portal](../dev-portal/introduction.md) is
309
+ maintenance. Zuplo's [Developer Portal](../dev-portal/overview.mdx) is
310
310
  automatically generated from your OpenAPI spec and includes:
311
311
 
312
312
  - Interactive API reference documentation
@@ -404,5 +404,5 @@ between both gateways.
404
404
  - [Set up your first Zuplo gateway](./step-1-setup-basic-gateway.md)
405
405
  - [Add rate limiting](./step-2-add-rate-limiting.md)
406
406
  - [Add API key authentication](./step-3-add-api-key-auth.md)
407
- - [Configure your developer portal](../dev-portal/introduction.md)
407
+ - [Configure your developer portal](../dev-portal/overview.mdx)
408
408
  - [Set up source control](./source-control.md)
@@ -244,5 +244,5 @@ secrets to secure the connection between Zuplo and your AWS backends.
244
244
  - [Set up your first Zuplo gateway](./step-1-setup-basic-gateway.md)
245
245
  - [Add rate limiting](./step-2-add-rate-limiting.md)
246
246
  - [Add API key authentication](./step-3-add-api-key-auth.md)
247
- - [Configure your developer portal](../dev-portal/introduction.md)
247
+ - [Configure your developer portal](../dev-portal/overview.mdx)
248
248
  - [Set up source control](./source-control.md)