pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +9 -1
- 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 +18 -45
- pygeai/assistant/data/clients.py +1 -0
- pygeai/assistant/data_analyst/clients.py +8 -12
- pygeai/assistant/managers.py +195 -157
- pygeai/assistant/mappers.py +4 -2
- pygeai/assistant/rag/clients.py +27 -67
- pygeai/assistant/rag/mappers.py +12 -6
- pygeai/assistant/rag/models.py +301 -159
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +308 -37
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +2 -8
- pygeai/chat/managers.py +9 -6
- 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 +7 -10
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +9 -9
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +71 -9
- pygeai/cli/commands/chat.py +676 -19
- pygeai/cli/commands/common.py +28 -24
- pygeai/cli/commands/configuration.py +66 -13
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +58 -11
- pygeai/cli/commands/evaluation.py +38 -38
- pygeai/cli/commands/feedback.py +3 -4
- pygeai/cli/commands/files.py +7 -8
- pygeai/cli/commands/gam.py +85 -10
- pygeai/cli/commands/lab/ai_lab.py +340 -484
- 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 +6 -7
- pygeai/cli/commands/migrate.py +1064 -436
- pygeai/cli/commands/organization.py +516 -11
- pygeai/cli/commands/rag.py +13 -14
- pygeai/cli/commands/rerank.py +3 -5
- pygeai/cli/commands/secrets.py +8 -9
- pygeai/cli/commands/usage_limits.py +18 -20
- pygeai/cli/commands/validators.py +144 -1
- pygeai/cli/commands/version.py +4 -5
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +170 -31
- pygeai/cli/geai_proxy.py +86 -25
- pygeai/cli/install_man.py +93 -22
- pygeai/cli/parsers.py +75 -25
- pygeai/cli/texts/help.py +265 -28
- pygeai/core/base/clients.py +53 -12
- pygeai/core/base/mappers.py +11 -2
- pygeai/core/base/session.py +95 -11
- pygeai/core/common/config.py +78 -14
- pygeai/core/common/exceptions.py +96 -6
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +23 -5
- pygeai/core/embeddings/managers.py +9 -4
- pygeai/core/embeddings/mappers.py +16 -2
- pygeai/core/embeddings/responses.py +9 -2
- pygeai/core/feedback/clients.py +8 -3
- pygeai/core/files/clients.py +23 -24
- pygeai/core/files/managers.py +121 -30
- pygeai/core/files/responses.py +4 -3
- pygeai/core/handlers.py +10 -1
- pygeai/core/llm/clients.py +22 -29
- pygeai/core/models.py +127 -11
- pygeai/core/plugins/clients.py +6 -6
- pygeai/core/rerank/clients.py +9 -3
- pygeai/core/rerank/managers.py +22 -5
- pygeai/core/secrets/clients.py +16 -37
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +159 -49
- 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 +854 -14
- pygeai/evaluation/clients.py +7 -4
- pygeai/evaluation/dataset/clients.py +46 -44
- pygeai/evaluation/plan/clients.py +28 -26
- pygeai/evaluation/result/clients.py +38 -5
- pygeai/gam/clients.py +50 -28
- pygeai/gam/endpoints.py +2 -1
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -90
- pygeai/lab/agents/clients.py +203 -162
- pygeai/lab/agents/endpoints.py +4 -0
- pygeai/lab/agents/mappers.py +57 -7
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +571 -541
- pygeai/lab/models.py +108 -19
- pygeai/lab/processes/clients.py +332 -340
- pygeai/lab/processes/mappers.py +3 -3
- 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/clients.py +67 -63
- pygeai/lab/strategies/mappers.py +1 -1
- pygeai/lab/tools/clients.py +85 -118
- pygeai/lab/tools/endpoints.py +4 -0
- pygeai/lab/tools/mappers.py +5 -5
- pygeai/man/man1/geai-proxy.1 +116 -0
- pygeai/man/man1/geai.1 +2580 -66
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +468 -146
- pygeai/migration/tools.py +170 -3
- pygeai/organization/clients.py +245 -50
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/clients.py +34 -32
- pygeai/organization/limits/managers.py +108 -49
- pygeai/organization/managers.py +347 -53
- pygeai/organization/mappers.py +102 -2
- pygeai/organization/responses.py +58 -1
- pygeai/proxy/clients.py +6 -3
- pygeai/proxy/config.py +14 -1
- pygeai/proxy/managers.py +61 -33
- pygeai/proxy/servers.py +196 -51
- pygeai/proxy/tool.py +33 -16
- 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/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -82
- pygeai/tests/assistants/test_managers.py +191 -57
- 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/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 +5 -5
- pygeai/tests/core/base/data/models.py +7 -0
- pygeai/tests/core/base/test_mappers.py +43 -11
- pygeai/tests/core/base/test_models.py +3 -1
- 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/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +124 -78
- 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/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +61 -39
- 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/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_models.py +500 -3
- 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/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +298 -56
- pygeai/tests/organization/test_clients.py +600 -30
- 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/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/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_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/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/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/delete_file.py +1 -4
- pygeai/tests/snippets/files/get_file_content.py +2 -4
- pygeai/tests/snippets/files/get_file_data.py +1 -4
- pygeai/tests/snippets/files/get_file_list.py +1 -6
- pygeai/tests/snippets/files/upload_file.py +1 -5
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
- pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
- pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
- 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 +1 -5
- pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
- pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
- pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
- 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/create_process.py +3 -5
- pygeai/tests/snippets/lab/processes/create_task.py +3 -5
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
- pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
- pygeai/tests/snippets/lab/runner_1.py +1 -1
- pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
- pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
- pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
- pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
- pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
- pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -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/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
- pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
- 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/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +2 -2
- 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_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/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.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
- pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
- docs/geai-proxy/README.md +0 -145
- docs/source/conf.py +0 -45
- pygeai/tests/core/test_managers.py +0 -233
- pygeai-0.1.51b3.dist-info/METADATA +0 -130
- pygeai-0.1.51b3.dist-info/RECORD +0 -324
- pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
- scripts/bump_beta_version.py +0 -56
- {scripts → pygeai/analytics}/__init__.py +0 -0
- /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
pygeai/migration/strategies.py
CHANGED
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
import sys
|
|
2
2
|
from abc import ABC, abstractmethod
|
|
3
|
+
from typing import Optional
|
|
3
4
|
|
|
4
|
-
from pygeai
|
|
5
|
+
from pygeai import logger
|
|
6
|
+
from pygeai.core.files.responses import UploadFileResponse
|
|
7
|
+
from pygeai.core.models import Project, UsageLimit
|
|
5
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
|
|
6
12
|
from pygeai.lab.managers import AILabManager
|
|
7
13
|
from pygeai.lab.models import Agent, Tool, AgenticProcess, Task
|
|
14
|
+
from pygeai.organization.limits.managers import UsageLimitManager
|
|
8
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
|
|
9
19
|
|
|
10
20
|
|
|
11
21
|
class MigrationStrategy(ABC):
|
|
12
22
|
|
|
13
23
|
def __init__(
|
|
14
24
|
self,
|
|
15
|
-
from_api_key: str
|
|
16
|
-
from_instance: str
|
|
17
|
-
to_api_key: str = None,
|
|
18
|
-
to_instance: str = None
|
|
25
|
+
from_api_key: str,
|
|
26
|
+
from_instance: str,
|
|
27
|
+
to_api_key: Optional[str] = None,
|
|
28
|
+
to_instance: Optional[str] = None
|
|
19
29
|
):
|
|
20
30
|
self.from_api_key = from_api_key
|
|
21
31
|
self.from_instance = from_instance
|
|
@@ -26,112 +36,226 @@ class MigrationStrategy(ABC):
|
|
|
26
36
|
def migrate(self):
|
|
27
37
|
pass
|
|
28
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
|
+
|
|
29
48
|
|
|
30
49
|
class ProjectMigrationStrategy(MigrationStrategy):
|
|
31
50
|
"""
|
|
32
51
|
Migrate a project from a GEAI instance.
|
|
33
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
|
|
34
57
|
"""
|
|
35
58
|
|
|
36
59
|
def __init__(
|
|
37
60
|
self,
|
|
38
|
-
from_api_key: str
|
|
39
|
-
from_instance: str
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
45
68
|
):
|
|
46
69
|
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
47
70
|
self.from_project_id = from_project_id
|
|
48
71
|
self.to_project_name = to_project_name
|
|
49
72
|
self.admin_email = admin_email
|
|
50
|
-
self.
|
|
73
|
+
self._source_manager = OrganizationManager(
|
|
51
74
|
api_key=self.from_api_key,
|
|
52
75
|
base_url=self.from_instance
|
|
53
76
|
)
|
|
54
|
-
self.
|
|
77
|
+
self._destination_manager = OrganizationManager(
|
|
55
78
|
api_key=self.to_api_key,
|
|
56
79
|
base_url=self.to_instance
|
|
57
80
|
)
|
|
58
81
|
|
|
59
|
-
def
|
|
60
|
-
|
|
61
|
-
if isinstance(response, ErrorListResponse):
|
|
62
|
-
return response.to_dict()
|
|
63
|
-
else:
|
|
64
|
-
new_project = response.project
|
|
65
|
-
|
|
66
|
-
self.__migrate_assistants(new_project)
|
|
82
|
+
def get_display_info(self) -> str:
|
|
83
|
+
return f"project '{self.to_project_name}'"
|
|
67
84
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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}")
|
|
72
109
|
|
|
73
110
|
new_project = project_data.project
|
|
74
111
|
new_project.name = self.to_project_name
|
|
75
112
|
new_project.email = self.admin_email
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
79
132
|
|
|
80
|
-
|
|
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
|
+
"""
|
|
81
155
|
pass
|
|
82
156
|
|
|
83
157
|
|
|
84
|
-
class
|
|
158
|
+
class _LabResourceMigrationStrategy(MigrationStrategy):
|
|
85
159
|
"""
|
|
86
|
-
|
|
87
|
-
|
|
160
|
+
Base class for migrating AI Lab resources (agents, tools, processes, tasks).
|
|
161
|
+
Provides common functionality for resource migration.
|
|
88
162
|
"""
|
|
89
163
|
|
|
90
164
|
def __init__(
|
|
91
165
|
self,
|
|
92
|
-
from_api_key: str
|
|
93
|
-
from_instance: str
|
|
94
|
-
to_api_key: str = None,
|
|
95
|
-
to_instance: str = None
|
|
96
|
-
from_project_id: str = None,
|
|
97
|
-
to_project_id: str = None,
|
|
98
|
-
agent_id: str = None
|
|
166
|
+
from_api_key: str,
|
|
167
|
+
from_instance: str,
|
|
168
|
+
to_api_key: Optional[str] = None,
|
|
169
|
+
to_instance: Optional[str] = None
|
|
99
170
|
):
|
|
100
171
|
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
101
|
-
self.
|
|
102
|
-
self.to_project_id = to_project_id
|
|
103
|
-
self.agent_id = agent_id
|
|
104
|
-
self.source_manager = AILabManager(
|
|
172
|
+
self._source_manager = AILabManager(
|
|
105
173
|
api_key=self.from_api_key,
|
|
106
174
|
base_url=self.from_instance
|
|
107
175
|
)
|
|
108
|
-
self.
|
|
176
|
+
self._destination_manager = AILabManager(
|
|
109
177
|
api_key=self.to_api_key,
|
|
110
178
|
base_url=self.to_instance
|
|
111
179
|
)
|
|
112
180
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
|
117
190
|
|
|
118
|
-
|
|
191
|
+
@abstractmethod
|
|
192
|
+
def _get_resource_name(self) -> str:
|
|
193
|
+
"""Return the name of the resource type for logging/errors"""
|
|
194
|
+
pass
|
|
119
195
|
|
|
120
|
-
def
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
source_agent = self.source_manager.get_agent(project_id=self.from_project_id, agent_id=self.agent_id)
|
|
124
|
-
if not isinstance(source_agent, Agent):
|
|
125
|
-
raise ValueError("Unable to retrieve requested agent.")
|
|
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}"
|
|
126
199
|
|
|
127
|
-
|
|
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
|
|
128
223
|
except Exception as e:
|
|
129
|
-
|
|
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
|
|
130
226
|
|
|
131
|
-
return new_agent
|
|
132
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
|
+
"""
|
|
133
233
|
|
|
134
|
-
|
|
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):
|
|
135
259
|
"""
|
|
136
260
|
Migrate a tool from a GEAI instance.
|
|
137
261
|
The target project can be in another organization or the same one; in the same instance or another.
|
|
@@ -139,143 +263,341 @@ class ToolMigrationStrategy(MigrationStrategy):
|
|
|
139
263
|
|
|
140
264
|
def __init__(
|
|
141
265
|
self,
|
|
142
|
-
from_api_key: str
|
|
143
|
-
from_instance: str
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
to_project_id: str = None,
|
|
148
|
-
tool_id: str = None
|
|
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
|
|
149
271
|
):
|
|
150
272
|
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
151
|
-
self.from_project_id = from_project_id
|
|
152
|
-
self.to_project_id = to_project_id
|
|
153
273
|
self.tool_id = tool_id
|
|
154
|
-
|
|
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(
|
|
155
367
|
api_key=self.from_api_key,
|
|
156
|
-
base_url=self.from_instance
|
|
368
|
+
base_url=self.from_instance,
|
|
369
|
+
organization_id=self.from_organization_id
|
|
157
370
|
)
|
|
158
|
-
self.
|
|
371
|
+
self._destination_manager = UsageLimitManager(
|
|
159
372
|
api_key=self.to_api_key,
|
|
160
|
-
base_url=self.to_instance
|
|
373
|
+
base_url=self.to_instance,
|
|
374
|
+
organization_id=self.to_organization_id
|
|
161
375
|
)
|
|
162
376
|
|
|
163
|
-
def
|
|
164
|
-
|
|
165
|
-
if isinstance(new_tool, ErrorListResponse):
|
|
166
|
-
sys.stderr.write(f"{new_tool.to_dict()}\n")
|
|
377
|
+
def get_display_info(self) -> str:
|
|
378
|
+
return f"usage limits (org {self.from_organization_id})"
|
|
167
379
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
+
"""
|
|
172
396
|
try:
|
|
173
|
-
|
|
174
|
-
if not isinstance(
|
|
175
|
-
raise ValueError("Unable to retrieve
|
|
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")
|
|
176
400
|
|
|
177
|
-
|
|
401
|
+
source_limit.id = None
|
|
402
|
+
new_limit = self._destination_manager.set_organization_usage_limit(source_limit)
|
|
403
|
+
return new_limit
|
|
178
404
|
except Exception as e:
|
|
179
|
-
|
|
405
|
+
logger.error(f"Usage limit migration failed: {e}")
|
|
406
|
+
raise ValueError(f"Usage limit migration failed: {e}") from e
|
|
180
407
|
|
|
181
|
-
return new_tool
|
|
182
408
|
|
|
183
|
-
|
|
184
|
-
class AgenticProcessMigrationStrategy(MigrationStrategy):
|
|
409
|
+
class RAGAssistantMigrationStrategy(MigrationStrategy):
|
|
185
410
|
"""
|
|
186
|
-
Migrate
|
|
187
|
-
The target
|
|
411
|
+
Migrate RAG assistant from a GEAI instance.
|
|
412
|
+
The target instance can be the same or another.
|
|
188
413
|
"""
|
|
189
414
|
|
|
190
415
|
def __init__(
|
|
191
416
|
self,
|
|
192
|
-
from_api_key: str
|
|
193
|
-
from_instance: str
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
to_project_id: str = None,
|
|
198
|
-
process_id: str = None
|
|
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
|
|
199
422
|
):
|
|
200
423
|
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
201
|
-
self.
|
|
202
|
-
self.
|
|
203
|
-
self.process_id = process_id
|
|
204
|
-
self.source_manager = AILabManager(
|
|
424
|
+
self.assistant_name = assistant_name
|
|
425
|
+
self._source_manager = AssistantManager(
|
|
205
426
|
api_key=self.from_api_key,
|
|
206
427
|
base_url=self.from_instance
|
|
207
428
|
)
|
|
208
|
-
self.
|
|
429
|
+
self._destination_manager = AssistantManager(
|
|
209
430
|
api_key=self.to_api_key,
|
|
210
431
|
base_url=self.to_instance
|
|
211
432
|
)
|
|
212
433
|
|
|
213
|
-
def
|
|
214
|
-
|
|
215
|
-
if isinstance(new_process, ErrorListResponse):
|
|
216
|
-
sys.stdout.write(f"{new_process.to_dict()}\n")
|
|
217
|
-
|
|
218
|
-
sys.stdout.write(f"New process detail: \n{new_process}\n")
|
|
434
|
+
def get_display_info(self) -> str:
|
|
435
|
+
return f"RAG assistant '{self.assistant_name}'"
|
|
219
436
|
|
|
220
|
-
def
|
|
221
|
-
|
|
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
|
+
"""
|
|
222
453
|
try:
|
|
223
|
-
|
|
224
|
-
if not isinstance(
|
|
225
|
-
raise ValueError("
|
|
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")
|
|
226
457
|
|
|
227
|
-
|
|
458
|
+
source_assistant.id = None
|
|
459
|
+
new_assistant = self._destination_manager.create_assistant(source_assistant)
|
|
460
|
+
return new_assistant
|
|
228
461
|
except Exception as e:
|
|
229
|
-
|
|
462
|
+
logger.error(f"RAG assistant migration failed: {e}")
|
|
463
|
+
raise ValueError(f"RAG assistant migration failed: {e}") from e
|
|
230
464
|
|
|
231
|
-
return new_process
|
|
232
465
|
|
|
233
|
-
|
|
234
|
-
class TaskMigrationStrategy(MigrationStrategy):
|
|
466
|
+
class FileMigrationStrategy(MigrationStrategy):
|
|
235
467
|
"""
|
|
236
|
-
Migrate
|
|
468
|
+
Migrate file from a GEAI project.
|
|
237
469
|
The target project can be in another organization or the same one; in the same instance or another.
|
|
238
470
|
"""
|
|
239
471
|
|
|
240
472
|
def __init__(
|
|
241
473
|
self,
|
|
242
|
-
from_api_key: str
|
|
243
|
-
from_instance: str
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
to_project_id: str
|
|
248
|
-
|
|
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
|
|
249
483
|
):
|
|
250
484
|
super().__init__(from_api_key, from_instance, to_api_key, to_instance)
|
|
485
|
+
self.from_organization_id = from_organization_id
|
|
251
486
|
self.from_project_id = from_project_id
|
|
487
|
+
self.to_organization_id = to_organization_id
|
|
252
488
|
self.to_project_id = to_project_id
|
|
253
|
-
self.
|
|
254
|
-
self.
|
|
489
|
+
self.file_id = file_id
|
|
490
|
+
self._source_manager = FileManager(
|
|
255
491
|
api_key=self.from_api_key,
|
|
256
|
-
base_url=self.from_instance
|
|
492
|
+
base_url=self.from_instance,
|
|
493
|
+
organization_id=self.from_organization_id,
|
|
494
|
+
project_id=self.from_project_id
|
|
257
495
|
)
|
|
258
|
-
self.
|
|
496
|
+
self._destination_manager = FileManager(
|
|
259
497
|
api_key=self.to_api_key,
|
|
260
|
-
base_url=self.to_instance
|
|
498
|
+
base_url=self.to_instance,
|
|
499
|
+
organization_id=self.to_organization_id,
|
|
500
|
+
project_id=self.to_project_id
|
|
261
501
|
)
|
|
262
502
|
|
|
503
|
+
def get_display_info(self) -> str:
|
|
504
|
+
return f"file {self.file_id}"
|
|
505
|
+
|
|
263
506
|
def migrate(self):
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
|
267
537
|
|
|
268
|
-
sys.stdout.write(f"New task detail: \n{new_task}\n")
|
|
269
538
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
raise ValueError("Unable to retrieve requested task.")
|
|
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
|
+
"""
|
|
276
544
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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}"
|
|
280
566
|
|
|
281
|
-
|
|
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
|