zuplo 7.9.13 → 7.9.15
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/bedrock-runtime.mdx +1 -1
- package/docs/ai-gateway/custom-policies.mdx +1 -1
- package/docs/ai-gateway/fallback.mdx +1 -1
- package/docs/ai-gateway/integrations/ai-sdk.mdx +5 -5
- package/docs/ai-gateway/integrations/claude-code.mdx +6 -8
- package/docs/ai-gateway/integrations/codex.mdx +6 -5
- package/docs/ai-gateway/integrations/goose.mdx +3 -3
- package/docs/ai-gateway/integrations/langchain.mdx +1 -1
- package/docs/ai-gateway/integrations/openai.mdx +3 -3
- package/docs/ai-gateway/managing-providers.mdx +1 -1
- package/docs/ai-gateway/openrouter.mdx +14 -13
- package/docs/ai-gateway/overview.mdx +4 -2
- package/docs/ai-gateway/providers.mdx +2 -2
- package/docs/ai-gateway/source-control.mdx +61 -2
- package/docs/ai-gateway/universal-api.mdx +1 -1
- package/docs/ai-gateway/user-apps.mdx +5 -2
- package/docs/articles/accounts/audit-logs.mdx +3 -9
- package/docs/articles/environment-variables.mdx +56 -231
- package/docs/articles/graphql-support.mdx +59 -18
- package/docs/articles/local-development-env-variables.mdx +37 -8
- package/docs/articles/logging.mdx +21 -0
- package/docs/articles/opentelemetry.mdx +1 -1
- package/docs/cli/source-upgrade.mdx +39 -0
- package/docs/cli/source-upgrade.partial.mdx +11 -0
- package/docs/concepts/ai-gateway.mdx +1 -1
- package/docs/dev-portal/zudoku/guides/environment-variables.md +75 -0
- package/docs/dev-portal/zudoku-partials/guides/environment-variables.partial.md +74 -0
- package/docs/handlers/mcp-server.mdx +72 -0
- package/docs/mcp-server/overview.mdx +7 -0
- package/docs/mcp-server/tools.mdx +72 -0
- package/docs/policies/_index.md +1 -1
- package/docs/policies/ai-gateway-auth-inbound/doc.md +2 -2
- package/docs/policies/ai-gateway-configuration-executor-inbound/doc.md +3 -3
- package/docs/policies/ai-gateway-prompt-injection/doc.md +1 -2
- package/docs/policies/ai-gateway-prompt-injection/schema.json +2 -2
- package/docs/policies/ai-gateway-smart-router-inbound/doc.md +112 -29
- package/docs/policies/ai-gateway-smart-router-inbound/schema.json +109 -12
- package/docs/policies/internal-only-inbound/doc.md +206 -0
- package/docs/policies/internal-only-inbound/intro.md +10 -0
- package/docs/policies/internal-only-inbound/schema.json +75 -0
- package/docs/programmable-api/environment.mdx +220 -48
- package/docs/programmable-api/hooks.mdx +24 -0
- package/docs/programmable-api/mcp-sdk.mdx +22 -0
- package/package.json +5 -5
- package/docs/policies/ai-gateway-internal-only-inbound/doc.md +0 -102
- package/docs/policies/ai-gateway-internal-only-inbound/intro.md +0 -11
- package/docs/policies/ai-gateway-internal-only-inbound/schema.json +0 -50
|
@@ -234,7 +234,7 @@ model ID, the same as every other provider. Cross-region inference profiles are
|
|
|
234
234
|
priced too: the `us.`, `eu.`, `apac.`, `au.`, `jp.`, `us-gov.`, and `global.`
|
|
235
235
|
IDs are catalog rows in their own right, each at its own rate. A
|
|
236
236
|
foundation-model or inference-profile ARN, such as
|
|
237
|
-
`arn:aws:bedrock:eu-central-1:123456789012:inference-profile/eu.anthropic.claude-opus-
|
|
237
|
+
`arn:aws:bedrock:eu-central-1:123456789012:inference-profile/eu.anthropic.claude-opus-5-5`,
|
|
238
238
|
is priced as the ID it contains. Every model you can call has a catalog price,
|
|
239
239
|
so each request counts toward token, request, and spending
|
|
240
240
|
[budgets](./usage-limits.mdx).
|
|
@@ -144,7 +144,7 @@ terms. By the end, one app on your gateway rejects a prompt containing
|
|
|
144
144
|
-H "Authorization: Bearer YOUR_APP_API_KEY" \
|
|
145
145
|
-H "Content-Type: application/json" \
|
|
146
146
|
-d '{
|
|
147
|
-
"model": "openai/gpt-
|
|
147
|
+
"model": "openai/gpt-6-luna",
|
|
148
148
|
"messages": [{"role": "user", "content": "Tell me about acme-secret-project"}]
|
|
149
149
|
}'
|
|
150
150
|
```
|
|
@@ -38,7 +38,7 @@ models are referenced like any model, as `providerName/model`.
|
|
|
38
38
|
- **Fallback**: the model attempted after a retryable error or timeout, for
|
|
39
39
|
example `anthropic/claude-haiku-4-5`.
|
|
40
40
|
- **Quota fallback**: the model used once a usage limit is exceeded, for
|
|
41
|
-
example `openai/gpt-
|
|
41
|
+
example `openai/gpt-6-luna`.
|
|
42
42
|
- **Fallback timeout (seconds)**: how long the primary call can run before
|
|
43
43
|
the gateway fails over. The default is `60`; values from `1` to `300` are
|
|
44
44
|
accepted.
|
|
@@ -71,7 +71,7 @@ const openai = createOpenAI({
|
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
const { text } = await generateText({
|
|
74
|
-
model: openai.chat("openai/gpt-
|
|
74
|
+
model: openai.chat("openai/gpt-6-luna"),
|
|
75
75
|
prompt: "Write a one-sentence bedtime story about a unicorn.",
|
|
76
76
|
});
|
|
77
77
|
```
|
|
@@ -93,7 +93,7 @@ const anthropic = createAnthropic({
|
|
|
93
93
|
});
|
|
94
94
|
|
|
95
95
|
const { text } = await generateText({
|
|
96
|
-
model: anthropic("anthropic/claude-sonnet-
|
|
96
|
+
model: anthropic("anthropic/claude-sonnet-5"),
|
|
97
97
|
prompt: "Write a one-sentence bedtime story about a unicorn.",
|
|
98
98
|
});
|
|
99
99
|
```
|
|
@@ -118,7 +118,7 @@ const gateway = createOpenAICompatible({
|
|
|
118
118
|
});
|
|
119
119
|
|
|
120
120
|
const { text } = await generateText({
|
|
121
|
-
model: gateway("google/gemini-
|
|
121
|
+
model: gateway("google/gemini-3.5-flash"),
|
|
122
122
|
prompt: "Write a one-sentence bedtime story about a unicorn.",
|
|
123
123
|
});
|
|
124
124
|
```
|
|
@@ -160,7 +160,7 @@ const xai = createXai({
|
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
const { text } = await generateText({
|
|
163
|
-
model: xai.chat("xai/grok-4"),
|
|
163
|
+
model: xai.chat("xai/grok-4.3"),
|
|
164
164
|
prompt: "Write a one-sentence bedtime story about a unicorn.",
|
|
165
165
|
});
|
|
166
166
|
```
|
|
@@ -314,7 +314,7 @@ const openai = createOpenAI({
|
|
|
314
314
|
});
|
|
315
315
|
|
|
316
316
|
const { text } = await generateText({
|
|
317
|
-
model: openai.chat("openrouter/anthropic/claude-sonnet-
|
|
317
|
+
model: openai.chat("openrouter/anthropic/claude-sonnet-5"),
|
|
318
318
|
prompt: "Write a one-sentence bedtime story about a unicorn.",
|
|
319
319
|
});
|
|
320
320
|
```
|
|
@@ -76,10 +76,9 @@ use the app's API key and API URL instead.
|
|
|
76
76
|
"env": {
|
|
77
77
|
"ANTHROPIC_AUTH_TOKEN": "<your-personal-api-key>",
|
|
78
78
|
"ANTHROPIC_BASE_URL": "https://my-gateway-main-2e18f50.zuplo.app/u/741d375d631b429293481d6d0458bb64",
|
|
79
|
-
"ANTHROPIC_MODEL": "anthropic/claude-sonnet-5",
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"ANTHROPIC_DEFAULT_SONNET_MODEL": "anthropic/claude-sonnet-5",
|
|
79
|
+
"ANTHROPIC_MODEL": "anthropic/claude-sonnet-5-5",
|
|
80
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL": "anthropic/claude-opus-5-5",
|
|
81
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "anthropic/claude-sonnet-5-5",
|
|
83
82
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "anthropic/claude-haiku-4-5",
|
|
84
83
|
"ANTHROPIC_DEFAULT_FABLE_MODEL": "anthropic/claude-fable-5-1"
|
|
85
84
|
},
|
|
@@ -152,10 +151,9 @@ In the **JSON** editor:
|
|
|
152
151
|
"env": {
|
|
153
152
|
"ANTHROPIC_BASE_URL": "https://my-gateway-main-2e18f50.zuplo.app/config_fe0a04972d2848e0a94ae4b8bcd1497e",
|
|
154
153
|
"ANTHROPIC_CUSTOM_HEADERS": "zp-gateway-api-key: <your-ai-gateway-app-api-key>",
|
|
155
|
-
"ANTHROPIC_MODEL": "anthropic/claude-sonnet-5",
|
|
156
|
-
"
|
|
157
|
-
"
|
|
158
|
-
"ANTHROPIC_DEFAULT_SONNET_MODEL": "anthropic/claude-sonnet-5",
|
|
154
|
+
"ANTHROPIC_MODEL": "anthropic/claude-sonnet-5-5",
|
|
155
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL": "anthropic/claude-opus-5-5",
|
|
156
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "anthropic/claude-sonnet-5-5",
|
|
159
157
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "anthropic/claude-haiku-4-5",
|
|
160
158
|
"ANTHROPIC_DEFAULT_FABLE_MODEL": "anthropic/claude-fable-5-1"
|
|
161
159
|
},
|
|
@@ -40,8 +40,9 @@ The rest of this guide calls these your **gateway URL** and **gateway key**.
|
|
|
40
40
|
|
|
41
41
|
The examples assume your provider is named `openai`. Replace that prefix with
|
|
42
42
|
the name of **your** provider before copying anything. A provider named
|
|
43
|
-
`my-openai` routes `my-openai/gpt-
|
|
44
|
-
serves. Check [your provider's page](../managing-providers.mdx) in the
|
|
43
|
+
`my-openai` routes `my-openai/gpt-6.1-sol`. The model part must be an ID that
|
|
44
|
+
provider serves. Check [your provider's page](../managing-providers.mdx) in the
|
|
45
|
+
Portal.
|
|
45
46
|
|
|
46
47
|
:::
|
|
47
48
|
|
|
@@ -60,7 +61,7 @@ instead.
|
|
|
60
61
|
|
|
61
62
|
```toml
|
|
62
63
|
model_provider = "zuplo"
|
|
63
|
-
model = "openai/gpt-
|
|
64
|
+
model = "openai/gpt-6.1-sol"
|
|
64
65
|
|
|
65
66
|
[model_providers.zuplo]
|
|
66
67
|
name = "Zuplo AI Gateway"
|
|
@@ -80,7 +81,7 @@ subscription logins.
|
|
|
80
81
|
|
|
81
82
|
```toml
|
|
82
83
|
model_provider = "zuplo"
|
|
83
|
-
model = "openai/gpt-
|
|
84
|
+
model = "openai/gpt-6.1-sol"
|
|
84
85
|
|
|
85
86
|
[model_providers.zuplo]
|
|
86
87
|
name = "Zuplo AI Gateway"
|
|
@@ -138,7 +139,7 @@ do. A placeholder value works if nothing else uses it.
|
|
|
138
139
|
Set `model` in `config.toml`, or pass it on the command line:
|
|
139
140
|
|
|
140
141
|
```bash
|
|
141
|
-
codex --config model_provider="zuplo" --model "openai/gpt-
|
|
142
|
+
codex --config model_provider="zuplo" --model "openai/gpt-6.1-sol"
|
|
142
143
|
```
|
|
143
144
|
|
|
144
145
|
Do not use the `/model` picker. It sends model names without the provider
|
|
@@ -57,7 +57,7 @@ configuration approaches depending on which version you choose.
|
|
|
57
57
|
`v1/chat/completions` as the value
|
|
58
58
|
|
|
59
59
|
7. Enter the model you want to use with goose, as `providerName/model`—for
|
|
60
|
-
example `openai/gpt-
|
|
60
|
+
example `openai/gpt-6-luna`.
|
|
61
61
|
|
|
62
62
|
</Stepper>
|
|
63
63
|
|
|
@@ -98,8 +98,8 @@ Gateway by following these steps:
|
|
|
98
98
|
8. Set the **API Key** to your gateway key
|
|
99
99
|
|
|
100
100
|
9. Set the list of **Available Models** to the models the Model Filtering policy
|
|
101
|
-
allows, named as `providerName/model` (for example `openai/gpt-
|
|
102
|
-
`openai/gpt-
|
|
101
|
+
allows, named as `providerName/model` (for example `openai/gpt-6-luna` and
|
|
102
|
+
`openai/gpt-6.1-sol`)
|
|
103
103
|
|
|
104
104
|
10. Click on **Create Provider**
|
|
105
105
|
|
|
@@ -59,7 +59,7 @@ const client = new OpenAI({
|
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
const response = await client.chat.completions.create({
|
|
62
|
-
model: "openai/gpt-
|
|
62
|
+
model: "openai/gpt-6-luna",
|
|
63
63
|
messages: [
|
|
64
64
|
{
|
|
65
65
|
role: "user",
|
|
@@ -83,7 +83,7 @@ The AI Gateway supports all major OpenAI API endpoints through the
|
|
|
83
83
|
interactions
|
|
84
84
|
- **Embeddings** (`/v1/embeddings`) - For generating vector embeddings
|
|
85
85
|
- **Responses** (`/v1/responses`) - For OpenAI models that support the responses
|
|
86
|
-
endpoint (such as GPT-
|
|
86
|
+
endpoint (such as GPT-6.1 Sol and other compatible models)
|
|
87
87
|
|
|
88
88
|
## Using the Responses Endpoint
|
|
89
89
|
|
|
@@ -100,7 +100,7 @@ const client = new OpenAI({
|
|
|
100
100
|
});
|
|
101
101
|
|
|
102
102
|
const response = await client.responses.create({
|
|
103
|
-
model: "openai/gpt-
|
|
103
|
+
model: "openai/gpt-6.1-sol",
|
|
104
104
|
input: "Write a one-sentence bedtime story about a unicorn.",
|
|
105
105
|
});
|
|
106
106
|
|
|
@@ -45,7 +45,7 @@ To add a new AI provider to your Zuplo AI Gateway, follow these steps:
|
|
|
45
45
|
provider you selected (a second OpenAI configuration becomes `openai-2`). You
|
|
46
46
|
can replace it with your own name, but only now—the name is permanent after
|
|
47
47
|
creation. Apps reference this provider's models as `providerName/model`—for
|
|
48
|
-
example, a provider named `openai` serves `openai/gpt-
|
|
48
|
+
example, a provider named `openai` serves `openai/gpt-6-luna`.
|
|
49
49
|
|
|
50
50
|
1. Enter the API Key for the selected provider. For instructions on how to
|
|
51
51
|
create an API key for each provider see the
|
|
@@ -27,13 +27,13 @@ type:
|
|
|
27
27
|
|
|
28
28
|
## Model references include the vendor prefix
|
|
29
29
|
|
|
30
|
-
Every OpenRouter model ID is vendor-qualified — `anthropic/claude-sonnet-
|
|
31
|
-
`openai/gpt-
|
|
32
|
-
prefixes your provider name onto that, so it has **two** slashes:
|
|
30
|
+
Every OpenRouter model ID is vendor-qualified — `anthropic/claude-sonnet-5`,
|
|
31
|
+
`openai/gpt-6-sol`, `meta-llama/llama-3.3-70b-instruct`. A gateway model
|
|
32
|
+
reference prefixes your provider name onto that, so it has **two** slashes:
|
|
33
33
|
|
|
34
34
|
```text
|
|
35
|
-
openrouter/anthropic/claude-sonnet-
|
|
36
|
-
openrouter/openai/gpt-
|
|
35
|
+
openrouter/anthropic/claude-sonnet-5
|
|
36
|
+
openrouter/openai/gpt-6-sol
|
|
37
37
|
openrouter/meta-llama/llama-3.3-70b-instruct
|
|
38
38
|
```
|
|
39
39
|
|
|
@@ -101,7 +101,7 @@ account and project **Admins**—see
|
|
|
101
101
|
|
|
102
102
|
3. Give the provider a **Provider Name**. This is the first segment of every
|
|
103
103
|
model reference, so a provider named `openrouter` serves
|
|
104
|
-
`openrouter/openai/gpt-
|
|
104
|
+
`openrouter/openai/gpt-6-sol`. The name is permanent after creation.
|
|
105
105
|
|
|
106
106
|
4. Paste your **API Key**. There is no endpoint or region to enter — OpenRouter
|
|
107
107
|
is a single global host.
|
|
@@ -123,14 +123,15 @@ OpenRouter lets you append a routing preference to any model ID:
|
|
|
123
123
|
|
|
124
124
|
These work through the gateway and are forwarded to OpenRouter unchanged. They
|
|
125
125
|
don't appear in the model picker, because they aren't separate models — the
|
|
126
|
-
gateway resolves `openrouter/openai/gpt-
|
|
127
|
-
catalog entry and sends the suffix upstream.
|
|
126
|
+
gateway resolves `openrouter/openai/gpt-6-sol:nitro` against the
|
|
127
|
+
`openai/gpt-6-sol` catalog entry and sends the suffix upstream.
|
|
128
128
|
|
|
129
129
|
Two consequences worth knowing:
|
|
130
130
|
|
|
131
131
|
- **A model-filtering allow list matches literally.** Allowing
|
|
132
|
-
`openrouter/openai/gpt-
|
|
133
|
-
the suffixed reference explicitly if
|
|
132
|
+
`openrouter/openai/gpt-6-sol` does not allow
|
|
133
|
+
`openrouter/openai/gpt-6-sol:nitro`. Add the suffixed reference explicitly if
|
|
134
|
+
you want it.
|
|
134
135
|
- **Other suffixes aren't supported.** OpenRouter's `:free` variants are
|
|
135
136
|
separate models, and the gateway's OpenRouter catalog doesn't include them, so
|
|
136
137
|
a request for one is rejected like any model outside your selections.
|
|
@@ -149,7 +150,7 @@ const client = new OpenAI({
|
|
|
149
150
|
});
|
|
150
151
|
|
|
151
152
|
const completion = await client.chat.completions.create({
|
|
152
|
-
model: "openrouter/openai/gpt-
|
|
153
|
+
model: "openrouter/openai/gpt-6-sol",
|
|
153
154
|
messages: [{ role: "user", content: "Hello!" }],
|
|
154
155
|
});
|
|
155
156
|
```
|
|
@@ -161,7 +162,7 @@ preferences per request:
|
|
|
161
162
|
|
|
162
163
|
```ts
|
|
163
164
|
const completion = await client.chat.completions.create({
|
|
164
|
-
model: "openrouter/openai/gpt-
|
|
165
|
+
model: "openrouter/openai/gpt-6-sol",
|
|
165
166
|
messages: [{ role: "user", content: "Hello!" }],
|
|
166
167
|
// @ts-expect-error -- an OpenRouter extension, not part of the OpenAI types
|
|
167
168
|
provider: { sort: "throughput" },
|
|
@@ -205,7 +206,7 @@ const client = new Anthropic({
|
|
|
205
206
|
});
|
|
206
207
|
|
|
207
208
|
const message = await client.messages.create({
|
|
208
|
-
model: "openrouter/anthropic/claude-sonnet-
|
|
209
|
+
model: "openrouter/anthropic/claude-sonnet-5",
|
|
209
210
|
max_tokens: 1024,
|
|
210
211
|
messages: [{ role: "user", content: "Hello!" }],
|
|
211
212
|
});
|
|
@@ -89,7 +89,7 @@ providers include OpenAI, Anthropic, Google, Mistral, xAI, Microsoft Azure
|
|
|
89
89
|
System One model ([Jev](./jev.mdx)), and OpenAI-compatible custom providers. See
|
|
90
90
|
[AI Providers](./providers.mdx) for the full list of providers and supported
|
|
91
91
|
capabilities. Apps reference models as `providerName/model`—for example
|
|
92
|
-
`openai/gpt-
|
|
92
|
+
`openai/gpt-6-luna`—so a single app can use models from several providers.
|
|
93
93
|
|
|
94
94
|
### Source-Controlled Gateway
|
|
95
95
|
|
|
@@ -97,7 +97,9 @@ A new AI Gateway project deploys without a Git repository, so you can configure
|
|
|
97
97
|
providers, pools, and apps right away. Connect a
|
|
98
98
|
[Git repository](./source-control.mdx) when you want to write custom policies or
|
|
99
99
|
review gateway changes in Git. After you connect, the default branch is what
|
|
100
|
-
production runs
|
|
100
|
+
production runs, and new template routes and policies reach the gateway only
|
|
101
|
+
when you
|
|
102
|
+
[add them to the repository](./source-control.mdx#keep-the-gateway-up-to-date).
|
|
101
103
|
|
|
102
104
|
### Per-App Policy Chains
|
|
103
105
|
|
|
@@ -90,7 +90,7 @@ segment on its API URL, and you enter that URL as an origin root—without the
|
|
|
90
90
|
[Custom Providers](./custom-providers.mdx#requirements) for the exact contract.
|
|
91
91
|
|
|
92
92
|
Apps reference a provider's models as `providerName/model`—for example
|
|
93
|
-
`openai/gpt-
|
|
93
|
+
`openai/gpt-6-luna` or `anthropic/claude-sonnet-5`—where `providerName` is the
|
|
94
94
|
name you give the provider configuration. See the
|
|
95
95
|
[Universal API](./universal-api.mdx).
|
|
96
96
|
|
|
@@ -199,7 +199,7 @@ Three things are specific to it:
|
|
|
199
199
|
|
|
200
200
|
- **Model references have two slashes.** Every OpenRouter model ID is
|
|
201
201
|
vendor-qualified, so a provider named `openrouter` serves
|
|
202
|
-
`openrouter/anthropic/claude-sonnet-
|
|
202
|
+
`openrouter/anthropic/claude-sonnet-5` and `openrouter/openai/gpt-6-sol`. This
|
|
203
203
|
is the same shape Vertex AI uses.
|
|
204
204
|
- **Claude models are on the Messages API.** Models whose ID begins `anthropic/`
|
|
205
205
|
serve the native Anthropic Messages API (`/v1/messages`) and a translated
|
|
@@ -36,8 +36,20 @@ it. The first push rebuilds production from that source. After that, with
|
|
|
36
36
|
GitHub, pushes to your default branch deploy to production.
|
|
37
37
|
|
|
38
38
|
Until you connect a repository, production runs the gateway template Zuplo
|
|
39
|
-
deploys at project creation
|
|
40
|
-
|
|
39
|
+
deploys at project creation, and Zuplo redeploys it daily from the latest
|
|
40
|
+
template, so new routes and policies reach the gateway automatically. Connecting
|
|
41
|
+
a repository doesn't replace that production URL; the first source deploy reuses
|
|
42
|
+
it.
|
|
43
|
+
|
|
44
|
+
:::caution{title="Connected gateways stop receiving template updates"}
|
|
45
|
+
|
|
46
|
+
Connecting a repository copies the current template into it. After that,
|
|
47
|
+
production runs only what's in your repository, and Zuplo doesn't change it.
|
|
48
|
+
Routes and policies that Zuplo later adds to the template, such as the `/u/`
|
|
49
|
+
route that serves the [User App](./user-apps.mdx), don't reach the gateway until
|
|
50
|
+
you add them. See [Keep the gateway up to date](#keep-the-gateway-up-to-date).
|
|
51
|
+
|
|
52
|
+
:::
|
|
41
53
|
|
|
42
54
|
To work with the source locally, clone the repository:
|
|
43
55
|
|
|
@@ -98,9 +110,56 @@ deployment.
|
|
|
98
110
|
|
|
99
111
|
:::
|
|
100
112
|
|
|
113
|
+
## Keep the gateway up to date
|
|
114
|
+
|
|
115
|
+
When Zuplo adds routes or policies to the AI Gateway template, a connected
|
|
116
|
+
gateway doesn't get them until you add them to `config/ai.oas.json` and
|
|
117
|
+
`config/policies.json`. The [`zuplo source upgrade`](../cli/source-upgrade.mdx)
|
|
118
|
+
command adds the missing definitions for you. Run it from a local clone of the
|
|
119
|
+
repository:
|
|
120
|
+
|
|
121
|
+
1. Install the latest `zuplo` package. If `package.json` or the lockfile change,
|
|
122
|
+
commit them; applying an upgrade requires a clean working tree.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
npm install zuplo@latest
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
2. Preview the upgrade. The CLI prints each missing route and policy and a diff,
|
|
129
|
+
without changing any files:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npx zuplo source upgrade --type ai-gateway
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
3. Apply the upgrade. The CLI asks you to confirm before it writes the files:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npx zuplo source upgrade --type ai-gateway --apply
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
4. Review and test the changes, then commit and push them:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
git add --all
|
|
145
|
+
git commit -m "Upgrade AI Gateway template"
|
|
146
|
+
git push
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The push deploys like any other repository change—see
|
|
150
|
+
[How deployments work](#how-deployments-work).
|
|
151
|
+
|
|
152
|
+
The command only adds what's missing. It doesn't change your existing routes,
|
|
153
|
+
policies, or custom policy code. If an addition conflicts with your
|
|
154
|
+
configuration or can't be verified, the CLI changes nothing and prints the
|
|
155
|
+
definitions so you can add them by hand. Review authentication and policy order
|
|
156
|
+
before you add a route manually.
|
|
157
|
+
|
|
101
158
|
## Next steps
|
|
102
159
|
|
|
103
160
|
- [Policy Chains](./policy-chains.mdx): how apps select policies from
|
|
104
161
|
`config/policies.json`
|
|
105
162
|
- [Custom Policies](./custom-policies.mdx): add your own policy to the
|
|
106
163
|
repository
|
|
164
|
+
- [`zuplo source upgrade`](../cli/source-upgrade.mdx): every option and the
|
|
165
|
+
recovery steps for an interrupted upgrade
|
|
@@ -18,8 +18,11 @@ engineer using Claude Code or Codex is a person, and calls the User App with a
|
|
|
18
18
|
personal key.
|
|
19
19
|
|
|
20
20
|
Each AI Gateway project has one User App, created for you. A new project gets it
|
|
21
|
-
right away; an existing project gets it on its next production deployment.
|
|
22
|
-
|
|
21
|
+
right away; an existing project gets it on its next production deployment. A
|
|
22
|
+
project connected to source control also needs the User App route in its
|
|
23
|
+
repository—see
|
|
24
|
+
[Keep the gateway up to date](./source-control.mdx#keep-the-gateway-up-to-date).
|
|
25
|
+
It has:
|
|
23
26
|
|
|
24
27
|
- **A URL** under `/u/`, such as
|
|
25
28
|
`https://my-gateway-main-2e18f50.zuplo.app/u/741d375d631b429293481d6d0458bb64`.
|
|
@@ -142,26 +142,20 @@ exceed 30 days. The start date must be before the end date.
|
|
|
142
142
|
"data": [
|
|
143
143
|
{
|
|
144
144
|
"action": "project.update",
|
|
145
|
-
"metadata": {
|
|
146
|
-
/* action-specific metadata */
|
|
147
|
-
},
|
|
145
|
+
"metadata": {/* action-specific metadata */},
|
|
148
146
|
"actor": {
|
|
149
147
|
"sub": "auth0|123456",
|
|
150
148
|
"email": "user@example.com",
|
|
151
149
|
"type": "user",
|
|
152
150
|
"connection": "auth0",
|
|
153
151
|
"actingAs": null,
|
|
154
|
-
"metadata": {
|
|
155
|
-
/* additional actor metadata */
|
|
156
|
-
}
|
|
152
|
+
"metadata": {/* additional actor metadata */}
|
|
157
153
|
},
|
|
158
154
|
"resources": [
|
|
159
155
|
{
|
|
160
156
|
"type": "project",
|
|
161
157
|
"id": "proj_123",
|
|
162
|
-
"metadata": {
|
|
163
|
-
/* resource-specific metadata */
|
|
164
|
-
}
|
|
158
|
+
"metadata": {/* resource-specific metadata */}
|
|
165
159
|
}
|
|
166
160
|
],
|
|
167
161
|
"context": {
|