pygeai 0.6.0b7__py3-none-any.whl → 0.6.0b10__py3-none-any.whl
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.
- pygeai/_docs/source/conf.py +78 -6
- pygeai/_docs/source/content/api_reference/embeddings.rst +31 -1
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +7 -0
- pygeai/_docs/source/content/debugger.rst +376 -83
- pygeai/_docs/source/content/migration.rst +528 -0
- pygeai/_docs/source/content/modules.rst +1 -1
- pygeai/_docs/source/pygeai.cli.rst +8 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +16 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +16 -0
- pygeai/_docs/source/pygeai.tests.snippets.chat.rst +40 -0
- pygeai/_docs/source/pygeai.tests.snippets.dbg.rst +45 -0
- pygeai/_docs/source/pygeai.tests.snippets.embeddings.rst +40 -0
- pygeai/_docs/source/pygeai.tests.snippets.evaluation.dataset.rst +197 -0
- pygeai/_docs/source/pygeai.tests.snippets.evaluation.plan.rst +133 -0
- pygeai/_docs/source/pygeai.tests.snippets.evaluation.result.rst +37 -0
- pygeai/_docs/source/pygeai.tests.snippets.evaluation.rst +10 -0
- pygeai/_docs/source/pygeai.tests.snippets.rst +1 -0
- pygeai/admin/clients.py +5 -0
- pygeai/assistant/clients.py +7 -0
- pygeai/assistant/data_analyst/clients.py +2 -0
- pygeai/assistant/rag/clients.py +11 -0
- pygeai/chat/clients.py +191 -25
- pygeai/chat/endpoints.py +2 -1
- pygeai/cli/commands/chat.py +227 -1
- pygeai/cli/commands/embeddings.py +56 -8
- pygeai/cli/commands/migrate.py +994 -434
- pygeai/cli/error_handler.py +116 -0
- pygeai/cli/geai.py +28 -10
- pygeai/cli/parsers.py +8 -2
- pygeai/core/base/clients.py +3 -1
- pygeai/core/common/exceptions.py +11 -10
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +17 -2
- pygeai/core/embeddings/mappers.py +16 -2
- pygeai/core/embeddings/responses.py +9 -2
- pygeai/core/feedback/clients.py +1 -0
- pygeai/core/files/clients.py +5 -7
- pygeai/core/files/managers.py +42 -0
- pygeai/core/llm/clients.py +4 -0
- pygeai/core/plugins/clients.py +1 -0
- pygeai/core/rerank/clients.py +1 -0
- pygeai/core/secrets/clients.py +6 -0
- pygeai/core/services/rest.py +1 -1
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +565 -70
- pygeai/evaluation/clients.py +1 -1
- pygeai/evaluation/dataset/clients.py +45 -44
- pygeai/evaluation/plan/clients.py +27 -26
- pygeai/evaluation/result/clients.py +37 -5
- pygeai/gam/clients.py +4 -0
- pygeai/health/clients.py +1 -0
- pygeai/lab/agents/clients.py +8 -1
- pygeai/lab/models.py +3 -3
- pygeai/lab/processes/clients.py +21 -0
- pygeai/lab/strategies/clients.py +4 -0
- pygeai/lab/tools/clients.py +1 -0
- pygeai/migration/__init__.py +31 -0
- pygeai/migration/strategies.py +404 -155
- pygeai/migration/tools.py +170 -3
- pygeai/organization/clients.py +13 -0
- pygeai/organization/limits/clients.py +15 -0
- pygeai/proxy/clients.py +3 -1
- pygeai/tests/admin/test_clients.py +16 -11
- pygeai/tests/assistants/rag/test_clients.py +35 -23
- pygeai/tests/assistants/test_clients.py +22 -15
- pygeai/tests/auth/test_clients.py +14 -6
- pygeai/tests/chat/test_clients.py +211 -1
- pygeai/tests/cli/commands/test_embeddings.py +32 -9
- pygeai/tests/cli/commands/test_evaluation.py +7 -0
- pygeai/tests/cli/commands/test_migrate.py +112 -243
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +5 -5
- pygeai/tests/core/embeddings/test_clients.py +144 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/test_clients.py +2 -0
- pygeai/tests/core/files/test_clients.py +1 -0
- pygeai/tests/core/llm/test_clients.py +14 -9
- pygeai/tests/core/plugins/test_clients.py +5 -3
- pygeai/tests/core/rerank/test_clients.py +1 -0
- pygeai/tests/core/secrets/test_clients.py +19 -13
- pygeai/tests/dbg/test_debugger.py +453 -75
- pygeai/tests/evaluation/dataset/test_clients.py +3 -1
- pygeai/tests/evaluation/plan/test_clients.py +4 -2
- pygeai/tests/evaluation/result/test_clients.py +7 -5
- pygeai/tests/gam/test_clients.py +1 -1
- pygeai/tests/health/test_clients.py +1 -0
- pygeai/tests/lab/agents/test_clients.py +9 -0
- pygeai/tests/lab/processes/test_clients.py +36 -0
- pygeai/tests/lab/processes/test_mappers.py +3 -0
- pygeai/tests/lab/strategies/test_clients.py +14 -9
- pygeai/tests/migration/test_strategies.py +45 -218
- pygeai/tests/migration/test_tools.py +133 -9
- pygeai/tests/organization/limits/test_clients.py +17 -0
- pygeai/tests/organization/test_clients.py +22 -0
- pygeai/tests/proxy/test_clients.py +2 -0
- pygeai/tests/proxy/test_integration.py +1 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/create_project.py +2 -2
- {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/METADATA +1 -1
- {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/RECORD +178 -96
- {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/WHEEL +0 -0
- {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/entry_points.txt +0 -0
- {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/licenses/LICENSE +0 -0
- {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
Usage Limits
|
|
2
|
+
============
|
|
3
|
+
|
|
4
|
+
The Usage Limits module provides functionality to define, monitor, and manage usage limits for organizations and projects. This helps control costs, prevent overuse, and implement subscription-based access models.
|
|
5
|
+
|
|
6
|
+
This section covers:
|
|
7
|
+
|
|
8
|
+
* Setting organization and project usage limits
|
|
9
|
+
* Configuring hard and soft limits
|
|
10
|
+
* Managing renewal policies
|
|
11
|
+
* Monitoring usage
|
|
12
|
+
|
|
13
|
+
For each operation, you use the Low-Level Service Layer.
|
|
14
|
+
|
|
15
|
+
Overview
|
|
16
|
+
--------
|
|
17
|
+
|
|
18
|
+
Usage limits can be configured at two levels:
|
|
19
|
+
|
|
20
|
+
* **Organization Level**: Applies to the entire organization
|
|
21
|
+
* **Project Level**: Applies to specific projects within an organization
|
|
22
|
+
|
|
23
|
+
Limit Types:
|
|
24
|
+
|
|
25
|
+
* **Soft Limit**: Warning threshold that triggers notifications
|
|
26
|
+
* **Hard Limit**: Maximum allowed usage; requests blocked when exceeded
|
|
27
|
+
* **Subscription Types**: Freemium, Daily, Weekly, Monthly
|
|
28
|
+
* **Usage Units**: Requests (count) or Cost (dollars)
|
|
29
|
+
|
|
30
|
+
Organization Usage Limits
|
|
31
|
+
--------------------------
|
|
32
|
+
|
|
33
|
+
Set Organization Limit
|
|
34
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
|
35
|
+
|
|
36
|
+
Defines a new usage limit for an organization.
|
|
37
|
+
|
|
38
|
+
Low-Level Service Layer
|
|
39
|
+
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
40
|
+
|
|
41
|
+
.. code-block:: python
|
|
42
|
+
|
|
43
|
+
from pygeai.organization.limits.clients import UsageLimitClient
|
|
44
|
+
|
|
45
|
+
client = UsageLimitClient()
|
|
46
|
+
|
|
47
|
+
usage_limit = {
|
|
48
|
+
"subscriptionType": "Monthly",
|
|
49
|
+
"usageUnit": "Cost",
|
|
50
|
+
"softLimit": 800.0,
|
|
51
|
+
"hardLimit": 1000.0,
|
|
52
|
+
"renewalStatus": "Renewable"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
result = client.set_organization_usage_limit(
|
|
56
|
+
organization="org-uuid",
|
|
57
|
+
usage_limit=usage_limit
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
print(f"Limit ID: {result['id']}")
|
|
61
|
+
|
|
62
|
+
**Parameters:**
|
|
63
|
+
|
|
64
|
+
* ``organization``: (Required) Organization UUID
|
|
65
|
+
* ``usage_limit``: (Required) Dictionary with:
|
|
66
|
+
|
|
67
|
+
* ``subscriptionType``: "Freemium", "Daily", "Weekly", or "Monthly"
|
|
68
|
+
* ``usageUnit``: "Requests" or "Cost"
|
|
69
|
+
* ``softLimit``: Warning threshold (number)
|
|
70
|
+
* ``hardLimit``: Maximum allowed (must be >= softLimit)
|
|
71
|
+
* ``renewalStatus``: "Renewable" or "NonRenewable"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
Get Latest Organization Limit
|
|
75
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
76
|
+
|
|
77
|
+
.. code-block:: python
|
|
78
|
+
|
|
79
|
+
client = UsageLimitClient()
|
|
80
|
+
|
|
81
|
+
latest = client.get_organization_latest_usage_limit(
|
|
82
|
+
organization="org-uuid"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
print(f"Soft limit: {latest['softLimit']}")
|
|
86
|
+
print(f"Hard limit: {latest['hardLimit']}")
|
|
87
|
+
print(f"Current usage: {latest.get('currentUsage', 0)}")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
List All Organization Limits
|
|
91
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
92
|
+
|
|
93
|
+
.. code-block:: python
|
|
94
|
+
|
|
95
|
+
client = UsageLimitClient()
|
|
96
|
+
|
|
97
|
+
all_limits = client.get_all_usage_limits_from_organization(
|
|
98
|
+
organization="org-uuid"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
for limit in all_limits.get('limits', []):
|
|
102
|
+
print(f"{limit['subscriptionType']}: {limit['hardLimit']} {limit['usageUnit']}")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
Update Organization Hard Limit
|
|
106
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
107
|
+
|
|
108
|
+
.. code-block:: python
|
|
109
|
+
|
|
110
|
+
client = UsageLimitClient()
|
|
111
|
+
|
|
112
|
+
client.set_organization_hard_limit(
|
|
113
|
+
organization="org-uuid",
|
|
114
|
+
limit_id="limit-uuid",
|
|
115
|
+
hard_limit=2000.0
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
Update Organization Soft Limit
|
|
120
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
121
|
+
|
|
122
|
+
.. code-block:: python
|
|
123
|
+
|
|
124
|
+
client = UsageLimitClient()
|
|
125
|
+
|
|
126
|
+
client.set_organization_soft_limit(
|
|
127
|
+
organization="org-uuid",
|
|
128
|
+
limit_id="limit-uuid",
|
|
129
|
+
soft_limit=1500.0
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
Set Renewal Status
|
|
134
|
+
~~~~~~~~~~~~~~~~~~
|
|
135
|
+
|
|
136
|
+
.. code-block:: python
|
|
137
|
+
|
|
138
|
+
client = UsageLimitClient()
|
|
139
|
+
|
|
140
|
+
client.set_organization_renewal_status(
|
|
141
|
+
organization="org-uuid",
|
|
142
|
+
limit_id="limit-uuid",
|
|
143
|
+
renewal_status="NonRenewable"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
Delete Organization Limit
|
|
148
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
149
|
+
|
|
150
|
+
.. code-block:: python
|
|
151
|
+
|
|
152
|
+
client = UsageLimitClient()
|
|
153
|
+
|
|
154
|
+
client.delete_usage_limit_from_organization(
|
|
155
|
+
organization="org-uuid",
|
|
156
|
+
limit_id="limit-uuid"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
Project Usage Limits
|
|
161
|
+
--------------------
|
|
162
|
+
|
|
163
|
+
Set Project Limit
|
|
164
|
+
~~~~~~~~~~~~~~~~~
|
|
165
|
+
|
|
166
|
+
.. code-block:: python
|
|
167
|
+
|
|
168
|
+
client = UsageLimitClient()
|
|
169
|
+
|
|
170
|
+
usage_limit = {
|
|
171
|
+
"subscriptionType": "Daily",
|
|
172
|
+
"usageUnit": "Requests",
|
|
173
|
+
"softLimit": 900,
|
|
174
|
+
"hardLimit": 1000,
|
|
175
|
+
"renewalStatus": "Renewable"
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
result = client.set_project_usage_limit(
|
|
179
|
+
organization="org-uuid",
|
|
180
|
+
project="project-uuid",
|
|
181
|
+
usage_limit=usage_limit
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
Get Latest Project Limit
|
|
186
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
187
|
+
|
|
188
|
+
.. code-block:: python
|
|
189
|
+
|
|
190
|
+
client = UsageLimitClient()
|
|
191
|
+
|
|
192
|
+
latest = client.get_latest_usage_limit_from_project(
|
|
193
|
+
organization="org-uuid",
|
|
194
|
+
project="project-uuid"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
Get Active Project Limit
|
|
199
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
200
|
+
|
|
201
|
+
.. code-block:: python
|
|
202
|
+
|
|
203
|
+
client = UsageLimitClient()
|
|
204
|
+
|
|
205
|
+
active = client.get_active_usage_limit_from_project(
|
|
206
|
+
organization="org-uuid",
|
|
207
|
+
project="project-uuid"
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
Update Project Limits
|
|
212
|
+
~~~~~~~~~~~~~~~~~~~~~
|
|
213
|
+
|
|
214
|
+
.. code-block:: python
|
|
215
|
+
|
|
216
|
+
client = UsageLimitClient()
|
|
217
|
+
|
|
218
|
+
# Update hard limit
|
|
219
|
+
client.set_hard_limit_for_active_usage_limit_from_project(
|
|
220
|
+
organization="org-uuid",
|
|
221
|
+
project="project-uuid",
|
|
222
|
+
limit_id="limit-uuid",
|
|
223
|
+
hard_limit=5000
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Update soft limit
|
|
227
|
+
client.set_soft_limit_for_active_usage_limit_from_project(
|
|
228
|
+
organization="org-uuid",
|
|
229
|
+
project="project-uuid",
|
|
230
|
+
limit_id="limit-uuid",
|
|
231
|
+
soft_limit=4000
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Update renewal status
|
|
235
|
+
client.set_project_renewal_status(
|
|
236
|
+
organization="org-uuid",
|
|
237
|
+
project="project-uuid",
|
|
238
|
+
limit_id="limit-uuid",
|
|
239
|
+
renewal_status="Renewable"
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
Complete Example
|
|
244
|
+
----------------
|
|
245
|
+
|
|
246
|
+
.. code-block:: python
|
|
247
|
+
|
|
248
|
+
from pygeai.organization.limits.clients import UsageLimitClient
|
|
249
|
+
|
|
250
|
+
client = UsageLimitClient()
|
|
251
|
+
org_id = "your-org-uuid"
|
|
252
|
+
project_id = "your-project-uuid"
|
|
253
|
+
|
|
254
|
+
# Set monthly cost limit for organization
|
|
255
|
+
org_limit = client.set_organization_usage_limit(
|
|
256
|
+
organization=org_id,
|
|
257
|
+
usage_limit={
|
|
258
|
+
"subscriptionType": "Monthly",
|
|
259
|
+
"usageUnit": "Cost",
|
|
260
|
+
"softLimit": 800.0,
|
|
261
|
+
"hardLimit": 1000.0,
|
|
262
|
+
"renewalStatus": "Renewable"
|
|
263
|
+
}
|
|
264
|
+
)
|
|
265
|
+
print(f"Organization limit set: {org_limit['id']}")
|
|
266
|
+
|
|
267
|
+
# Set daily request limit for project
|
|
268
|
+
project_limit = client.set_project_usage_limit(
|
|
269
|
+
organization=org_id,
|
|
270
|
+
project=project_id,
|
|
271
|
+
usage_limit={
|
|
272
|
+
"subscriptionType": "Daily",
|
|
273
|
+
"usageUnit": "Requests",
|
|
274
|
+
"softLimit": 900,
|
|
275
|
+
"hardLimit": 1000,
|
|
276
|
+
"renewalStatus": "Renewable"
|
|
277
|
+
}
|
|
278
|
+
)
|
|
279
|
+
print(f"Project limit set: {project_limit['id']}")
|
|
280
|
+
|
|
281
|
+
# Monitor usage
|
|
282
|
+
active_limit = client.get_active_usage_limit_from_project(
|
|
283
|
+
organization=org_id,
|
|
284
|
+
project=project_id
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
current = active_limit.get('currentUsage', 0)
|
|
288
|
+
soft = active_limit['softLimit']
|
|
289
|
+
hard = active_limit['hardLimit']
|
|
290
|
+
|
|
291
|
+
print(f"\nCurrent usage: {current}/{hard}")
|
|
292
|
+
|
|
293
|
+
if current >= hard:
|
|
294
|
+
print("⛔ Hard limit reached!")
|
|
295
|
+
elif current >= soft:
|
|
296
|
+
print("⚠️ Soft limit exceeded")
|
|
297
|
+
else:
|
|
298
|
+
remaining = hard - current
|
|
299
|
+
print(f"✅ {remaining} units remaining")
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
Best Practices
|
|
303
|
+
--------------
|
|
304
|
+
|
|
305
|
+
Limit Configuration
|
|
306
|
+
~~~~~~~~~~~~~~~~~~~
|
|
307
|
+
|
|
308
|
+
* Set soft limits at 80-90% of hard limits
|
|
309
|
+
* Choose appropriate subscription types:
|
|
310
|
+
|
|
311
|
+
* Daily: For development/testing
|
|
312
|
+
* Monthly: For production
|
|
313
|
+
* Freemium: For trial users
|
|
314
|
+
|
|
315
|
+
* Use "Cost" units for budget control
|
|
316
|
+
* Use "Requests" units for rate limiting
|
|
317
|
+
|
|
318
|
+
Monitoring
|
|
319
|
+
~~~~~~~~~~
|
|
320
|
+
|
|
321
|
+
* Check usage regularly (hourly/daily)
|
|
322
|
+
* Send alerts when approaching soft limits
|
|
323
|
+
* Log when hard limits are hit
|
|
324
|
+
* Track usage trends over time
|
|
325
|
+
|
|
326
|
+
Renewal Management
|
|
327
|
+
~~~~~~~~~~~~~~~~~~
|
|
328
|
+
|
|
329
|
+
* Use "Renewable" for ongoing subscriptions
|
|
330
|
+
* Use "NonRenewable" for one-time allocations
|
|
331
|
+
* Document renewal schedules
|
|
332
|
+
* Automate renewal processes
|
|
333
|
+
|
|
334
|
+
Hierarchy
|
|
335
|
+
~~~~~~~~~
|
|
336
|
+
|
|
337
|
+
* Organization limits apply to all projects
|
|
338
|
+
* Project limits can be more restrictive
|
|
339
|
+
* Lower limit takes precedence
|
|
340
|
+
* Monitor both levels
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
Error Handling
|
|
344
|
+
--------------
|
|
345
|
+
|
|
346
|
+
.. code-block:: python
|
|
347
|
+
|
|
348
|
+
from pygeai.organization.limits.clients import UsageLimitClient
|
|
349
|
+
from pygeai.core.common.exceptions import APIError
|
|
350
|
+
|
|
351
|
+
client = UsageLimitClient()
|
|
352
|
+
|
|
353
|
+
try:
|
|
354
|
+
client.set_organization_usage_limit(
|
|
355
|
+
organization="org-uuid",
|
|
356
|
+
usage_limit={
|
|
357
|
+
"subscriptionType": "Monthly",
|
|
358
|
+
"usageUnit": "Cost",
|
|
359
|
+
"softLimit": 1000.0,
|
|
360
|
+
"hardLimit": 800.0 # Invalid: hard < soft
|
|
361
|
+
}
|
|
362
|
+
)
|
|
363
|
+
except APIError as e:
|
|
364
|
+
print(f"Invalid limit configuration: {e}")
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
Common Issues
|
|
368
|
+
~~~~~~~~~~~~~
|
|
369
|
+
|
|
370
|
+
**Hard Limit Less Than Soft Limit**
|
|
371
|
+
|
|
372
|
+
Hard limit must be >= soft limit.
|
|
373
|
+
|
|
374
|
+
**Invalid Subscription Type**
|
|
375
|
+
|
|
376
|
+
Must be one of: "Freemium", "Daily", "Weekly", "Monthly".
|
|
377
|
+
|
|
378
|
+
**Invalid Usage Unit**
|
|
379
|
+
|
|
380
|
+
Must be either "Requests" or "Cost".
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
Notes
|
|
384
|
+
-----
|
|
385
|
+
|
|
386
|
+
* Limits are enforced in real-time
|
|
387
|
+
* Usage resets based on subscription type (daily/weekly/monthly)
|
|
388
|
+
* Non-renewable limits don't reset
|
|
389
|
+
* Both organization and project limits are checked
|
|
390
|
+
* Deleting a limit removes all usage tracking
|
|
@@ -12,10 +12,17 @@ This document provides a comprehensive overview of **API Reference**, outlining
|
|
|
12
12
|
api_reference/assistant
|
|
13
13
|
api_reference/chat
|
|
14
14
|
api_reference/embeddings
|
|
15
|
+
api_reference/evaluation
|
|
16
|
+
api_reference/feedback
|
|
17
|
+
api_reference/files
|
|
18
|
+
api_reference/gam
|
|
15
19
|
api_reference/health
|
|
16
20
|
api_reference/project
|
|
21
|
+
api_reference/proxy
|
|
17
22
|
api_reference/rag
|
|
18
23
|
api_reference/rerank
|
|
24
|
+
api_reference/secrets
|
|
25
|
+
api_reference/usage_limits
|
|
19
26
|
|
|
20
27
|
|
|
21
28
|
Authentication
|