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.
- 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
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from typing import Optional, List, Dict
|
|
2
|
+
|
|
3
|
+
from pygeai import logger
|
|
4
|
+
from pygeai.core.base.clients import BaseClient
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
6
|
+
from pygeai.core.plugins.endpoints import LIST_ASSISTANTS_PLUGINS_V1
|
|
7
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
8
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PluginClient(BaseClient):
|
|
12
|
+
"""
|
|
13
|
+
Client for interacting with plugin endpoints of the API.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def list_assistants(
|
|
17
|
+
self,
|
|
18
|
+
organization_id: str,
|
|
19
|
+
project_id: str
|
|
20
|
+
) -> dict:
|
|
21
|
+
params = {
|
|
22
|
+
"organization": organization_id,
|
|
23
|
+
"project": project_id,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
response = self.api_service.get(
|
|
27
|
+
endpoint=LIST_ASSISTANTS_PLUGINS_V1,
|
|
28
|
+
params=params
|
|
29
|
+
)
|
|
30
|
+
validate_status_code(response)
|
|
31
|
+
return parse_json_response(response, f"list assistants for organization {organization_id} and project {project_id}")
|
|
32
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
LIST_ASSISTANTS_PLUGINS_V1 = "v1/plugins" # GET -> Obtain the list of assistants permitted to access in a particular organization and project.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from pydantic import BaseModel, Field
|
|
2
|
+
from typing import Optional, List, Literal
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
from pygeai.core import CustomBaseModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PluginBase(CustomBaseModel):
|
|
9
|
+
can_regenerate_answer: bool = Field(..., alias="canRegenerateAnswer")
|
|
10
|
+
can_show_preview: bool = Field(..., alias="canShowPreview")
|
|
11
|
+
full_conversation: bool = Field(..., alias="fullConversation")
|
|
12
|
+
max_output_tokens: int = Field(..., alias="maxOutputTokens")
|
|
13
|
+
must_trigger_initial_message: bool = Field(..., alias="mustTriggerInitialMessage")
|
|
14
|
+
plugin_id: str = Field(..., alias="pluginId")
|
|
15
|
+
plugin_name: str = Field(..., alias="pluginName")
|
|
16
|
+
plugin_type: str = Field(..., alias="pluginType")
|
|
17
|
+
share_scope: str = Field(..., alias="shareScope")
|
|
18
|
+
streams: bool = Field(..., alias="streams")
|
|
19
|
+
supports_raw_html: bool = Field(..., alias="supportsRawHtml")
|
|
20
|
+
upload_files: bool = Field(..., alias="uploadFiles")
|
|
21
|
+
upload_max_file_count: int = Field(..., alias="uploadMaxFileCount")
|
|
22
|
+
upload_max_file_size: int = Field(..., alias="uploadMaxFileSize")
|
|
23
|
+
plugin_description: Optional[str] = Field(None, alias="pluginDescription")
|
|
24
|
+
temperature: Optional[float] = Field(None, alias="temperature")
|
|
25
|
+
|
|
26
|
+
class Config:
|
|
27
|
+
populate_by_name = True
|
|
28
|
+
|
|
29
|
+
def to_dict(self):
|
|
30
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
|
31
|
+
|
|
32
|
+
def __str__(self):
|
|
33
|
+
return str(self.to_dict())
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class DataAnalystPlugin(PluginBase):
|
|
37
|
+
model_id: UUID = Field(..., alias="modelId")
|
|
38
|
+
model_name: str = Field(..., alias="modelName")
|
|
39
|
+
provider_name: str = Field(..., alias="providerName")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class TextPromptAssistantPlugin(PluginBase):
|
|
43
|
+
input_moderation: bool = Field(..., alias="inputModeration")
|
|
44
|
+
llm_output: bool = Field(..., alias="llmOutput")
|
|
45
|
+
max_token_send_limit: int = Field(..., alias="maxTokenSendLimit")
|
|
46
|
+
model_id: UUID = Field(..., alias="modelId")
|
|
47
|
+
model_name: str = Field(..., alias="modelName")
|
|
48
|
+
prompt_injection: bool = Field(..., alias="promptInjection")
|
|
49
|
+
provider_name: str = Field(..., alias="providerName")
|
|
50
|
+
supported_categories: str = Field(..., alias="supportedCategories")
|
|
51
|
+
supported_file_extensions: str = Field(..., alias="supportedFileExtensions")
|
|
52
|
+
supports_multimodal: bool = Field(..., alias="supportsMultimodal")
|
|
53
|
+
supports_function_calling: Optional[bool] = Field(None, alias="supportsFunctionCalling")
|
|
54
|
+
supports_tool_calling: Optional[bool] = Field(None, alias="supportsToolCalling")
|
|
55
|
+
plugin_icon: Optional[str] = Field(None, alias="pluginIcon")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class RAGPlugin(CustomBaseModel):
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AgentPlugin(CustomBaseModel):
|
|
63
|
+
max_token_send_limit: Optional[int] = Field(None, alias="maxTokenSendLimit")
|
|
64
|
+
model_id: Optional[UUID] = Field(None, alias="modelId")
|
|
65
|
+
model_name: Optional[str] = Field(None, alias="modelName")
|
|
66
|
+
provider_name: Optional[str] = Field(None, alias="providerName")
|
|
67
|
+
supported_categories: Optional[str] = Field(None, alias="supportedCategories")
|
|
68
|
+
supported_file_extensions: Optional[str] = Field(None, alias="supportedFileExtensions")
|
|
69
|
+
supports_function_calling: Optional[bool] = Field(None, alias="supportsFunctionCalling")
|
|
70
|
+
supports_multimodal: Optional[bool] = Field(None, alias="supportsMultimodal")
|
|
71
|
+
supports_tool_calling: Optional[bool] = Field(None, alias="supportsToolCalling")
|
|
72
|
+
plugin_icon: Optional[str] = Field(None, alias="pluginIcon")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class PluginsResponse(CustomBaseModel):
|
|
76
|
+
plugins: List[PluginBase] = Field(..., alias="plugins")
|
|
77
|
+
|
|
78
|
+
class Config:
|
|
79
|
+
populate_by_name = True
|
|
80
|
+
|
|
81
|
+
def to_dict(self):
|
|
82
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
|
83
|
+
|
|
84
|
+
def __str__(self):
|
|
85
|
+
return str(self.to_dict())
|
|
86
|
+
|
|
File without changes
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from typing import Any, Union
|
|
2
|
+
|
|
3
|
+
from pygeai import logger
|
|
4
|
+
from pygeai.core.base.clients import BaseClient
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
6
|
+
from pygeai.core.rerank.endpoints import RERANK_V1
|
|
7
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
8
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RerankClient(BaseClient):
|
|
12
|
+
|
|
13
|
+
def rerank_chunks(
|
|
14
|
+
self,
|
|
15
|
+
query: str,
|
|
16
|
+
model: str,
|
|
17
|
+
documents: list[str],
|
|
18
|
+
top_n: int = 3
|
|
19
|
+
) -> dict:
|
|
20
|
+
data = {
|
|
21
|
+
"query": query,
|
|
22
|
+
"model": model,
|
|
23
|
+
"documents": documents,
|
|
24
|
+
"top_n": top_n
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
logger.debug(f"Generating rerank with data: {data}")
|
|
28
|
+
|
|
29
|
+
response = self.api_service.post(
|
|
30
|
+
endpoint=RERANK_V1,
|
|
31
|
+
data=data
|
|
32
|
+
)
|
|
33
|
+
validate_status_code(response)
|
|
34
|
+
return parse_json_response(response, "rerank chunks for query with model", query=query, model=model)
|
|
35
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
RERANK_V1 = "/rerank" # POST -> Reranks a list of document chunks based on a query.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from pygeai import logger
|
|
2
|
+
from pygeai.core.common.exceptions import APIError
|
|
3
|
+
from pygeai.core.handlers import ErrorHandler
|
|
4
|
+
from pygeai.core.rerank.clients import RerankClient
|
|
5
|
+
from pygeai.core.rerank.mappers import RerankResponseMapper
|
|
6
|
+
from pygeai.core.rerank.models import RerankResponse
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RerankManager:
|
|
10
|
+
|
|
11
|
+
def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
|
|
12
|
+
self.__client = RerankClient(api_key, base_url, alias)
|
|
13
|
+
|
|
14
|
+
def rerank_chunks(
|
|
15
|
+
self,
|
|
16
|
+
query: str,
|
|
17
|
+
model: str,
|
|
18
|
+
documents: list[str],
|
|
19
|
+
top_n: int = 3
|
|
20
|
+
) -> RerankResponse:
|
|
21
|
+
"""
|
|
22
|
+
Reranks a list of documents based on their relevance to the given query.
|
|
23
|
+
|
|
24
|
+
This method sends a rerank request to the RerankClient using the specified
|
|
25
|
+
model, query, and list of documents. It processes the API response by
|
|
26
|
+
checking for errors and mapping the result into a structured RerankResponse.
|
|
27
|
+
|
|
28
|
+
:param query: str - The query string used to evaluate document relevance.
|
|
29
|
+
:param model: str - The identifier of the reranking model to use.
|
|
30
|
+
:param documents: list[str] - A list of document strings to be evaluated and reranked.
|
|
31
|
+
:param top_n: int, optional - The number of top-ranked documents to return. Defaults to 3.
|
|
32
|
+
:return: RerankResponse - The structured reranking response containing the top documents and scores.
|
|
33
|
+
:raises APIError: If the API returns errors.
|
|
34
|
+
"""
|
|
35
|
+
response_data = self.__client.rerank_chunks(
|
|
36
|
+
query=query,
|
|
37
|
+
model=model,
|
|
38
|
+
documents=documents,
|
|
39
|
+
top_n=top_n
|
|
40
|
+
)
|
|
41
|
+
if ErrorHandler.has_errors(response_data):
|
|
42
|
+
error = ErrorHandler.extract_error(response_data)
|
|
43
|
+
logger.error(f"Error received while reranking chunks: {error}")
|
|
44
|
+
raise APIError(f"Error received while reranking chunks: {error}")
|
|
45
|
+
|
|
46
|
+
result = RerankResponseMapper.map_to_rerank_response(response_data)
|
|
47
|
+
return result
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from pygeai.core.rerank.models import RerankResponse, RerankResult, RerankMetaData, ApiVersion, BilledUnits
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RerankResponseMapper:
|
|
5
|
+
|
|
6
|
+
@classmethod
|
|
7
|
+
def map_to_rerank_response(cls, data: dict) -> RerankResponse:
|
|
8
|
+
return RerankResponse(
|
|
9
|
+
id=data.get("id"),
|
|
10
|
+
results=cls.map_to_rerank_results(data.get("results", [])),
|
|
11
|
+
meta=cls.map_to_rerank_metadata(data.get("meta", {}))
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def map_to_rerank_results(cls, results: list) -> list[RerankResult]:
|
|
16
|
+
return [RerankResult(index=item["index"], relevance_score=item["relevance_score"]) for item in results]
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def map_to_rerank_metadata(cls, data: dict) -> RerankMetaData:
|
|
20
|
+
return RerankMetaData(
|
|
21
|
+
api_version=ApiVersion(version=data.get("api_version", {}).get("version", "")),
|
|
22
|
+
billed_units=BilledUnits(search_units=data.get("billed_units", {}).get("search_units", 0))
|
|
23
|
+
)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class RerankResult(BaseModel):
|
|
7
|
+
index: int
|
|
8
|
+
relevance_score: float
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ApiVersion(BaseModel):
|
|
12
|
+
version: str
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BilledUnits(BaseModel):
|
|
16
|
+
search_units: int
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RerankMetaData(BaseModel):
|
|
20
|
+
api_version: ApiVersion
|
|
21
|
+
billed_units: BilledUnits
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class RerankResponse(BaseModel):
|
|
25
|
+
id: str
|
|
26
|
+
results: List[RerankResult]
|
|
27
|
+
meta: RerankMetaData
|
pygeai/core/responses.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
|
|
3
|
+
from pydantic.main import BaseModel
|
|
4
|
+
|
|
5
|
+
from pygeai.core.models import Project, Assistant, ChatMessage
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AssistantResponse(BaseModel):
|
|
9
|
+
assistant: Assistant
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class NewAssistantResponse(BaseModel):
|
|
13
|
+
assistant: Optional[Assistant] = None
|
|
14
|
+
project: Optional[Project] = None
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TokenDetails(BaseModel):
|
|
18
|
+
reasoning_tokens: Optional[int] = None
|
|
19
|
+
cached_tokens: Optional[int] = None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UsageDetails(BaseModel):
|
|
23
|
+
completion_tokens: int
|
|
24
|
+
prompt_tokens: int
|
|
25
|
+
total_cost: float
|
|
26
|
+
completion_tokens_details: Optional[TokenDetails] = None
|
|
27
|
+
prompt_tokens_details: Optional[TokenDetails] = None
|
|
28
|
+
total_tokens: int
|
|
29
|
+
currency: str
|
|
30
|
+
completion_cost: float
|
|
31
|
+
prompt_cost: float
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Choice(BaseModel):
|
|
35
|
+
finish_reason: str
|
|
36
|
+
index: int
|
|
37
|
+
message: Optional[ChatMessage] = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ProviderResponse(BaseModel):
|
|
41
|
+
created: int
|
|
42
|
+
usage: UsageDetails
|
|
43
|
+
model: str
|
|
44
|
+
service_tier: Optional[str] = None
|
|
45
|
+
id: Optional[str] = None
|
|
46
|
+
system_fingerprint: Optional[str] = None
|
|
47
|
+
choices: List[Choice]
|
|
48
|
+
object: Optional[str] = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ChatResponse(BaseModel):
|
|
52
|
+
"""
|
|
53
|
+
{
|
|
54
|
+
'progress': 100,
|
|
55
|
+
'providerName': 'openai',
|
|
56
|
+
'providerResponse': '{
|
|
57
|
+
"created":1738936741,
|
|
58
|
+
"usage":{
|
|
59
|
+
"completion_tokens":15,
|
|
60
|
+
"prompt_tokens":34,
|
|
61
|
+
"total_cost":0.00192,
|
|
62
|
+
"completion_tokens_details":{
|
|
63
|
+
"reasoning_tokens":0
|
|
64
|
+
},
|
|
65
|
+
"prompt_tokens_details":{
|
|
66
|
+
"cached_tokens":0
|
|
67
|
+
},
|
|
68
|
+
"total_tokens":49,
|
|
69
|
+
"currency":"USD",
|
|
70
|
+
"completion_cost":0.0009,
|
|
71
|
+
"prompt_cost":0.00102
|
|
72
|
+
},
|
|
73
|
+
"model":"gpt-4o-2024-08-06",
|
|
74
|
+
"service_tier":"default",
|
|
75
|
+
"id":"chatcmpl-AyJAjwWvbcvKQ5HO29YbGS7t4b5hr",
|
|
76
|
+
"system_fingerprint":"fp_4691090a87",
|
|
77
|
+
"choices":[
|
|
78
|
+
{
|
|
79
|
+
"finish_reason":"stop",
|
|
80
|
+
"index":0,
|
|
81
|
+
"message":{
|
|
82
|
+
"role":"assistant",
|
|
83
|
+
"function_call":null,
|
|
84
|
+
"refusal":null,
|
|
85
|
+
"tool_calls":null,
|
|
86
|
+
"content":"Le logiciel libre est le logiciel qui protège les libertés des utilisateurs."
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"object":"chat.completion"
|
|
91
|
+
}',
|
|
92
|
+
'requestId': '458c003a-d7fb-4d31-867c-d009ebb9d9c5',
|
|
93
|
+
'status': 'succeeded',
|
|
94
|
+
'success': True,
|
|
95
|
+
'text': 'Le logiciel libre est le logiciel qui protège les libertés des utilisateurs.'
|
|
96
|
+
}
|
|
97
|
+
"""
|
|
98
|
+
progress: Optional[int] = None
|
|
99
|
+
provider_name: Optional[str] = None
|
|
100
|
+
provider_response: Optional[ProviderResponse] = None
|
|
101
|
+
request_id: Optional[str] = None
|
|
102
|
+
status: Optional[str] = None
|
|
103
|
+
success: Optional[bool] = False
|
|
104
|
+
text: Optional[str] = False
|
|
File without changes
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
from typing import Optional, List, Dict
|
|
2
|
+
|
|
3
|
+
from pygeai import logger
|
|
4
|
+
from pygeai.core.base.clients import BaseClient
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
6
|
+
from pygeai.core.secrets.endpoints import LIST_SECRETS_V1, GET_SECRET_V1, CREATE_SECRET_V1, UPDATE_SECRET_V1, \
|
|
7
|
+
SET_SECRET_ACCESSES_V1, GET_SECRET_ACCESSES_V1
|
|
8
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
9
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SecretClient(BaseClient):
|
|
13
|
+
"""
|
|
14
|
+
Client for interacting with secret-related endpoints of the API.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def list_secrets(
|
|
18
|
+
self,
|
|
19
|
+
name: str = None,
|
|
20
|
+
id: str = None,
|
|
21
|
+
start: int = 0,
|
|
22
|
+
count: int = 10
|
|
23
|
+
) -> dict:
|
|
24
|
+
"""
|
|
25
|
+
Retrieves a list of secrets with optional filtering and pagination.
|
|
26
|
+
|
|
27
|
+
This method sends a GET request to the LIST_SECRETS_V1 endpoint to fetch a list of secrets.
|
|
28
|
+
Optional query parameters can be used to filter by name or ID and control pagination.
|
|
29
|
+
|
|
30
|
+
:param name: str, optional - Filter secrets by name.
|
|
31
|
+
:param id: str, optional - Filter secrets by ID.
|
|
32
|
+
:param start: int, optional - Starting index for pagination, defaults to 0.
|
|
33
|
+
:param count: int, optional - Number of secrets to return, defaults to 10.
|
|
34
|
+
:return: dict - The API response as a dictionary if JSON parsing succeeds, otherwise the raw response text.
|
|
35
|
+
"""
|
|
36
|
+
params = {
|
|
37
|
+
"name": name,
|
|
38
|
+
"id": id,
|
|
39
|
+
"start": start,
|
|
40
|
+
"count": count
|
|
41
|
+
}
|
|
42
|
+
params = {k: v for k, v in params.items() if v is not None}
|
|
43
|
+
|
|
44
|
+
response = self.api_service.get(
|
|
45
|
+
endpoint=LIST_SECRETS_V1,
|
|
46
|
+
params=params
|
|
47
|
+
)
|
|
48
|
+
validate_status_code(response)
|
|
49
|
+
return parse_json_response(response, "list secrets with params")
|
|
50
|
+
|
|
51
|
+
def get_secret(self, secret_id: str) -> dict:
|
|
52
|
+
"""
|
|
53
|
+
Retrieves a secret by its ID.
|
|
54
|
+
|
|
55
|
+
This method sends a GET request to the GET_SECRET_V1 endpoint to fetch details of a specific secret
|
|
56
|
+
identified by its ID.
|
|
57
|
+
|
|
58
|
+
:param secret_id: str - The unique identifier of the secret to retrieve.
|
|
59
|
+
:return: dict - The API response as a dictionary if JSON parsing succeeds, otherwise the raw response text.
|
|
60
|
+
:raises ValueError: If secret_id is not provided or is empty.
|
|
61
|
+
"""
|
|
62
|
+
if not secret_id:
|
|
63
|
+
raise ValueError("secret_id must be provided and non-empty.")
|
|
64
|
+
|
|
65
|
+
endpoint = GET_SECRET_V1.format(secretID=secret_id)
|
|
66
|
+
response = self.api_service.get(
|
|
67
|
+
endpoint=endpoint
|
|
68
|
+
)
|
|
69
|
+
validate_status_code(response)
|
|
70
|
+
return parse_json_response(response, "get secret with ID", secret_id=secret_id)
|
|
71
|
+
|
|
72
|
+
def create_secret(
|
|
73
|
+
self,
|
|
74
|
+
name: str,
|
|
75
|
+
secret_string: str,
|
|
76
|
+
description: Optional[str] = None
|
|
77
|
+
) -> dict:
|
|
78
|
+
"""
|
|
79
|
+
Creates a new secret with the specified details.
|
|
80
|
+
|
|
81
|
+
This method sends a POST request to the CREATE_SECRET_V1 endpoint to create a secret
|
|
82
|
+
with the provided name, secret string, and optional description.
|
|
83
|
+
|
|
84
|
+
:param name: str - The name of the secret.
|
|
85
|
+
:param secret_string: str - The secret value to store.
|
|
86
|
+
:param description: str, optional - A description of the secret.
|
|
87
|
+
:return: dict - The API response as a dictionary if JSON parsing succeeds, otherwise the raw response text.
|
|
88
|
+
:raises ValueError: If name or secret_string is not provided or is empty.
|
|
89
|
+
"""
|
|
90
|
+
if not name or not secret_string:
|
|
91
|
+
raise ValueError("name and secret_string must be provided and non-empty.")
|
|
92
|
+
|
|
93
|
+
secret_definition = {
|
|
94
|
+
"name": name,
|
|
95
|
+
"secretString": secret_string,
|
|
96
|
+
"description": description
|
|
97
|
+
}
|
|
98
|
+
secret_definition = {k: v for k, v in secret_definition.items() if v is not None}
|
|
99
|
+
|
|
100
|
+
data = {
|
|
101
|
+
"secretDefinition": secret_definition
|
|
102
|
+
}
|
|
103
|
+
response = self.api_service.post(
|
|
104
|
+
endpoint=CREATE_SECRET_V1,
|
|
105
|
+
data=data
|
|
106
|
+
)
|
|
107
|
+
validate_status_code(response)
|
|
108
|
+
return parse_json_response(response, "create secret with name", name=name)
|
|
109
|
+
|
|
110
|
+
def update_secret(
|
|
111
|
+
self,
|
|
112
|
+
secret_id: str,
|
|
113
|
+
name: str,
|
|
114
|
+
secret_string: str,
|
|
115
|
+
description: Optional[str] = None
|
|
116
|
+
) -> dict:
|
|
117
|
+
"""
|
|
118
|
+
Updates an existing secret identified by its ID with the specified details.
|
|
119
|
+
|
|
120
|
+
This method sends a PUT request to the UPDATE_SECRET_V1 endpoint to update a secret
|
|
121
|
+
with the provided name, secret string, and optional description.
|
|
122
|
+
|
|
123
|
+
:param secret_id: str - The unique identifier of the secret to update.
|
|
124
|
+
:param name: str - The updated name of the secret.
|
|
125
|
+
:param secret_string: str - The updated secret value.
|
|
126
|
+
:param description: str, optional - The updated description of the secret.
|
|
127
|
+
:return: dict - The API response as a dictionary if JSON parsing succeeds, otherwise the raw response text.
|
|
128
|
+
:raises ValueError: If secret_id, name, or secret_string is not provided or is empty.
|
|
129
|
+
"""
|
|
130
|
+
if not secret_id or not name or not secret_string:
|
|
131
|
+
raise ValueError("secret_id, name, and secret_string must be provided and non-empty.")
|
|
132
|
+
|
|
133
|
+
secret_definition = {
|
|
134
|
+
"name": name,
|
|
135
|
+
"secretString": secret_string,
|
|
136
|
+
"description": description
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
secret_definition = {k: v for k, v in secret_definition.items() if v is not None}
|
|
140
|
+
|
|
141
|
+
data = {
|
|
142
|
+
"secretDefinition": secret_definition
|
|
143
|
+
}
|
|
144
|
+
endpoint = UPDATE_SECRET_V1.format(secretID=secret_id)
|
|
145
|
+
response = self.api_service.put(
|
|
146
|
+
endpoint=endpoint,
|
|
147
|
+
data=data
|
|
148
|
+
)
|
|
149
|
+
validate_status_code(response)
|
|
150
|
+
return parse_json_response(response, "update secret with ID", secret_id=secret_id)
|
|
151
|
+
|
|
152
|
+
def set_secret_accesses(
|
|
153
|
+
self,
|
|
154
|
+
secret_id: str,
|
|
155
|
+
access_list: List[Dict[str, str]]
|
|
156
|
+
) -> dict:
|
|
157
|
+
"""
|
|
158
|
+
Sets access configurations for a secret identified by its ID.
|
|
159
|
+
|
|
160
|
+
This method sends a POST request to the SET_SECRET_ACCESSES_V1 endpoint to set the access
|
|
161
|
+
configurations for a secret, specifying the access level and principal type for each entry.
|
|
162
|
+
|
|
163
|
+
:param secret_id: str - The unique identifier of the secret.
|
|
164
|
+
:param access_list: List[Dict[str, str]] - A list of access configurations, each containing
|
|
165
|
+
'accessLevel' (e.g., 'write') and 'principalType' (e.g., 'service').
|
|
166
|
+
:return: dict - The API response as a dictionary if JSON parsing succeeds, otherwise the raw response text.
|
|
167
|
+
:raises ValueError: If secret_id is not provided or empty, or if access_list is empty or invalid.
|
|
168
|
+
"""
|
|
169
|
+
if not secret_id:
|
|
170
|
+
raise ValueError("secret_id must be provided and non-empty.")
|
|
171
|
+
if not access_list:
|
|
172
|
+
raise ValueError("access_list must be provided and non-empty.")
|
|
173
|
+
|
|
174
|
+
for access in access_list:
|
|
175
|
+
if not all(key in access for key in ["accessLevel", "principalType"]):
|
|
176
|
+
raise ValueError("Each access entry must contain 'accessLevel' and 'principalType'.")
|
|
177
|
+
if not all(isinstance(access[key], str) and access[key] for key in ["accessLevel", "principalType"]):
|
|
178
|
+
raise ValueError("'accessLevel' and 'principalType' must be non-empty strings.")
|
|
179
|
+
|
|
180
|
+
data = {
|
|
181
|
+
"secretDefinition": {
|
|
182
|
+
"accessList": access_list
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
endpoint = SET_SECRET_ACCESSES_V1.format(secretID=secret_id)
|
|
186
|
+
response = self.api_service.post(
|
|
187
|
+
endpoint=endpoint,
|
|
188
|
+
data=data
|
|
189
|
+
)
|
|
190
|
+
validate_status_code(response)
|
|
191
|
+
return parse_json_response(response, "set accesses for secret with ID", secret_id=secret_id)
|
|
192
|
+
|
|
193
|
+
def get_secret_accesses(self, secret_id: str) -> dict:
|
|
194
|
+
"""
|
|
195
|
+
Retrieves access configurations for a secret identified by its ID.
|
|
196
|
+
|
|
197
|
+
This method sends a GET request to the GET_SECRET_ACCESSES_V1 endpoint to fetch the access
|
|
198
|
+
configurations for a specific secret.
|
|
199
|
+
|
|
200
|
+
:param secret_id: str - The unique identifier of the secret.
|
|
201
|
+
:return: dict - The API response as a dictionary if JSON parsing succeeds, otherwise the raw response text.
|
|
202
|
+
:raises ValueError: If secret_id is not provided or is empty.
|
|
203
|
+
"""
|
|
204
|
+
if not secret_id:
|
|
205
|
+
raise ValueError("secret_id must be provided and non-empty.")
|
|
206
|
+
|
|
207
|
+
endpoint = GET_SECRET_ACCESSES_V1.format(secretID=secret_id)
|
|
208
|
+
response = self.api_service.get(
|
|
209
|
+
endpoint=endpoint
|
|
210
|
+
)
|
|
211
|
+
validate_status_code(response)
|
|
212
|
+
return parse_json_response(response, "get accesses for secret with ID", secret_id=secret_id)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
LIST_SECRETS_V1 = "/v1/secrets" # GET -> Get secrets (Params: ?name=&id=&start=&count=)
|
|
2
|
+
GET_SECRET_V1 = "/v1/secrets/{secretID}" # GET -> Get secret by Id
|
|
3
|
+
CREATE_SECRET_V1 = "/v1/secrets" # POST -> Create secret
|
|
4
|
+
UPDATE_SECRET_V1 = "/v1/secrets/{secretID}" # PUT -> Update secret by Id
|
|
5
|
+
SET_SECRET_ACCESSES_V1 = "/v1/secrets/{secretID}/accesses" # POST -> Set accesses
|
|
6
|
+
GET_SECRET_ACCESSES_V1 = "/v1/secrets/{secretID}/accesses" # GET -> Get accesses
|
|
7
|
+
|
|
File without changes
|