zuplo 7.9.5 → 7.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/docs/ai-gateway/apps.mdx +28 -16
  2. package/docs/ai-gateway/custom-policies.mdx +7 -7
  3. package/docs/ai-gateway/custom-providers.mdx +1 -1
  4. package/docs/ai-gateway/fallback.mdx +5 -5
  5. package/docs/ai-gateway/integrations/ai-sdk.mdx +2 -2
  6. package/docs/ai-gateway/integrations/claude-code.mdx +41 -33
  7. package/docs/ai-gateway/integrations/claude-desktop.mdx +37 -34
  8. package/docs/ai-gateway/integrations/codex.mdx +42 -31
  9. package/docs/ai-gateway/integrations/github-copilot.mdx +39 -37
  10. package/docs/ai-gateway/integrations/goose.mdx +27 -30
  11. package/docs/ai-gateway/integrations/langchain.mdx +2 -2
  12. package/docs/ai-gateway/integrations/openai.mdx +2 -2
  13. package/docs/ai-gateway/jev.mdx +344 -0
  14. package/docs/ai-gateway/managing-apps.mdx +22 -22
  15. package/docs/ai-gateway/managing-pools.mdx +87 -0
  16. package/docs/ai-gateway/managing-providers.mdx +4 -4
  17. package/docs/ai-gateway/overview.mdx +38 -26
  18. package/docs/ai-gateway/policy-chains.mdx +7 -7
  19. package/docs/ai-gateway/policy-templates.mdx +22 -22
  20. package/docs/ai-gateway/pools.mdx +53 -0
  21. package/docs/ai-gateway/providers.mdx +32 -2
  22. package/docs/ai-gateway/source-control.mdx +2 -2
  23. package/docs/ai-gateway/universal-api.mdx +4 -0
  24. package/docs/ai-gateway/usage-limits.mdx +49 -47
  25. package/docs/ai-gateway/user-apps.mdx +166 -0
  26. package/docs/articles/accounts/roles-and-permissions.mdx +92 -63
  27. package/docs/concepts/ai-gateway.mdx +24 -20
  28. package/docs/policies/ai-gateway-akamai-firewall-inbound/doc.md +1 -1
  29. package/docs/policies/ai-gateway-metering-inbound/schema.json +16 -2
  30. package/docs/policies/ai-gateway-smart-router-inbound/doc.md +172 -29
  31. package/docs/policies/ai-gateway-smart-router-inbound/intro.md +4 -3
  32. package/docs/policies/ai-gateway-smart-router-inbound/schema.json +177 -30
  33. package/package.json +5 -5
  34. package/docs/ai-gateway/managing-teams.mdx +0 -87
  35. package/docs/ai-gateway/teams.mdx +0 -49
@@ -2,40 +2,43 @@
2
2
  title: "Usage Limits & Budget Rules"
3
3
  sidebar_label: "Usage Limits"
4
4
  description:
5
- Set spending, token, and request budgets at the gateway, team, and app levels,
5
+ Set spending, token, and request budgets at the gateway, pool, and app levels,
6
6
  and give every metadata value its own separate budget using expression rules.
7
7
  ---
8
8
 
9
- Set spending, token, and request budgets for your apps, teams, and gateway to
9
+ Set spending, token, and request budgets for your apps, pools, and gateway to
10
10
  control how much they can use.
11
11
 
12
12
  ## Budget Hierarchy
13
13
 
14
14
  Limits at every level apply together. The gateway checks its own limits, parent
15
- team limits, and app limits. An exhausted **Block** limit rejects the request
15
+ pool limits, and app limits. An exhausted **Block** limit rejects the request
16
16
  unless the normal provider path uses a configured
17
17
  [quota fallback](#when-a-limit-is-exceeded). **Warn** limits allow the request
18
18
  and report the warning. Budgets cover these levels:
19
19
 
20
20
  - **Gateway** - Limits across the Zuplo project (for example, $1,000/day),
21
- covering all teams, sub-teams, and apps combined
22
- - **Teams** - Limits covering the team's own usage and every descendant sub-team
23
- and app (for example, $500/day for the Engineering team)
21
+ covering all pools, sub-pools, and apps combined
22
+ - **Pools** - Limits covering the pool's own usage and every descendant sub-pool
23
+ and app (for example, $500/day for the Engineering pool)
24
24
  - **Apps** - Per-app limits for granular control (for example, $10/day for a
25
25
  hackathon app)
26
26
 
27
- For example, a team has a $50 monthly shared **Block** budget. App A spends $40
27
+ The [User App](./user-apps.mdx) isn't part of a pool. It has a per-person
28
+ budget, set on the **Users** tab, and gateway limits apply to it as well.
29
+
30
+ For example, a pool has a $50 monthly shared **Block** budget. App A spends $40
28
31
  and App B spends $10. Once that usage is reflected in the budget check, both
29
- apps have reached the team's budget. Without a quota fallback, requests through
30
- both apps receive `429 Too Many Requests`. An app outside this team doesn't
31
- share its $50 budget, but still has its own app, team, and gateway limits.
32
+ apps have reached the pool's budget. Without a quota fallback, requests through
33
+ both apps receive `429 Too Many Requests`. An app outside this pool doesn't
34
+ share its $50 budget, but still has its own app, pool, and gateway limits.
32
35
 
33
36
  <Diagram direction="vertical" height="h-80">
34
37
  <DiagramNode id="gateway" variant="green">
35
38
  Gateway · shared budget available
36
39
  </DiagramNode>
37
- <DiagramNode id="team" variant="red">
38
- Team · spent $50 of $50 this month
40
+ <DiagramNode id="pool" variant="red">
41
+ Pool · spent $50 of $50 this month
39
42
  </DiagramNode>
40
43
  <DiagramNode id="appa" variant="red">
41
44
  App A · spent $40
@@ -44,28 +47,28 @@ share its $50 budget, but still has its own app, team, and gateway limits.
44
47
  App B · spent $10
45
48
  </DiagramNode>
46
49
  <DiagramNode id="other" variant="green">
47
- App outside the team
50
+ App outside the pool
48
51
  </DiagramNode>
49
- <DiagramEdge from="gateway" to="team" label="team budget exhausted" />
52
+ <DiagramEdge from="gateway" to="pool" label="pool budget exhausted" />
50
53
  <DiagramEdge
51
54
  from="gateway"
52
55
  to="other"
53
- label="unaffected by this team budget"
56
+ label="unaffected by this pool budget"
54
57
  />
55
- <DiagramEdge from="team" to="appa" label="429 without quota fallback" />
56
- <DiagramEdge from="team" to="appb" label="429 without quota fallback" />
58
+ <DiagramEdge from="pool" to="appa" label="429 without quota fallback" />
59
+ <DiagramEdge from="pool" to="appb" label="429 without quota fallback" />
57
60
  </Diagram>
58
61
 
59
- App budgets can add up to more than their team's budget. The team's budget caps
60
- the combined usage; increasing an app's budget doesn't increase its team's cap.
61
- The same rule applies to nested teams and the gateway root.
62
+ App budgets can add up to more than their pool's budget. The pool's budget caps
63
+ the combined usage; increasing an app's budget doesn't increase its pool's cap.
64
+ The same rule applies to nested pools and the gateway root.
62
65
 
63
66
  ## Where limits are configured
64
67
 
65
68
  | Level | Budgets | Where to configure |
66
69
  | ------- | ----------------------- | ---------------------------------------------------------------------- |
67
70
  | Gateway | Shared | **Settings → Usage Limits** |
68
- | Team | Shared | The team's **Usage & Limits** tab |
71
+ | Pool | Shared | The pool's **Usage & Limits** tab |
69
72
  | App | Shared and per-metadata | **Budgets and Costs** in the app's [policy chain](./policy-chains.mdx) |
70
73
 
71
74
  Use **Budgets and Costs** to set an app's own budget.
@@ -73,7 +76,7 @@ Use **Budgets and Costs** to set an app's own budget.
73
76
  :::note
74
77
 
75
78
  New apps inherit their initial budget settings from their
76
- [team policy template](./policy-templates.mdx). To limit the team's combined
79
+ [pool policy template](./policy-templates.mdx). To limit the pool's combined
77
80
  usage, set a budget on **Usage & Limits**.
78
81
 
79
82
  :::
@@ -86,7 +89,7 @@ Each budget rule defines who shares the budget and how much they can use.
86
89
 
87
90
  | Scope | What it budgets |
88
91
  | --------------- | ----------------------------------------------------------- |
89
- | **Shared** | One budget for the app, team, or gateway |
92
+ | **Shared** | One budget for the app, pool, or gateway |
90
93
  | **By metadata** | A separate budget for every distinct value of an expression |
91
94
 
92
95
  A **By metadata** rule gives each distinct expression value its own allowance.
@@ -133,11 +136,11 @@ again, doesn't reset the period's usage.
133
136
 
134
137
  <Stepper>
135
138
 
136
- 1. Open the [Apps & Teams](https://portal.zuplo.com/+/account/project/ai/apps)
137
- tab and select the app.
139
+ 1. Open the [Apps](https://portal.zuplo.com/+/account/project/ai/apps) tab and
140
+ select the app.
138
141
 
139
142
  1. On the **Policies** tab, configure the **Budgets and Costs** policy (add it
140
- from **Add Policy** if the chain doesn't have it).
143
+ from **Add policy** if the chain doesn't have it).
141
144
 
142
145
  1. Select **Add rule**, choose the scope, and use **Add limit** to add rows for
143
146
  the meters and periods you want to cap. For a **By metadata** rule, enter the
@@ -149,8 +152,8 @@ again, doesn't reset the period's usage.
149
152
 
150
153
  </Stepper>
151
154
 
152
- The app editor shows team and gateway budgets under **Inherited**. To change
153
- one, open the team or gateway where you set it.
155
+ The app editor shows pool and gateway budgets under **Inherited**. To change
156
+ one, open the pool or gateway where you set it.
154
157
 
155
158
  ### Budget expressions
156
159
 
@@ -271,19 +274,18 @@ Verdicts name their rule too. A block or warning from a **By metadata** rule
271
274
  carries the expression and its `ruleId`; one from an app-wide budget carries
272
275
  neither. That's how you tell which rule refused a request.
273
276
 
274
- ## Setting team and gateway limits
277
+ ## Setting pool and gateway limits
275
278
 
276
- A team budget covers the combined usage of its apps and sub-teams. A gateway
279
+ A pool budget covers the combined usage of its apps and sub-pools. A gateway
277
280
  budget covers all apps in the project.
278
281
 
279
- To add a shared team rule, select the team or sub-team in
280
- [Apps & Teams](https://portal.zuplo.com/+/account/project/ai/teams), then open
281
- **Usage & Limits**. To add a shared gateway rule, open **Settings → Usage
282
- Limits**. Both editors use the same meter, period, amount, and action rows as
283
- the app editor.
282
+ To add a shared pool rule, select the pool or sub-pool in
283
+ [Apps](https://portal.zuplo.com/+/account/project/ai/pools), then open **Usage &
284
+ Limits**. To add a shared gateway rule, open **Settings → Usage Limits**. Both
285
+ editors use the same meter, period, amount, and action rows as the app editor.
284
286
 
285
- The editor shows budgets from parent teams and the gateway under **Inherited**.
286
- To change an inherited budget, edit it on the team or gateway where you created
287
+ The editor shows budgets from parent pools and the gateway under **Inherited**.
288
+ To change an inherited budget, edit it on the pool or gateway where you created
287
289
  it.
288
290
 
289
291
  ## When a limit is exceeded
@@ -291,7 +293,7 @@ it.
291
293
  For a request continuing to a provider, an exhausted **Block** limit uses the
292
294
  app's configured **quota fallback** model instead of blocking. See
293
295
  [Fallback Models](./fallback.mdx), where the fallback model is selected. This
294
- applies to gateway and team limits as well as the app's own. The fallback's
296
+ applies to gateway and pool limits as well as the app's own. The fallback's
295
297
  usage still counts toward the limits.
296
298
 
297
299
  Without a quota fallback on that path, the request is rejected with
@@ -314,7 +316,7 @@ Without a quota fallback on that path, the request is rejected with
314
316
  ```
315
317
 
316
318
  The `scope` tells the caller which budget they hit. It is `application` when the
317
- gateway, a team, or the app exhausts a shared budget. It is `dimension` when a
319
+ gateway, a pool, or the app exhausts a shared budget. It is `dimension` when a
318
320
  value exhausts an expression budget. Quote the `ruleId` when raising a support
319
321
  request.
320
322
 
@@ -330,14 +332,14 @@ the budget check doesn't replace an authentication error with a budget error.
330
332
 
331
333
  :::caution{title="Budgets fail open by default"}
332
334
 
333
- If a team or gateway budget check fails, the request can continue. However, a
335
+ If a pool or gateway budget check fails, the request can continue. However, a
334
336
  failed check doesn't override a budget violation already detected: a cache hit
335
337
  still returns `429` if the app's budget check has found an exhausted **Block**
336
338
  limit.
337
339
 
338
340
  To reject requests when **Budgets and Costs** can't complete its own checks,
339
341
  enable **Fail closed when metering is unavailable** (`throwOnFailure`). This
340
- option is off by default and doesn't change how team or gateway check failures
342
+ option is off by default and doesn't change how pool or gateway check failures
341
343
  are handled.
342
344
 
343
345
  :::
@@ -345,7 +347,7 @@ are handled.
345
347
  ## Propagation and accounting delays
346
348
 
347
349
  Budget changes don't take effect immediately. After editing a budget or moving
348
- an app to another team, allow time for the saved settings and usage totals to
350
+ an app to another pool, allow time for the saved settings and usage totals to
349
351
  update. The delay depends on your gateway's
350
352
  [cache settings](./policy-chains.mdx#configuration-executor).
351
353
 
@@ -354,21 +356,21 @@ spending past a budget before further requests are blocked.
354
356
 
355
357
  ## Monitoring Usage
356
358
 
357
- Each app, team, and the gateway show current usage against their limits:
359
+ Each app, pool, and the gateway show current usage against their limits:
358
360
 
359
- 1. Open the [Apps & Teams](https://portal.zuplo.com/+/account/project/ai/apps)
360
- tab and select an app or team
361
+ 1. Open the [Apps](https://portal.zuplo.com/+/account/project/ai/apps) tab and
362
+ select an app or pool
361
363
  2. The **Overview** tab shows daily and monthly usage—spend, tokens, and
362
364
  requests—with progress against any configured limits
363
365
  3. The same tab's **Metrics** frame charts request count, token usage, and cost
364
366
  over time; **View in Analytics** opens the full request-level breakdown
365
- scoped to that app or team
367
+ scoped to that app or pool
366
368
 
367
369
  ## Related Resources
368
370
 
369
371
  - [Getting Started](../getting-started/ai-gateway/portal.mdx) - Set up your
370
372
  first AI Gateway project with budget controls
371
- - [Managing Teams](./managing-teams.mdx) - Configure team-level budgets
373
+ - [Managing Pools](./managing-pools.mdx) - Configure pool-level budgets
372
374
  - [Managing Apps](./managing-apps.mdx) - Configure app-level limits
373
375
  - [Fallback Models](./fallback.mdx) - Serve a cheaper model instead of blocking
374
376
  when a limit is exceeded
@@ -0,0 +1,166 @@
1
+ ---
2
+ title: AI Gateway User Apps
3
+ sidebar_label: User Apps
4
+ description:
5
+ User Apps let people call your AI Gateway with their own personal API key,
6
+ each drawing from a personal budget, without creating an app for every user.
7
+ ---
8
+
9
+ A User App lets people call the AI Gateway with their own API key. Instead of
10
+ creating an [app](./apps.mdx) for every person who wants to use AI in their
11
+ everyday tools, everyone with access to the project calls one shared URL with a
12
+ personal key. The gateway knows who made each request, applies that person's
13
+ budget, and reports their usage.
14
+
15
+ Use an app for software and the User App for people. A support chatbot or a
16
+ nightly batch job is an app, with its own API key, in a [pool](./pools.mdx). An
17
+ engineer using Claude Code or Codex is a person, and calls the User App with a
18
+ personal key.
19
+
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:
23
+
24
+ - **A URL** under `/u/`, such as
25
+ `https://my-gateway-main-2e18f50.zuplo.app/u/741d375d631b429293481d6d0458bb64`.
26
+ Everyone calls the same URL.
27
+ - **Personal API keys**—each person creates their own. A personal key works only
28
+ on the User App URL, and an app's API key doesn't work there.
29
+ - **A per-person budget**—an optional spending allowance, such as $50 per day,
30
+ that applies to each person separately.
31
+ - **A [policy chain](./policy-chains.mdx)**—the policies that run on every
32
+ request made with a personal key.
33
+
34
+ The User App isn't part of a pool. Pool budgets and policy templates apply to
35
+ apps; [gateway-wide usage limits](./usage-limits.mdx) apply to both.
36
+
37
+ ## Setting up the User App
38
+
39
+ Only Admins set up the User App: they choose who can use it, set its budget, and
40
+ edit its policies. With the role-based access control (RBAC) add-on, that means
41
+ project or account **Admins**; Developers, Members, and AI Users can use the
42
+ User App but can't change its budget or policies. Without RBAC, every account
43
+ member is an Admin.
44
+
45
+ Admins manage the User App on the AI Gateway project's
46
+ [**Users**](https://portal.zuplo.com/+/account/project/ai/users) tab.
47
+
48
+ <Stepper>
49
+
50
+ 1. **Give people access.** Everyone with a role on the AI Gateway project—Admin,
51
+ Developer, Member, or AI User—can use the User App.
52
+
53
+ With RBAC, to give someone access to the User App and nothing else, open
54
+ [**Settings** > **Members & Access**](https://portal.zuplo.com/+/account/project/ai/settings/members)
55
+ on the AI Gateway project, click **Add to project**, enter their email, and
56
+ choose the **AI User** role. Someone who isn't in your Zuplo account yet is
57
+ added to it as a **Member**. An AI User can call the User App and see their
58
+ own keys and usage, but not the rest of the project's configuration or anyone
59
+ else's usage. See
60
+ [Managing Project Members](../articles/accounts/managing-project-members.mdx)
61
+ and [Role Permissions](../articles/accounts/roles-and-permissions.mdx).
62
+
63
+ 1. **Set a per-person budget.** The User App starts with no budget. Open
64
+ **Budgets** and set how much each person can spend **Per person per day** and
65
+ **Per person per month**, such as $50 and $100. Each person gets the full
66
+ amount, counted separately.
67
+
68
+ :::caution{title="Set a budget to limit spend"}
69
+
70
+ Until you set a budget, the gateway tracks what each person spends through
71
+ the User App, and **People** shows it, but nothing limits it. A budget you
72
+ add partway through a day or month counts what each person already spent in
73
+ that period.
74
+
75
+ :::
76
+
77
+ 1. **Review the policies.** **Policies** edits the User App's policy chain, such
78
+ as which models people can use. The same policies as an app's
79
+ [policy chain](./policy-chains.mdx) are available.
80
+
81
+ </Stepper>
82
+
83
+ **People** lists everyone on the project, how many personal keys each person
84
+ has, and what each person spent today and this month. **Gateway** shows the User
85
+ App's name, which you can change, its configuration ID, and its URL.
86
+
87
+ ### Personal budgets
88
+
89
+ To give one person a different amount from everyone else, an Admin clicks the
90
+ **Budget** button on the person's row in **People**. **Per day** and **Per
91
+ month** always appear; **Per hour** and **Per week** appear only when the User
92
+ App's budget limits them. For each period, choose:
93
+
94
+ - **Default**, shown with the User App's amount, such as **Default · $50**. The
95
+ person's limit follows the User App's amount, including when you change it
96
+ later.
97
+ - **Custom** to set an amount for this person only, such as $200 per day for a
98
+ heavy user. Everyone else keeps the User App's amount.
99
+
100
+ A period that has no User App amount shows **No limit**, and you can't set a
101
+ custom amount for it until you set one on **Budgets**. While anyone has a custom
102
+ amount for a period, you can't remove that period's amount from **Budgets**;
103
+ switch those people back to the default first.
104
+
105
+ Click **Save** to apply the change. To remove all of a person's custom amounts,
106
+ click **Use all defaults** and confirm. Changing a budget never resets what the
107
+ person has already spent in the current period.
108
+
109
+ ## Using the User App
110
+
111
+ <Stepper>
112
+
113
+ 1. **Create a personal API key.** Open the AI Gateway project in the Zuplo
114
+ Portal and go to the
115
+ [**Home**](https://portal.zuplo.com/+/account/project/ai/home) tab. Under
116
+ **My API keys**, click **New key**, give it a name such as `Laptop CLI`, and
117
+ copy the key.
118
+
119
+ 1. **Call the gateway.** Copy the **Gateway URL** shown at the top of the
120
+ **Home** tab once the gateway has a production deployment—the User App's
121
+ `/u/` URL—and use it with your personal key in place of the provider's base
122
+ URL and API key. The **Home** tab also shows setup steps for common tools
123
+ such as Claude Code and Codex.
124
+
125
+ </Stepper>
126
+
127
+ For example, to call the Chat Completions endpoint with `curl`:
128
+
129
+ ```bash
130
+ curl https://my-gateway-main-2e18f50.zuplo.app/u/741d375d631b429293481d6d0458bb64/v1/chat/completions \
131
+ -H "Authorization: Bearer $ZUPLO_PERSONAL_KEY" \
132
+ -H "Content-Type: application/json" \
133
+ -d '{
134
+ "model": "anthropic/claude-sonnet-5",
135
+ "messages": [{ "role": "user", "content": "Hello" }]
136
+ }'
137
+ ```
138
+
139
+ The User App serves the same [endpoints](./universal-api.mdx) as an app—**Chat
140
+ Completions**, **Responses**, and **Messages**. The integration guides for
141
+ [Claude Code](./integrations/claude-code.mdx),
142
+ [Codex](./integrations/codex.mdx),
143
+ [Claude Desktop](./integrations/claude-desktop.mdx),
144
+ [GitHub Copilot](./integrations/github-copilot.mdx), and
145
+ [goose](./integrations/goose.mdx) start from your Gateway URL and personal key.
146
+
147
+ The **Home** tab also shows your allowance and what you've spent against it. If
148
+ no budget is set, it says your requests have no personal spending limit. Once
149
+ you reach your allowance, the gateway refuses requests with
150
+ `429 Too Many Requests` until the period resets or an Admin raises your budget.
151
+
152
+ ## Removing access
153
+
154
+ A personal key works only while its owner has access to the AI Gateway project.
155
+ When someone loses access to the project, or is removed from the Zuplo account,
156
+ their personal keys for that project are deleted and stop working within
157
+ seconds. You don't need to rotate any keys.
158
+
159
+ **Additional Resources**
160
+
161
+ - [Apps](./apps.mdx) - Apps for services and integrations, each with its own API
162
+ key.
163
+ - [Role Permissions](../articles/accounts/roles-and-permissions.mdx) - Details
164
+ on the AI User role and other Zuplo account and project roles.
165
+ - [Usage Limits](./usage-limits.mdx) - Gateway-wide limits that apply to every
166
+ request.
@@ -3,7 +3,7 @@ title: Role Permissions
3
3
  sidebar_label: Role Permissions
4
4
  description:
5
5
  Compare account, project, and AI Gateway permissions for Admin, Developer,
6
- Member, and team roles.
6
+ Member, AI User, and pool roles.
7
7
  ---
8
8
 
9
9
  <EnterpriseFeature name="Role Based Access Control" />
@@ -11,8 +11,8 @@ description:
11
11
  :::note
12
12
 
13
13
  Without the role-based access control (RBAC) enterprise add-on, every user
14
- invited to an account is an **Admin**. The **Developer** and **Member**
15
- distinctions below apply only when RBAC is enabled.
14
+ invited to an account is an **Admin**. The **Developer**, **Member**, and **AI
15
+ User** distinctions below apply only when RBAC is enabled.
16
16
 
17
17
  :::
18
18
 
@@ -46,6 +46,16 @@ The following roles are available at the project level:
46
46
  in a project. They can't modify production resources.
47
47
  - **Member**: Members of a project can view resources in the project but can't
48
48
  modify them.
49
+ - **AI User**: Available only on AI Gateway projects. AI Users can call the
50
+ project's [User App](../../ai-gateway/user-apps.mdx) with their own personal
51
+ API keys and see their own usage. They can't view the rest of the project's
52
+ configuration, other people's keys or usage, or project analytics. There is no
53
+ AI User role at the account level. To give someone only this access, add them
54
+ to the AI Gateway project with the **AI User** role from **Members & Access**.
55
+ Someone who isn't in the account yet joins it as a **Member**.
56
+
57
+ Every project role, and the account Admin and Developer roles, can also use the
58
+ User App with their own personal API keys.
49
59
 
50
60
  ## Account Role Permissions
51
61
 
@@ -60,10 +70,14 @@ account role.
60
70
  | | View | ✅ | ✅ | ❌ |
61
71
  | AI Providers | Edit | ✅ | ❌ | ❌ |
62
72
  | | View | ✅ | ✅ | ❌ |
63
- | AI Teams | Manage | ✅ | ❌ | ❌ |
73
+ | AI Pools | Manage | ✅ | ❌ | ❌ |
64
74
  | | View | ✅ | ❌ | ❌ |
65
75
  | AI Apps | Manage | ✅ | ❌ | ❌ |
66
76
  | | View | ✅ | ❌ | ❌ |
77
+ | AI User App | Edit | ✅ | ❌ | ❌ |
78
+ | | View | ✅ | ✅ | ❌ |
79
+ | Personal Keys | Edit (Own Keys) | ✅ | ✅ | ❌ |
80
+ | | View (Own Keys) | ✅ | ✅ | ❌ |
67
81
  | Custom Domains | Edit | ✅ | ❌ | ❌ |
68
82
  | | View | ✅ | ✅ | ❌ |
69
83
  | Tunnels | Edit | ✅ | ❌ | ❌ |
@@ -82,63 +96,78 @@ account role.
82
96
  The following table outlines the permissions granted directly by each Zuplo
83
97
  project role.
84
98
 
85
- | Resource | Environment | Action | Admin | Developer | Member |
86
- | --------------------- | ----------- | ------ | ----- | --------- | ------ |
87
- | Project | | Edit | ✅ | ❌ | ❌ |
88
- | | | View | ✅ | ✅ | ✅ |
89
- | AI Providers | | Edit | ✅ | ❌ | ❌ |
90
- | | | View | ✅ | ✅ | ✅ |
91
- | AI Teams | | Manage | ✅ | ❌ | ❌ |
92
- | | | View | ✅ | ❌ | ❌ |
93
- | AI Apps | | Manage | ✅ | ❌ | ❌ |
94
- | | | View | ✅ | ❌ | ❌ |
95
- | Environment | Production | Edit | ✅ | ❌ | ❌ |
96
- | | | View | ✅ | ✅ | ✅ |
97
- | | | Deploy | ✅ | ❌ | ❌ |
98
- | | Preview | Edit | ✅ | ✅ | ❌ |
99
- | | | View | ✅ | ✅ | ✅ |
100
- | | | Deploy | ✅ | ✅ | ❌ |
101
- | | Development | Edit | ✅ | ✅ | ❌ |
102
- | | | View | ✅ | ✅ | ✅ |
103
- | | | Deploy | ✅ | ✅ | ❌ |
104
- | Environment Variables | Production | Edit | ✅ | ❌ | ❌ |
105
- | | | View | ✅ | ✅ | ✅ |
106
- | | Preview | Edit | ✅ | ✅ | ❌ |
107
- | | | View | ✅ | ✅ | ✅ |
108
- | | Development | Edit | ✅ | ✅ | ❌ |
109
- | | | View | ✅ | ✅ | ✅ |
110
- | Source Control | N/A | Edit | ✅ | ❌ | ❌ |
111
- | | | View | ✅ | ✅ | ✅ |
112
- | Members | N/A | Edit | ✅ | ❌ | ❌ |
113
- | | | View | ✅ | ✅ | ✅ |
114
- | Custom Domains | N/A | Edit | ✅ | ❌ | ❌ |
115
- | | | View | ✅ | ✅ | ✅ |
116
- | Logs | Production | View | ✅ | ✅ | ❌ |
117
- | | Preview | View | ✅ | ✅ | ✅ |
118
- | | Development | View | ✅ | ✅ | ✅ |
119
- | Builds | Production | View | ✅ | ✅ | ✅ |
120
- | | Preview | View | ✅ | ✅ | ✅ |
121
- | | Development | View | ✅ | ✅ | ✅ |
122
- | Analytics | Production | View | ✅ | ✅ | ✅ |
123
- | | Preview | View | ✅ | ✅ | ✅ |
124
- | | Development | View | ✅ | ✅ | ✅ |
125
- | API Key Buckets | Production | Edit | ✅ | ❌ | ❌ |
126
- | | | View | ✅ | ✅ | ✅ |
127
- | | Preview | Edit | ✅ | ✅ | ❌ |
128
- | | | View | ✅ | ✅ | ✅ |
129
- | | Development | Edit | ✅ | ❌ | ❌ |
130
- | | | View | ✅ | ✅ | ✅ |
131
- | Monetization Buckets | Production | Edit | ✅ | ❌ | ❌ |
132
- | | | View | ✅ | ✅ | ✅ |
133
- | | Preview | Edit | ✅ | ✅ | ❌ |
134
- | | | View | ✅ | ✅ | ✅ |
135
- | | Development | Edit | ✅ | ❌ | ❌ |
136
- | | | View | ✅ | ✅ | ✅ |
137
-
138
- The AI Teams and AI Apps rows show project-wide access granted directly by a
139
- Zuplo account or Zuplo project role. A [team role](../../ai-gateway/teams.mdx)
140
- can grant additional access to a specific team and its apps, but only when the
141
- user also has permission to view the associated Zuplo project. A team **Admin**
142
- can manage the team's settings, members, and apps, while a team **Member** can
99
+ | Resource | Environment | Action | Admin | Developer | Member | AI User |
100
+ | --------------------- | ----------- | --------------- | ----- | --------- | ------ | ------- |
101
+ | Project | | Edit | ✅ | ❌ | ❌ | ❌ |
102
+ | | | View | ✅ | ✅ | ✅ | ✅ |
103
+ | AI Providers | | Edit | ✅ | ❌ | ❌ | ❌ |
104
+ | | | View | ✅ | ✅ | ✅ | ❌ |
105
+ | AI Pools | | Manage | ✅ | ❌ | ❌ | ❌ |
106
+ | | | View | ✅ | ❌ | ❌ | ❌ |
107
+ | AI Apps | | Manage | ✅ | ❌ | ❌ | ❌ |
108
+ | | | View | ✅ | ❌ | ❌ | ❌ |
109
+ | AI User App | | Edit | ✅ | ❌ | ❌ | ❌ |
110
+ | | | View | ✅ | ✅ | ✅ | ✅ |
111
+ | Personal Keys | | Edit (Own Keys) | ✅ | ✅ | ✅ | ✅ |
112
+ | | | View (Own Keys) | ✅ | ✅ | ✅ | ✅ |
113
+ | Environment | Production | Edit | ✅ | ❌ | ❌ | ❌ |
114
+ | | | View | ✅ | ✅ | ✅ | ❌ |
115
+ | | | Deploy | ✅ | ❌ | ❌ | ❌ |
116
+ | | Preview | Edit | ✅ | ✅ | ❌ | ❌ |
117
+ | | | View | ✅ | ✅ | ✅ | ❌ |
118
+ | | | Deploy | ✅ | ✅ | ❌ | ❌ |
119
+ | | Development | Edit | ✅ | ✅ | ❌ | ❌ |
120
+ | | | View | ✅ | ✅ | ✅ | ❌ |
121
+ | | | Deploy | ✅ | ✅ | ❌ | ❌ |
122
+ | Environment Variables | Production | Edit | ✅ | ❌ | ❌ | ❌ |
123
+ | | | View | ✅ | ✅ | ✅ | ❌ |
124
+ | | Preview | Edit | ✅ | ✅ | ❌ | ❌ |
125
+ | | | View | ✅ | ✅ | ✅ | ❌ |
126
+ | | Development | Edit | ✅ | ✅ | ❌ | ❌ |
127
+ | | | View | ✅ | ✅ | ✅ | ❌ |
128
+ | Source Control | N/A | Edit | ✅ | ❌ | ❌ | ❌ |
129
+ | | | View | ✅ | ✅ | ✅ | ❌ |
130
+ | Members | N/A | Edit | ✅ | ❌ | ❌ | ❌ |
131
+ | | | View | ✅ | ✅ | ✅ | ❌ |
132
+ | Custom Domains | N/A | Edit | ✅ | ❌ | ❌ | ❌ |
133
+ | | | View | ✅ | ✅ | ✅ | ❌ |
134
+ | Logs | Production | View | ✅ | ✅ | ❌ | ❌ |
135
+ | | Preview | View | ✅ | ✅ | ✅ | ❌ |
136
+ | | Development | View | ✅ | ✅ | ✅ | ❌ |
137
+ | Builds | Production | View | ✅ | ✅ | ✅ | ❌ |
138
+ | | Preview | View | ✅ | ✅ | ✅ | ❌ |
139
+ | | Development | View | ✅ | ✅ | ✅ | ❌ |
140
+ | Analytics | Production | View | ✅ | ✅ | ✅ | ❌ |
141
+ | | Preview | View | ✅ | ✅ | ✅ | ❌ |
142
+ | | Development | View | ✅ | ✅ | ✅ | ❌ |
143
+ | API Key Buckets | Production | Edit | ✅ | ❌ | ❌ | ❌ |
144
+ | | | View | ✅ | ✅ | ✅ | ❌ |
145
+ | | Preview | Edit | ✅ | ✅ | ❌ | ❌ |
146
+ | | | View | ✅ | ✅ | ✅ | ❌ |
147
+ | | Development | Edit | ✅ | ❌ | ❌ | ❌ |
148
+ | | | View | ✅ | ✅ | ✅ | ❌ |
149
+ | Monetization Buckets | Production | Edit | ✅ | ❌ | ❌ | ❌ |
150
+ | | | View | ✅ | ✅ | ✅ | ❌ |
151
+ | | Preview | Edit | ✅ | ✅ | ❌ | ❌ |
152
+ | | | View | ✅ | ✅ | ✅ | ❌ |
153
+ | | Development | Edit | ✅ | ❌ | ❌ | ❌ |
154
+ | | | View | ✅ | ✅ | ✅ | ❌ |
155
+
156
+ The AI Pools and AI Apps rows show project-wide access granted directly by a
157
+ Zuplo account or Zuplo project role. A [pool role](../../ai-gateway/pools.mdx)
158
+ can grant additional access to a specific pool and its apps, but only when the
159
+ user also has permission to view the associated Zuplo project. A pool **Admin**
160
+ can manage the pool's settings, members, and apps, while a pool **Member** can
143
161
  access its apps. AI provider permissions come only from the user's Zuplo account
144
- or Zuplo project role; team membership doesn't grant provider access.
162
+ or Zuplo project role; pool membership doesn't grant provider access.
163
+
164
+ The AI User App rows cover the project's
165
+ [User App](../../ai-gateway/user-apps.mdx). **View** lets a user find the User
166
+ App URL, call it with their own personal API keys, and see their own usage and
167
+ allowance. **Edit** covers the User App's policies and per-person budgets.
168
+ **Personal Keys** covers creating and rolling a user's own keys. Users with **AI
169
+ User App** **Edit** can also manage other people's personal keys on the project.
170
+
171
+ Permissions accumulate. Assigning **AI User** on a project never removes access
172
+ that a user already has from their account role. For example, an account Admin
173
+ who is also a project AI User keeps full access to the project.