pygeai 0.1.6__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +11 -2
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +48 -57
- pygeai/assistant/data/__init__.py +0 -0
- pygeai/assistant/data/clients.py +15 -0
- pygeai/assistant/data_analyst/__init__.py +0 -0
- pygeai/assistant/data_analyst/clients.py +75 -0
- pygeai/assistant/data_analyst/endpoints.py +2 -0
- pygeai/assistant/endpoints.py +0 -2
- pygeai/assistant/managers.py +738 -0
- pygeai/assistant/mappers.py +153 -0
- pygeai/assistant/rag/clients.py +132 -21
- pygeai/assistant/rag/mappers.py +228 -0
- pygeai/assistant/rag/models.py +396 -0
- pygeai/assistant/rag/responses.py +10 -0
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +406 -31
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +17 -0
- pygeai/chat/managers.py +64 -0
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +9 -12
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +11 -11
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +201 -7
- pygeai/cli/commands/chat.py +875 -14
- pygeai/cli/commands/common.py +30 -26
- pygeai/cli/commands/configuration.py +84 -9
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +187 -0
- pygeai/cli/commands/evaluation.py +2069 -0
- pygeai/cli/commands/feedback.py +93 -0
- pygeai/cli/commands/files.py +312 -0
- pygeai/cli/commands/flows/__init__.py +0 -0
- pygeai/cli/commands/gam.py +349 -0
- pygeai/cli/commands/lab/__init__.py +0 -0
- pygeai/cli/commands/lab/ai_lab.py +4110 -0
- pygeai/cli/commands/lab/common.py +135 -0
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +164 -0
- pygeai/cli/commands/migrate.py +1198 -0
- pygeai/cli/commands/options.py +86 -0
- pygeai/cli/commands/organization.py +560 -98
- pygeai/cli/commands/rag.py +306 -10
- pygeai/cli/commands/rerank.py +108 -0
- pygeai/cli/commands/secrets.py +357 -0
- pygeai/cli/commands/usage_limits.py +583 -0
- pygeai/cli/commands/validators.py +209 -0
- pygeai/cli/commands/version.py +44 -0
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +171 -30
- pygeai/cli/geai_proxy.py +318 -0
- pygeai/cli/install_man.py +107 -0
- pygeai/cli/parsers.py +78 -25
- pygeai/cli/texts/help.py +712 -55
- pygeai/core/__init__.py +9 -1
- pygeai/core/base/clients.py +61 -10
- pygeai/core/base/mappers.py +208 -30
- pygeai/core/base/models.py +8 -308
- pygeai/core/base/responses.py +18 -1
- pygeai/core/base/session.py +110 -17
- pygeai/core/common/config.py +98 -16
- pygeai/core/common/decorators.py +44 -0
- pygeai/core/common/exceptions.py +104 -4
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +93 -0
- pygeai/core/embeddings/endpoints.py +1 -0
- pygeai/core/embeddings/managers.py +62 -0
- pygeai/core/embeddings/mappers.py +52 -0
- pygeai/core/embeddings/models.py +14 -0
- pygeai/core/embeddings/responses.py +31 -0
- pygeai/core/feedback/__init__.py +0 -0
- pygeai/core/feedback/clients.py +50 -0
- pygeai/core/feedback/endpoints.py +1 -0
- pygeai/core/feedback/models.py +10 -0
- pygeai/core/files/__init__.py +0 -0
- pygeai/core/files/clients.py +156 -0
- pygeai/core/files/endpoints.py +5 -0
- pygeai/core/files/managers.py +224 -0
- pygeai/core/files/mappers.py +44 -0
- pygeai/core/files/models.py +24 -0
- pygeai/core/files/responses.py +19 -0
- pygeai/core/handlers.py +32 -0
- pygeai/core/llm/__init__.py +0 -0
- pygeai/core/llm/clients.py +53 -0
- pygeai/core/llm/endpoints.py +4 -0
- pygeai/core/models.py +799 -0
- pygeai/core/plugins/__init__.py +0 -0
- pygeai/core/plugins/clients.py +32 -0
- pygeai/core/plugins/endpoints.py +1 -0
- pygeai/core/plugins/models.py +86 -0
- pygeai/core/rerank/__init__.py +0 -0
- pygeai/core/rerank/clients.py +35 -0
- pygeai/core/rerank/endpoints.py +1 -0
- pygeai/core/rerank/managers.py +47 -0
- pygeai/core/rerank/mappers.py +23 -0
- pygeai/core/rerank/models.py +27 -0
- pygeai/core/responses.py +104 -0
- pygeai/core/secrets/__init__.py +0 -0
- pygeai/core/secrets/clients.py +212 -0
- pygeai/core/secrets/endpoints.py +7 -0
- pygeai/core/services/llm/__init__.py +0 -0
- pygeai/core/services/llm/model.py +186 -0
- pygeai/core/services/llm/providers.py +15 -0
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +311 -89
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +870 -0
- pygeai/evaluation/__init__.py +0 -0
- pygeai/evaluation/clients.py +19 -0
- pygeai/evaluation/dataset/__init__.py +0 -0
- pygeai/evaluation/dataset/clients.py +514 -0
- pygeai/evaluation/dataset/endpoints.py +26 -0
- pygeai/evaluation/plan/__init__.py +0 -0
- pygeai/evaluation/plan/clients.py +302 -0
- pygeai/evaluation/plan/endpoints.py +16 -0
- pygeai/evaluation/result/__init__.py +0 -0
- pygeai/evaluation/result/clients.py +70 -0
- pygeai/evaluation/result/endpoints.py +2 -0
- pygeai/flows/__init__.py +0 -0
- pygeai/flows/endpoints.py +362 -0
- pygeai/flows/models.py +1304 -0
- pygeai/gam/__init__.py +0 -0
- pygeai/gam/clients.py +178 -0
- pygeai/gam/endpoints.py +4 -0
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -0
- pygeai/lab/agents/__init__.py +0 -0
- pygeai/lab/agents/clients.py +426 -0
- pygeai/lab/agents/endpoints.py +12 -0
- pygeai/lab/agents/mappers.py +319 -0
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +1558 -0
- pygeai/lab/models.py +1719 -0
- pygeai/lab/processes/__init__.py +0 -0
- pygeai/lab/processes/clients.py +1051 -0
- pygeai/lab/processes/endpoints.py +26 -0
- pygeai/lab/processes/mappers.py +395 -0
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/__init__.py +0 -0
- pygeai/lab/strategies/clients.py +212 -0
- pygeai/lab/strategies/endpoints.py +5 -0
- pygeai/lab/strategies/mappers.py +58 -0
- pygeai/lab/tools/__init__.py +0 -0
- pygeai/lab/tools/clients.py +465 -0
- pygeai/lab/tools/endpoints.py +13 -0
- pygeai/lab/tools/mappers.py +131 -0
- pygeai/man/__init__.py +1 -0
- pygeai/man/man1/__init__.py +1 -0
- pygeai/man/man1/geai-proxy.1 +246 -0
- pygeai/man/man1/geai.1 +2615 -0
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +603 -0
- pygeai/migration/tools.py +180 -0
- pygeai/organization/clients.py +246 -18
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/__init__.py +0 -0
- pygeai/organization/limits/clients.py +281 -0
- pygeai/organization/limits/endpoints.py +15 -0
- pygeai/organization/limits/managers.py +331 -0
- pygeai/organization/limits/mappers.py +21 -0
- pygeai/organization/managers.py +537 -0
- pygeai/organization/mappers.py +111 -46
- pygeai/organization/responses.py +61 -11
- pygeai/proxy/__init__.py +0 -0
- pygeai/proxy/clients.py +216 -0
- pygeai/proxy/config.py +128 -0
- pygeai/proxy/managers.py +232 -0
- pygeai/proxy/servers.py +304 -0
- pygeai/proxy/tool.py +69 -0
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/__init__.py +0 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_mappers.py +189 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -80
- pygeai/tests/assistants/test_managers.py +198 -0
- pygeai/tests/assistants/test_mappers.py +111 -0
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/__init__.py +0 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +154 -0
- pygeai/tests/core/base/__init__.py +0 -0
- pygeai/tests/core/base/data/__init__.py +0 -0
- pygeai/tests/core/base/data/mappers.py +117 -0
- pygeai/tests/core/base/data/models.py +312 -0
- pygeai/tests/core/base/test_mappers.py +569 -0
- pygeai/tests/core/base/test_models.py +261 -0
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/__init__.py +0 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +219 -0
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/__init__.py +0 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +99 -0
- pygeai/tests/core/rerank/test_mappers.py +54 -0
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/__init__.py +0 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_mappers.py +245 -0
- pygeai/tests/lab/test_models.py +1154 -0
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/__init__.py +0 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +402 -0
- pygeai/tests/organization/test_clients.py +615 -64
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/__init__.py +0 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/assistants/__init__.py +0 -0
- pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
- pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
- pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
- pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
- pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
- pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
- pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
- pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
- pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
- pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
- pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
- pygeai/tests/snippets/assistants/send_feedback.py +14 -0
- pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/__init__.py +0 -0
- pygeai/tests/snippets/chat/cancel_request.py +7 -0
- pygeai/tests/snippets/chat/chat_completion.py +28 -0
- pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
- pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
- pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
- pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
- pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_request_status.py +7 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/chat/send_chat_request.py +33 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/__init__.py +0 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/__init__.py +0 -0
- pygeai/tests/snippets/files/delete_file.py +9 -0
- pygeai/tests/snippets/files/get_file_content.py +10 -0
- pygeai/tests/snippets/files/get_file_data.py +9 -0
- pygeai/tests/snippets/files/get_file_list.py +6 -0
- pygeai/tests/snippets/files/upload_file.py +13 -0
- pygeai/tests/snippets/gam/__init__.py +0 -0
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/__init__.py +0 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
- pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
- pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
- pygeai/tests/snippets/lab/agents/__init__.py +0 -0
- pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
- pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
- pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
- pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/create_process.py +24 -0
- pygeai/tests/snippets/lab/processes/create_task.py +8 -0
- pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
- pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
- pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
- pygeai/tests/snippets/lab/runner_1.py +212 -0
- pygeai/tests/snippets/lab/samples/__init__.py +0 -0
- pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
- pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
- pygeai/tests/snippets/lab/tools/__init__.py +0 -0
- pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
- pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
- pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
- pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
- pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
- pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/__init__.py +0 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +23 -0
- pygeai/tests/snippets/organization/delete_project.py +7 -0
- pygeai/tests/snippets/organization/export_request_data.py +7 -0
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_data.py +7 -0
- pygeai/tests/snippets/organization/get_project_list.py +8 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
- pygeai/tests/snippets/organization/update_project.py +14 -0
- pygeai/tests/snippets/rerank/__init__.py +0 -0
- pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
- pygeai/tests/snippets/secrets/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
- pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
- docs/source/conf.py +0 -45
- pygeai/core/clients.py +0 -240
- pygeai/tests/core/test_clients.py +0 -49
- pygeai-0.1.6.dist-info/METADATA +0 -92
- pygeai-0.1.6.dist-info/RECORD +0 -65
- pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
- pygeai-0.1.6.dist-info/entry_points.txt +0 -2
- /pygeai/{agent → analytics}/__init__.py +0 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
from unittest import TestCase
|
|
2
|
+
import uuid
|
|
3
|
+
from pygeai.lab.managers import AILabManager
|
|
4
|
+
from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model, Sampling, PromptExample, PromptOutput
|
|
5
|
+
from pydantic import ValidationError
|
|
6
|
+
from pygeai.core.common.exceptions import APIError
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestAILabUpdateAgentIntegration(TestCase):
|
|
10
|
+
def setUp(self):
|
|
11
|
+
"""
|
|
12
|
+
Set up the test environment.
|
|
13
|
+
"""
|
|
14
|
+
self.ai_lab_manager = AILabManager()
|
|
15
|
+
|
|
16
|
+
load_agent = self.__load_agent()
|
|
17
|
+
self.agent_to_update = load_agent["agent"]
|
|
18
|
+
self.random_str = load_agent["random_str"]
|
|
19
|
+
|
|
20
|
+
def __load_agent(self):
|
|
21
|
+
random_str = str(uuid.uuid4())
|
|
22
|
+
agent = Agent(
|
|
23
|
+
id="b4b09935-2ad2-42c0-bd55-1ee6fa4b6034",
|
|
24
|
+
name=f"UpdatedAgent{random_str}",
|
|
25
|
+
access_scope="public",
|
|
26
|
+
public_name=f"public_{random_str}",
|
|
27
|
+
job_description=f"SummarizerAgent{random_str}",
|
|
28
|
+
description=f"Agent that summarized documents. {random_str}",
|
|
29
|
+
agent_data=AgentData(
|
|
30
|
+
prompt=Prompt(
|
|
31
|
+
instructions="the user will provide a document, you must return a summary of the document.",
|
|
32
|
+
inputs=["text", "avoid slang indicator"],
|
|
33
|
+
outputs=[
|
|
34
|
+
PromptOutput(key="translated_text", description="translated text, with slang or not depending on the indication. in plain text.")
|
|
35
|
+
],
|
|
36
|
+
examples=[
|
|
37
|
+
PromptExample(input_data="hola mundo [no-slang]", output='{"translated_text":"hello world"}'),
|
|
38
|
+
PromptExample(input_data="esto es una prueba pincheguey [keep-slang]", output='{"translated_text":"this is a test pal"}')
|
|
39
|
+
]
|
|
40
|
+
),
|
|
41
|
+
llm_config=LlmConfig(
|
|
42
|
+
max_tokens=1800,
|
|
43
|
+
timeout=0,
|
|
44
|
+
sampling=Sampling(temperature=0.3, top_k=0, top_p=0)
|
|
45
|
+
),
|
|
46
|
+
models=[Model(name="openai/gpt-4o")]
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
"agent": agent,
|
|
52
|
+
"random_str": random_str
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def __update_agent(self, agent=None, automatic_publish=False, upsert=False):
|
|
57
|
+
"""
|
|
58
|
+
Helper to create an agent with the current project_id and ai_lab_manager.
|
|
59
|
+
If automatic_publish is None, do not pass it (useful for tests that omit it).
|
|
60
|
+
"""
|
|
61
|
+
return self.ai_lab_manager.update_agent(
|
|
62
|
+
agent=self.agent_to_update if agent is None else agent,
|
|
63
|
+
automatic_publish=automatic_publish,
|
|
64
|
+
upsert=upsert
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_update_agent(self):
|
|
69
|
+
self.agent_to_update.agent_data.models[0].name = "gemini/gemini-1.5-flash-8b-exp-0827"
|
|
70
|
+
self.agent_to_update.access_scope = "private"
|
|
71
|
+
updated_agent = self.__update_agent()
|
|
72
|
+
|
|
73
|
+
self.assertTrue(isinstance(updated_agent, Agent), "Expected a created agent")
|
|
74
|
+
|
|
75
|
+
self.assertEqual(updated_agent.name, f"UpdatedAgent{self.random_str}")
|
|
76
|
+
self.assertEqual(updated_agent.access_scope, "private")
|
|
77
|
+
self.assertEqual(updated_agent.public_name, f"public_{self.random_str}")
|
|
78
|
+
self.assertEqual(updated_agent.job_description, f"SummarizerAgent{self.random_str}",)
|
|
79
|
+
self.assertEqual(updated_agent.description, f"Agent that summarized documents. {self.random_str}")
|
|
80
|
+
|
|
81
|
+
self.assertEqual(updated_agent.agent_data.models[0].name, "gemini/gemini-1.5-flash-8b-exp-0827")
|
|
82
|
+
self.assertTrue(updated_agent.is_draft, "gemini/gemini-1.5-flash-8b-exp-0827")
|
|
83
|
+
|
|
84
|
+
self.agent_to_update.agent_data.models[0].name = "openai/gpt-4o"
|
|
85
|
+
self.__update_agent()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_update_agent_no_name(self):
|
|
89
|
+
test_params = [ True, False ]
|
|
90
|
+
self.agent_to_update.name = ""
|
|
91
|
+
for auto_publish in test_params:
|
|
92
|
+
with self.subTest(input=auto_publish):
|
|
93
|
+
with self.assertRaises(APIError) as exception:
|
|
94
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
95
|
+
|
|
96
|
+
self.assertIn(
|
|
97
|
+
"Error received while updating agent: errors=[Error(id=2007, description='Agent name cannot be empty.')]",
|
|
98
|
+
str(exception.exception),
|
|
99
|
+
f"Expected error about missing agent name when autopublish is {'enabled' if auto_publish else 'disabled'} was not returned."
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def test_update_agent_duplicated_name(self):
|
|
104
|
+
test_params = [ True, False ]
|
|
105
|
+
self.agent_to_update.name = "AritmeticaExpert"
|
|
106
|
+
|
|
107
|
+
for auto_publish in test_params:
|
|
108
|
+
with self.subTest(input=auto_publish):
|
|
109
|
+
with self.assertRaises(APIError) as exception:
|
|
110
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
111
|
+
|
|
112
|
+
self.assertIn(
|
|
113
|
+
"Agent already exists [name=AritmeticaExpert].",
|
|
114
|
+
str(exception.exception),
|
|
115
|
+
f"Expected error about duplicated agent name when autopublish is {'enabled' if auto_publish else 'disabled'} was not returned."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def test_update_agent_invalid_name(self):
|
|
120
|
+
test_params = [ True, False ]
|
|
121
|
+
self.agent_to_update.name = f"{self.agent_to_update.name}:/"
|
|
122
|
+
|
|
123
|
+
for auto_publish in test_params:
|
|
124
|
+
with self.subTest(input=auto_publish):
|
|
125
|
+
|
|
126
|
+
with self.assertRaises(APIError) as exception:
|
|
127
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
128
|
+
|
|
129
|
+
self.assertIn(
|
|
130
|
+
"Invalid character in name (: is not allowed).",
|
|
131
|
+
str(exception.exception),
|
|
132
|
+
f"Expected error about invalid character (:) in name when autopublish is {'enabled' if auto_publish else 'disabled'} was not returned."
|
|
133
|
+
)
|
|
134
|
+
self.assertIn(
|
|
135
|
+
"Invalid character in name (/ is not allowed).",
|
|
136
|
+
str(exception.exception),
|
|
137
|
+
f"Expected error about invalid character (/) in name when autopublish is {'enabled' if auto_publish else 'disabled'} was not returned."
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_update_agent_no_public_name(self):
|
|
142
|
+
test_params = [ True, False ]
|
|
143
|
+
self.agent_to_update.public_name = ""
|
|
144
|
+
|
|
145
|
+
for auto_publish in test_params:
|
|
146
|
+
with self.subTest(input=auto_publish):
|
|
147
|
+
with self.assertRaises(APIError) as exception:
|
|
148
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
149
|
+
|
|
150
|
+
self.assertIn(
|
|
151
|
+
"Agent publicName is required for agents with accessScope=public.",
|
|
152
|
+
str(exception.exception),
|
|
153
|
+
f"Expected error about missing public name when autopublish is {'enabled' if auto_publish else 'disabled'} was not returned."
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def test_update_agent_duplicated_public_name(self):
|
|
158
|
+
test_params = [ True, False ]
|
|
159
|
+
self.agent_to_update.public_name = "com.testing.geai.googlesummarizer"
|
|
160
|
+
|
|
161
|
+
for auto_publish in test_params:
|
|
162
|
+
with self.subTest(input=auto_publish):
|
|
163
|
+
with self.assertRaises(APIError) as exception:
|
|
164
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
165
|
+
|
|
166
|
+
self.assertIn(
|
|
167
|
+
"Agent already exists [publicName=com.testing.geai.googlesummarizer].",
|
|
168
|
+
str(exception.exception),
|
|
169
|
+
f"Expected error about duplicated public name when autopublish is {'enabled' if auto_publish else 'disabled'} was not returned."
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def test_update_agent_invalid_public_name(self):
|
|
174
|
+
test_params = [ True, False ]
|
|
175
|
+
self.agent_to_update.public_name = self.agent_to_update.public_name.replace("_", "/")
|
|
176
|
+
|
|
177
|
+
for auto_publish in test_params:
|
|
178
|
+
with self.subTest(input=auto_publish):
|
|
179
|
+
with self.assertRaises(APIError) as exception:
|
|
180
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
181
|
+
|
|
182
|
+
self.assertIn(
|
|
183
|
+
"Invalid public name, it can only contain lowercase letters, numbers, periods (.), dashes (-), and underscores (_). Please remove any other characters.",
|
|
184
|
+
str(exception.exception),
|
|
185
|
+
f"Expected error about invalid public name when autopublish is {'enabled' if auto_publish else 'disabled'} was not returned."
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def test_update_agent_no_prompt_instructions(self):
|
|
190
|
+
test_params = [ True, False ]
|
|
191
|
+
self.agent_to_update.agent_data.prompt.instructions = ""
|
|
192
|
+
|
|
193
|
+
for auto_publish in test_params:
|
|
194
|
+
with self.subTest(input=auto_publish):
|
|
195
|
+
if auto_publish == True:
|
|
196
|
+
with self.assertRaises(ValidationError) as exception:
|
|
197
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
198
|
+
self.assertIn(
|
|
199
|
+
"agent_data.prompt must have at least instructions for publication",
|
|
200
|
+
str(exception.exception),
|
|
201
|
+
f"Expected a validation error about allowed values for instructions when autopublish is {'enabled' if auto_publish else 'disabled'}"
|
|
202
|
+
)
|
|
203
|
+
else:
|
|
204
|
+
updated_agent = self.__update_agent(automatic_publish=auto_publish)
|
|
205
|
+
self.assertTrue(isinstance(updated_agent, Agent))
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def test_update_agent_no_model(self):
|
|
209
|
+
test_params = [ True, False ]
|
|
210
|
+
self.agent_to_update.agent_data.models[0].name = ""
|
|
211
|
+
|
|
212
|
+
for auto_publish in test_params:
|
|
213
|
+
with self.subTest(input=auto_publish):
|
|
214
|
+
|
|
215
|
+
# If the agent is not published, the API returns a warning message for invalid model name. However, the sdk mapping is not returning it.
|
|
216
|
+
if auto_publish == False:
|
|
217
|
+
updated_agent = self.__update_agent(automatic_publish=auto_publish)
|
|
218
|
+
|
|
219
|
+
self.assertTrue(isinstance(updated_agent, Agent))
|
|
220
|
+
else:
|
|
221
|
+
with self.assertRaises(APIError) as exception:
|
|
222
|
+
self.__update_agent(automatic_publish=auto_publish)
|
|
223
|
+
error_msg = str(exception.exception)
|
|
224
|
+
self.assertIn(
|
|
225
|
+
"description='Model not found [name=]",
|
|
226
|
+
error_msg,
|
|
227
|
+
"Expected a validation error about allowed values for model name"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def test_update_agent_autopublish(self):
|
|
232
|
+
updated_agent = self.__update_agent(automatic_publish=True)
|
|
233
|
+
|
|
234
|
+
self.assertEqual(
|
|
235
|
+
updated_agent.name,
|
|
236
|
+
f"UpdatedAgent{self.random_str}",
|
|
237
|
+
"Expected agent name to remain unchanged after update."
|
|
238
|
+
)
|
|
239
|
+
self.assertFalse(
|
|
240
|
+
updated_agent.is_draft,
|
|
241
|
+
"Expected agent to be published when autopublish is True, but it is still a draft."
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def test_update_agent_autopublish_private_scope(self):
|
|
246
|
+
self.agent_to_update.access_scope = "private"
|
|
247
|
+
|
|
248
|
+
updated_agent = self.__update_agent(automatic_publish=True)
|
|
249
|
+
self.assertFalse(updated_agent.is_draft, "Expected the agent to be published automatically even with private scope")
|
|
250
|
+
|
|
File without changes
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
from unittest import TestCase
|
|
2
|
+
import unittest
|
|
3
|
+
import uuid
|
|
4
|
+
from pygeai.lab.managers import AILabManager
|
|
5
|
+
from pygeai.lab.models import (
|
|
6
|
+
AgenticProcess, KnowledgeBase, AgenticActivity, ArtifactSignal, Task,
|
|
7
|
+
UserSignal, Event, SequenceFlow, Variable
|
|
8
|
+
)
|
|
9
|
+
from pygeai.core.common.exceptions import APIResponseError, APIError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TestAILabCreateProcessIntegration(TestCase):
|
|
13
|
+
|
|
14
|
+
def setUp(self):
|
|
15
|
+
"""
|
|
16
|
+
Set up the test environment.
|
|
17
|
+
"""
|
|
18
|
+
self.ai_lab_manager = AILabManager()
|
|
19
|
+
self.new_process = self.__load_process()
|
|
20
|
+
self.created_process: AgenticProcess = None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def tearDown(self):
|
|
24
|
+
"""
|
|
25
|
+
Clean up after each test if necessary.
|
|
26
|
+
This can be used to delete the created process
|
|
27
|
+
"""
|
|
28
|
+
if isinstance(self.created_process, AgenticProcess):
|
|
29
|
+
self.ai_lab_manager.delete_process(self.created_process.id)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def __load_process(self):
|
|
33
|
+
"""
|
|
34
|
+
Helper to load a complete process configuration for testing.
|
|
35
|
+
"""
|
|
36
|
+
unique_key = str(uuid.uuid4())
|
|
37
|
+
process = AgenticProcess(
|
|
38
|
+
key="product_def",
|
|
39
|
+
name=f"Test Process {unique_key[:8]}",
|
|
40
|
+
description="This is a sample process",
|
|
41
|
+
kb=KnowledgeBase(name="basic-sample", artifact_type_name=["sample-artifact"]),
|
|
42
|
+
agentic_activities=[
|
|
43
|
+
AgenticActivity(key="activityOne", name="First Step", task_name="basic-task", agent_name="GoogleSummarizer2", agent_revision_id=0)
|
|
44
|
+
],
|
|
45
|
+
artifact_signals=[
|
|
46
|
+
ArtifactSignal(key="artifact.upload.1", name="artifact.upload", handling_type="C", artifact_type_name=["sample-artifact"])
|
|
47
|
+
],
|
|
48
|
+
user_signals=[
|
|
49
|
+
UserSignal(key="signal_done", name="process-completed")
|
|
50
|
+
],
|
|
51
|
+
start_event=Event(key="artifact.upload.1", name="artifact.upload"),
|
|
52
|
+
end_event=Event(key="end", name="Done"),
|
|
53
|
+
sequence_flows=[
|
|
54
|
+
SequenceFlow(key="step1", source_key="artifact.upload.1", target_key="activityOne"),
|
|
55
|
+
SequenceFlow(key="step2", source_key="activityOne", target_key="signal_done"),
|
|
56
|
+
SequenceFlow(key="stepEnd", source_key="signal_done", target_key="end")
|
|
57
|
+
]
|
|
58
|
+
)
|
|
59
|
+
return process
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def __create_process(self, process=None, automatic_publish=False):
|
|
63
|
+
"""
|
|
64
|
+
Helper to create a process using ai_lab_manager.
|
|
65
|
+
"""
|
|
66
|
+
return self.ai_lab_manager.create_process(
|
|
67
|
+
process=self.new_process if process is None else process,
|
|
68
|
+
automatic_publish=automatic_publish
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_create_process_full_data(self):
|
|
73
|
+
"""
|
|
74
|
+
Test creating a process with all available fields populated.
|
|
75
|
+
"""
|
|
76
|
+
self.created_process = self.__create_process()
|
|
77
|
+
created_process = self.created_process
|
|
78
|
+
process = self.new_process
|
|
79
|
+
|
|
80
|
+
self.assertTrue(isinstance(created_process, AgenticProcess), "Expected a created process")
|
|
81
|
+
|
|
82
|
+
# Assert the main fields of the created process
|
|
83
|
+
self.assertIsNotNone(created_process.id)
|
|
84
|
+
#self.assertEqual(created_process.key, process.key)
|
|
85
|
+
self.assertEqual(created_process.name, process.name)
|
|
86
|
+
self.assertEqual(created_process.description, process.description)
|
|
87
|
+
self.assertEqual(created_process.status, "active")
|
|
88
|
+
|
|
89
|
+
# Assert knowledge base
|
|
90
|
+
self.assertIsNotNone(created_process.kb)
|
|
91
|
+
self.assertEqual(created_process.kb.name, process.kb.name)
|
|
92
|
+
|
|
93
|
+
# Assert agentic activities
|
|
94
|
+
created_activity = created_process.agentic_activities[0]
|
|
95
|
+
original_activity = process.agentic_activities[0]
|
|
96
|
+
self.assertTrue(isinstance(created_activity, AgenticActivity))
|
|
97
|
+
self.assertEqual(created_activity.key.lower(), original_activity.key.lower())
|
|
98
|
+
self.assertEqual(created_activity.name, original_activity.name)
|
|
99
|
+
|
|
100
|
+
# Assert artifact signals
|
|
101
|
+
created_signal = created_process.artifact_signals[0]
|
|
102
|
+
original_signal = process.artifact_signals[0]
|
|
103
|
+
self.assertTrue(isinstance(created_signal, ArtifactSignal))
|
|
104
|
+
self.assertEqual(created_signal.key.lower(), original_signal.key.lower())
|
|
105
|
+
self.assertEqual(created_signal.name, original_signal.name)
|
|
106
|
+
self.assertEqual(created_signal.handling_type, original_signal.handling_type)
|
|
107
|
+
|
|
108
|
+
# Assert user signals
|
|
109
|
+
created_user_signal = created_process.user_signals[0]
|
|
110
|
+
self.assertTrue(isinstance(created_user_signal, UserSignal))
|
|
111
|
+
|
|
112
|
+
# Assert events
|
|
113
|
+
self.assertIsNotNone(created_process.start_event)
|
|
114
|
+
self.assertEqual(created_process.start_event.key.lower(), process.start_event.key.lower())
|
|
115
|
+
self.assertEqual(created_process.start_event.name, process.start_event.name)
|
|
116
|
+
|
|
117
|
+
self.assertIsNotNone(created_process.end_event)
|
|
118
|
+
self.assertEqual(created_process.end_event.key.lower(), process.end_event.key.lower())
|
|
119
|
+
self.assertEqual(created_process.end_event.name, process.end_event.name)
|
|
120
|
+
|
|
121
|
+
# Assert sequence flows
|
|
122
|
+
created_flow = created_process.sequence_flows[0]
|
|
123
|
+
original_flow = process.sequence_flows[0]
|
|
124
|
+
self.assertIsNotNone(created_process.sequence_flows)
|
|
125
|
+
self.assertEqual(len(created_process.sequence_flows), len(process.sequence_flows))
|
|
126
|
+
|
|
127
|
+
self.assertEqual(created_flow.key.lower(), original_flow.key.lower())
|
|
128
|
+
self.assertEqual(created_flow.source_key.lower(), original_flow.source_key.lower())
|
|
129
|
+
self.assertEqual(created_flow.target_key.lower(), original_flow.target_key.lower())
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def test_create_process_minimum_required_data(self):
|
|
133
|
+
"""
|
|
134
|
+
Test creating a process with only minimum required fields (key and name).
|
|
135
|
+
"""
|
|
136
|
+
unique_key = str(uuid.uuid4())
|
|
137
|
+
self.new_process = AgenticProcess(
|
|
138
|
+
key=unique_key,
|
|
139
|
+
name=f"Minimal Process {unique_key[:8]}"
|
|
140
|
+
)
|
|
141
|
+
self.created_process = self.__create_process()
|
|
142
|
+
process = self.new_process
|
|
143
|
+
|
|
144
|
+
self.assertTrue(isinstance(self.created_process, AgenticProcess), "Expected a created process")
|
|
145
|
+
self.assertIsNotNone(self.created_process.id)
|
|
146
|
+
self.assertEqual(self.created_process.name, process.name)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def test_create_process_without_key(self):
|
|
150
|
+
"""
|
|
151
|
+
Test creating a process without a key should still work (key is optional).
|
|
152
|
+
"""
|
|
153
|
+
self.new_process = AgenticProcess(
|
|
154
|
+
name=f"Process Without Key {str(uuid.uuid4())[:8]}"
|
|
155
|
+
)
|
|
156
|
+
self.created_process = self.__create_process()
|
|
157
|
+
|
|
158
|
+
self.assertTrue(isinstance(self.created_process, AgenticProcess), "Expected a created process")
|
|
159
|
+
self.assertIsNotNone(self.created_process.id)
|
|
160
|
+
self.assertEqual(self.created_process.name, self.new_process.name)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_create_process_no_name(self):
|
|
164
|
+
"""
|
|
165
|
+
Test creating a process without a name should raise an error.
|
|
166
|
+
"""
|
|
167
|
+
test_params = [True, False]
|
|
168
|
+
|
|
169
|
+
for auto_publish in test_params:
|
|
170
|
+
with self.subTest(input=auto_publish):
|
|
171
|
+
self.new_process.name = ""
|
|
172
|
+
with self.assertRaises(APIError) as exception:
|
|
173
|
+
self.__create_process(automatic_publish=auto_publish)
|
|
174
|
+
|
|
175
|
+
self.assertIn(
|
|
176
|
+
"Process name cannot be empty",
|
|
177
|
+
str(exception.exception),
|
|
178
|
+
f"Expected an error about empty process name with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def test_create_process_duplicated_name(self):
|
|
183
|
+
"""
|
|
184
|
+
Test creating a process with a duplicate name should raise an error.
|
|
185
|
+
"""
|
|
186
|
+
test_params = [True, False]
|
|
187
|
+
created_process = self.__create_process()
|
|
188
|
+
|
|
189
|
+
for auto_publish in test_params:
|
|
190
|
+
with self.subTest(input=auto_publish):
|
|
191
|
+
loaded_process = self.__load_process()
|
|
192
|
+
loaded_process.name = created_process.name
|
|
193
|
+
with self.assertRaises(APIError) as exception:
|
|
194
|
+
self.__create_process(process = loaded_process, automatic_publish=auto_publish)
|
|
195
|
+
|
|
196
|
+
self.assertIn(
|
|
197
|
+
f"A process with this name already exists [name={created_process.name}].",
|
|
198
|
+
str(exception.exception),
|
|
199
|
+
f"Expected an error about duplicated process name with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def test_create_process_invalid_name_characters(self):
|
|
204
|
+
"""
|
|
205
|
+
Test creating a process with invalid characters in name should raise a validation error.
|
|
206
|
+
"""
|
|
207
|
+
test_params = [True, False]
|
|
208
|
+
|
|
209
|
+
for auto_publish in test_params:
|
|
210
|
+
with self.subTest(input=auto_publish):
|
|
211
|
+
invalid_names = [
|
|
212
|
+
f"{str(uuid.uuid4())[:8]}:invalid",
|
|
213
|
+
f"{str(uuid.uuid4())[:8]}/invalid"
|
|
214
|
+
]
|
|
215
|
+
|
|
216
|
+
for invalid_name in invalid_names:
|
|
217
|
+
new_process = self.__load_process()
|
|
218
|
+
new_process.name = invalid_name
|
|
219
|
+
|
|
220
|
+
with self.assertRaises(APIError) as exception:
|
|
221
|
+
self.__create_process(process=new_process, automatic_publish=auto_publish)
|
|
222
|
+
|
|
223
|
+
self.assertIn(
|
|
224
|
+
"Invalid character in name",
|
|
225
|
+
str(exception.exception),
|
|
226
|
+
f"Expected an error about invalid character in process name with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
@unittest.skip("Skipping test for now.KB is required but is marked as optional")
|
|
231
|
+
def test_create_process_with_no_kb(self):
|
|
232
|
+
"""
|
|
233
|
+
Test creating a process with knowledge base in JSON format.
|
|
234
|
+
"""
|
|
235
|
+
unique_key = str(uuid.uuid4())
|
|
236
|
+
self.new_process.kb = None
|
|
237
|
+
self.created_process = self.__create_process()
|
|
238
|
+
|
|
239
|
+
self.assertIsNotNone(self.created_process.kb)
|
|
240
|
+
self.assertEqual(self.created_process.kb.name, "basic-sample")
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def test_create_process_with_empty_agentic_activities_array(self):
|
|
244
|
+
"""
|
|
245
|
+
Test creating a process with empty agentic activities array (to clear all activities).
|
|
246
|
+
"""
|
|
247
|
+
self.new_process.agentic_activities = []
|
|
248
|
+
self.new_process.sequence_flows = [] # Clear sequence flows as well because they depend on activities
|
|
249
|
+
self.created_process = self.__create_process()
|
|
250
|
+
|
|
251
|
+
# Empty array should be handled gracefully
|
|
252
|
+
self.assertTrue(
|
|
253
|
+
self.created_process.agentic_activities is None or
|
|
254
|
+
len(self.created_process.agentic_activities) == 0
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def test_create_process_with_multiple_artifact_signals(self):
|
|
259
|
+
"""
|
|
260
|
+
Test creating a process with multiple artifact signals.
|
|
261
|
+
"""
|
|
262
|
+
self.new_process.artifact_signals=[
|
|
263
|
+
ArtifactSignal(key="artifact.upload.1", name="artifact.upload", handling_type="C", artifact_type_name=["sample-artifact"]),
|
|
264
|
+
ArtifactSignal(key="artifact.upload.2", name="artifact.upload.second", handling_type="C", artifact_type_name=["sample-artifact"])
|
|
265
|
+
]
|
|
266
|
+
self.created_process = self.__create_process()
|
|
267
|
+
|
|
268
|
+
self.assertIsNotNone(self.created_process.artifact_signals)
|
|
269
|
+
self.assertEqual(len(self.created_process.artifact_signals), 2)
|
|
270
|
+
|
|
271
|
+
first_signal = self.created_process.artifact_signals[0]
|
|
272
|
+
second_signal = self.created_process.artifact_signals[1]
|
|
273
|
+
|
|
274
|
+
self.assertEqual(first_signal.key.lower(), "artifact.upload.1")
|
|
275
|
+
self.assertEqual(second_signal.key.lower(), "artifact.upload.2")
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def test_create_process_with_multiple_user_signals(self):
|
|
279
|
+
"""
|
|
280
|
+
Test creating a process with multiple user signals.
|
|
281
|
+
"""
|
|
282
|
+
self.new_process.user_signals=[
|
|
283
|
+
UserSignal(key="signal_done", name="process-completed"),
|
|
284
|
+
UserSignal(key="signal_cancel", name="process-cancelled")
|
|
285
|
+
]
|
|
286
|
+
self.created_process = self.__create_process()
|
|
287
|
+
|
|
288
|
+
self.assertIsNotNone(self.created_process.user_signals)
|
|
289
|
+
self.assertEqual(len(self.created_process.user_signals)-1, 2)
|
|
290
|
+
keys = [signal.key for signal in self.created_process.user_signals]
|
|
291
|
+
|
|
292
|
+
assert "SIGNAL_CANCEL" in keys
|
|
293
|
+
assert "SIGNAL_DONE" in keys
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def test_create_process_autopublish_disabled(self):
|
|
297
|
+
"""
|
|
298
|
+
Test creating a process without automatic publish (default behavior).
|
|
299
|
+
"""
|
|
300
|
+
self.created_process = self.__create_process(automatic_publish=False)
|
|
301
|
+
|
|
302
|
+
# Process should be created as draft by default
|
|
303
|
+
self.assertTrue(
|
|
304
|
+
self.created_process.is_draft is True or
|
|
305
|
+
self.created_process.is_draft is None, # API might not return this field for drafts
|
|
306
|
+
"Expected the process to be created as draft when autopublish is disabled"
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def test_create_process_autopublish_without_task(self):
|
|
311
|
+
"""
|
|
312
|
+
Test creating a process with automatic publish enabled.
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
with self.assertRaises(APIError) as exception:
|
|
316
|
+
self.__create_process(automatic_publish=True)
|
|
317
|
+
|
|
318
|
+
self.assertIn(
|
|
319
|
+
"Failure on process publication",
|
|
320
|
+
str(exception.exception),
|
|
321
|
+
"Expected an error about failure on process publication"
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
self.assertIn(
|
|
325
|
+
"Task is required",
|
|
326
|
+
str(exception.exception),
|
|
327
|
+
"Expected an error about task being required"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def test_create_process_autopublish_enabled(self):
|
|
332
|
+
"""
|
|
333
|
+
Test creating a process with automatic publish enabled.
|
|
334
|
+
"""
|
|
335
|
+
unique_key = str(uuid.uuid4())
|
|
336
|
+
task = Task(name=unique_key, description="Basic task for process", title_template="Basic Task")
|
|
337
|
+
self.ai_lab_manager.create_task(task=task, automatic_publish=True)
|
|
338
|
+
self.new_process.agentic_activities[0].task_name = unique_key
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
self.created_process = self.__create_process(automatic_publish=True)
|
|
342
|
+
self.assertTrue(
|
|
343
|
+
self.created_process.is_draft is False,
|
|
344
|
+
"Expected the process to be created no draft when autopublish is enabled"
|
|
345
|
+
)
|