pygeai 0.1.6__py3-none-any.whl → 0.6.0b15__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.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +11 -2
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- 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/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -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 +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +48 -57
- pygeai/assistant/data/__init__.py +0 -0
- pygeai/assistant/data/clients.py +15 -0
- pygeai/assistant/data_analyst/__init__.py +0 -0
- pygeai/assistant/data_analyst/clients.py +75 -0
- pygeai/assistant/data_analyst/endpoints.py +2 -0
- pygeai/assistant/endpoints.py +0 -2
- pygeai/assistant/managers.py +738 -0
- pygeai/assistant/mappers.py +153 -0
- pygeai/assistant/rag/clients.py +132 -21
- pygeai/assistant/rag/mappers.py +228 -0
- pygeai/assistant/rag/models.py +396 -0
- pygeai/assistant/rag/responses.py +10 -0
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +406 -31
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +17 -0
- pygeai/chat/managers.py +64 -0
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +9 -12
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +11 -11
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +201 -7
- pygeai/cli/commands/chat.py +875 -14
- pygeai/cli/commands/common.py +30 -26
- pygeai/cli/commands/configuration.py +84 -9
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +187 -0
- pygeai/cli/commands/evaluation.py +2069 -0
- pygeai/cli/commands/feedback.py +93 -0
- pygeai/cli/commands/files.py +312 -0
- pygeai/cli/commands/flows/__init__.py +0 -0
- pygeai/cli/commands/gam.py +349 -0
- pygeai/cli/commands/lab/__init__.py +0 -0
- pygeai/cli/commands/lab/ai_lab.py +4110 -0
- pygeai/cli/commands/lab/common.py +135 -0
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +164 -0
- pygeai/cli/commands/migrate.py +1198 -0
- pygeai/cli/commands/options.py +86 -0
- pygeai/cli/commands/organization.py +560 -98
- pygeai/cli/commands/rag.py +306 -10
- pygeai/cli/commands/rerank.py +108 -0
- pygeai/cli/commands/secrets.py +357 -0
- pygeai/cli/commands/usage_limits.py +583 -0
- pygeai/cli/commands/validators.py +209 -0
- pygeai/cli/commands/version.py +44 -0
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +171 -30
- pygeai/cli/geai_proxy.py +318 -0
- pygeai/cli/install_man.py +107 -0
- pygeai/cli/parsers.py +78 -25
- pygeai/cli/texts/help.py +712 -55
- pygeai/core/__init__.py +9 -1
- pygeai/core/base/clients.py +61 -10
- pygeai/core/base/mappers.py +208 -30
- pygeai/core/base/models.py +8 -308
- pygeai/core/base/responses.py +18 -1
- pygeai/core/base/session.py +110 -17
- pygeai/core/common/config.py +98 -16
- pygeai/core/common/decorators.py +44 -0
- pygeai/core/common/exceptions.py +104 -4
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +93 -0
- pygeai/core/embeddings/endpoints.py +1 -0
- pygeai/core/embeddings/managers.py +62 -0
- pygeai/core/embeddings/mappers.py +52 -0
- pygeai/core/embeddings/models.py +14 -0
- pygeai/core/embeddings/responses.py +31 -0
- pygeai/core/feedback/__init__.py +0 -0
- pygeai/core/feedback/clients.py +50 -0
- pygeai/core/feedback/endpoints.py +1 -0
- pygeai/core/feedback/models.py +10 -0
- pygeai/core/files/__init__.py +0 -0
- pygeai/core/files/clients.py +156 -0
- pygeai/core/files/endpoints.py +5 -0
- pygeai/core/files/managers.py +224 -0
- pygeai/core/files/mappers.py +44 -0
- pygeai/core/files/models.py +24 -0
- pygeai/core/files/responses.py +19 -0
- pygeai/core/handlers.py +32 -0
- pygeai/core/llm/__init__.py +0 -0
- pygeai/core/llm/clients.py +53 -0
- pygeai/core/llm/endpoints.py +4 -0
- pygeai/core/models.py +799 -0
- pygeai/core/plugins/__init__.py +0 -0
- pygeai/core/plugins/clients.py +32 -0
- pygeai/core/plugins/endpoints.py +1 -0
- pygeai/core/plugins/models.py +86 -0
- pygeai/core/rerank/__init__.py +0 -0
- pygeai/core/rerank/clients.py +35 -0
- pygeai/core/rerank/endpoints.py +1 -0
- pygeai/core/rerank/managers.py +47 -0
- pygeai/core/rerank/mappers.py +23 -0
- pygeai/core/rerank/models.py +27 -0
- pygeai/core/responses.py +104 -0
- pygeai/core/secrets/__init__.py +0 -0
- pygeai/core/secrets/clients.py +212 -0
- pygeai/core/secrets/endpoints.py +7 -0
- pygeai/core/services/llm/__init__.py +0 -0
- pygeai/core/services/llm/model.py +186 -0
- pygeai/core/services/llm/providers.py +15 -0
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +311 -89
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +870 -0
- pygeai/evaluation/__init__.py +0 -0
- pygeai/evaluation/clients.py +19 -0
- pygeai/evaluation/dataset/__init__.py +0 -0
- pygeai/evaluation/dataset/clients.py +514 -0
- pygeai/evaluation/dataset/endpoints.py +26 -0
- pygeai/evaluation/plan/__init__.py +0 -0
- pygeai/evaluation/plan/clients.py +302 -0
- pygeai/evaluation/plan/endpoints.py +16 -0
- pygeai/evaluation/result/__init__.py +0 -0
- pygeai/evaluation/result/clients.py +70 -0
- pygeai/evaluation/result/endpoints.py +2 -0
- pygeai/flows/__init__.py +0 -0
- pygeai/flows/endpoints.py +362 -0
- pygeai/flows/models.py +1304 -0
- pygeai/gam/__init__.py +0 -0
- pygeai/gam/clients.py +178 -0
- pygeai/gam/endpoints.py +4 -0
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -0
- pygeai/lab/agents/__init__.py +0 -0
- pygeai/lab/agents/clients.py +426 -0
- pygeai/lab/agents/endpoints.py +12 -0
- pygeai/lab/agents/mappers.py +319 -0
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +1558 -0
- pygeai/lab/models.py +1719 -0
- pygeai/lab/processes/__init__.py +0 -0
- pygeai/lab/processes/clients.py +1051 -0
- pygeai/lab/processes/endpoints.py +26 -0
- pygeai/lab/processes/mappers.py +395 -0
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/__init__.py +0 -0
- pygeai/lab/strategies/clients.py +212 -0
- pygeai/lab/strategies/endpoints.py +5 -0
- pygeai/lab/strategies/mappers.py +58 -0
- pygeai/lab/tools/__init__.py +0 -0
- pygeai/lab/tools/clients.py +465 -0
- pygeai/lab/tools/endpoints.py +13 -0
- pygeai/lab/tools/mappers.py +131 -0
- pygeai/man/__init__.py +1 -0
- pygeai/man/man1/__init__.py +1 -0
- pygeai/man/man1/geai-proxy.1 +246 -0
- pygeai/man/man1/geai.1 +2615 -0
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +603 -0
- pygeai/migration/tools.py +180 -0
- pygeai/organization/clients.py +246 -18
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/__init__.py +0 -0
- pygeai/organization/limits/clients.py +281 -0
- pygeai/organization/limits/endpoints.py +15 -0
- pygeai/organization/limits/managers.py +331 -0
- pygeai/organization/limits/mappers.py +21 -0
- pygeai/organization/managers.py +537 -0
- pygeai/organization/mappers.py +111 -46
- pygeai/organization/responses.py +61 -11
- pygeai/proxy/__init__.py +0 -0
- pygeai/proxy/clients.py +216 -0
- pygeai/proxy/config.py +128 -0
- pygeai/proxy/managers.py +232 -0
- pygeai/proxy/servers.py +304 -0
- pygeai/proxy/tool.py +69 -0
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/__init__.py +0 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_mappers.py +189 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -80
- pygeai/tests/assistants/test_managers.py +198 -0
- pygeai/tests/assistants/test_mappers.py +111 -0
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/__init__.py +0 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +154 -0
- pygeai/tests/core/base/__init__.py +0 -0
- pygeai/tests/core/base/data/__init__.py +0 -0
- pygeai/tests/core/base/data/mappers.py +117 -0
- pygeai/tests/core/base/data/models.py +312 -0
- pygeai/tests/core/base/test_mappers.py +569 -0
- pygeai/tests/core/base/test_models.py +261 -0
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/__init__.py +0 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +219 -0
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/__init__.py +0 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +99 -0
- pygeai/tests/core/rerank/test_mappers.py +54 -0
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/__init__.py +0 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_mappers.py +245 -0
- pygeai/tests/lab/test_models.py +1154 -0
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/__init__.py +0 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +402 -0
- pygeai/tests/organization/test_clients.py +615 -64
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/__init__.py +0 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/assistants/__init__.py +0 -0
- pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
- pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
- pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
- pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
- pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
- pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
- pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
- pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
- pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
- pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
- pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
- pygeai/tests/snippets/assistants/send_feedback.py +14 -0
- pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/__init__.py +0 -0
- pygeai/tests/snippets/chat/cancel_request.py +7 -0
- pygeai/tests/snippets/chat/chat_completion.py +28 -0
- pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
- pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
- pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
- pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
- pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_request_status.py +7 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -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_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/chat/send_chat_request.py +33 -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/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/__init__.py +0 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -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/__init__.py +0 -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/files/__init__.py +0 -0
- pygeai/tests/snippets/files/delete_file.py +9 -0
- pygeai/tests/snippets/files/get_file_content.py +10 -0
- pygeai/tests/snippets/files/get_file_data.py +9 -0
- pygeai/tests/snippets/files/get_file_list.py +6 -0
- pygeai/tests/snippets/files/upload_file.py +13 -0
- pygeai/tests/snippets/gam/__init__.py +0 -0
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/__init__.py +0 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
- pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
- pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
- pygeai/tests/snippets/lab/agents/__init__.py +0 -0
- pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
- pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
- pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
- pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/create_process.py +24 -0
- pygeai/tests/snippets/lab/processes/create_task.py +8 -0
- pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
- pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
- pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
- pygeai/tests/snippets/lab/runner_1.py +212 -0
- pygeai/tests/snippets/lab/samples/__init__.py +0 -0
- pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
- pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
- pygeai/tests/snippets/lab/tools/__init__.py +0 -0
- pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
- pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
- pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
- pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
- pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
- pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -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/__init__.py +0 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +23 -0
- pygeai/tests/snippets/organization/delete_project.py +7 -0
- pygeai/tests/snippets/organization/export_request_data.py +7 -0
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_data.py +7 -0
- pygeai/tests/snippets/organization/get_project_list.py +8 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
- pygeai/tests/snippets/organization/update_project.py +14 -0
- pygeai/tests/snippets/rerank/__init__.py +0 -0
- pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
- pygeai/tests/snippets/secrets/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
- pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
- docs/source/conf.py +0 -45
- pygeai/core/clients.py +0 -240
- pygeai/tests/core/test_clients.py +0 -49
- pygeai-0.1.6.dist-info/METADATA +0 -92
- pygeai-0.1.6.dist-info/RECORD +0 -65
- pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
- pygeai-0.1.6.dist-info/entry_points.txt +0 -2
- /pygeai/{agent → analytics}/__init__.py +0 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
|
|
2
|
+
from pygeai import logger
|
|
3
|
+
from pygeai.core.base.clients import BaseClient
|
|
4
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
5
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
6
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
7
|
+
from pygeai.organization.limits.endpoints import SET_ORGANIZATION_USAGE_LIMIT_V2, GET_ORGANIZATION_LATEST_USAGE_LIMIT_V2, \
|
|
8
|
+
GET_ALL_ORGANIZATION_USAGE_LIMITS_V2, DELETE_ORGANIZATION_USAGE_LIMIT_V2, SET_ORGANIZATION_HARD_LIMIT_V2, \
|
|
9
|
+
SET_ORGANIZATION_SOFT_LIMIT_V2, SET_ORGANIZATION_RENEWAL_STATUS_V2, SET_PROJECT_USAGE_LIMIT_V2, \
|
|
10
|
+
GET_ALL_PROJECT_USAGE_LIMIT_V2, GET_LATEST_PROJECT_USAGE_LIMIT_V2, GET_PROJECT_ACTIVE_USAGE_LIMIT_V2, \
|
|
11
|
+
DELETE_PROJECT_USAGE_LIMIT_V2, SET_PROJECT_HARD_LIMIT_V2, SET_PROJECT_SOFT_LIMIT_V2, \
|
|
12
|
+
SET_PROJECT_RENEWAL_STATUS_V2
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class UsageLimitClient(BaseClient):
|
|
16
|
+
|
|
17
|
+
def set_organization_usage_limit(self, organization: str, usage_limit: dict) -> dict:
|
|
18
|
+
"""
|
|
19
|
+
Defines a new usage limit for an organization.
|
|
20
|
+
|
|
21
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
22
|
+
:param usage_limit: dict - A dictionary containing the usage limit configuration. Example structure:
|
|
23
|
+
{
|
|
24
|
+
"subscriptionType": "Freemium" | "Daily" | "Weekly" | "Monthly",
|
|
25
|
+
"usageUnit": "Requests" | "Cost",
|
|
26
|
+
"softLimit": number,
|
|
27
|
+
"hardLimit": number, # Must be greater than or equal to softLimit
|
|
28
|
+
"renewalStatus": "Renewable" | "NonRenewable"
|
|
29
|
+
} (Required)
|
|
30
|
+
:return: dict - The API response as a JSON object containing details about the created usage limit.
|
|
31
|
+
"""
|
|
32
|
+
endpoint = SET_ORGANIZATION_USAGE_LIMIT_V2.format(organization=organization)
|
|
33
|
+
response = self.api_service.post(
|
|
34
|
+
endpoint=endpoint,
|
|
35
|
+
data=usage_limit
|
|
36
|
+
)
|
|
37
|
+
validate_status_code(response)
|
|
38
|
+
return parse_json_response(response, f"set usage limit for organization", organization=organization)
|
|
39
|
+
|
|
40
|
+
def get_organization_latest_usage_limit(self, organization: str) -> dict:
|
|
41
|
+
"""
|
|
42
|
+
Retrieves the latest usage limit defined for a given organization.
|
|
43
|
+
|
|
44
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
45
|
+
:return: dict - The API response as a JSON object containing details of the latest usage limit.
|
|
46
|
+
"""
|
|
47
|
+
endpoint = GET_ORGANIZATION_LATEST_USAGE_LIMIT_V2.format(organization=organization)
|
|
48
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
49
|
+
validate_status_code(response)
|
|
50
|
+
return parse_json_response(response, f"get latest usage limit for organization", organization=organization)
|
|
51
|
+
|
|
52
|
+
def get_all_usage_limits_from_organization(self, organization: str) -> dict:
|
|
53
|
+
"""
|
|
54
|
+
Retrieves all usage limits defined for a given organization.
|
|
55
|
+
|
|
56
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
57
|
+
:return: dict - The API response as a JSON object containing a list of all usage limits.
|
|
58
|
+
"""
|
|
59
|
+
endpoint = GET_ALL_ORGANIZATION_USAGE_LIMITS_V2.format(organization=organization)
|
|
60
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
61
|
+
validate_status_code(response)
|
|
62
|
+
return parse_json_response(response, f"get all usage limits for organization", organization=organization)
|
|
63
|
+
|
|
64
|
+
def delete_usage_limit_from_organization(self, organization: str, limit_id: str) -> dict:
|
|
65
|
+
"""
|
|
66
|
+
Deletes a specific usage limit from an organization.
|
|
67
|
+
|
|
68
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
69
|
+
:param limit_id: str - The unique identifier of the usage limit to be deleted. (Required)
|
|
70
|
+
:return: dict - The API response as a JSON object indicating the result of the delete operation.
|
|
71
|
+
"""
|
|
72
|
+
endpoint = DELETE_ORGANIZATION_USAGE_LIMIT_V2.format(organization=organization, id=limit_id)
|
|
73
|
+
response = self.api_service.delete(endpoint=endpoint)
|
|
74
|
+
validate_status_code(response)
|
|
75
|
+
return parse_json_response(response, f"delete usage limit with ID '{limit_id}' from organization", organization=organization)
|
|
76
|
+
|
|
77
|
+
def set_organization_hard_limit(self, organization: str, limit_id: str, hard_limit: float) -> dict:
|
|
78
|
+
"""
|
|
79
|
+
Updates the hard limit for a specific usage limit in an organization.
|
|
80
|
+
|
|
81
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
82
|
+
:param limit_id: str - The unique identifier of the usage limit to be updated. (Required)
|
|
83
|
+
:param hard_limit: float - The new hard limit value. Must be greater than or equal to the soft limit. (Required)
|
|
84
|
+
:return: dict - The API response as a JSON object confirming the update.
|
|
85
|
+
"""
|
|
86
|
+
endpoint = SET_ORGANIZATION_HARD_LIMIT_V2.format(organization=organization, id=limit_id)
|
|
87
|
+
response = self.api_service.put(
|
|
88
|
+
endpoint=endpoint,
|
|
89
|
+
data={
|
|
90
|
+
"hardLimit": hard_limit
|
|
91
|
+
}
|
|
92
|
+
)
|
|
93
|
+
validate_status_code(response)
|
|
94
|
+
return parse_json_response(response, f"set hard limit for usage limit ID '{limit_id}' in organization", organization=organization)
|
|
95
|
+
|
|
96
|
+
def set_organization_soft_limit(self, organization: str, limit_id: str, soft_limit: float) -> dict:
|
|
97
|
+
"""
|
|
98
|
+
Updates the soft limit for a specific usage limit in an organization.
|
|
99
|
+
|
|
100
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
101
|
+
:param limit_id: str - The unique identifier of the usage limit to be updated. (Required)
|
|
102
|
+
:param soft_limit: float - The new soft limit value. Must be less than or equal to the hard limit. (Required)
|
|
103
|
+
:return: dict - The API response as a JSON object confirming the update.
|
|
104
|
+
"""
|
|
105
|
+
endpoint = SET_ORGANIZATION_SOFT_LIMIT_V2.format(organization=organization, id=limit_id)
|
|
106
|
+
response = self.api_service.put(
|
|
107
|
+
endpoint=endpoint,
|
|
108
|
+
data={
|
|
109
|
+
"softLimit": soft_limit
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
validate_status_code(response)
|
|
113
|
+
return parse_json_response(response, f"set soft limit for usage limit ID '{limit_id}' in organization", organization=organization)
|
|
114
|
+
|
|
115
|
+
def set_organization_renewal_status(self, organization: str, limit_id: str, renewal_status: str) -> dict:
|
|
116
|
+
"""
|
|
117
|
+
Updates the renewal status for a specific usage limit in an organization.
|
|
118
|
+
|
|
119
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
120
|
+
:param limit_id: str - The unique identifier of the usage limit to be updated. (Required)
|
|
121
|
+
:param renewal_status: str - The new renewal status. Must be either "Renewable" or "NonRenewable". (Required)
|
|
122
|
+
:return: dict - The API response as a JSON object confirming the update.
|
|
123
|
+
"""
|
|
124
|
+
endpoint = SET_ORGANIZATION_RENEWAL_STATUS_V2.format(organization=organization, id=limit_id)
|
|
125
|
+
response = self.api_service.put(
|
|
126
|
+
endpoint=endpoint,
|
|
127
|
+
data={
|
|
128
|
+
"renewalStatus": renewal_status
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
validate_status_code(response)
|
|
132
|
+
return parse_json_response(response, f"set renewal status for usage limit ID '{limit_id}' in organization", organization=organization)
|
|
133
|
+
|
|
134
|
+
def set_project_usage_limit(self, organization: str, project: str, usage_limit: dict) -> dict:
|
|
135
|
+
"""
|
|
136
|
+
Defines a new usage limit for a specific project within an organization.
|
|
137
|
+
|
|
138
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
139
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
140
|
+
:param usage_limit: dict - A dictionary containing usage limit details. Example structure:
|
|
141
|
+
{
|
|
142
|
+
"subscriptionType": "Freemium" | "Daily" | "Weekly" | "Monthly",
|
|
143
|
+
"usageUnit": "Requests" | "Cost",
|
|
144
|
+
"softLimit": float,
|
|
145
|
+
"hardLimit": float,
|
|
146
|
+
"renewalStatus": "Renewable" | "NonRenewable"
|
|
147
|
+
} (Required)
|
|
148
|
+
:return: dict - The API response as a JSON object containing details about the created project usage limit.
|
|
149
|
+
"""
|
|
150
|
+
endpoint = SET_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project)
|
|
151
|
+
response = self.api_service.post(
|
|
152
|
+
endpoint=endpoint,
|
|
153
|
+
data=usage_limit
|
|
154
|
+
)
|
|
155
|
+
validate_status_code(response)
|
|
156
|
+
return parse_json_response(response, f"set usage limit for project '{project}' in organization", organization=organization)
|
|
157
|
+
|
|
158
|
+
def get_all_usage_limits_from_project(self, organization: str, project: str) -> dict:
|
|
159
|
+
"""
|
|
160
|
+
Retrieves all usage limits associated with a specific project within an organization.
|
|
161
|
+
|
|
162
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
163
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
164
|
+
:return: dict - A JSON object containing details of all usage limits set for the specified project.
|
|
165
|
+
"""
|
|
166
|
+
endpoint = GET_ALL_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project)
|
|
167
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
168
|
+
validate_status_code(response)
|
|
169
|
+
return parse_json_response(response, f"get all usage limits for project '{project}' in organization", organization=organization)
|
|
170
|
+
|
|
171
|
+
def get_latest_usage_limit_from_project(self, organization: str, project: str) -> dict:
|
|
172
|
+
"""
|
|
173
|
+
Retrieves the most recent usage limit configured for a specific project within an organization.
|
|
174
|
+
|
|
175
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
176
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
177
|
+
:return: dict - A JSON object containing details of the latest usage limit for the specified project.
|
|
178
|
+
"""
|
|
179
|
+
endpoint = GET_LATEST_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project)
|
|
180
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
181
|
+
validate_status_code(response)
|
|
182
|
+
return parse_json_response(response, f"get latest usage limit for project '{project}' in organization", organization=organization)
|
|
183
|
+
|
|
184
|
+
def get_active_usage_limit_from_project(self, organization: str, project: str) -> dict:
|
|
185
|
+
"""
|
|
186
|
+
Retrieves the currently active usage limit for a specific project within an organization.
|
|
187
|
+
|
|
188
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
189
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
190
|
+
:return: dict - A JSON object containing details of the active usage limit for the specified project.
|
|
191
|
+
"""
|
|
192
|
+
endpoint = GET_PROJECT_ACTIVE_USAGE_LIMIT_V2.format(organization=organization, project=project)
|
|
193
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
194
|
+
validate_status_code(response)
|
|
195
|
+
return parse_json_response(response, f"get active usage limit for project '{project}' in organization", organization=organization)
|
|
196
|
+
|
|
197
|
+
def delete_usage_limit_from_project(self, organization: str, project: str, limit_id: str) -> dict:
|
|
198
|
+
"""
|
|
199
|
+
Deletes a specific usage limit for a given project within an organization.
|
|
200
|
+
|
|
201
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
202
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
203
|
+
:param limit_id: str - The unique identifier of the usage limit to be deleted. (Required)
|
|
204
|
+
:return: dict - A JSON object containing the response of the delete operation.
|
|
205
|
+
"""
|
|
206
|
+
endpoint = DELETE_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project, id=limit_id)
|
|
207
|
+
response = self.api_service.delete(endpoint=endpoint)
|
|
208
|
+
validate_status_code(response)
|
|
209
|
+
return parse_json_response(response, f"delete usage limit with ID '{limit_id}' for project '{project}' in organization", organization=organization)
|
|
210
|
+
|
|
211
|
+
def set_hard_limit_for_active_usage_limit_from_project(
|
|
212
|
+
self,
|
|
213
|
+
organization: str,
|
|
214
|
+
project: str,
|
|
215
|
+
limit_id: str,
|
|
216
|
+
hard_limit: float
|
|
217
|
+
) -> dict:
|
|
218
|
+
"""
|
|
219
|
+
Sets the hard limit for an active usage limit of a project within an organization.
|
|
220
|
+
|
|
221
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
222
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
223
|
+
:param limit_id: str - The unique identifier of the usage limit. (Required)
|
|
224
|
+
:param hard_limit: float - The new hard limit value to be set. (Required)
|
|
225
|
+
:return: dict - A JSON object containing the response of the update operation.
|
|
226
|
+
"""
|
|
227
|
+
endpoint = SET_PROJECT_HARD_LIMIT_V2.format(organization=organization, project=project, id=limit_id)
|
|
228
|
+
response = self.api_service.put(
|
|
229
|
+
endpoint=endpoint,
|
|
230
|
+
data={
|
|
231
|
+
"hardLimit": hard_limit
|
|
232
|
+
}
|
|
233
|
+
)
|
|
234
|
+
validate_status_code(response)
|
|
235
|
+
return parse_json_response(response, f"set hard limit for usage limit ID '{limit_id}' for project '{project}' in organization", organization=organization)
|
|
236
|
+
|
|
237
|
+
def set_soft_limit_for_active_usage_limit_from_project(
|
|
238
|
+
self,
|
|
239
|
+
organization: str,
|
|
240
|
+
project: str,
|
|
241
|
+
limit_id: str,
|
|
242
|
+
soft_limit: float
|
|
243
|
+
) -> dict:
|
|
244
|
+
"""
|
|
245
|
+
Sets the soft limit for an active usage limit of a project within an organization.
|
|
246
|
+
|
|
247
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
248
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
249
|
+
:param limit_id: str - The unique identifier of the usage limit. (Required)
|
|
250
|
+
:param soft_limit: float - The new soft limit value to be set. (Required)
|
|
251
|
+
:return: dict - A JSON object containing the response of the update operation.
|
|
252
|
+
"""
|
|
253
|
+
endpoint = SET_PROJECT_SOFT_LIMIT_V2.format(organization=organization, project=project, id=limit_id)
|
|
254
|
+
response = self.api_service.put(
|
|
255
|
+
endpoint=endpoint,
|
|
256
|
+
data={
|
|
257
|
+
"softLimit": soft_limit
|
|
258
|
+
}
|
|
259
|
+
)
|
|
260
|
+
validate_status_code(response)
|
|
261
|
+
return parse_json_response(response, f"set soft limit for usage limit ID '{limit_id}' for project '{project}' in organization", organization=organization)
|
|
262
|
+
|
|
263
|
+
def set_project_renewal_status(self, organization: str, project: str, limit_id: str, renewal_status: str) -> dict:
|
|
264
|
+
"""
|
|
265
|
+
Updates the renewal status of a project's usage limit within an organization.
|
|
266
|
+
|
|
267
|
+
:param organization: str - The unique identifier of the organization. (Required)
|
|
268
|
+
:param project: str - The unique identifier of the project. (Required)
|
|
269
|
+
:param limit_id: str - The unique identifier of the usage limit. (Required)
|
|
270
|
+
:param renewal_status: str - The new renewal status to be set. Options: "Renewable", "NonRenewable". (Required)
|
|
271
|
+
:return: dict - A JSON object containing the response of the update operation.
|
|
272
|
+
"""
|
|
273
|
+
endpoint = SET_PROJECT_RENEWAL_STATUS_V2.format(organization=organization, project=project, id=limit_id)
|
|
274
|
+
response = self.api_service.put(
|
|
275
|
+
endpoint=endpoint,
|
|
276
|
+
data={
|
|
277
|
+
"renewalStatus": renewal_status
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
validate_status_code(response)
|
|
281
|
+
return parse_json_response(response, f"set renewal status for usage limit ID '{limit_id}' for project '{project}' in organization", organization=organization)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
SET_ORGANIZATION_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits" # POST -> Defines a new usage limit for an organization
|
|
2
|
+
GET_ORGANIZATION_LATEST_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/latest" # GET -> Retrieves the latest usage limit defined for the organization
|
|
3
|
+
GET_ALL_ORGANIZATION_USAGE_LIMITS_V2 = "v2/usageLimits/organizations/{organization}/limits" # GET -> Retrieves all usage limits defined for the organization
|
|
4
|
+
DELETE_ORGANIZATION_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}" # DELETE -> Deletes a usage limit for the organization
|
|
5
|
+
SET_ORGANIZATION_HARD_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}/hardLimit" # PUT -> Modifies the hardLimit of an active usage limit for the organization
|
|
6
|
+
SET_ORGANIZATION_SOFT_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}/softLimit" # PUT -> Modifies the softLimit of an active usage limit for the organization
|
|
7
|
+
SET_ORGANIZATION_RENEWAL_STATUS_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}/renewalStatus" # PUT -> Modifies the renewalStatus of an active usage limit for the organization
|
|
8
|
+
SET_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits" # POST -> Defines a new usage limit for a project
|
|
9
|
+
GET_ALL_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits" # GET -> Retrieves all usage limits for a project
|
|
10
|
+
GET_LATEST_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/latest" # GET -> Retrieves the latest usage limit defined for a project
|
|
11
|
+
GET_PROJECT_ACTIVE_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/active" # GET -> Retrieves the active usage limit for a project
|
|
12
|
+
DELETE_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}" # DELETE -> Deletes an active usage limit for a project
|
|
13
|
+
SET_PROJECT_HARD_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}/hardLimit" # PUT -> Modifies the hardLimit for an active usage limit for a project
|
|
14
|
+
SET_PROJECT_SOFT_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}/softLimit" # PUT -> Modifies the softLimit for an active usage limit for a project
|
|
15
|
+
SET_PROJECT_RENEWAL_STATUS_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}/renewalStatus" # PUT -> Modifies the renewalStatus for an active usage limit for a project
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
from pygeai import logger
|
|
2
|
+
from pygeai.core.base.mappers import ErrorMapper, ModelMapper
|
|
3
|
+
from pygeai.core.models import UsageLimit
|
|
4
|
+
from pygeai.organization.limits.clients import UsageLimitClient
|
|
5
|
+
from pygeai.core.handlers import ErrorHandler
|
|
6
|
+
from pygeai.core.common.exceptions import APIError
|
|
7
|
+
import logging
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UsageLimitManager:
|
|
13
|
+
"""
|
|
14
|
+
Manages usage limits for an organization and its projects.
|
|
15
|
+
|
|
16
|
+
This class provides methods to set, retrieve, update, and delete usage limits
|
|
17
|
+
at both the organization and project levels. It interacts with the `UsageLimitClient`
|
|
18
|
+
to perform API operations.
|
|
19
|
+
|
|
20
|
+
Attributes:
|
|
21
|
+
__client (UsageLimitClient): Client for making API requests.
|
|
22
|
+
__organization_id (str): The organization ID for which usage limits are managed.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
api_key: str = None,
|
|
28
|
+
base_url: str = None,
|
|
29
|
+
alias: str = None,
|
|
30
|
+
organization_id: str = None
|
|
31
|
+
):
|
|
32
|
+
self.__client = UsageLimitClient(api_key, base_url, alias)
|
|
33
|
+
self.__organization_id = organization_id
|
|
34
|
+
|
|
35
|
+
def set_organization_usage_limit(self, usage_limit: UsageLimit) -> UsageLimit:
|
|
36
|
+
"""
|
|
37
|
+
Sets a new usage limit for the organization.
|
|
38
|
+
|
|
39
|
+
This method sends a request to the usage limit client to set a new usage limit
|
|
40
|
+
for the specified organization.
|
|
41
|
+
|
|
42
|
+
:param usage_limit: UsageLimit object containing the limit details.
|
|
43
|
+
:return: UsageLimit object with the created usage limit details.
|
|
44
|
+
:raises APIError: If the API returns errors.
|
|
45
|
+
"""
|
|
46
|
+
response_data = self.__client.set_organization_usage_limit(
|
|
47
|
+
organization=self.__organization_id,
|
|
48
|
+
usage_limit=usage_limit.to_dict()
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if ErrorHandler.has_errors(response_data):
|
|
52
|
+
error = ErrorHandler.extract_error(response_data)
|
|
53
|
+
logger.error(f"Error received while setting organization usage limit: {error}")
|
|
54
|
+
raise APIError(f"Error received while setting organization usage limit: {error}")
|
|
55
|
+
|
|
56
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
57
|
+
return result
|
|
58
|
+
|
|
59
|
+
def get_latest_usage_limit_from_organization(self) -> UsageLimit:
|
|
60
|
+
"""
|
|
61
|
+
Retrieves the latest usage limit set for the organization.
|
|
62
|
+
|
|
63
|
+
This method queries the usage limit client to fetch the latest usage limit
|
|
64
|
+
for the specified organization.
|
|
65
|
+
|
|
66
|
+
:return: UsageLimit object containing the latest usage limit details.
|
|
67
|
+
:raises APIError: If the API returns errors.
|
|
68
|
+
"""
|
|
69
|
+
response_data = self.__client.get_organization_latest_usage_limit(
|
|
70
|
+
organization=self.__organization_id
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if ErrorHandler.has_errors(response_data):
|
|
74
|
+
error = ErrorHandler.extract_error(response_data)
|
|
75
|
+
logger.error(f"Error received while retrieving latest organization usage limit: {error}")
|
|
76
|
+
raise APIError(f"Error received while retrieving latest organization usage limit: {error}")
|
|
77
|
+
|
|
78
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
79
|
+
return result
|
|
80
|
+
|
|
81
|
+
def get_all_usage_limits_from_organization(self) -> list[UsageLimit]:
|
|
82
|
+
"""
|
|
83
|
+
Retrieves all usage limits associated with the organization.
|
|
84
|
+
|
|
85
|
+
This method queries the usage limit client to fetch all usage limits
|
|
86
|
+
for the specified organization.
|
|
87
|
+
|
|
88
|
+
:return: list[UsageLimit] - A list of UsageLimit objects containing all usage limits for the organization.
|
|
89
|
+
:raises APIError: If the API returns errors.
|
|
90
|
+
"""
|
|
91
|
+
response_data = self.__client.get_all_usage_limits_from_organization(
|
|
92
|
+
organization=self.__organization_id
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if ErrorHandler.has_errors(response_data):
|
|
96
|
+
error = ErrorHandler.extract_error(response_data)
|
|
97
|
+
logger.error(f"Error received while retrieving all organization usage limits: {error}")
|
|
98
|
+
raise APIError(f"Error received while retrieving all organization usage limits: {error}")
|
|
99
|
+
|
|
100
|
+
result = ModelMapper.map_to_usage_limit_list(response_data)
|
|
101
|
+
return result
|
|
102
|
+
|
|
103
|
+
def update_organization_usage_limit(self, usage_limit: UsageLimit) -> UsageLimit:
|
|
104
|
+
"""
|
|
105
|
+
Updates the usage limits for an organization, including hard limit, soft limit, and renewal status.
|
|
106
|
+
|
|
107
|
+
This method sends requests to the usage limit client to update specific attributes
|
|
108
|
+
of the usage limit for the specified organization.
|
|
109
|
+
|
|
110
|
+
:param usage_limit: UsageLimit object containing the updated limit values.
|
|
111
|
+
:return: UsageLimit object with updated usage limit details.
|
|
112
|
+
:raises APIError: If the API returns errors.
|
|
113
|
+
"""
|
|
114
|
+
response_data = {}
|
|
115
|
+
if usage_limit.hard_limit:
|
|
116
|
+
response_data = self.__client.set_organization_hard_limit(
|
|
117
|
+
organization=self.__organization_id,
|
|
118
|
+
limit_id=usage_limit.id,
|
|
119
|
+
hard_limit=usage_limit.hard_limit
|
|
120
|
+
)
|
|
121
|
+
if usage_limit.soft_limit:
|
|
122
|
+
response_data = self.__client.set_organization_soft_limit(
|
|
123
|
+
organization=self.__organization_id,
|
|
124
|
+
limit_id=usage_limit.id,
|
|
125
|
+
soft_limit=usage_limit.soft_limit
|
|
126
|
+
)
|
|
127
|
+
if usage_limit.renewal_status:
|
|
128
|
+
response_data = self.__client.set_organization_renewal_status(
|
|
129
|
+
organization=self.__organization_id,
|
|
130
|
+
limit_id=usage_limit.id,
|
|
131
|
+
renewal_status=usage_limit.renewal_status
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
if ErrorHandler.has_errors(response_data):
|
|
135
|
+
error = ErrorHandler.extract_error(response_data)
|
|
136
|
+
logger.error(f"Error received while updating organization usage limit: {error}")
|
|
137
|
+
raise APIError(f"Error received while updating organization usage limit: {error}")
|
|
138
|
+
|
|
139
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
140
|
+
return result
|
|
141
|
+
|
|
142
|
+
def delete_usage_limit_from_organization(self, limit_id: str) -> UsageLimit:
|
|
143
|
+
"""
|
|
144
|
+
Deletes a usage limit from the organization.
|
|
145
|
+
|
|
146
|
+
This method sends a request to the usage limit client to delete a usage limit
|
|
147
|
+
identified by `limit_id` for the specified organization.
|
|
148
|
+
|
|
149
|
+
:param limit_id: The ID of the usage limit to be deleted.
|
|
150
|
+
:return: UsageLimit object representing the deleted limit details.
|
|
151
|
+
:raises APIError: If the API returns errors.
|
|
152
|
+
"""
|
|
153
|
+
response_data = self.__client.delete_usage_limit_from_organization(
|
|
154
|
+
organization=self.__organization_id,
|
|
155
|
+
limit_id=limit_id,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
if ErrorHandler.has_errors(response_data):
|
|
159
|
+
error = ErrorHandler.extract_error(response_data)
|
|
160
|
+
logger.error(f"Error received while deleting organization usage limit: {error}")
|
|
161
|
+
raise APIError(f"Error received while deleting organization usage limit: {error}")
|
|
162
|
+
|
|
163
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
164
|
+
return result
|
|
165
|
+
|
|
166
|
+
def set_project_usage_limit(self, project_id: str, usage_limit: UsageLimit) -> UsageLimit:
|
|
167
|
+
"""
|
|
168
|
+
Sets a new usage limit for a specific project within the organization.
|
|
169
|
+
|
|
170
|
+
This method sends a request to the usage limit client to set a new usage limit
|
|
171
|
+
for the specified project.
|
|
172
|
+
|
|
173
|
+
:param project_id: The unique identifier of the project.
|
|
174
|
+
:param usage_limit: UsageLimit object containing the limit details.
|
|
175
|
+
:return: UsageLimit object with the created project usage limit details.
|
|
176
|
+
:raises APIError: If the API returns errors.
|
|
177
|
+
"""
|
|
178
|
+
response_data = self.__client.set_project_usage_limit(
|
|
179
|
+
organization=self.__organization_id,
|
|
180
|
+
project=project_id,
|
|
181
|
+
usage_limit=usage_limit.to_dict()
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
if ErrorHandler.has_errors(response_data):
|
|
185
|
+
error = ErrorHandler.extract_error(response_data)
|
|
186
|
+
logger.error(f"Error received while setting project usage limit: {error}")
|
|
187
|
+
raise APIError(f"Error received while setting project usage limit: {error}")
|
|
188
|
+
|
|
189
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
190
|
+
return result
|
|
191
|
+
|
|
192
|
+
def get_all_usage_limits_from_project(self, project_id: str) -> UsageLimit:
|
|
193
|
+
"""
|
|
194
|
+
Retrieves all usage limits associated with a specific project.
|
|
195
|
+
|
|
196
|
+
This method queries the usage limit client to fetch all usage limits
|
|
197
|
+
for the specified project.
|
|
198
|
+
|
|
199
|
+
:param project_id: The unique identifier of the project.
|
|
200
|
+
:return: UsageLimit object containing all usage limits for the project.
|
|
201
|
+
:raises APIError: If the API returns errors.
|
|
202
|
+
"""
|
|
203
|
+
response_data = self.__client.get_all_usage_limits_from_project(
|
|
204
|
+
organization=self.__organization_id,
|
|
205
|
+
project=project_id,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
if ErrorHandler.has_errors(response_data):
|
|
209
|
+
error = ErrorHandler.extract_error(response_data)
|
|
210
|
+
logger.error(f"Error received while retrieving all project usage limits: {error}")
|
|
211
|
+
raise APIError(f"Error received while retrieving all project usage limits: {error}")
|
|
212
|
+
|
|
213
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
214
|
+
return result
|
|
215
|
+
|
|
216
|
+
def get_latest_usage_limit_from_project(self, project_id: str) -> UsageLimit:
|
|
217
|
+
"""
|
|
218
|
+
Retrieves the latest usage limit set for a specific project.
|
|
219
|
+
|
|
220
|
+
This method queries the usage limit client to fetch the latest usage limit
|
|
221
|
+
for the specified project.
|
|
222
|
+
|
|
223
|
+
:param project_id: The unique identifier of the project.
|
|
224
|
+
:return: UsageLimit object containing the latest usage limit details.
|
|
225
|
+
:raises APIError: If the API returns errors.
|
|
226
|
+
"""
|
|
227
|
+
response_data = self.__client.get_latest_usage_limit_from_project(
|
|
228
|
+
organization=self.__organization_id,
|
|
229
|
+
project=project_id,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
if ErrorHandler.has_errors(response_data):
|
|
233
|
+
error = ErrorHandler.extract_error(response_data)
|
|
234
|
+
logger.error(f"Error received while retrieving latest project usage limit: {error}")
|
|
235
|
+
raise APIError(f"Error received while retrieving latest project usage limit: {error}")
|
|
236
|
+
|
|
237
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
238
|
+
return result
|
|
239
|
+
|
|
240
|
+
def get_active_usage_limit_from_project(self, project_id: str) -> UsageLimit:
|
|
241
|
+
"""
|
|
242
|
+
Retrieves the currently active usage limit for a specific project.
|
|
243
|
+
|
|
244
|
+
This method queries the usage limit client to fetch the active usage limit
|
|
245
|
+
for the specified project.
|
|
246
|
+
|
|
247
|
+
:param project_id: The unique identifier of the project.
|
|
248
|
+
:return: UsageLimit object containing the active usage limit details.
|
|
249
|
+
:raises APIError: If the API returns errors.
|
|
250
|
+
"""
|
|
251
|
+
response_data = self.__client.get_active_usage_limit_from_project(
|
|
252
|
+
organization=self.__organization_id,
|
|
253
|
+
project=project_id,
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
if ErrorHandler.has_errors(response_data):
|
|
257
|
+
error = ErrorHandler.extract_error(response_data)
|
|
258
|
+
logger.error(f"Error received while retrieving active project usage limit: {error}")
|
|
259
|
+
raise APIError(f"Error received while retrieving active project usage limit: {error}")
|
|
260
|
+
|
|
261
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
262
|
+
return result
|
|
263
|
+
|
|
264
|
+
def delete_usage_limit_from_project(self, project_id: str, usage_limit: UsageLimit) -> UsageLimit:
|
|
265
|
+
"""
|
|
266
|
+
Deletes a specified usage limit from a project.
|
|
267
|
+
|
|
268
|
+
This method sends a request to the usage limit client to delete a usage limit
|
|
269
|
+
identified by `usage_limit.id` for the specified project.
|
|
270
|
+
|
|
271
|
+
:param project_id: The unique identifier of the project.
|
|
272
|
+
:param usage_limit: The UsageLimit object representing the limit to be deleted.
|
|
273
|
+
:return: UsageLimit object representing the deleted usage limit details.
|
|
274
|
+
:raises APIError: If the API returns errors.
|
|
275
|
+
"""
|
|
276
|
+
response_data = self.__client.delete_usage_limit_from_project(
|
|
277
|
+
organization=self.__organization_id,
|
|
278
|
+
project=project_id,
|
|
279
|
+
limit_id=usage_limit.id
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
if ErrorHandler.has_errors(response_data):
|
|
283
|
+
error = ErrorHandler.extract_error(response_data)
|
|
284
|
+
logger.error(f"Error received while deleting project usage limit: {error}")
|
|
285
|
+
raise APIError(f"Error received while deleting project usage limit: {error}")
|
|
286
|
+
|
|
287
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
288
|
+
return result
|
|
289
|
+
|
|
290
|
+
def update_project_usage_limit(self, project_id: str, usage_limit: UsageLimit) -> UsageLimit:
|
|
291
|
+
"""
|
|
292
|
+
Updates the usage limits for a specific project, including hard limit, soft limit, and renewal status.
|
|
293
|
+
|
|
294
|
+
This method sends requests to the usage limit client to update specific attributes
|
|
295
|
+
of the usage limit for the specified project.
|
|
296
|
+
|
|
297
|
+
:param project_id: The unique identifier of the project.
|
|
298
|
+
:param usage_limit: UsageLimit object containing the updated limit values.
|
|
299
|
+
:return: UsageLimit object with updated usage limit details.
|
|
300
|
+
:raises APIError: If the API returns errors.
|
|
301
|
+
"""
|
|
302
|
+
response_data = {}
|
|
303
|
+
if usage_limit.hard_limit:
|
|
304
|
+
response_data = self.__client.set_hard_limit_for_active_usage_limit_from_project(
|
|
305
|
+
organization=self.__organization_id,
|
|
306
|
+
project=project_id,
|
|
307
|
+
limit_id=usage_limit.id,
|
|
308
|
+
hard_limit=usage_limit.hard_limit
|
|
309
|
+
)
|
|
310
|
+
if usage_limit.soft_limit:
|
|
311
|
+
response_data = self.__client.set_soft_limit_for_active_usage_limit_from_project(
|
|
312
|
+
organization=self.__organization_id,
|
|
313
|
+
project=project_id,
|
|
314
|
+
limit_id=usage_limit.id,
|
|
315
|
+
soft_limit=usage_limit.soft_limit
|
|
316
|
+
)
|
|
317
|
+
if usage_limit.renewal_status:
|
|
318
|
+
response_data = self.__client.set_project_renewal_status(
|
|
319
|
+
organization=self.__organization_id,
|
|
320
|
+
project=project_id,
|
|
321
|
+
limit_id=usage_limit.id,
|
|
322
|
+
renewal_status=usage_limit.renewal_status
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
if ErrorHandler.has_errors(response_data):
|
|
326
|
+
error = ErrorHandler.extract_error(response_data)
|
|
327
|
+
logger.error(f"Error received while updating project usage limit: {error}")
|
|
328
|
+
raise APIError(f"Error received while updating project usage limit: {error}")
|
|
329
|
+
|
|
330
|
+
result = ModelMapper.map_to_usage_limit(response_data)
|
|
331
|
+
return result
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from pygeai.core.models import UsageLimit
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class UsageLimitMapper:
|
|
5
|
+
|
|
6
|
+
@classmethod
|
|
7
|
+
def map_to_usage_limit(cls, data: dict) -> UsageLimit:
|
|
8
|
+
return UsageLimit(
|
|
9
|
+
hard_limit=data.get('hardLimit'),
|
|
10
|
+
usage_limit_id=data.get('id'),
|
|
11
|
+
related_entity_name=data.get('relatedEntityName'),
|
|
12
|
+
remaining_usage=data.get('remainingUsage'),
|
|
13
|
+
renewal_status=data.get('renewalStatus'),
|
|
14
|
+
soft_limit=data.get('softLimit'),
|
|
15
|
+
status=data.get('status'),
|
|
16
|
+
subscription_type=data.get('subscriptionType'),
|
|
17
|
+
usage_unit=data.get('usageUnit'),
|
|
18
|
+
used_amount=data.get('usedAmount'),
|
|
19
|
+
valid_from=data.get('validFrom'),
|
|
20
|
+
valid_until=data.get('validUntil'),
|
|
21
|
+
)
|