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.
Files changed (178) hide show
  1. pygeai/_docs/source/conf.py +78 -6
  2. pygeai/_docs/source/content/api_reference/embeddings.rst +31 -1
  3. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  4. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  5. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  6. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  7. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  8. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  9. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  10. pygeai/_docs/source/content/api_reference.rst +7 -0
  11. pygeai/_docs/source/content/debugger.rst +376 -83
  12. pygeai/_docs/source/content/migration.rst +528 -0
  13. pygeai/_docs/source/content/modules.rst +1 -1
  14. pygeai/_docs/source/pygeai.cli.rst +8 -0
  15. pygeai/_docs/source/pygeai.tests.cli.rst +16 -0
  16. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +16 -0
  17. pygeai/_docs/source/pygeai.tests.snippets.chat.rst +40 -0
  18. pygeai/_docs/source/pygeai.tests.snippets.dbg.rst +45 -0
  19. pygeai/_docs/source/pygeai.tests.snippets.embeddings.rst +40 -0
  20. pygeai/_docs/source/pygeai.tests.snippets.evaluation.dataset.rst +197 -0
  21. pygeai/_docs/source/pygeai.tests.snippets.evaluation.plan.rst +133 -0
  22. pygeai/_docs/source/pygeai.tests.snippets.evaluation.result.rst +37 -0
  23. pygeai/_docs/source/pygeai.tests.snippets.evaluation.rst +10 -0
  24. pygeai/_docs/source/pygeai.tests.snippets.rst +1 -0
  25. pygeai/admin/clients.py +5 -0
  26. pygeai/assistant/clients.py +7 -0
  27. pygeai/assistant/data_analyst/clients.py +2 -0
  28. pygeai/assistant/rag/clients.py +11 -0
  29. pygeai/chat/clients.py +191 -25
  30. pygeai/chat/endpoints.py +2 -1
  31. pygeai/cli/commands/chat.py +227 -1
  32. pygeai/cli/commands/embeddings.py +56 -8
  33. pygeai/cli/commands/migrate.py +994 -434
  34. pygeai/cli/error_handler.py +116 -0
  35. pygeai/cli/geai.py +28 -10
  36. pygeai/cli/parsers.py +8 -2
  37. pygeai/core/base/clients.py +3 -1
  38. pygeai/core/common/exceptions.py +11 -10
  39. pygeai/core/embeddings/__init__.py +19 -0
  40. pygeai/core/embeddings/clients.py +17 -2
  41. pygeai/core/embeddings/mappers.py +16 -2
  42. pygeai/core/embeddings/responses.py +9 -2
  43. pygeai/core/feedback/clients.py +1 -0
  44. pygeai/core/files/clients.py +5 -7
  45. pygeai/core/files/managers.py +42 -0
  46. pygeai/core/llm/clients.py +4 -0
  47. pygeai/core/plugins/clients.py +1 -0
  48. pygeai/core/rerank/clients.py +1 -0
  49. pygeai/core/secrets/clients.py +6 -0
  50. pygeai/core/services/rest.py +1 -1
  51. pygeai/dbg/__init__.py +3 -0
  52. pygeai/dbg/debugger.py +565 -70
  53. pygeai/evaluation/clients.py +1 -1
  54. pygeai/evaluation/dataset/clients.py +45 -44
  55. pygeai/evaluation/plan/clients.py +27 -26
  56. pygeai/evaluation/result/clients.py +37 -5
  57. pygeai/gam/clients.py +4 -0
  58. pygeai/health/clients.py +1 -0
  59. pygeai/lab/agents/clients.py +8 -1
  60. pygeai/lab/models.py +3 -3
  61. pygeai/lab/processes/clients.py +21 -0
  62. pygeai/lab/strategies/clients.py +4 -0
  63. pygeai/lab/tools/clients.py +1 -0
  64. pygeai/migration/__init__.py +31 -0
  65. pygeai/migration/strategies.py +404 -155
  66. pygeai/migration/tools.py +170 -3
  67. pygeai/organization/clients.py +13 -0
  68. pygeai/organization/limits/clients.py +15 -0
  69. pygeai/proxy/clients.py +3 -1
  70. pygeai/tests/admin/test_clients.py +16 -11
  71. pygeai/tests/assistants/rag/test_clients.py +35 -23
  72. pygeai/tests/assistants/test_clients.py +22 -15
  73. pygeai/tests/auth/test_clients.py +14 -6
  74. pygeai/tests/chat/test_clients.py +211 -1
  75. pygeai/tests/cli/commands/test_embeddings.py +32 -9
  76. pygeai/tests/cli/commands/test_evaluation.py +7 -0
  77. pygeai/tests/cli/commands/test_migrate.py +112 -243
  78. pygeai/tests/cli/test_error_handler.py +225 -0
  79. pygeai/tests/cli/test_geai_driver.py +154 -0
  80. pygeai/tests/cli/test_parsers.py +5 -5
  81. pygeai/tests/core/embeddings/test_clients.py +144 -0
  82. pygeai/tests/core/embeddings/test_managers.py +171 -0
  83. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  84. pygeai/tests/core/feedback/test_clients.py +2 -0
  85. pygeai/tests/core/files/test_clients.py +1 -0
  86. pygeai/tests/core/llm/test_clients.py +14 -9
  87. pygeai/tests/core/plugins/test_clients.py +5 -3
  88. pygeai/tests/core/rerank/test_clients.py +1 -0
  89. pygeai/tests/core/secrets/test_clients.py +19 -13
  90. pygeai/tests/dbg/test_debugger.py +453 -75
  91. pygeai/tests/evaluation/dataset/test_clients.py +3 -1
  92. pygeai/tests/evaluation/plan/test_clients.py +4 -2
  93. pygeai/tests/evaluation/result/test_clients.py +7 -5
  94. pygeai/tests/gam/test_clients.py +1 -1
  95. pygeai/tests/health/test_clients.py +1 -0
  96. pygeai/tests/lab/agents/test_clients.py +9 -0
  97. pygeai/tests/lab/processes/test_clients.py +36 -0
  98. pygeai/tests/lab/processes/test_mappers.py +3 -0
  99. pygeai/tests/lab/strategies/test_clients.py +14 -9
  100. pygeai/tests/migration/test_strategies.py +45 -218
  101. pygeai/tests/migration/test_tools.py +133 -9
  102. pygeai/tests/organization/limits/test_clients.py +17 -0
  103. pygeai/tests/organization/test_clients.py +22 -0
  104. pygeai/tests/proxy/test_clients.py +2 -0
  105. pygeai/tests/proxy/test_integration.py +1 -0
  106. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  107. pygeai/tests/snippets/chat/get_response.py +15 -0
  108. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  109. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  110. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  111. pygeai/tests/snippets/dbg/__init__.py +0 -0
  112. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  113. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  114. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  115. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  116. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  117. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  118. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  119. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  120. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  121. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  122. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  123. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  124. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  125. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  126. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  127. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  128. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  129. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  130. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  131. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  132. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  133. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  134. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  135. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  136. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  137. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  138. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  139. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  140. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  141. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  142. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  143. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  144. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  145. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  146. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  147. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  148. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  149. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  150. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  151. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  152. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  153. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  154. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  155. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  156. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  157. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  158. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  159. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  160. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  161. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  162. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  163. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  164. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  165. pygeai/tests/snippets/migrate/__init__.py +45 -0
  166. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  167. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  168. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  169. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  170. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  171. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  172. pygeai/tests/snippets/organization/create_project.py +2 -2
  173. {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/METADATA +1 -1
  174. {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/RECORD +178 -96
  175. {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/WHEEL +0 -0
  176. {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/entry_points.txt +0 -0
  177. {pygeai-0.6.0b7.dist-info → pygeai-0.6.0b10.dist-info}/licenses/LICENSE +0 -0
  178. {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