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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from pygeai.migration.strategies import (
|
|
2
|
+
MigrationStrategy,
|
|
3
|
+
ProjectMigrationStrategy,
|
|
4
|
+
AgentMigrationStrategy,
|
|
5
|
+
ToolMigrationStrategy,
|
|
6
|
+
AgenticProcessMigrationStrategy,
|
|
7
|
+
TaskMigrationStrategy,
|
|
8
|
+
UsageLimitMigrationStrategy,
|
|
9
|
+
RAGAssistantMigrationStrategy,
|
|
10
|
+
FileMigrationStrategy,
|
|
11
|
+
SecretMigrationStrategy
|
|
12
|
+
)
|
|
13
|
+
from pygeai.migration.tools import (
|
|
14
|
+
MigrationTool,
|
|
15
|
+
MigrationPlan,
|
|
16
|
+
MigrationOrchestrator
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"MigrationStrategy",
|
|
21
|
+
"ProjectMigrationStrategy",
|
|
22
|
+
"AgentMigrationStrategy",
|
|
23
|
+
"ToolMigrationStrategy",
|
|
24
|
+
"AgenticProcessMigrationStrategy",
|
|
25
|
+
"TaskMigrationStrategy",
|
|
26
|
+
"UsageLimitMigrationStrategy",
|
|
27
|
+
"RAGAssistantMigrationStrategy",
|
|
28
|
+
"FileMigrationStrategy",
|
|
29
|
+
"SecretMigrationStrategy",
|
|
30
|
+
"MigrationTool",
|
|
31
|
+
"MigrationPlan",
|
|
32
|
+
"MigrationOrchestrator"
|
|
33
|
+
]
|
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from pygeai import logger
|
|
6
|
+
from pygeai.core.files.responses import UploadFileResponse
|
|
7
|
+
from pygeai.core.models import Project, UsageLimit
|
|
8
|
+
from pygeai.core.base.responses import ErrorListResponse
|
|
9
|
+
from pygeai.core.utils.console import Console
|
|
10
|
+
from pygeai.core.files.managers import FileManager
|
|
11
|
+
from pygeai.core.files.models import File
|
|
12
|
+
from pygeai.lab.managers import AILabManager
|
|
13
|
+
from pygeai.lab.models import Agent, Tool, AgenticProcess, Task
|
|
14
|
+
from pygeai.organization.limits.managers import UsageLimitManager
|
|
15
|
+
from pygeai.organization.managers import OrganizationManager
|
|
16
|
+
from pygeai.assistant.managers import AssistantManager
|
|
17
|
+
from pygeai.assistant.rag.models import RAGAssistant
|
|
18
|
+
from pygeai.core.secrets.clients import SecretClient
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class MigrationStrategy(ABC):
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
from_api_key: str,
|
|
26
|
+
from_instance: str,
|
|
27
|
+
to_api_key: Optional[str] = None,
|
|
28
|
+
to_instance: Optional[str] = None
|
|
29
|
+
):
|
|
30
|
+
self.from_api_key = from_api_key
|
|
31
|
+
self.from_instance = from_instance
|
|
32
|
+
self.to_api_key = to_api_key if to_api_key else from_api_key
|
|
33
|
+
self.to_instance = to_instance if to_instance else from_instance
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def migrate(self):
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
def get_display_info(self) -> str:
|
|
40
|
+
"""
|
|
41
|
+
Return a human-readable description of what this strategy will migrate.
|
|
42
|
+
Used for progress tracking and logging.
|
|
43
|
+
|
|
44
|
+
:return: String description like "agent abc-123" or "project MyProject"
|
|
45
|
+
"""
|
|
46
|
+
return self.__class__.__name__.replace("MigrationStrategy", "").lower()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ProjectMigrationStrategy(MigrationStrategy):
|
|
50
|
+
"""
|
|
51
|
+
Migrate a project from a GEAI instance.
|
|
52
|
+
The target project can be in another organization or the same one; in the same instance or another.
|
|
53
|
+
|
|
54
|
+
Note: This strategy requires organization scope API keys for both source and destination,
|
|
55
|
+
as it needs to create projects and manage usage limits using the Organization API.
|
|
56
|
+
See: https://docs.globant.ai/en/wiki?22,Organization+API
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
from_api_key: str,
|
|
62
|
+
from_instance: str,
|
|
63
|
+
from_project_id: str,
|
|
64
|
+
to_project_name: str,
|
|
65
|
+
admin_email: str,
|
|
66
|
+
to_api_key: Optional[str] = None,
|
|
67
|
+
to_instance: Optional[str] = None
|
|
68
|
+
):
|
|
69
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
70
|
+
self.from_project_id = from_project_id
|
|
71
|
+
self.to_project_name = to_project_name
|
|
72
|
+
self.admin_email = admin_email
|
|
73
|
+
self._source_manager = OrganizationManager(
|
|
74
|
+
api_key=self.from_api_key,
|
|
75
|
+
base_url=self.from_instance
|
|
76
|
+
)
|
|
77
|
+
self._destination_manager = OrganizationManager(
|
|
78
|
+
api_key=self.to_api_key,
|
|
79
|
+
base_url=self.to_instance
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
def get_display_info(self) -> str:
|
|
83
|
+
return f"project '{self.to_project_name}'"
|
|
84
|
+
|
|
85
|
+
def migrate(self):
|
|
86
|
+
"""
|
|
87
|
+
Execute the project migration from source to destination instance.
|
|
88
|
+
|
|
89
|
+
:return: The ID of the created project
|
|
90
|
+
:raises ValueError: If project data cannot be retrieved or migration fails
|
|
91
|
+
"""
|
|
92
|
+
new_project = self._migrate_project()
|
|
93
|
+
project_name = getattr(new_project, 'name', 'Unknown')
|
|
94
|
+
project_id = getattr(new_project, 'id', None)
|
|
95
|
+
logger.info(f"Successfully migrated project {self.from_project_id} to {project_name}")
|
|
96
|
+
return project_id
|
|
97
|
+
|
|
98
|
+
def _migrate_project(self) -> Project:
|
|
99
|
+
"""
|
|
100
|
+
Migrate the project data and create it in the destination instance.
|
|
101
|
+
|
|
102
|
+
:return: The newly created project
|
|
103
|
+
:raises ValueError: If project retrieval or creation fails
|
|
104
|
+
"""
|
|
105
|
+
project_data = self._source_manager.get_project_data(project_id=self.from_project_id)
|
|
106
|
+
|
|
107
|
+
if not hasattr(project_data, "project"):
|
|
108
|
+
raise ValueError(f"Unable to retrieve project data for project {self.from_project_id}")
|
|
109
|
+
|
|
110
|
+
new_project = project_data.project
|
|
111
|
+
new_project.name = self.to_project_name
|
|
112
|
+
new_project.email = self.admin_email
|
|
113
|
+
|
|
114
|
+
logger.debug(f"Creating project with destination manager:")
|
|
115
|
+
logger.debug(f" - API Key (first 20 chars): {self.to_api_key[:20] if self.to_api_key else 'None'}...")
|
|
116
|
+
logger.debug(f" - Base URL: {self.to_instance}")
|
|
117
|
+
logger.debug(f" - Project Name: {self.to_project_name}")
|
|
118
|
+
logger.debug(f" - Admin Email: {self.admin_email}")
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
response = self._destination_manager.create_project(new_project)
|
|
122
|
+
except Exception as e:
|
|
123
|
+
error_msg = f"Create project failed: {e}"
|
|
124
|
+
logger.error(error_msg)
|
|
125
|
+
logger.error(f" - Operation: Create project")
|
|
126
|
+
logger.error(f" - Base URL: {self.to_instance}")
|
|
127
|
+
logger.error(f" - API Key used (first 20 chars): {self.to_api_key[:20] if self.to_api_key else 'None'}...")
|
|
128
|
+
Console.write_stderr(f"\nDEBUG: Operation failed: Create project")
|
|
129
|
+
Console.write_stderr(f"DEBUG: Base URL: {self.to_instance}")
|
|
130
|
+
Console.write_stderr(f"DEBUG: API Key used (first 20 chars): {self.to_api_key[:20] if self.to_api_key else 'None'}...")
|
|
131
|
+
raise ValueError(error_msg) from e
|
|
132
|
+
|
|
133
|
+
if isinstance(response, ErrorListResponse):
|
|
134
|
+
error_detail = response.to_dict()
|
|
135
|
+
logger.error(f"Create project returned error response: {error_detail}")
|
|
136
|
+
logger.error(f" - Operation: Create project")
|
|
137
|
+
logger.error(f" - Base URL: {self.to_instance}")
|
|
138
|
+
logger.error(f" - API Key used (first 20 chars): {self.to_api_key[:20] if self.to_api_key else 'None'}...")
|
|
139
|
+
Console.write_stderr(f"\nDEBUG: Operation failed: Create project")
|
|
140
|
+
Console.write_stderr(f"DEBUG: Base URL: {self.to_instance}")
|
|
141
|
+
Console.write_stderr(f"DEBUG: API Key used (first 20 chars): {self.to_api_key[:20] if self.to_api_key else 'None'}...")
|
|
142
|
+
raise ValueError(f"Failed to create project: {error_detail}")
|
|
143
|
+
|
|
144
|
+
if not response or not hasattr(response, "project"):
|
|
145
|
+
raise ValueError("Project creation returned invalid response")
|
|
146
|
+
|
|
147
|
+
return response.project
|
|
148
|
+
|
|
149
|
+
def _migrate_assistants(self, new_project: Project):
|
|
150
|
+
"""
|
|
151
|
+
Migrate assistants associated with the project.
|
|
152
|
+
|
|
153
|
+
:param new_project: The newly created project to migrate assistants to
|
|
154
|
+
"""
|
|
155
|
+
pass
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class _LabResourceMigrationStrategy(MigrationStrategy):
|
|
159
|
+
"""
|
|
160
|
+
Base class for migrating AI Lab resources (agents, tools, processes, tasks).
|
|
161
|
+
Provides common functionality for resource migration.
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
def __init__(
|
|
165
|
+
self,
|
|
166
|
+
from_api_key: str,
|
|
167
|
+
from_instance: str,
|
|
168
|
+
to_api_key: Optional[str] = None,
|
|
169
|
+
to_instance: Optional[str] = None
|
|
170
|
+
):
|
|
171
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
172
|
+
self._source_manager = AILabManager(
|
|
173
|
+
api_key=self.from_api_key,
|
|
174
|
+
base_url=self.from_instance
|
|
175
|
+
)
|
|
176
|
+
self._destination_manager = AILabManager(
|
|
177
|
+
api_key=self.to_api_key,
|
|
178
|
+
base_url=self.to_instance
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
@abstractmethod
|
|
182
|
+
def _get_resource(self, resource_id: str):
|
|
183
|
+
"""Retrieve the resource from source instance"""
|
|
184
|
+
pass
|
|
185
|
+
|
|
186
|
+
@abstractmethod
|
|
187
|
+
def _create_resource(self, resource):
|
|
188
|
+
"""Create the resource in destination instance"""
|
|
189
|
+
pass
|
|
190
|
+
|
|
191
|
+
@abstractmethod
|
|
192
|
+
def _get_resource_name(self) -> str:
|
|
193
|
+
"""Return the name of the resource type for logging/errors"""
|
|
194
|
+
pass
|
|
195
|
+
|
|
196
|
+
def get_display_info(self) -> str:
|
|
197
|
+
resource_id = getattr(self, f"{self._get_resource_name()}_id", "unknown")
|
|
198
|
+
return f"{self._get_resource_name()} {resource_id}"
|
|
199
|
+
|
|
200
|
+
def migrate(self):
|
|
201
|
+
"""
|
|
202
|
+
Execute the resource migration from source to destination instance.
|
|
203
|
+
|
|
204
|
+
:raises ValueError: If resource retrieval or creation fails
|
|
205
|
+
"""
|
|
206
|
+
resource_id = getattr(self, f"{self._get_resource_name()}_id")
|
|
207
|
+
new_resource = self._migrate_resource(resource_id)
|
|
208
|
+
Console.write_stdout(f"New {self._get_resource_name()} detail: \n{new_resource}")
|
|
209
|
+
logger.info(f"Successfully migrated {self._get_resource_name()} {resource_id}")
|
|
210
|
+
|
|
211
|
+
def _migrate_resource(self, resource_id: str):
|
|
212
|
+
"""
|
|
213
|
+
Retrieve resource from source and create in destination.
|
|
214
|
+
|
|
215
|
+
:param resource_id: The ID of the resource to migrate
|
|
216
|
+
:return: The newly created resource
|
|
217
|
+
:raises ValueError: If migration fails
|
|
218
|
+
"""
|
|
219
|
+
try:
|
|
220
|
+
source_resource = self._get_resource(resource_id)
|
|
221
|
+
new_resource = self._create_resource(source_resource)
|
|
222
|
+
return new_resource
|
|
223
|
+
except Exception as e:
|
|
224
|
+
logger.error(f"{self._get_resource_name().capitalize()} migration failed: {e}")
|
|
225
|
+
raise ValueError(f"{self._get_resource_name().capitalize()} migration failed: {e}") from e
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class AgentMigrationStrategy(_LabResourceMigrationStrategy):
|
|
229
|
+
"""
|
|
230
|
+
Migrate an agent from a GEAI instance.
|
|
231
|
+
The target project can be in another organization or the same one; in the same instance or another.
|
|
232
|
+
"""
|
|
233
|
+
|
|
234
|
+
def __init__(
|
|
235
|
+
self,
|
|
236
|
+
from_api_key: str,
|
|
237
|
+
from_instance: str,
|
|
238
|
+
agent_id: str,
|
|
239
|
+
to_api_key: Optional[str] = None,
|
|
240
|
+
to_instance: Optional[str] = None
|
|
241
|
+
):
|
|
242
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
243
|
+
self.agent_id = agent_id
|
|
244
|
+
|
|
245
|
+
def _get_resource(self, resource_id: str) -> Agent:
|
|
246
|
+
agent = self._source_manager.get_agent(agent_id=resource_id)
|
|
247
|
+
if not isinstance(agent, Agent):
|
|
248
|
+
raise ValueError(f"Unable to retrieve agent {resource_id}")
|
|
249
|
+
return agent
|
|
250
|
+
|
|
251
|
+
def _create_resource(self, resource: Agent) -> Agent:
|
|
252
|
+
return self._destination_manager.create_agent(agent=resource)
|
|
253
|
+
|
|
254
|
+
def _get_resource_name(self) -> str:
|
|
255
|
+
return "agent"
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class ToolMigrationStrategy(_LabResourceMigrationStrategy):
|
|
259
|
+
"""
|
|
260
|
+
Migrate a tool from a GEAI instance.
|
|
261
|
+
The target project can be in another organization or the same one; in the same instance or another.
|
|
262
|
+
"""
|
|
263
|
+
|
|
264
|
+
def __init__(
|
|
265
|
+
self,
|
|
266
|
+
from_api_key: str,
|
|
267
|
+
from_instance: str,
|
|
268
|
+
tool_id: str,
|
|
269
|
+
to_api_key: Optional[str] = None,
|
|
270
|
+
to_instance: Optional[str] = None
|
|
271
|
+
):
|
|
272
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
273
|
+
self.tool_id = tool_id
|
|
274
|
+
|
|
275
|
+
def _get_resource(self, resource_id: str) -> Tool:
|
|
276
|
+
tool = self._source_manager.get_tool(tool_id=resource_id)
|
|
277
|
+
if not isinstance(tool, Tool):
|
|
278
|
+
raise ValueError(f"Unable to retrieve tool {resource_id}")
|
|
279
|
+
return tool
|
|
280
|
+
|
|
281
|
+
def _create_resource(self, resource: Tool) -> Tool:
|
|
282
|
+
return self._destination_manager.create_tool(tool=resource)
|
|
283
|
+
|
|
284
|
+
def _get_resource_name(self) -> str:
|
|
285
|
+
return "tool"
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class AgenticProcessMigrationStrategy(_LabResourceMigrationStrategy):
|
|
289
|
+
"""
|
|
290
|
+
Migrate an agentic process from a GEAI instance.
|
|
291
|
+
The target project can be in another organization or the same one; in the same instance or another.
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
def __init__(
|
|
295
|
+
self,
|
|
296
|
+
from_api_key: str,
|
|
297
|
+
from_instance: str,
|
|
298
|
+
process_id: str,
|
|
299
|
+
to_api_key: Optional[str] = None,
|
|
300
|
+
to_instance: Optional[str] = None
|
|
301
|
+
):
|
|
302
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
303
|
+
self.process_id = process_id
|
|
304
|
+
|
|
305
|
+
def _get_resource(self, resource_id: str) -> AgenticProcess:
|
|
306
|
+
process = self._source_manager.get_process(process_id=resource_id)
|
|
307
|
+
if not isinstance(process, AgenticProcess):
|
|
308
|
+
raise ValueError(f"Unable to retrieve process {resource_id}")
|
|
309
|
+
return process
|
|
310
|
+
|
|
311
|
+
def _create_resource(self, resource: AgenticProcess) -> AgenticProcess:
|
|
312
|
+
return self._destination_manager.create_process(process=resource)
|
|
313
|
+
|
|
314
|
+
def _get_resource_name(self) -> str:
|
|
315
|
+
return "process"
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
class TaskMigrationStrategy(_LabResourceMigrationStrategy):
|
|
319
|
+
"""
|
|
320
|
+
Migrate a task from a GEAI instance.
|
|
321
|
+
The target project can be in another organization or the same one; in the same instance or another.
|
|
322
|
+
"""
|
|
323
|
+
|
|
324
|
+
def __init__(
|
|
325
|
+
self,
|
|
326
|
+
from_api_key: str,
|
|
327
|
+
from_instance: str,
|
|
328
|
+
task_id: str,
|
|
329
|
+
to_api_key: Optional[str] = None,
|
|
330
|
+
to_instance: Optional[str] = None
|
|
331
|
+
):
|
|
332
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
333
|
+
self.task_id = task_id
|
|
334
|
+
|
|
335
|
+
def _get_resource(self, resource_id: str) -> Task:
|
|
336
|
+
task = self._source_manager.get_task(task_id=resource_id)
|
|
337
|
+
if not isinstance(task, Task):
|
|
338
|
+
raise ValueError(f"Unable to retrieve task {resource_id}")
|
|
339
|
+
return task
|
|
340
|
+
|
|
341
|
+
def _create_resource(self, resource: Task) -> Task:
|
|
342
|
+
return self._destination_manager.create_task(task=resource)
|
|
343
|
+
|
|
344
|
+
def _get_resource_name(self) -> str:
|
|
345
|
+
return "task"
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
class UsageLimitMigrationStrategy(MigrationStrategy):
|
|
349
|
+
"""
|
|
350
|
+
Migrate usage limit from a GEAI organization.
|
|
351
|
+
The target organization can be in the same instance or another.
|
|
352
|
+
"""
|
|
353
|
+
|
|
354
|
+
def __init__(
|
|
355
|
+
self,
|
|
356
|
+
from_api_key: str,
|
|
357
|
+
from_instance: str,
|
|
358
|
+
from_organization_id: str,
|
|
359
|
+
to_organization_id: str,
|
|
360
|
+
to_api_key: Optional[str] = None,
|
|
361
|
+
to_instance: Optional[str] = None
|
|
362
|
+
):
|
|
363
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
364
|
+
self.from_organization_id = from_organization_id
|
|
365
|
+
self.to_organization_id = to_organization_id
|
|
366
|
+
self._source_manager = UsageLimitManager(
|
|
367
|
+
api_key=self.from_api_key,
|
|
368
|
+
base_url=self.from_instance,
|
|
369
|
+
organization_id=self.from_organization_id
|
|
370
|
+
)
|
|
371
|
+
self._destination_manager = UsageLimitManager(
|
|
372
|
+
api_key=self.to_api_key,
|
|
373
|
+
base_url=self.to_instance,
|
|
374
|
+
organization_id=self.to_organization_id
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
def get_display_info(self) -> str:
|
|
378
|
+
return f"usage limits (org {self.from_organization_id})"
|
|
379
|
+
|
|
380
|
+
def migrate(self):
|
|
381
|
+
"""
|
|
382
|
+
Execute the usage limit migration from source to destination organization.
|
|
383
|
+
|
|
384
|
+
:raises ValueError: If usage limit retrieval or creation fails
|
|
385
|
+
"""
|
|
386
|
+
new_limit = self._migrate_usage_limit()
|
|
387
|
+
logger.info(f"Successfully migrated usage limit from org {self.from_organization_id} to {self.to_organization_id}")
|
|
388
|
+
|
|
389
|
+
def _migrate_usage_limit(self) -> UsageLimit:
|
|
390
|
+
"""
|
|
391
|
+
Retrieve latest usage limit from source and create in destination.
|
|
392
|
+
|
|
393
|
+
:return: The newly created usage limit
|
|
394
|
+
:raises ValueError: If migration fails
|
|
395
|
+
"""
|
|
396
|
+
try:
|
|
397
|
+
source_limit = self._source_manager.get_latest_usage_limit_from_organization()
|
|
398
|
+
if not isinstance(source_limit, UsageLimit):
|
|
399
|
+
raise ValueError("Unable to retrieve usage limit from source organization")
|
|
400
|
+
|
|
401
|
+
source_limit.id = None
|
|
402
|
+
new_limit = self._destination_manager.set_organization_usage_limit(source_limit)
|
|
403
|
+
return new_limit
|
|
404
|
+
except Exception as e:
|
|
405
|
+
logger.error(f"Usage limit migration failed: {e}")
|
|
406
|
+
raise ValueError(f"Usage limit migration failed: {e}") from e
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
class RAGAssistantMigrationStrategy(MigrationStrategy):
|
|
410
|
+
"""
|
|
411
|
+
Migrate RAG assistant from a GEAI instance.
|
|
412
|
+
The target instance can be the same or another.
|
|
413
|
+
"""
|
|
414
|
+
|
|
415
|
+
def __init__(
|
|
416
|
+
self,
|
|
417
|
+
from_api_key: str,
|
|
418
|
+
from_instance: str,
|
|
419
|
+
assistant_name: str,
|
|
420
|
+
to_api_key: Optional[str] = None,
|
|
421
|
+
to_instance: Optional[str] = None
|
|
422
|
+
):
|
|
423
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
424
|
+
self.assistant_name = assistant_name
|
|
425
|
+
self._source_manager = AssistantManager(
|
|
426
|
+
api_key=self.from_api_key,
|
|
427
|
+
base_url=self.from_instance
|
|
428
|
+
)
|
|
429
|
+
self._destination_manager = AssistantManager(
|
|
430
|
+
api_key=self.to_api_key,
|
|
431
|
+
base_url=self.to_instance
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
def get_display_info(self) -> str:
|
|
435
|
+
return f"RAG assistant '{self.assistant_name}'"
|
|
436
|
+
|
|
437
|
+
def migrate(self):
|
|
438
|
+
"""
|
|
439
|
+
Execute the RAG assistant migration from source to destination instance.
|
|
440
|
+
|
|
441
|
+
:raises ValueError: If assistant retrieval or creation fails
|
|
442
|
+
"""
|
|
443
|
+
new_assistant = self._migrate_assistant()
|
|
444
|
+
logger.info(f"Successfully migrated RAG assistant {self.assistant_name}")
|
|
445
|
+
|
|
446
|
+
def _migrate_assistant(self) -> RAGAssistant:
|
|
447
|
+
"""
|
|
448
|
+
Retrieve RAG assistant from source and create in destination.
|
|
449
|
+
|
|
450
|
+
:return: The newly created RAG assistant
|
|
451
|
+
:raises ValueError: If migration fails
|
|
452
|
+
"""
|
|
453
|
+
try:
|
|
454
|
+
source_assistant = self._source_manager.get_assistant_data(assistant_name=self.assistant_name)
|
|
455
|
+
if not isinstance(source_assistant, RAGAssistant):
|
|
456
|
+
raise ValueError(f"Assistant {self.assistant_name} is not a RAG assistant")
|
|
457
|
+
|
|
458
|
+
source_assistant.id = None
|
|
459
|
+
new_assistant = self._destination_manager.create_assistant(source_assistant)
|
|
460
|
+
return new_assistant
|
|
461
|
+
except Exception as e:
|
|
462
|
+
logger.error(f"RAG assistant migration failed: {e}")
|
|
463
|
+
raise ValueError(f"RAG assistant migration failed: {e}") from e
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
class FileMigrationStrategy(MigrationStrategy):
|
|
467
|
+
"""
|
|
468
|
+
Migrate file from a GEAI project.
|
|
469
|
+
The target project can be in another organization or the same one; in the same instance or another.
|
|
470
|
+
"""
|
|
471
|
+
|
|
472
|
+
def __init__(
|
|
473
|
+
self,
|
|
474
|
+
from_api_key: str,
|
|
475
|
+
from_instance: str,
|
|
476
|
+
from_organization_id: str,
|
|
477
|
+
from_project_id: str,
|
|
478
|
+
to_organization_id: str,
|
|
479
|
+
to_project_id: str,
|
|
480
|
+
file_id: str,
|
|
481
|
+
to_api_key: Optional[str] = None,
|
|
482
|
+
to_instance: Optional[str] = None
|
|
483
|
+
):
|
|
484
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
485
|
+
self.from_organization_id = from_organization_id
|
|
486
|
+
self.from_project_id = from_project_id
|
|
487
|
+
self.to_organization_id = to_organization_id
|
|
488
|
+
self.to_project_id = to_project_id
|
|
489
|
+
self.file_id = file_id
|
|
490
|
+
self._source_manager = FileManager(
|
|
491
|
+
api_key=self.from_api_key,
|
|
492
|
+
base_url=self.from_instance,
|
|
493
|
+
organization_id=self.from_organization_id,
|
|
494
|
+
project_id=self.from_project_id
|
|
495
|
+
)
|
|
496
|
+
self._destination_manager = FileManager(
|
|
497
|
+
api_key=self.to_api_key,
|
|
498
|
+
base_url=self.to_instance,
|
|
499
|
+
organization_id=self.to_organization_id,
|
|
500
|
+
project_id=self.to_project_id
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
def get_display_info(self) -> str:
|
|
504
|
+
return f"file {self.file_id}"
|
|
505
|
+
|
|
506
|
+
def migrate(self):
|
|
507
|
+
"""
|
|
508
|
+
Execute the file migration from source to destination project.
|
|
509
|
+
|
|
510
|
+
:raises ValueError: If file retrieval or upload fails
|
|
511
|
+
"""
|
|
512
|
+
upload_file_response = self._migrate_file()
|
|
513
|
+
logger.info(f"Successfully migrated file {self.file_id}")
|
|
514
|
+
|
|
515
|
+
def _migrate_file(self) -> UploadFileResponse:
|
|
516
|
+
"""
|
|
517
|
+
Retrieve file from source and upload to destination.
|
|
518
|
+
|
|
519
|
+
:return: The newly uploaded file
|
|
520
|
+
:raises ValueError: If migration fails
|
|
521
|
+
"""
|
|
522
|
+
try:
|
|
523
|
+
source_file = self._source_manager.get_file_data(file_id=self.file_id)
|
|
524
|
+
if not isinstance(source_file, File):
|
|
525
|
+
raise ValueError(f"Unable to retrieve file {self.file_id}")
|
|
526
|
+
|
|
527
|
+
file_content = self._source_manager.get_file_content(file_id=self.file_id)
|
|
528
|
+
upload_response = self._destination_manager.upload_file_from_content(
|
|
529
|
+
file_name=source_file.name,
|
|
530
|
+
content=file_content,
|
|
531
|
+
folder=None
|
|
532
|
+
)
|
|
533
|
+
return upload_response
|
|
534
|
+
except Exception as e:
|
|
535
|
+
logger.error(f"File migration failed: {e}")
|
|
536
|
+
raise ValueError(f"File migration failed: {e}") from e
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
class SecretMigrationStrategy(MigrationStrategy):
|
|
540
|
+
"""
|
|
541
|
+
Migrate secret from a GEAI project.
|
|
542
|
+
The target project can be in another organization or the same one; in the same instance or another.
|
|
543
|
+
"""
|
|
544
|
+
|
|
545
|
+
def __init__(
|
|
546
|
+
self,
|
|
547
|
+
from_api_key: str,
|
|
548
|
+
from_instance: str,
|
|
549
|
+
secret_id: str,
|
|
550
|
+
to_api_key: Optional[str] = None,
|
|
551
|
+
to_instance: Optional[str] = None
|
|
552
|
+
):
|
|
553
|
+
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
554
|
+
self.secret_id = secret_id
|
|
555
|
+
self._source_client = SecretClient(
|
|
556
|
+
api_key=self.from_api_key,
|
|
557
|
+
base_url=self.from_instance
|
|
558
|
+
)
|
|
559
|
+
self._destination_client = SecretClient(
|
|
560
|
+
api_key=self.to_api_key,
|
|
561
|
+
base_url=self.to_instance
|
|
562
|
+
)
|
|
563
|
+
|
|
564
|
+
def get_display_info(self) -> str:
|
|
565
|
+
return f"secret {self.secret_id}"
|
|
566
|
+
|
|
567
|
+
def migrate(self):
|
|
568
|
+
"""
|
|
569
|
+
Execute the secret migration from source to destination project.
|
|
570
|
+
|
|
571
|
+
:raises ValueError: If secret retrieval or creation fails
|
|
572
|
+
"""
|
|
573
|
+
new_secret = self._migrate_secret()
|
|
574
|
+
logger.info(f"Successfully migrated secret {self.secret_id}")
|
|
575
|
+
|
|
576
|
+
def _migrate_secret(self) -> dict:
|
|
577
|
+
"""
|
|
578
|
+
Retrieve secret from source and create in destination.
|
|
579
|
+
|
|
580
|
+
:return: The newly created secret
|
|
581
|
+
:raises ValueError: If migration fails
|
|
582
|
+
"""
|
|
583
|
+
try:
|
|
584
|
+
source_secret = self._source_client.get_secret(secret_id=self.secret_id)
|
|
585
|
+
if not isinstance(source_secret, dict):
|
|
586
|
+
raise ValueError(f"Unable to retrieve secret {self.secret_id}")
|
|
587
|
+
|
|
588
|
+
secret_name = source_secret.get("name")
|
|
589
|
+
secret_string = source_secret.get("secretString")
|
|
590
|
+
secret_description = source_secret.get("description")
|
|
591
|
+
|
|
592
|
+
if not secret_name or not secret_string:
|
|
593
|
+
raise ValueError(f"Secret {self.secret_id} missing required fields (name or secretString)")
|
|
594
|
+
|
|
595
|
+
new_secret = self._destination_client.create_secret(
|
|
596
|
+
name=secret_name,
|
|
597
|
+
secret_string=secret_string,
|
|
598
|
+
description=secret_description
|
|
599
|
+
)
|
|
600
|
+
return new_secret
|
|
601
|
+
except Exception as e:
|
|
602
|
+
logger.error(f"Secret migration failed: {e}")
|
|
603
|
+
raise ValueError(f"Secret migration failed: {e}") from e
|