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.
Files changed (47) hide show
  1. package/docs/ai-gateway/bedrock-runtime.mdx +1 -1
  2. package/docs/ai-gateway/custom-policies.mdx +1 -1
  3. package/docs/ai-gateway/fallback.mdx +1 -1
  4. package/docs/ai-gateway/integrations/ai-sdk.mdx +5 -5
  5. package/docs/ai-gateway/integrations/claude-code.mdx +6 -8
  6. package/docs/ai-gateway/integrations/codex.mdx +6 -5
  7. package/docs/ai-gateway/integrations/goose.mdx +3 -3
  8. package/docs/ai-gateway/integrations/langchain.mdx +1 -1
  9. package/docs/ai-gateway/integrations/openai.mdx +3 -3
  10. package/docs/ai-gateway/managing-providers.mdx +1 -1
  11. package/docs/ai-gateway/openrouter.mdx +14 -13
  12. package/docs/ai-gateway/overview.mdx +4 -2
  13. package/docs/ai-gateway/providers.mdx +2 -2
  14. package/docs/ai-gateway/source-control.mdx +61 -2
  15. package/docs/ai-gateway/universal-api.mdx +1 -1
  16. package/docs/ai-gateway/user-apps.mdx +5 -2
  17. package/docs/articles/accounts/audit-logs.mdx +3 -9
  18. package/docs/articles/environment-variables.mdx +56 -231
  19. package/docs/articles/graphql-support.mdx +59 -18
  20. package/docs/articles/local-development-env-variables.mdx +37 -8
  21. package/docs/articles/logging.mdx +21 -0
  22. package/docs/articles/opentelemetry.mdx +1 -1
  23. package/docs/cli/source-upgrade.mdx +39 -0
  24. package/docs/cli/source-upgrade.partial.mdx +11 -0
  25. package/docs/concepts/ai-gateway.mdx +1 -1
  26. package/docs/dev-portal/zudoku/guides/environment-variables.md +75 -0
  27. package/docs/dev-portal/zudoku-partials/guides/environment-variables.partial.md +74 -0
  28. package/docs/handlers/mcp-server.mdx +72 -0
  29. package/docs/mcp-server/overview.mdx +7 -0
  30. package/docs/mcp-server/tools.mdx +72 -0
  31. package/docs/policies/_index.md +1 -1
  32. package/docs/policies/ai-gateway-auth-inbound/doc.md +2 -2
  33. package/docs/policies/ai-gateway-configuration-executor-inbound/doc.md +3 -3
  34. package/docs/policies/ai-gateway-prompt-injection/doc.md +1 -2
  35. package/docs/policies/ai-gateway-prompt-injection/schema.json +2 -2
  36. package/docs/policies/ai-gateway-smart-router-inbound/doc.md +112 -29
  37. package/docs/policies/ai-gateway-smart-router-inbound/schema.json +109 -12
  38. package/docs/policies/internal-only-inbound/doc.md +206 -0
  39. package/docs/policies/internal-only-inbound/intro.md +10 -0
  40. package/docs/policies/internal-only-inbound/schema.json +75 -0
  41. package/docs/programmable-api/environment.mdx +220 -48
  42. package/docs/programmable-api/hooks.mdx +24 -0
  43. package/docs/programmable-api/mcp-sdk.mdx +22 -0
  44. package/package.json +5 -5
  45. package/docs/policies/ai-gateway-internal-only-inbound/doc.md +0 -102
  46. package/docs/policies/ai-gateway-internal-only-inbound/intro.md +0 -11
  47. 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-4-8`,
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-5-mini",
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-4o-mini`.
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-5-mini"),
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-4-5-20250929"),
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-2.5-flash"),
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-4.5"),
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
- "ANTHROPIC_SMALL_FAST_MODEL": "anthropic/claude-haiku-4-5",
81
- "ANTHROPIC_DEFAULT_OPUS_MODEL": "anthropic/claude-opus-5",
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
- "ANTHROPIC_SMALL_FAST_MODEL": "anthropic/claude-haiku-4-5",
157
- "ANTHROPIC_DEFAULT_OPUS_MODEL": "anthropic/claude-opus-5",
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-5`. The model part must be an ID that provider
44
- serves. Check [your provider's page](../managing-providers.mdx) in the Portal.
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-5"
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-5.6-sol"
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-5.6-sol"
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-5-mini`.
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-5-mini`,
102
- `openai/gpt-5`, `openai/gpt-5-nano`)
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
 
@@ -57,7 +57,7 @@ def init_chat_model():
57
57
  exit(1)
58
58
 
59
59
  return ChatOpenAI(
60
- api_key=api_key, model="openai/gpt-5-mini", base_url=base_url
60
+ api_key=api_key, model="openai/gpt-6-luna", base_url=base_url
61
61
  )
62
62
  ```
63
63
 
@@ -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-5-mini",
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-5 and other compatible models)
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-5",
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-5-mini`.
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-4.5`,
31
- `openai/gpt-5`, `meta-llama/llama-3.3-70b-instruct`. A gateway model reference
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-4.5
36
- openrouter/openai/gpt-5
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-5`. The name is permanent after creation.
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-5:nitro` against the `openai/gpt-5`
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-5` does not allow `openrouter/openai/gpt-5:nitro`. Add
133
- the suffixed reference explicitly if you want it.
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-5",
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-5",
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-4.5",
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-5-mini`—so a single app can use models from several providers.
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-5-mini` or `anthropic/claude-sonnet-4-6`—where `providerName` is the
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-4.5` and `openrouter/openai/gpt-5`. This
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. Connecting a repository doesn't replace that
40
- production URL; the first source deploy reuses it.
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
@@ -40,7 +40,7 @@ const client = new OpenAI({
40
40
  });
41
41
 
42
42
  const response = await client.chat.completions.create({
43
- model: "openai/gpt-5-mini",
43
+ model: "openai/gpt-6-luna",
44
44
  messages: [
45
45
  {
46
46
  role: "user",
@@ -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. It
22
- has:
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": {