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,319 @@
|
|
|
1
|
+
from unittest import TestCase
|
|
2
|
+
import unittest
|
|
3
|
+
import uuid
|
|
4
|
+
from pygeai.lab.managers import AILabManager
|
|
5
|
+
from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model, Sampling, PromptExample, PromptOutput
|
|
6
|
+
from pydantic import ValidationError
|
|
7
|
+
from pygeai.core.common.exceptions import APIError, InvalidAPIResponseException
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TestAILabCreateAgentIntegration(TestCase):
|
|
11
|
+
def setUp(self):
|
|
12
|
+
"""
|
|
13
|
+
Set up the test environment.
|
|
14
|
+
"""
|
|
15
|
+
self.ai_lab_manager = AILabManager()
|
|
16
|
+
self.new_agent = self.__load_agent()
|
|
17
|
+
self.created_agent: Agent = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def tearDown(self):
|
|
21
|
+
"""
|
|
22
|
+
Clean up after each test if necessary.
|
|
23
|
+
This can be used to delete the created agent or reset the state.
|
|
24
|
+
"""
|
|
25
|
+
if isinstance(self.created_agent, Agent):
|
|
26
|
+
self.ai_lab_manager.delete_agent(self.created_agent.id)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def __load_agent(self):
|
|
30
|
+
random_str = str(uuid.uuid4())
|
|
31
|
+
return Agent(
|
|
32
|
+
name=random_str,
|
|
33
|
+
access_scope="public",
|
|
34
|
+
public_name=f"public_{random_str}",
|
|
35
|
+
job_description="Translator",
|
|
36
|
+
description="Agent that translates from any language to english.",
|
|
37
|
+
agent_data=AgentData(
|
|
38
|
+
prompt=Prompt(
|
|
39
|
+
instructions="the user will provide a text, you must return the same text translated to english",
|
|
40
|
+
inputs=["text", "avoid slang indicator"],
|
|
41
|
+
outputs=[
|
|
42
|
+
PromptOutput(key="translated_text", description="translated text, with slang or not depending on the indication. in plain text.")
|
|
43
|
+
],
|
|
44
|
+
examples=[
|
|
45
|
+
PromptExample(input_data="hola mundo [no-slang]", output='{"translated_text":"hello world"}'),
|
|
46
|
+
PromptExample(input_data="esto es una prueba pincheguey [keep-slang]", output='{"translated_text":"this is a test pal"}')
|
|
47
|
+
]
|
|
48
|
+
),
|
|
49
|
+
llm_config=LlmConfig(
|
|
50
|
+
max_tokens=1800,
|
|
51
|
+
timeout=0,
|
|
52
|
+
sampling=Sampling(temperature=0.3, top_k=0, top_p=0)
|
|
53
|
+
),
|
|
54
|
+
models=[Model(name="gpt-4o")]
|
|
55
|
+
)
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def __create_agent(self, agent=None, automatic_publish=False):
|
|
60
|
+
"""
|
|
61
|
+
Helper to create an agent with the current project_id and ai_lab_manager.
|
|
62
|
+
If automatic_publish is None, do not pass it (useful for tests that omit it).
|
|
63
|
+
"""
|
|
64
|
+
return self.ai_lab_manager.create_agent(
|
|
65
|
+
agent=self.new_agent if agent is None else agent,
|
|
66
|
+
automatic_publish=automatic_publish
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_create_agent_full_data(self):
|
|
71
|
+
self.created_agent = self.__create_agent()
|
|
72
|
+
created_agent = self.created_agent
|
|
73
|
+
agent = self.new_agent
|
|
74
|
+
|
|
75
|
+
self.assertTrue(isinstance(created_agent, Agent), "Expected a created agent")
|
|
76
|
+
|
|
77
|
+
# Assert the main fields of the created agent
|
|
78
|
+
self.assertIsNotNone(created_agent.id)
|
|
79
|
+
self.assertEqual(created_agent.name, agent.name)
|
|
80
|
+
self.assertEqual(created_agent.access_scope, agent.access_scope)
|
|
81
|
+
self.assertEqual(created_agent.public_name, agent.public_name)
|
|
82
|
+
self.assertEqual(created_agent.avatar_image, agent.avatar_image)
|
|
83
|
+
self.assertEqual(created_agent.description, agent.description)
|
|
84
|
+
self.assertEqual(created_agent.job_description, agent.job_description)
|
|
85
|
+
|
|
86
|
+
# Assert agentData fields
|
|
87
|
+
agent_data = created_agent.agent_data
|
|
88
|
+
self.assertIsNotNone(agent_data)
|
|
89
|
+
self.assertEqual(agent_data.llm_config.max_tokens, agent.agent_data.llm_config.max_tokens)
|
|
90
|
+
self.assertEqual(agent_data.llm_config.timeout, agent.agent_data.llm_config.timeout)
|
|
91
|
+
self.assertEqual(agent_data.llm_config.sampling.temperature, agent.agent_data.llm_config.sampling.temperature)
|
|
92
|
+
self.assertEqual(agent_data.llm_config.sampling.top_k, agent.agent_data.llm_config.sampling.top_k)
|
|
93
|
+
self.assertEqual(agent_data.llm_config.sampling.top_p, agent.agent_data.llm_config.sampling.top_p)
|
|
94
|
+
self.assertEqual(agent_data.models[0].name, agent.agent_data.models[0].name)
|
|
95
|
+
|
|
96
|
+
# Assert prompt fields
|
|
97
|
+
prompt = agent_data.prompt
|
|
98
|
+
self.assertEqual(prompt.instructions, agent.agent_data.prompt.instructions)
|
|
99
|
+
self.assertEqual(prompt.inputs, agent.agent_data.prompt.inputs)
|
|
100
|
+
self.assertEqual(prompt.outputs[0].key, agent.agent_data.prompt.outputs[0].key)
|
|
101
|
+
self.assertEqual(prompt.outputs[0].description, agent.agent_data.prompt.outputs[0].description)
|
|
102
|
+
|
|
103
|
+
# Assert prompt examples
|
|
104
|
+
self.assertEqual(prompt.examples[0].input_data, agent.agent_data.prompt.examples[0].input_data)
|
|
105
|
+
self.assertEqual(prompt.examples[0].output, agent.agent_data.prompt.examples[0].output)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_create_agent_minimum_required_data(self):
|
|
109
|
+
self.new_agent = Agent(
|
|
110
|
+
name=str(uuid.uuid4()),
|
|
111
|
+
description="Agent that translates from any language to english.",
|
|
112
|
+
agent_data=AgentData(
|
|
113
|
+
prompt=Prompt(
|
|
114
|
+
instructions="the user will provide a text, you must return the same text translated to english",
|
|
115
|
+
inputs=["text", "avoid slang indicator"]
|
|
116
|
+
),
|
|
117
|
+
llm_config=LlmConfig(
|
|
118
|
+
max_tokens=1800,
|
|
119
|
+
timeout=0
|
|
120
|
+
),
|
|
121
|
+
models=[Model(name="gpt-4o")]
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
self.created_agent = self.__create_agent()
|
|
125
|
+
agent = self.new_agent
|
|
126
|
+
|
|
127
|
+
self.assertIsNotNone(self.created_agent.id)
|
|
128
|
+
self.assertEqual(self.created_agent.name, agent.name)
|
|
129
|
+
self.assertEqual(self.created_agent.description, agent.description)
|
|
130
|
+
|
|
131
|
+
# Assert agentData fields
|
|
132
|
+
agent_data = self.created_agent.agent_data
|
|
133
|
+
self.assertIsNotNone(agent_data)
|
|
134
|
+
self.assertEqual(agent_data.llm_config.max_tokens, agent.agent_data.llm_config.max_tokens)
|
|
135
|
+
self.assertEqual(agent_data.llm_config.timeout, agent.agent_data.llm_config.timeout)
|
|
136
|
+
self.assertEqual(agent_data.models[0].name, agent.agent_data.models[0].name)
|
|
137
|
+
|
|
138
|
+
# Assert prompt fields
|
|
139
|
+
prompt = agent_data.prompt
|
|
140
|
+
self.assertEqual(prompt.instructions, agent.agent_data.prompt.instructions)
|
|
141
|
+
self.assertEqual(prompt.inputs, agent.agent_data.prompt.inputs)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def test_create_agent_without_required_data(self):
|
|
145
|
+
test_params = [ True, False ]
|
|
146
|
+
|
|
147
|
+
for auto_publish in test_params:
|
|
148
|
+
|
|
149
|
+
with self.subTest(input=auto_publish):
|
|
150
|
+
self.new_agent = Agent(
|
|
151
|
+
name=str(uuid.uuid4())
|
|
152
|
+
)
|
|
153
|
+
if auto_publish:
|
|
154
|
+
|
|
155
|
+
with self.assertRaises(APIError) as exception:
|
|
156
|
+
self.__create_agent(automatic_publish=auto_publish)
|
|
157
|
+
|
|
158
|
+
#TODO: Change validation error to a more specific one
|
|
159
|
+
self.assertIn(
|
|
160
|
+
"A valid prompt is required. To be valid, it must provide clear instructions to the model",
|
|
161
|
+
str(exception.exception)
|
|
162
|
+
)
|
|
163
|
+
else:
|
|
164
|
+
created_agent = self.__create_agent(automatic_publish=auto_publish)
|
|
165
|
+
self.assertTrue(isinstance(created_agent, Agent), "Expected a created agent")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def test_create_agent_no_name(self):
|
|
169
|
+
test_params = [ True, False ]
|
|
170
|
+
|
|
171
|
+
for auto_publish in test_params:
|
|
172
|
+
with self.subTest(input=auto_publish):
|
|
173
|
+
self.new_agent.name = ""
|
|
174
|
+
with self.assertRaises(APIError) as exception:
|
|
175
|
+
self.__create_agent(automatic_publish=auto_publish)
|
|
176
|
+
|
|
177
|
+
self.assertIn(
|
|
178
|
+
"Agent name cannot be empty.",
|
|
179
|
+
str(exception.exception),
|
|
180
|
+
f"Expected an error about the missing agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def test_create_agent_duplicated_name(self):
|
|
185
|
+
test_params = [ True, False ]
|
|
186
|
+
|
|
187
|
+
for auto_publish in test_params:
|
|
188
|
+
|
|
189
|
+
with self.subTest(input=auto_publish):
|
|
190
|
+
self.new_agent.name = "AritmeticaExpert"
|
|
191
|
+
with self.assertRaises(APIError) as exception:
|
|
192
|
+
self.__create_agent(automatic_publish=auto_publish)
|
|
193
|
+
self.assertIn(
|
|
194
|
+
"Agent cannot be created as it already exists [name=AritmeticaExpert].",
|
|
195
|
+
str(exception.exception),
|
|
196
|
+
f"Expected an error about duplicated agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def test_create_agent_invalid_name(self):
|
|
201
|
+
test_params = [ True, False ]
|
|
202
|
+
|
|
203
|
+
for auto_publish in test_params:
|
|
204
|
+
with self.subTest(input=auto_publish):
|
|
205
|
+
new_agent = self.__load_agent()
|
|
206
|
+
new_agent2 = self.__load_agent()
|
|
207
|
+
|
|
208
|
+
with self.assertRaises(APIError) as exception:
|
|
209
|
+
new_agent.name = f"{new_agent.name}:invalid"
|
|
210
|
+
self.__create_agent(agent=new_agent, automatic_publish=auto_publish)
|
|
211
|
+
self.assertIn(
|
|
212
|
+
"Invalid character in name (: is not allowed).",
|
|
213
|
+
str(exception.exception),
|
|
214
|
+
f"Expected an error about invalid character (:) in agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
with self.assertRaises(APIError) as exception:
|
|
218
|
+
new_agent2.name = f"{new_agent2.name}/invalid"
|
|
219
|
+
self.__create_agent(agent=new_agent2, automatic_publish=auto_publish)
|
|
220
|
+
self.assertIn(
|
|
221
|
+
"Invalid character in name (/ is not allowed).",
|
|
222
|
+
str(exception.exception),
|
|
223
|
+
f"Expected an error about invalid character (/) in agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def test_create_agent_invalid_scope(self):
|
|
228
|
+
self.new_agent.access_scope = "project"
|
|
229
|
+
with self.assertRaises(ValueError) as exc:
|
|
230
|
+
self.__create_agent()
|
|
231
|
+
self.assertEqual(
|
|
232
|
+
str(exc.exception),
|
|
233
|
+
"Access scope must be one of public, private.",
|
|
234
|
+
"Expected a ValueError exception for invalid access scope"
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def test_create_agent_default_scope(self):
|
|
239
|
+
self.new_agent.access_scope = None
|
|
240
|
+
self.created_agent = self.__create_agent()
|
|
241
|
+
|
|
242
|
+
self.assertEqual(self.created_agent.access_scope, "private", "Expected the default access scope to be 'private' when not specified")
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def test_create_agent_no_public_name(self):
|
|
246
|
+
test_params = [ True, False ]
|
|
247
|
+
|
|
248
|
+
for auto_publish in test_params:
|
|
249
|
+
|
|
250
|
+
with self.subTest(input=auto_publish):
|
|
251
|
+
self.new_agent.public_name = None
|
|
252
|
+
with self.assertRaises(APIError) as exception:
|
|
253
|
+
self.__create_agent(automatic_publish=auto_publish)
|
|
254
|
+
self.assertIn(
|
|
255
|
+
"Agent publicName is required for agents with accessScope=public.",
|
|
256
|
+
str(exception.exception),
|
|
257
|
+
f"Expected an error about missing publicName for public access scope with autopublish {'enabled' if auto_publish else 'disabled'}"
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def test_create_agent_invalid_public_name(self):
|
|
262
|
+
test_params = [ True, False ]
|
|
263
|
+
|
|
264
|
+
for auto_publish in test_params:
|
|
265
|
+
with self.subTest(input=auto_publish):
|
|
266
|
+
self.new_agent.public_name = self.new_agent.public_name.replace("_", "#") # Add invalid character to public name
|
|
267
|
+
with self.assertRaises(APIError) as exception:
|
|
268
|
+
self.__create_agent(automatic_publish=auto_publish)
|
|
269
|
+
|
|
270
|
+
self.assertIn(
|
|
271
|
+
"Invalid public name, it can only contain lowercase letters, numbers, periods (.), dashes (-), and underscores (_). Please remove any other characters.",
|
|
272
|
+
str(exception.exception),
|
|
273
|
+
f"The expected error about invalid publicName was not returned when autopublish is {'enabled' if auto_publish else 'disabled'}"
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def test_create_agent_duplicated_public_name(self):
|
|
278
|
+
test_params = [ True, False ]
|
|
279
|
+
self.created_agent = self.__create_agent()
|
|
280
|
+
|
|
281
|
+
for auto_publish in test_params:
|
|
282
|
+
with self.subTest(input=auto_publish):
|
|
283
|
+
duplicated_pn_agent = self.__load_agent()
|
|
284
|
+
duplicated_pn_agent.public_name = self.created_agent.public_name
|
|
285
|
+
|
|
286
|
+
with self.assertRaises(APIError) as exception:
|
|
287
|
+
self.__create_agent(agent=duplicated_pn_agent, automatic_publish=auto_publish)
|
|
288
|
+
self.assertIn(
|
|
289
|
+
f"Agent already exists [publicName={self.created_agent.public_name}].",
|
|
290
|
+
str(exception.exception),
|
|
291
|
+
f"Expected an error about the duplicated public name when autopublish is {'enabled' if auto_publish else 'disabled'}"
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def test_create_agent_no_prompt_instructions(self):
|
|
296
|
+
self.new_agent.agent_data.prompt.instructions = ""
|
|
297
|
+
self.created_agent = self.__create_agent()
|
|
298
|
+
|
|
299
|
+
self.assertTrue(
|
|
300
|
+
isinstance(self.created_agent, Agent),
|
|
301
|
+
"Expected a created agent"
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
self.assertIsNone(
|
|
305
|
+
self.created_agent.agent_data.prompt.instructions,
|
|
306
|
+
"Expected the created agent to not have prompt instructions"
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def test_create_agent_autopublish(self):
|
|
311
|
+
self.created_agent = self.__create_agent(automatic_publish=True)
|
|
312
|
+
self.assertFalse(self.created_agent.is_draft, "Expected the agent to be published automatically")
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def test_create_agent_autopublish_private_scope(self):
|
|
316
|
+
self.new_agent.access_scope = "private"
|
|
317
|
+
|
|
318
|
+
self.created_agent = self.__create_agent(automatic_publish=True)
|
|
319
|
+
self.assertFalse(self.created_agent.is_draft, "Expected the agent to be published automatically even with private scope")
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from unittest import TestCase
|
|
2
|
+
import unittest
|
|
3
|
+
from pygeai.lab.managers import AILabManager
|
|
4
|
+
from pygeai.lab.models import SharingLink
|
|
5
|
+
from pygeai.core.common.exceptions import APIError, MissingRequirementException
|
|
6
|
+
|
|
7
|
+
ai_lab_manager: AILabManager
|
|
8
|
+
|
|
9
|
+
class TestAILabCreateSharingLinkIntegration(TestCase):
|
|
10
|
+
|
|
11
|
+
def setUp(self):
|
|
12
|
+
self.ai_lab_manager = AILabManager()
|
|
13
|
+
self.agent_id = "0026e53d-ea78-4cac-af9f-12650e5bb6d9"
|
|
14
|
+
|
|
15
|
+
def __create_sharing_link(self, agent_id=None):
|
|
16
|
+
return self.ai_lab_manager.create_sharing_link(
|
|
17
|
+
agent_id=self.agent_id if agent_id is None else agent_id
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
@unittest.skip("Endpoint is not found. Validate if it was deleted")
|
|
21
|
+
def test_create_sharing_link(self):
|
|
22
|
+
shared_link = self.__create_sharing_link()
|
|
23
|
+
self.assertIsInstance(shared_link, SharingLink, "Expected response to be an instance of SharingLink")
|
|
24
|
+
|
|
25
|
+
self.assertEqual(
|
|
26
|
+
shared_link.agent_id,
|
|
27
|
+
self.agent_id,
|
|
28
|
+
"Returned agentId should match the requested agent_id"
|
|
29
|
+
)
|
|
30
|
+
self.assertTrue(
|
|
31
|
+
shared_link.api_token.startswith("shared-"),
|
|
32
|
+
"apiToken should start with 'shared-'"
|
|
33
|
+
)
|
|
34
|
+
self.assertTrue(
|
|
35
|
+
shared_link.shared_link.startswith("https://"),
|
|
36
|
+
"sharedLink should be a valid URL"
|
|
37
|
+
)
|
|
38
|
+
self.assertIn(
|
|
39
|
+
f"agentId={self.agent_id}",
|
|
40
|
+
shared_link.shared_link,
|
|
41
|
+
"sharedLink should contain the agentId as a query parameter"
|
|
42
|
+
)
|
|
43
|
+
self.assertIn(
|
|
44
|
+
f"sharedToken={shared_link.api_token}",
|
|
45
|
+
shared_link.shared_link,
|
|
46
|
+
"sharedLink should contain the apiToken as sharedToken"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@unittest.skip("Endpoint is not found. Validate if it was deleted")
|
|
51
|
+
def test_create_sharing_link_no_agent_id(self):
|
|
52
|
+
with self.assertRaises(MissingRequirementException) as context:
|
|
53
|
+
self.__create_sharing_link(agent_id="")
|
|
54
|
+
self.assertEqual(
|
|
55
|
+
str(context.exception),
|
|
56
|
+
"agent_id must be specified in order to create sharing link",
|
|
57
|
+
"Expected exception for missing agent_id"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@unittest.skip("Endpoint is not found. Validate if it was deleted")
|
|
62
|
+
def test_create_sharing_link_invalid_agent_id(self):
|
|
63
|
+
with self.assertRaises(APIError) as exception:
|
|
64
|
+
invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
|
|
65
|
+
self.__create_sharing_link(agent_id=invalid_id)
|
|
66
|
+
self.assertIn(
|
|
67
|
+
f"Agent not found [IdOrName= {invalid_id}].",
|
|
68
|
+
str(exception.exception),
|
|
69
|
+
"Expected error message for invalid agent id"
|
|
70
|
+
)
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
6
|
+
|
|
7
|
+
ai_lab_manager: AILabManager
|
|
8
|
+
|
|
9
|
+
class TestAILabDeleteAgentIntegration(TestCase):
|
|
10
|
+
|
|
11
|
+
def setUp(self):
|
|
12
|
+
self.ai_lab_manager = AILabManager()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def __create_agent(self):
|
|
16
|
+
"""
|
|
17
|
+
Helper to create an agent with the current project_id and ai_lab_manager.
|
|
18
|
+
If automatic_publish is None, do not pass it (useful for tests that omit it).
|
|
19
|
+
"""
|
|
20
|
+
agent = Agent(
|
|
21
|
+
name=str(uuid.uuid4()),
|
|
22
|
+
description="Agent that translates from any language to english.",
|
|
23
|
+
agent_data=AgentData(
|
|
24
|
+
prompt=Prompt(
|
|
25
|
+
instructions="the user will provide a text, you must return the same text translated to english",
|
|
26
|
+
inputs=["text", "avoid slang indicator"]
|
|
27
|
+
),
|
|
28
|
+
llm_config=LlmConfig(
|
|
29
|
+
max_tokens=1800,
|
|
30
|
+
timeout=0
|
|
31
|
+
),
|
|
32
|
+
models=[Model(name="gpt-4o")]
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
return self.ai_lab_manager.create_agent(
|
|
38
|
+
agent=agent
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
def __delete_agent(self, agent_id: str):
|
|
42
|
+
return self.ai_lab_manager.delete_agent(
|
|
43
|
+
agent_id=agent_id
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_delete_agent(self):
|
|
48
|
+
create_agent = self.__create_agent()
|
|
49
|
+
deleted_agent = self.__delete_agent(agent_id=create_agent.id)
|
|
50
|
+
|
|
51
|
+
self.assertEqual(
|
|
52
|
+
deleted_agent.content,
|
|
53
|
+
"Agent deleted successfully",
|
|
54
|
+
"Expected confirmation message after deletion"
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_delete_agent_no_agent_id(self):
|
|
59
|
+
with self.assertRaises(InvalidAPIResponseException) as exception:
|
|
60
|
+
self.__delete_agent(agent_id="")
|
|
61
|
+
|
|
62
|
+
self.assertIn("405",str(exception.exception))
|
|
63
|
+
self.assertIn("Method Not Allowed",str(exception.exception))
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_delete_agent_invalid_agent_id(self):
|
|
67
|
+
invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
|
|
68
|
+
with self.assertRaises(InvalidAPIResponseException) as exception:
|
|
69
|
+
self.__delete_agent(agent_id=invalid_id)
|
|
70
|
+
|
|
71
|
+
self.assertIn(
|
|
72
|
+
f"Agent not found [IdOrName= {invalid_id}].",
|
|
73
|
+
str(exception.exception),
|
|
74
|
+
"Expected error message for invalid agent id"
|
|
75
|
+
)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from unittest import TestCase
|
|
2
|
+
from pygeai.lab.managers import AILabManager
|
|
3
|
+
from pygeai.lab.models import Agent, FilterSettings
|
|
4
|
+
from pygeai.core.common.exceptions import MissingRequirementException, APIError
|
|
5
|
+
import copy
|
|
6
|
+
|
|
7
|
+
ai_lab_manager: AILabManager
|
|
8
|
+
|
|
9
|
+
class TestAILabGetAgentIntegration(TestCase):
|
|
10
|
+
__required_attrs = [
|
|
11
|
+
'id', 'status', 'name', 'access_scope', 'public_name',
|
|
12
|
+
'avatar_image', 'description', 'job_description',
|
|
13
|
+
'is_draft', 'is_readonly', 'revision', 'version', 'agent_data'
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
def setUp(self):
|
|
17
|
+
self.ai_lab_manager = AILabManager()
|
|
18
|
+
self.agent_id = "0026e53d-ea78-4cac-af9f-12650e5bb6d9"
|
|
19
|
+
self.filter_settings = FilterSettings(
|
|
20
|
+
revision="0",
|
|
21
|
+
version="0"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def __get_agent(self, agent_id=None, filter_settings: FilterSettings = None):
|
|
25
|
+
return self.ai_lab_manager.get_agent(
|
|
26
|
+
agent_id=self.agent_id if agent_id is None else agent_id,
|
|
27
|
+
filter_settings=self.filter_settings if filter_settings is None else filter_settings
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def test_get_agent(self):
|
|
31
|
+
agent = self.__get_agent()
|
|
32
|
+
|
|
33
|
+
self.assertIsInstance(agent, Agent, "Expected an agent")
|
|
34
|
+
for attr in self.__required_attrs:
|
|
35
|
+
self.assertTrue(
|
|
36
|
+
hasattr(agent, attr),
|
|
37
|
+
f"Agent should have an '{attr}' attribute"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_get_agent_no_agent_id(self):
|
|
42
|
+
with self.assertRaises(Exception) as context:
|
|
43
|
+
self.__get_agent(agent_id="")
|
|
44
|
+
self.assertIn(
|
|
45
|
+
"agent_id must be specified in order to retrieve the agent",
|
|
46
|
+
str(context.exception),
|
|
47
|
+
"Expected exception for missing agent_id"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_get_agent_invalid_agent_id(self):
|
|
52
|
+
invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
|
|
53
|
+
with self.assertRaises(APIError) as context:
|
|
54
|
+
self.__get_agent(agent_id=invalid_id)
|
|
55
|
+
self.assertIn(
|
|
56
|
+
f"Agent not found [IdOrName= {invalid_id}].",
|
|
57
|
+
str(context.exception),
|
|
58
|
+
"Expected an error for invalid agent id"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_get_agent_no_revision(self):
|
|
63
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
64
|
+
filter_settings.revision = None
|
|
65
|
+
agent = self.__get_agent(filter_settings=filter_settings)
|
|
66
|
+
|
|
67
|
+
self.assertIsInstance(agent, Agent, "Expected an agent")
|
|
68
|
+
self.assertGreater(agent.revision, 1, "Expected agent revision to be the latest")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_get_agent_by_revision(self):
|
|
72
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
73
|
+
filter_settings.revision = "5"
|
|
74
|
+
agent = self.__get_agent(filter_settings=filter_settings)
|
|
75
|
+
|
|
76
|
+
self.assertEqual(5, agent.revision, "Expected agent revision to be 5")
|
|
77
|
+
self.assertIn("Version 2", agent.description, "Expected agent description to match the one in revision 5")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_get_agent_no_version(self):
|
|
81
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
82
|
+
filter_settings.version = None
|
|
83
|
+
agent = self.__get_agent(filter_settings=filter_settings)
|
|
84
|
+
|
|
85
|
+
self.assertGreater(agent.version, 1, "Expected agent version to be the latest")
|
|
86
|
+
self.assertIn("Latest version", agent.description, "Expected agent description to contain 'Latest version'")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_get_agent_by_version(self):
|
|
90
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
91
|
+
filter_settings.version = "1"
|
|
92
|
+
agent = self.__get_agent(filter_settings=filter_settings)
|
|
93
|
+
|
|
94
|
+
self.assertNotIn("Latest version", agent.description, "Expected agent description to not contain 'Latest version'")
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
from unittest import TestCase
|
|
2
|
+
import uuid
|
|
3
|
+
from pygeai.lab.managers import AILabManager
|
|
4
|
+
from pygeai.lab.models import Agent, AgentData, Prompt, PromptOutput, PromptExample, LlmConfig, Sampling, Model
|
|
5
|
+
from pygeai.core.common.exceptions import APIError
|
|
6
|
+
|
|
7
|
+
ai_lab_manager: AILabManager
|
|
8
|
+
|
|
9
|
+
class TestAILabPublishAgentRevisionIntegration(TestCase):
|
|
10
|
+
|
|
11
|
+
def setUp(self):
|
|
12
|
+
self.ai_lab_manager = AILabManager()
|
|
13
|
+
self.agent_id = "b4b09935-2ad2-42c0-bd55-1ee6fa4b6034"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def __publish_agent_revision(self, revision: str, agent_id=None):
|
|
17
|
+
return self.ai_lab_manager.publish_agent_revision(
|
|
18
|
+
agent_id=self.agent_id if agent_id is None else agent_id,
|
|
19
|
+
revision=revision
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def __load_agent(self):
|
|
24
|
+
random_str = str(uuid.uuid4())
|
|
25
|
+
agent = Agent(
|
|
26
|
+
id="b4b09935-2ad2-42c0-bd55-1ee6fa4b6034",
|
|
27
|
+
name=f"UpdatedAgent{random_str}",
|
|
28
|
+
access_scope="public",
|
|
29
|
+
public_name=f"public_{random_str}",
|
|
30
|
+
job_description=f"SummarizerAgent{random_str}",
|
|
31
|
+
description=f"Agent that summarized documents. {random_str}",
|
|
32
|
+
agent_data=AgentData(
|
|
33
|
+
prompt=Prompt(
|
|
34
|
+
instructions="the user will provide a document, you must return a summary of the document.",
|
|
35
|
+
inputs=["text", "avoid slang indicator"],
|
|
36
|
+
outputs=[
|
|
37
|
+
PromptOutput(key="translated_text", description="translated text, with slang or not depending on the indication. in plain text.")
|
|
38
|
+
],
|
|
39
|
+
examples=[
|
|
40
|
+
PromptExample(input_data="hola mundo [no-slang]", output='{"translated_text":"hello world"}'),
|
|
41
|
+
PromptExample(input_data="esto es una prueba pincheguey [keep-slang]", output='{"translated_text":"this is a test pal"}')
|
|
42
|
+
]
|
|
43
|
+
),
|
|
44
|
+
llm_config=LlmConfig(
|
|
45
|
+
max_tokens=1800,
|
|
46
|
+
timeout=0,
|
|
47
|
+
sampling=Sampling(temperature=0.3, top_k=0, top_p=0)
|
|
48
|
+
),
|
|
49
|
+
models=[Model(name="openai/gpt-4o")]
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return agent
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def __update_agent(self):
|
|
57
|
+
"""
|
|
58
|
+
Helper method to update agent and generate a new revision of it
|
|
59
|
+
"""
|
|
60
|
+
agent = self.__load_agent()
|
|
61
|
+
return self.ai_lab_manager.update_agent(
|
|
62
|
+
agent=agent,
|
|
63
|
+
automatic_publish=False,
|
|
64
|
+
upsert=False
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_publish_agent_revision(self):
|
|
69
|
+
new_revision = (self.__update_agent()).revision
|
|
70
|
+
published_agent = self.__publish_agent_revision(revision=new_revision)
|
|
71
|
+
|
|
72
|
+
self.assertFalse(published_agent.is_draft, "Expected draft to be false after publishing the revision")
|
|
73
|
+
self.assertEqual(published_agent.revision, new_revision, "Expected last revision to be published")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_publish_agent_earlier_revision_with_newer_revision_published(self):
|
|
77
|
+
with self.assertRaises(APIError) as exception:
|
|
78
|
+
self.__publish_agent_revision(revision="1")
|
|
79
|
+
self.assertIn(
|
|
80
|
+
"There are newer published revisions.",
|
|
81
|
+
str(exception.exception),
|
|
82
|
+
"Expected error when trying to send a earlier revision"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_publish_agent_earlier_revision(self):
|
|
87
|
+
earlier_revision = (self.__update_agent()).revision
|
|
88
|
+
self.__update_agent()
|
|
89
|
+
published_agent = self.__publish_agent_revision(revision=earlier_revision)
|
|
90
|
+
|
|
91
|
+
self.assertFalse(published_agent.is_draft, "Expected draft to be false after publishing the revision")
|
|
92
|
+
self.assertEqual(published_agent.revision, earlier_revision, "Expected last revision to be published")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_publish_agent_invalid_revision(self):
|
|
96
|
+
with self.assertRaises(APIError) as exception:
|
|
97
|
+
self.__publish_agent_revision(revision="10000000")
|
|
98
|
+
self.assertIn(
|
|
99
|
+
"Invalid revision [rev=10000000]",
|
|
100
|
+
str(exception.exception),
|
|
101
|
+
"Expected error when trying to send a revision that does not exist"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def test_publish_agent_string_revision(self):
|
|
106
|
+
with self.assertRaises(APIError) as exception:
|
|
107
|
+
self.__publish_agent_revision(revision="revision")
|
|
108
|
+
self.assertIn("Bad Request", str(exception.exception))
|
|
109
|
+
self.assertIn("400", str(exception.exception))
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_publish_agent_invalid_agent_id(self):
|
|
113
|
+
invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
|
|
114
|
+
with self.assertRaises(APIError) as exception:
|
|
115
|
+
self.__publish_agent_revision(revision="103", agent_id=invalid_id)
|
|
116
|
+
self.assertIn(
|
|
117
|
+
f"Agent not found [IdOrName= {invalid_id}].",
|
|
118
|
+
str(exception.exception),
|
|
119
|
+
"Expected error when sending and invalid agent id"
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def test_publish_agent_no_agent_id(self):
|
|
124
|
+
with self.assertRaises(APIError) as exception:
|
|
125
|
+
self.__publish_agent_revision(revision="103", agent_id="")
|
|
126
|
+
self.assertIn("Not Found", str(exception.exception))
|
|
127
|
+
self.assertIn("404", str(exception.exception))
|