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,1051 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from pygeai import logger
|
|
4
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
5
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
6
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
7
|
+
from pygeai.lab.processes.endpoints import CREATE_PROCESS_V2, UPDATE_PROCESS_V2, UPSERT_PROCESS_V2, GET_PROCESS_V2, \
|
|
8
|
+
LIST_PROCESSES_V2, LIST_PROCESS_INSTANCES_V2, DELETE_PROCESS_V2, PUBLISH_PROCESS_REVISION_V2, CREATE_TASK_V2, \
|
|
9
|
+
UPDATE_TASK_V2, UPSERT_TASK_V2, GET_TASK_V2, LIST_TASKS_V2, DELETE_TASK_V2, PUBLISH_TASK_REVISION_V2, \
|
|
10
|
+
START_INSTANCE_V2, ABORT_INSTANCE_V2, GET_INSTANCE_V2, GET_INSTANCE_HISTORY_V2, GET_THREAD_INFORMATION_V2, \
|
|
11
|
+
SEND_USER_SIGNAL_V2, CREATE_KB_V1, GET_KB_V1, LIST_KBS_V1, DELETE_KB_V1, LIST_JOBS_V1
|
|
12
|
+
from pygeai.lab.clients import AILabClient
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AgenticProcessClient(AILabClient):
|
|
16
|
+
|
|
17
|
+
def create_process(
|
|
18
|
+
self,
|
|
19
|
+
key: str,
|
|
20
|
+
name: str,
|
|
21
|
+
description: str = None,
|
|
22
|
+
kb: dict = None,
|
|
23
|
+
agentic_activities: list = None,
|
|
24
|
+
artifact_signals: list = None,
|
|
25
|
+
user_signals: list = None,
|
|
26
|
+
start_event: dict = None,
|
|
27
|
+
end_event: dict = None,
|
|
28
|
+
sequence_flows: list = None,
|
|
29
|
+
variables: list = None,
|
|
30
|
+
automatic_publish: bool = False
|
|
31
|
+
) -> dict:
|
|
32
|
+
"""
|
|
33
|
+
Creates a new process in the specified project.
|
|
34
|
+
|
|
35
|
+
:param key: str - Unique key for the process within the project.
|
|
36
|
+
:param name: str - Name of the process.
|
|
37
|
+
:param description: str, optional - Description of the process purpose.
|
|
38
|
+
:param kb: dict, optional - Knowledge base configuration.
|
|
39
|
+
:param agentic_activities: list, optional - List of agentic activity definitions.
|
|
40
|
+
:param artifact_signals: list, optional - List of artifact signal definitions.
|
|
41
|
+
:param user_signals: list, optional - List of user signal definitions.
|
|
42
|
+
:param start_event: dict, optional - Start event definition.
|
|
43
|
+
:param end_event: dict, optional - End event definition.
|
|
44
|
+
:param sequence_flows: list, optional - List of sequence flow definitions.
|
|
45
|
+
:param variables: list, optional - List of variables used in the process.
|
|
46
|
+
:param automatic_publish: bool, optional - Publish the process after creation (default: False).
|
|
47
|
+
:return: dict or str - Created process details or error message.
|
|
48
|
+
:raises InvalidAPIResponseException: If an error occurs during creation.
|
|
49
|
+
"""
|
|
50
|
+
endpoint = CREATE_PROCESS_V2
|
|
51
|
+
if automatic_publish:
|
|
52
|
+
endpoint = f"{endpoint}?automaticPublish=true"
|
|
53
|
+
|
|
54
|
+
headers = {
|
|
55
|
+
"Authorization": self.api_service.token,
|
|
56
|
+
"ProjectId": self.project_id,
|
|
57
|
+
"Content-Type": "application/json",
|
|
58
|
+
"Accept": "application/json"
|
|
59
|
+
}
|
|
60
|
+
data = {
|
|
61
|
+
"processDefinition": {
|
|
62
|
+
"key": key,
|
|
63
|
+
"name": name
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if description:
|
|
67
|
+
data["processDefinition"]["description"] = description
|
|
68
|
+
if kb:
|
|
69
|
+
data["processDefinition"]["kb"] = kb
|
|
70
|
+
if agentic_activities:
|
|
71
|
+
data["processDefinition"]["agenticActivities"] = agentic_activities
|
|
72
|
+
if artifact_signals:
|
|
73
|
+
data["processDefinition"]["artifactSignals"] = artifact_signals
|
|
74
|
+
if user_signals:
|
|
75
|
+
data["processDefinition"]["userSignals"] = user_signals
|
|
76
|
+
if start_event:
|
|
77
|
+
data["processDefinition"]["startEvent"] = start_event
|
|
78
|
+
if end_event:
|
|
79
|
+
data["processDefinition"]["endEvent"] = end_event
|
|
80
|
+
if sequence_flows:
|
|
81
|
+
data["processDefinition"]["sequenceFlows"] = sequence_flows
|
|
82
|
+
if variables:
|
|
83
|
+
data["processDefinition"]["variables"] = variables
|
|
84
|
+
|
|
85
|
+
logger.debug(f"Creating agentic process with data: {data}")
|
|
86
|
+
|
|
87
|
+
response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
|
|
88
|
+
validate_status_code(response)
|
|
89
|
+
return parse_json_response(response, f"create process for project {self.project_id}")
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def update_process(
|
|
93
|
+
self,
|
|
94
|
+
process_id: str = None,
|
|
95
|
+
name: str = None,
|
|
96
|
+
key: str = None,
|
|
97
|
+
description: str = None,
|
|
98
|
+
kb: dict = None,
|
|
99
|
+
agentic_activities: list = None,
|
|
100
|
+
artifact_signals: list = None,
|
|
101
|
+
user_signals: list = None,
|
|
102
|
+
start_event: dict = None,
|
|
103
|
+
end_event: dict = None,
|
|
104
|
+
sequence_flows: list = None,
|
|
105
|
+
variables: list = None,
|
|
106
|
+
automatic_publish: bool = False,
|
|
107
|
+
upsert: bool = False
|
|
108
|
+
) -> dict:
|
|
109
|
+
"""
|
|
110
|
+
Updates an existing process or creates it if upsert is enabled.
|
|
111
|
+
|
|
112
|
+
:param process_id: str, optional - Unique identifier of the process to update.
|
|
113
|
+
:param name: str, optional - Name of the process to update or create.
|
|
114
|
+
:param key: str, optional - Updated unique key for the process.
|
|
115
|
+
:param description: str, optional - Updated description of the process.
|
|
116
|
+
:param kb: dict, optional - Updated knowledge base configuration.
|
|
117
|
+
:param agentic_activities: list, optional - Updated list of agentic activity definitions.
|
|
118
|
+
:param artifact_signals: list, optional - Updated list of artifact signal definitions.
|
|
119
|
+
:param user_signals: list, optional - Updated list of user signal definitions.
|
|
120
|
+
:param start_event: dict, optional - Updated start event definition.
|
|
121
|
+
:param end_event: dict, optional - Updated end event definition.
|
|
122
|
+
:param sequence_flows: list, optional - Updated list of sequence flow definitions.
|
|
123
|
+
:param variables: list, optional - Updated list of variables.
|
|
124
|
+
:param automatic_publish: bool, optional - Publish the process after updating (default: False).
|
|
125
|
+
:param upsert: bool, optional - Create the process if it does not exist (default: False).
|
|
126
|
+
:return: dict or str - Updated or created process details or error message.
|
|
127
|
+
:raises ValueError: If neither process_id nor name is provided.
|
|
128
|
+
:raises InvalidAPIResponseException: If an error occurs during the update.
|
|
129
|
+
"""
|
|
130
|
+
if not (process_id or name):
|
|
131
|
+
raise ValueError("Either process_id or name must be provided.")
|
|
132
|
+
|
|
133
|
+
identifier = process_id if process_id else name
|
|
134
|
+
endpoint = UPSERT_PROCESS_V2 if upsert else UPDATE_PROCESS_V2
|
|
135
|
+
endpoint = endpoint.format(processId=identifier)
|
|
136
|
+
|
|
137
|
+
if automatic_publish:
|
|
138
|
+
endpoint = f"{endpoint}?automaticPublish=true"
|
|
139
|
+
|
|
140
|
+
headers = {
|
|
141
|
+
"Authorization": self.api_service.token,
|
|
142
|
+
"ProjectId": self.project_id,
|
|
143
|
+
"Content-Type": "application/json",
|
|
144
|
+
"Accept": "application/json"
|
|
145
|
+
}
|
|
146
|
+
data = {
|
|
147
|
+
"processDefinition": {}
|
|
148
|
+
}
|
|
149
|
+
if key is not None:
|
|
150
|
+
data["processDefinition"]["key"] = key
|
|
151
|
+
if name is not None:
|
|
152
|
+
data["processDefinition"]["name"] = name
|
|
153
|
+
if description is not None:
|
|
154
|
+
data["processDefinition"]["description"] = description
|
|
155
|
+
if kb is not None:
|
|
156
|
+
data["processDefinition"]["kb"] = kb
|
|
157
|
+
if agentic_activities is not None:
|
|
158
|
+
data["processDefinition"]["agenticActivities"] = agentic_activities
|
|
159
|
+
if artifact_signals is not None:
|
|
160
|
+
data["processDefinition"]["artifactSignals"] = artifact_signals
|
|
161
|
+
if user_signals is not None:
|
|
162
|
+
data["processDefinition"]["userSignals"] = user_signals
|
|
163
|
+
if start_event is not None:
|
|
164
|
+
data["processDefinition"]["startEvent"] = start_event
|
|
165
|
+
if end_event is not None:
|
|
166
|
+
data["processDefinition"]["endEvent"] = end_event
|
|
167
|
+
if sequence_flows is not None:
|
|
168
|
+
data["processDefinition"]["sequenceFlows"] = sequence_flows
|
|
169
|
+
if variables:
|
|
170
|
+
data["processDefinition"]["variables"] = variables
|
|
171
|
+
|
|
172
|
+
if kb is None and not upsert:
|
|
173
|
+
current_process = self.get_process(process_id=process_id, process_name=name)
|
|
174
|
+
if isinstance(current_process, dict) and "processDefinition" in current_process:
|
|
175
|
+
kb = current_process["processDefinition"].get("kb")
|
|
176
|
+
|
|
177
|
+
if agentic_activities is None and not upsert:
|
|
178
|
+
current_process = self.get_process(process_id=process_id, process_name=name)
|
|
179
|
+
if isinstance(current_process, dict) and "processDefinition" in current_process:
|
|
180
|
+
agentic_activities = current_process["processDefinition"].get("agenticActivities")
|
|
181
|
+
if agentic_activities is not None:
|
|
182
|
+
data["processDefinition"]["agenticActivities"] = agentic_activities
|
|
183
|
+
|
|
184
|
+
if process_id:
|
|
185
|
+
logger.debug(f"Updating agentic process with ID {process_id} with data: {data}")
|
|
186
|
+
else:
|
|
187
|
+
logger.debug(f"Updating agentic process with name{name} with data: {data}")
|
|
188
|
+
|
|
189
|
+
response = self.api_service.put(
|
|
190
|
+
endpoint=endpoint,
|
|
191
|
+
headers=headers,
|
|
192
|
+
data=data
|
|
193
|
+
)
|
|
194
|
+
validate_status_code(response)
|
|
195
|
+
return parse_json_response(response, f"update process {process_id or name} in project {self.project_id}")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def get_process(
|
|
199
|
+
self,
|
|
200
|
+
process_id: str = None,
|
|
201
|
+
process_name: str = None,
|
|
202
|
+
revision: str = "0",
|
|
203
|
+
version: int = 0,
|
|
204
|
+
allow_drafts: bool = True
|
|
205
|
+
) -> dict:
|
|
206
|
+
"""
|
|
207
|
+
Retrieves details of a specific process by its ID or name.
|
|
208
|
+
|
|
209
|
+
:param process_id: str, optional - Unique identifier of the process.
|
|
210
|
+
:param process_name: str, optional - Name of the process.
|
|
211
|
+
:param revision: str, optional - Revision of the process (default: '0').
|
|
212
|
+
:param version: int, optional - Version of the process (default: 0).
|
|
213
|
+
:param allow_drafts: bool, optional - Include draft processes (default: True).
|
|
214
|
+
:return: dict or str - Process details or error message.
|
|
215
|
+
:raises ValueError: If neither process_id nor process_name is provided.
|
|
216
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
217
|
+
"""
|
|
218
|
+
if not (process_id or process_name):
|
|
219
|
+
raise ValueError("Either process_id or process_name must be provided.")
|
|
220
|
+
|
|
221
|
+
identifier = process_id if process_id else process_name
|
|
222
|
+
endpoint = GET_PROCESS_V2.format(processId=identifier)
|
|
223
|
+
|
|
224
|
+
headers = {
|
|
225
|
+
"Authorization": self.api_service.token,
|
|
226
|
+
"ProjectId": self.project_id
|
|
227
|
+
}
|
|
228
|
+
params = {
|
|
229
|
+
"revision": revision,
|
|
230
|
+
"version": version,
|
|
231
|
+
"allowDrafts": allow_drafts
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if process_id:
|
|
235
|
+
logger.debug(f"Retrieving agentic process detail with ID {process_id}")
|
|
236
|
+
else:
|
|
237
|
+
logger.debug(f"Retrieving agentic process detail with name '{process_name}'")
|
|
238
|
+
|
|
239
|
+
response = self.api_service.get(
|
|
240
|
+
endpoint=endpoint,
|
|
241
|
+
headers=headers,
|
|
242
|
+
params=params
|
|
243
|
+
)
|
|
244
|
+
validate_status_code(response)
|
|
245
|
+
return parse_json_response(response, f"retrieve process {process_id or process_name} for project {self.project_id}")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def list_processes(
|
|
249
|
+
self,
|
|
250
|
+
id: str = None,
|
|
251
|
+
name: str = None,
|
|
252
|
+
status: str = None,
|
|
253
|
+
start: str = "0",
|
|
254
|
+
count: str = "100",
|
|
255
|
+
allow_draft: bool = True
|
|
256
|
+
) -> dict:
|
|
257
|
+
"""
|
|
258
|
+
Retrieves a list of processes in the specified project.
|
|
259
|
+
|
|
260
|
+
:param id: str, optional - ID of the process to filter by.
|
|
261
|
+
:param name: str, optional - Name of the process to filter by.
|
|
262
|
+
:param status: str, optional - Status of the processes (e.g., 'active', 'inactive').
|
|
263
|
+
:param start: str, optional - Starting index for pagination (default: '0').
|
|
264
|
+
:param count: str, optional - Number of processes to retrieve (default: '100').
|
|
265
|
+
:param allow_draft: bool, optional - Include draft processes (default: True).
|
|
266
|
+
:return: dict or str - List of processes or error message.
|
|
267
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
268
|
+
"""
|
|
269
|
+
endpoint = LIST_PROCESSES_V2
|
|
270
|
+
headers = {
|
|
271
|
+
"Authorization": self.api_service.token,
|
|
272
|
+
"ProjectId": self.project_id
|
|
273
|
+
}
|
|
274
|
+
params = {
|
|
275
|
+
"start": start,
|
|
276
|
+
"count": count,
|
|
277
|
+
"allowDraft": allow_draft
|
|
278
|
+
}
|
|
279
|
+
if id:
|
|
280
|
+
params["id"] = id
|
|
281
|
+
if name:
|
|
282
|
+
params["name"] = name
|
|
283
|
+
if status:
|
|
284
|
+
params["status"] = status
|
|
285
|
+
|
|
286
|
+
logger.debug(f"Listing agentic processes for project with ID {self.project_id}")
|
|
287
|
+
|
|
288
|
+
response = self.api_service.get(
|
|
289
|
+
endpoint=endpoint,
|
|
290
|
+
headers=headers,
|
|
291
|
+
params=params
|
|
292
|
+
)
|
|
293
|
+
validate_status_code(response)
|
|
294
|
+
return parse_json_response(response, f"list processes for project {self.project_id}")
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def list_process_instances(
|
|
298
|
+
self,
|
|
299
|
+
process_id: str,
|
|
300
|
+
is_active: bool = True,
|
|
301
|
+
start: str = "0",
|
|
302
|
+
count: str = "10"
|
|
303
|
+
) -> dict:
|
|
304
|
+
"""
|
|
305
|
+
Retrieves a list of process instances for a specific process.
|
|
306
|
+
|
|
307
|
+
:param process_id: str - Unique identifier of the process.
|
|
308
|
+
:param is_active: bool, optional - List only active instances (default: True).
|
|
309
|
+
:param start: str, optional - Starting index for pagination (default: '0').
|
|
310
|
+
:param count: str, optional - Number of instances to retrieve (default: '10').
|
|
311
|
+
:return: dict or str - List of process instances or error message.
|
|
312
|
+
:raises ValueError: If process_id is not provided.
|
|
313
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
314
|
+
"""
|
|
315
|
+
if not process_id:
|
|
316
|
+
raise ValueError("Process ID must be provided.")
|
|
317
|
+
|
|
318
|
+
endpoint = LIST_PROCESS_INSTANCES_V2.format(processId=process_id)
|
|
319
|
+
headers = {
|
|
320
|
+
"Authorization": self.api_service.token,
|
|
321
|
+
"ProjectId": self.project_id
|
|
322
|
+
}
|
|
323
|
+
params = {
|
|
324
|
+
"isActive": is_active,
|
|
325
|
+
"start": start,
|
|
326
|
+
"count": count
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
logger.debug(f"Listing instances for agentic process with ID {process_id}")
|
|
330
|
+
|
|
331
|
+
response = self.api_service.get(
|
|
332
|
+
endpoint=endpoint,
|
|
333
|
+
headers=headers,
|
|
334
|
+
params=params
|
|
335
|
+
)
|
|
336
|
+
validate_status_code(response)
|
|
337
|
+
return parse_json_response(response, f"list process instances for process {process_id} in project {self.project_id}")
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def delete_process(
|
|
341
|
+
self,
|
|
342
|
+
process_id: str = None,
|
|
343
|
+
process_name: str = None
|
|
344
|
+
) -> dict:
|
|
345
|
+
"""
|
|
346
|
+
Deletes a specific process by its ID or name.
|
|
347
|
+
|
|
348
|
+
:param process_id: str, optional - Unique identifier of the process.
|
|
349
|
+
:param process_name: str, optional - Name of the process.
|
|
350
|
+
:return: dict or str - Confirmation of deletion or error message.
|
|
351
|
+
:raises ValueError: If neither process_id nor process_name is provided.
|
|
352
|
+
:raises InvalidAPIResponseException: If an error occurs during deletion.
|
|
353
|
+
"""
|
|
354
|
+
if not (process_id or process_name):
|
|
355
|
+
raise ValueError("Either process_id or process_name must be provided.")
|
|
356
|
+
|
|
357
|
+
identifier = process_id if process_id else process_name
|
|
358
|
+
endpoint = DELETE_PROCESS_V2.format(processId=identifier)
|
|
359
|
+
|
|
360
|
+
headers = {
|
|
361
|
+
"Authorization": self.api_service.token,
|
|
362
|
+
"ProjectId": self.project_id
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
logger.debug(f"Deleting agentic process with ID {process_id}")
|
|
366
|
+
|
|
367
|
+
response = self.api_service.delete(
|
|
368
|
+
endpoint=endpoint,
|
|
369
|
+
headers=headers
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
if response.status_code != 204:
|
|
373
|
+
logger.error(f"Unable to delete process {process_id or process_name} from project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
|
|
374
|
+
raise InvalidAPIResponseException(f"Unable to delete process {process_id or process_name} from project {self.project_id}: {response.text}")
|
|
375
|
+
else:
|
|
376
|
+
return {}
|
|
377
|
+
|
|
378
|
+
def publish_process_revision(
|
|
379
|
+
self,
|
|
380
|
+
process_id: str = None,
|
|
381
|
+
process_name: str = None,
|
|
382
|
+
revision: str = None
|
|
383
|
+
) -> dict:
|
|
384
|
+
"""
|
|
385
|
+
Publishes a specific revision of a process.
|
|
386
|
+
|
|
387
|
+
:param process_id: str, optional - Unique identifier of the process.
|
|
388
|
+
:param process_name: str, optional - Name of the process.
|
|
389
|
+
:param revision: str, optional - Revision of the process to publish.
|
|
390
|
+
:return: dict or str - Result of the publish operation or error message.
|
|
391
|
+
:raises ValueError: If neither process_id nor process_name is provided, or if revision is not specified.
|
|
392
|
+
:raises InvalidAPIResponseException: If an error occurs during publishing.
|
|
393
|
+
"""
|
|
394
|
+
if not (process_id or process_name):
|
|
395
|
+
raise ValueError("Either process_id or process_name must be provided.")
|
|
396
|
+
if not revision:
|
|
397
|
+
raise ValueError("Revision must be provided.")
|
|
398
|
+
|
|
399
|
+
identifier = process_id if process_id else process_name
|
|
400
|
+
endpoint = PUBLISH_PROCESS_REVISION_V2.format(processId=identifier)
|
|
401
|
+
|
|
402
|
+
headers = {
|
|
403
|
+
"Authorization": self.api_service.token,
|
|
404
|
+
"ProjectId": self.project_id
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if process_id:
|
|
408
|
+
logger.debug(f"Publishing revision {revision} for agentic process with ID {process_id}")
|
|
409
|
+
else:
|
|
410
|
+
logger.debug(f"Publishing revision {revision} for agentic process with name '{process_name}'")
|
|
411
|
+
|
|
412
|
+
response = self.api_service.post(
|
|
413
|
+
endpoint=endpoint,
|
|
414
|
+
headers=headers,
|
|
415
|
+
data={
|
|
416
|
+
"revision": revision
|
|
417
|
+
}
|
|
418
|
+
)
|
|
419
|
+
validate_status_code(response)
|
|
420
|
+
return parse_json_response(response, f"publish revision {revision} for process {process_id or process_name} in project {self.project_id}")
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def create_task(
|
|
424
|
+
self,
|
|
425
|
+
name: str,
|
|
426
|
+
description: str = None,
|
|
427
|
+
title_template: str = None,
|
|
428
|
+
id: str = None,
|
|
429
|
+
prompt_data: dict = None,
|
|
430
|
+
artifact_types: List[dict] = None,
|
|
431
|
+
automatic_publish: bool = False
|
|
432
|
+
) -> dict:
|
|
433
|
+
"""
|
|
434
|
+
Creates a new task in the specified project.
|
|
435
|
+
|
|
436
|
+
:param name: str - Name of the task, unique within the project, excluding ':' or '/'.
|
|
437
|
+
:param description: str, optional - Description of the task purpose.
|
|
438
|
+
:param title_template: str, optional - Template for task instance names (e.g., 'specs for {{issue}}').
|
|
439
|
+
:param id: str, optional - Custom identifier for the task.
|
|
440
|
+
:param prompt_data: dict, optional - Prompt configuration for task execution.
|
|
441
|
+
:param artifact_types: List[dict], optional - List of artifact types with 'name', 'description', 'isRequired', 'usageType', and 'artifactVariableKey'.
|
|
442
|
+
:param automatic_publish: bool, optional - Publish the task after creation (default: False).
|
|
443
|
+
:return: dict or str - Created task details or error message.
|
|
444
|
+
:raises InvalidAPIResponseException: If an error occurs during creation.
|
|
445
|
+
"""
|
|
446
|
+
endpoint = CREATE_TASK_V2
|
|
447
|
+
if automatic_publish:
|
|
448
|
+
endpoint = f"{endpoint}?automaticPublish=true"
|
|
449
|
+
|
|
450
|
+
headers = {
|
|
451
|
+
"Authorization": self.api_service.token,
|
|
452
|
+
"ProjectId": self.project_id,
|
|
453
|
+
"Content-Type": "application/json",
|
|
454
|
+
"Accept": "application/json"
|
|
455
|
+
}
|
|
456
|
+
data = {
|
|
457
|
+
"taskDefinition": {
|
|
458
|
+
"name": name
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if id:
|
|
462
|
+
data["taskDefinition"]["id"] = id
|
|
463
|
+
if description:
|
|
464
|
+
data["taskDefinition"]["description"] = description
|
|
465
|
+
if title_template:
|
|
466
|
+
data["taskDefinition"]["titleTemplate"] = title_template
|
|
467
|
+
if prompt_data:
|
|
468
|
+
data["taskDefinition"]["promptData"] = prompt_data
|
|
469
|
+
if artifact_types:
|
|
470
|
+
data["taskDefinition"]["artifactTypes"] = artifact_types
|
|
471
|
+
|
|
472
|
+
logger.debug(f"Creating task with data: {data}")
|
|
473
|
+
|
|
474
|
+
response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
|
|
475
|
+
validate_status_code(response)
|
|
476
|
+
return parse_json_response(response, f"create task for project {self.project_id}")
|
|
477
|
+
def get_task(
|
|
478
|
+
self,
|
|
479
|
+
task_id: str,
|
|
480
|
+
task_name: str = None
|
|
481
|
+
) -> dict:
|
|
482
|
+
"""
|
|
483
|
+
Retrieves details of a specific task by its ID or name.
|
|
484
|
+
|
|
485
|
+
:param task_id: str, optional - Unique identifier of the task.
|
|
486
|
+
:param task_name: str, optional - Name of the task.
|
|
487
|
+
:return: dict or str - Task details or error message.
|
|
488
|
+
:raises ValueError: If neither task_id nor task_name is provided.
|
|
489
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
490
|
+
"""
|
|
491
|
+
if not (task_id or task_name):
|
|
492
|
+
raise ValueError("Either task_id or task_name must be provided.")
|
|
493
|
+
|
|
494
|
+
identifier = task_id if task_id else task_name
|
|
495
|
+
endpoint = GET_TASK_V2.format(taskId=identifier)
|
|
496
|
+
headers = {
|
|
497
|
+
"Authorization": self.api_service.token,
|
|
498
|
+
"ProjectId": self.project_id
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
if task_id:
|
|
502
|
+
logger.debug(f"Retrieving task detail with ID {task_id}")
|
|
503
|
+
else:
|
|
504
|
+
logger.debug(f"Retrieving task detail with name {task_name}")
|
|
505
|
+
|
|
506
|
+
response = self.api_service.get(endpoint=endpoint, headers=headers)
|
|
507
|
+
validate_status_code(response)
|
|
508
|
+
return parse_json_response(response, f"retrieve task {task_id or task_name} for project {self.project_id}")
|
|
509
|
+
def list_tasks(
|
|
510
|
+
self,
|
|
511
|
+
id: str = None,
|
|
512
|
+
start: str = "0",
|
|
513
|
+
count: str = "100",
|
|
514
|
+
allow_drafts: bool = True
|
|
515
|
+
) -> dict:
|
|
516
|
+
"""
|
|
517
|
+
Retrieves a list of tasks in the specified project.
|
|
518
|
+
|
|
519
|
+
:param id: str, optional - ID of the task to filter by.
|
|
520
|
+
:param start: str, optional - Starting index for pagination (default: '0').
|
|
521
|
+
:param count: str, optional - Number of tasks to retrieve (default: '100').
|
|
522
|
+
:param allow_drafts: bool, optional - Include draft tasks (default: True).
|
|
523
|
+
:return: dict or str - List of tasks or error message.
|
|
524
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
525
|
+
"""
|
|
526
|
+
endpoint = LIST_TASKS_V2
|
|
527
|
+
headers = {
|
|
528
|
+
"Authorization": self.api_service.token,
|
|
529
|
+
"ProjectId": self.project_id
|
|
530
|
+
}
|
|
531
|
+
params = {
|
|
532
|
+
"start": start,
|
|
533
|
+
"count": count,
|
|
534
|
+
"allowDrafts": allow_drafts
|
|
535
|
+
}
|
|
536
|
+
if id:
|
|
537
|
+
params["id"] = id
|
|
538
|
+
|
|
539
|
+
logger.debug(f"Listing tasks for project with ID {self.project_id}")
|
|
540
|
+
|
|
541
|
+
response = self.api_service.get(endpoint=endpoint, headers=headers, params=params)
|
|
542
|
+
validate_status_code(response)
|
|
543
|
+
return parse_json_response(response, f"list tasks for project {self.project_id}")
|
|
544
|
+
def update_task(
|
|
545
|
+
self,
|
|
546
|
+
task_id: str,
|
|
547
|
+
name: str = None,
|
|
548
|
+
description: str = None,
|
|
549
|
+
title_template: str = None,
|
|
550
|
+
id: str = None,
|
|
551
|
+
prompt_data: dict = None,
|
|
552
|
+
artifact_types: List[dict] = None,
|
|
553
|
+
automatic_publish: bool = False,
|
|
554
|
+
upsert: bool = False
|
|
555
|
+
) -> dict:
|
|
556
|
+
"""
|
|
557
|
+
Updates an existing task or creates it if upsert is enabled.
|
|
558
|
+
|
|
559
|
+
:param task_id: str - Unique identifier of the task to update.
|
|
560
|
+
:param name: str, optional - Updated name of the task, unique within the project, excluding ':' or '/'.
|
|
561
|
+
:param description: str, optional - Updated description of the task purpose.
|
|
562
|
+
:param title_template: str, optional - Updated template for task instance names (e.g., 'specs for {{issue}}').
|
|
563
|
+
:param id: str, optional - Custom identifier for the task (used in upsert mode).
|
|
564
|
+
:param prompt_data: dict, optional - Updated prompt configuration for task execution.
|
|
565
|
+
:param artifact_types: List[dict], optional - Updated list of artifact types with 'name', 'description', 'isRequired', 'usageType', and 'artifactVariableKey'.
|
|
566
|
+
:param automatic_publish: bool, optional - Publish the task after updating (default: False).
|
|
567
|
+
:param upsert: bool, optional - Create the task if it does not exist (default: False).
|
|
568
|
+
:return: dict or str - Updated or created task details or error message.
|
|
569
|
+
:raises ValueError: If task_id is not provided.
|
|
570
|
+
:raises InvalidAPIResponseException: If an error occurs during the update.
|
|
571
|
+
"""
|
|
572
|
+
if not task_id:
|
|
573
|
+
raise ValueError("Task ID must be provided.")
|
|
574
|
+
|
|
575
|
+
identifier = task_id
|
|
576
|
+
endpoint = UPSERT_TASK_V2 if upsert else UPDATE_TASK_V2
|
|
577
|
+
endpoint = endpoint.format(taskId=identifier)
|
|
578
|
+
if automatic_publish:
|
|
579
|
+
endpoint = f"{endpoint}?automaticPublish=true"
|
|
580
|
+
|
|
581
|
+
headers = {
|
|
582
|
+
"Authorization": self.api_service.token,
|
|
583
|
+
"ProjectId": self.project_id,
|
|
584
|
+
"Content-Type": "application/json",
|
|
585
|
+
"Accept": "application/json"
|
|
586
|
+
}
|
|
587
|
+
data = {
|
|
588
|
+
"taskDefinition": {}
|
|
589
|
+
}
|
|
590
|
+
if id is not None and upsert:
|
|
591
|
+
data["taskDefinition"]["id"] = id
|
|
592
|
+
if name is not None:
|
|
593
|
+
data["taskDefinition"]["name"] = name
|
|
594
|
+
if description is not None:
|
|
595
|
+
data["taskDefinition"]["description"] = description
|
|
596
|
+
if title_template is not None:
|
|
597
|
+
data["taskDefinition"]["titleTemplate"] = title_template
|
|
598
|
+
if prompt_data is not None:
|
|
599
|
+
data["taskDefinition"]["promptData"] = prompt_data
|
|
600
|
+
if artifact_types is not None:
|
|
601
|
+
data["taskDefinition"]["artifactTypes"] = artifact_types
|
|
602
|
+
|
|
603
|
+
logger.debug(f"Updating task with ID {task_id} with data: {data}")
|
|
604
|
+
|
|
605
|
+
response = self.api_service.put(endpoint=endpoint, headers=headers, data=data)
|
|
606
|
+
validate_status_code(response)
|
|
607
|
+
return parse_json_response(response, f"update task {task_id} in project {self.project_id}")
|
|
608
|
+
def delete_task(
|
|
609
|
+
self,
|
|
610
|
+
task_id: str,
|
|
611
|
+
task_name: str = None
|
|
612
|
+
) -> dict:
|
|
613
|
+
"""
|
|
614
|
+
Deletes a specific task by its ID or name.
|
|
615
|
+
|
|
616
|
+
:param task_id: str, optional - Unique identifier of the task.
|
|
617
|
+
:param task_name: str, optional - Name of the task.
|
|
618
|
+
:return: dict or str - Confirmation of deletion or error message.
|
|
619
|
+
:raises ValueError: If neither task_id nor task_name is provided.
|
|
620
|
+
:raises InvalidAPIResponseException: If an error occurs during deletion.
|
|
621
|
+
"""
|
|
622
|
+
if not (task_id or task_name):
|
|
623
|
+
raise ValueError("Either task_id or task_name must be provided.")
|
|
624
|
+
|
|
625
|
+
identifier = task_id if task_id else task_name
|
|
626
|
+
endpoint = DELETE_TASK_V2.format(taskId=identifier)
|
|
627
|
+
headers = {
|
|
628
|
+
"Authorization": self.api_service.token,
|
|
629
|
+
"ProjectId": self.project_id
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
if task_id:
|
|
633
|
+
logger.debug(f"Deleting task with ID {task_id}")
|
|
634
|
+
else:
|
|
635
|
+
logger.debug(f"Deleting task with name {task_name}")
|
|
636
|
+
|
|
637
|
+
response = self.api_service.delete(endpoint=endpoint, headers=headers)
|
|
638
|
+
|
|
639
|
+
if response.status_code != 204:
|
|
640
|
+
logger.error(f"Unable to delete task {task_id or task_name} from project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
|
|
641
|
+
raise InvalidAPIResponseException(f"Unable to delete task {task_id or task_name} from project {self.project_id}: {response.text}")
|
|
642
|
+
else:
|
|
643
|
+
return {}
|
|
644
|
+
|
|
645
|
+
def publish_task_revision(
|
|
646
|
+
self,
|
|
647
|
+
task_id: str,
|
|
648
|
+
task_name: str = None,
|
|
649
|
+
revision: str = None
|
|
650
|
+
) -> dict:
|
|
651
|
+
"""
|
|
652
|
+
Publishes a specific revision of a task.
|
|
653
|
+
|
|
654
|
+
:param task_id: str, optional - Unique identifier of the task.
|
|
655
|
+
:param task_name: str, optional - Name of the task.
|
|
656
|
+
:param revision: str, optional - Revision of the task to publish.
|
|
657
|
+
:return: dict or str - Result of the publish operation or error message.
|
|
658
|
+
:raises ValueError: If neither task_id nor task_name is provided, or if revision is not specified.
|
|
659
|
+
:raises InvalidAPIResponseException: If an error occurs during publishing.
|
|
660
|
+
"""
|
|
661
|
+
if not (task_id or task_name):
|
|
662
|
+
raise ValueError("Either task_id or task_name must be provided.")
|
|
663
|
+
if not revision:
|
|
664
|
+
raise ValueError("Revision must be provided.")
|
|
665
|
+
|
|
666
|
+
identifier = task_id if task_id else task_name
|
|
667
|
+
endpoint = PUBLISH_TASK_REVISION_V2.format(taskId=identifier)
|
|
668
|
+
headers = {
|
|
669
|
+
"Authorization": self.api_service.token,
|
|
670
|
+
"ProjectId": self.project_id,
|
|
671
|
+
"Content-Type": "application/json",
|
|
672
|
+
"Accept": "application/json"
|
|
673
|
+
}
|
|
674
|
+
data = {
|
|
675
|
+
"revision": revision
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
if task_id:
|
|
679
|
+
logger.debug(f"Publishing revision {revision} for task with ID {task_id}")
|
|
680
|
+
else:
|
|
681
|
+
logger.debug(f"Publishing revision {revision} for task with name {task_name}")
|
|
682
|
+
|
|
683
|
+
response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
|
|
684
|
+
validate_status_code(response)
|
|
685
|
+
return parse_json_response(response, f"publish revision {revision} for task {task_id or task_name} in project {self.project_id}")
|
|
686
|
+
def start_instance(
|
|
687
|
+
self,
|
|
688
|
+
process_name: str,
|
|
689
|
+
subject: str = None,
|
|
690
|
+
variables: list = None
|
|
691
|
+
) -> dict:
|
|
692
|
+
"""
|
|
693
|
+
Starts a new process instance.
|
|
694
|
+
|
|
695
|
+
:param process_name: str - Name of the process to start.
|
|
696
|
+
:param subject: str, optional - Subject of the process instance.
|
|
697
|
+
:param variables: list, optional - List of variables (e.g., [{"key": "location", "value": "Paris"}]).
|
|
698
|
+
:return: dict or str - Started instance details or error message.
|
|
699
|
+
:raises InvalidAPIResponseException: If an error occurs during instance creation.
|
|
700
|
+
"""
|
|
701
|
+
endpoint = START_INSTANCE_V2
|
|
702
|
+
headers = {
|
|
703
|
+
"Authorization": self.api_service.token,
|
|
704
|
+
"ProjectId": self.project_id,
|
|
705
|
+
"Content-Type": "application/json",
|
|
706
|
+
"Accept": "application/json"
|
|
707
|
+
}
|
|
708
|
+
data = {
|
|
709
|
+
"instanceDefinition": {
|
|
710
|
+
"process": process_name
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
if subject:
|
|
714
|
+
data["instanceDefinition"]["subject"] = subject
|
|
715
|
+
if variables:
|
|
716
|
+
data["instanceDefinition"]["variables"] = variables
|
|
717
|
+
|
|
718
|
+
logger.info(f"Starting instance for process with name '{process_name}'")
|
|
719
|
+
|
|
720
|
+
response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
|
|
721
|
+
validate_status_code(response)
|
|
722
|
+
return parse_json_response(response, f"start instance for process {process_name} in project {self.project_id}")
|
|
723
|
+
def abort_instance(
|
|
724
|
+
self,
|
|
725
|
+
instance_id: str
|
|
726
|
+
) -> dict:
|
|
727
|
+
"""
|
|
728
|
+
Aborts a specific process instance.
|
|
729
|
+
|
|
730
|
+
:param instance_id: str - Unique identifier of the instance to abort.
|
|
731
|
+
:return: dict or str - Confirmation of abort operation or error message.
|
|
732
|
+
:raises ValueError: If instance_id is not provided.
|
|
733
|
+
:raises InvalidAPIResponseException: If an error occurs during the abort.
|
|
734
|
+
"""
|
|
735
|
+
if not instance_id:
|
|
736
|
+
raise ValueError("Instance ID must be provided.")
|
|
737
|
+
|
|
738
|
+
endpoint = ABORT_INSTANCE_V2.format(instanceId=instance_id)
|
|
739
|
+
headers = {
|
|
740
|
+
"Authorization": self.api_service.token,
|
|
741
|
+
"ProjectId": self.project_id,
|
|
742
|
+
"Content-Type": "application/json",
|
|
743
|
+
"Accept": "application/json"
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
logger.info(f"Aborting instance with ID '{instance_id}'")
|
|
747
|
+
|
|
748
|
+
response = self.api_service.post(endpoint=endpoint, headers=headers, data={})
|
|
749
|
+
validate_status_code(response)
|
|
750
|
+
return parse_json_response(response, f"abort instance {instance_id} in project {self.project_id}")
|
|
751
|
+
def get_instance(
|
|
752
|
+
self,
|
|
753
|
+
instance_id: str
|
|
754
|
+
) -> dict:
|
|
755
|
+
"""
|
|
756
|
+
Retrieves details of a specific process instance.
|
|
757
|
+
|
|
758
|
+
:param instance_id: str - Unique identifier of the instance.
|
|
759
|
+
:return: dict or str - Instance details or error message.
|
|
760
|
+
:raises ValueError: If instance_id is not provided.
|
|
761
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
762
|
+
"""
|
|
763
|
+
if not instance_id:
|
|
764
|
+
raise ValueError("Instance ID must be provided.")
|
|
765
|
+
|
|
766
|
+
endpoint = GET_INSTANCE_V2.format(instanceId=instance_id)
|
|
767
|
+
headers = {
|
|
768
|
+
"Authorization": self.api_service.token,
|
|
769
|
+
"ProjectId": self.project_id
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
logger.info(f"Retrieving instance detail with ID '{instance_id}'")
|
|
773
|
+
|
|
774
|
+
response = self.api_service.get(endpoint=endpoint, headers=headers)
|
|
775
|
+
validate_status_code(response)
|
|
776
|
+
return parse_json_response(response, f"retrieve instance {instance_id} for project {self.project_id}")
|
|
777
|
+
def get_instance_history(
|
|
778
|
+
self,
|
|
779
|
+
instance_id: str
|
|
780
|
+
) -> dict:
|
|
781
|
+
"""
|
|
782
|
+
Retrieves the history of a specific process instance.
|
|
783
|
+
|
|
784
|
+
:param instance_id: str - Unique identifier of the instance.
|
|
785
|
+
:return: dict or str - Instance history or error message.
|
|
786
|
+
:raises ValueError: If instance_id is not provided.
|
|
787
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
788
|
+
"""
|
|
789
|
+
if not instance_id:
|
|
790
|
+
raise ValueError("Instance ID must be provided.")
|
|
791
|
+
|
|
792
|
+
endpoint = GET_INSTANCE_HISTORY_V2.format(instanceId=instance_id)
|
|
793
|
+
headers = {
|
|
794
|
+
"Authorization": self.api_service.token,
|
|
795
|
+
"ProjectId": self.project_id
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
logger.info(f"Retrieving instance history with ID '{instance_id}'")
|
|
799
|
+
|
|
800
|
+
response = self.api_service.get(endpoint=endpoint, headers=headers)
|
|
801
|
+
validate_status_code(response)
|
|
802
|
+
return parse_json_response(response, f"retrieve history for instance {instance_id} in project {self.project_id}")
|
|
803
|
+
def get_thread_information(
|
|
804
|
+
self,
|
|
805
|
+
thread_id: str
|
|
806
|
+
) -> dict:
|
|
807
|
+
"""
|
|
808
|
+
Retrieves information about a specific thread.
|
|
809
|
+
|
|
810
|
+
:param thread_id: str - Unique identifier of the thread.
|
|
811
|
+
:return: dict or str - Thread information or error message.
|
|
812
|
+
:raises ValueError: If thread_id is not provided.
|
|
813
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
814
|
+
"""
|
|
815
|
+
if not thread_id:
|
|
816
|
+
raise ValueError("Thread ID must be provided.")
|
|
817
|
+
|
|
818
|
+
endpoint = GET_THREAD_INFORMATION_V2.format(threadId=thread_id)
|
|
819
|
+
headers = {
|
|
820
|
+
"Authorization": self.api_service.token,
|
|
821
|
+
"ProjectId": self.project_id
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
logger.debug(f"Retrieving information about thread with ID {thread_id}")
|
|
825
|
+
|
|
826
|
+
response = self.api_service.get(endpoint=endpoint, headers=headers)
|
|
827
|
+
validate_status_code(response)
|
|
828
|
+
return parse_json_response(response, f"retrieve thread information for thread {thread_id} in project {self.project_id}")
|
|
829
|
+
def send_user_signal(
|
|
830
|
+
self,
|
|
831
|
+
instance_id: str,
|
|
832
|
+
signal_name: str
|
|
833
|
+
) -> dict:
|
|
834
|
+
"""
|
|
835
|
+
Sends a user signal to a specific process instance.
|
|
836
|
+
|
|
837
|
+
:param instance_id: str - Unique identifier of the instance.
|
|
838
|
+
:param signal_name: str - Name of the user signal (e.g., 'approval').
|
|
839
|
+
:return: dict or str - Confirmation of signal operation or error message.
|
|
840
|
+
:raises ValueError: If instance_id or signal_name is not provided.
|
|
841
|
+
:raises InvalidAPIResponseException: If an error occurs during signal sending.
|
|
842
|
+
"""
|
|
843
|
+
if not instance_id:
|
|
844
|
+
raise ValueError("Instance ID must be provided.")
|
|
845
|
+
if not signal_name:
|
|
846
|
+
raise ValueError("Signal name must be provided.")
|
|
847
|
+
|
|
848
|
+
endpoint = SEND_USER_SIGNAL_V2.format(instanceId=instance_id)
|
|
849
|
+
headers = {
|
|
850
|
+
"Authorization": self.api_service.token,
|
|
851
|
+
"ProjectId": self.project_id,
|
|
852
|
+
"Content-Type": "application/json",
|
|
853
|
+
"Accept": "application/json"
|
|
854
|
+
}
|
|
855
|
+
data = {
|
|
856
|
+
"name": signal_name
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
logger.debug(f"Sending user signal to process instance with ID {instance_id} with data: {data}")
|
|
860
|
+
|
|
861
|
+
response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
|
|
862
|
+
validate_status_code(response)
|
|
863
|
+
return parse_json_response(response, f"send user signal {signal_name} to instance {instance_id} in project {self.project_id}")
|
|
864
|
+
def create_kb(
|
|
865
|
+
self,
|
|
866
|
+
name: str,
|
|
867
|
+
artifacts: List[str] = None,
|
|
868
|
+
metadata: List[str] = None
|
|
869
|
+
) -> dict:
|
|
870
|
+
"""
|
|
871
|
+
Creates a new knowledge base (KB) in the specified project.
|
|
872
|
+
|
|
873
|
+
:param name: str - Name of the knowledge base.
|
|
874
|
+
:param artifacts: List[str], optional - List of artifact names associated with the KB.
|
|
875
|
+
:param metadata: List[str], optional - List of metadata fields for the KB.
|
|
876
|
+
:return: dict or str - Created KB details or error message.
|
|
877
|
+
:raises InvalidAPIResponseException: If an error occurs during creation.
|
|
878
|
+
"""
|
|
879
|
+
endpoint = CREATE_KB_V1
|
|
880
|
+
headers = {
|
|
881
|
+
"Authorization": self.api_service.token,
|
|
882
|
+
"ProjectId": self.project_id,
|
|
883
|
+
"Content-Type": "application/json",
|
|
884
|
+
"Accept": "application/json"
|
|
885
|
+
}
|
|
886
|
+
data = {
|
|
887
|
+
"KBDefinition": {
|
|
888
|
+
"name": name
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
if artifacts:
|
|
892
|
+
data["KBDefinition"]["artifacts"] = artifacts
|
|
893
|
+
if metadata:
|
|
894
|
+
data["KBDefinition"]["metadata"] = metadata
|
|
895
|
+
|
|
896
|
+
logger.debug(f"Creating KB with data: {data}")
|
|
897
|
+
|
|
898
|
+
response = self.api_service.post(
|
|
899
|
+
endpoint=endpoint,
|
|
900
|
+
headers=headers,
|
|
901
|
+
data=data
|
|
902
|
+
)
|
|
903
|
+
validate_status_code(response)
|
|
904
|
+
return parse_json_response(response, f"create knowledge base for project {self.project_id}")
|
|
905
|
+
def get_kb(
|
|
906
|
+
self,
|
|
907
|
+
kb_id: str = None,
|
|
908
|
+
kb_name: str = None
|
|
909
|
+
) -> dict:
|
|
910
|
+
"""
|
|
911
|
+
Retrieves details of a specific knowledge base (KB) by its ID or name.
|
|
912
|
+
|
|
913
|
+
:param kb_id: str, optional - Unique identifier of the KB.
|
|
914
|
+
:param kb_name: str, optional - Name of the KB.
|
|
915
|
+
:return: dict or str - KB details or error message.
|
|
916
|
+
:raises ValueError: If neither kb_id nor kb_name is provided.
|
|
917
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
918
|
+
"""
|
|
919
|
+
if not (kb_id or kb_name):
|
|
920
|
+
raise ValueError("Either kb_id or kb_name must be provided.")
|
|
921
|
+
|
|
922
|
+
identifier = kb_id if kb_id else kb_name
|
|
923
|
+
endpoint = GET_KB_V1.format(kbId=identifier)
|
|
924
|
+
headers = {
|
|
925
|
+
"Authorization": self.api_service.token,
|
|
926
|
+
"ProjectId": self.project_id
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
if kb_id:
|
|
930
|
+
logger.debug(f"Retrieving KB detail with ID {kb_id}")
|
|
931
|
+
else:
|
|
932
|
+
logger.debug(f"Retrieving KB detail with name {kb_name}")
|
|
933
|
+
|
|
934
|
+
response = self.api_service.get(endpoint=endpoint, headers=headers)
|
|
935
|
+
kb_identifier = kb_id or kb_name
|
|
936
|
+
validate_status_code(response)
|
|
937
|
+
return parse_json_response(response, f"retrieve knowledge base {kb_identifier} for project {self.project_id}")
|
|
938
|
+
def list_kbs(
|
|
939
|
+
self,
|
|
940
|
+
name: str = None,
|
|
941
|
+
start: str = "0",
|
|
942
|
+
count: str = "100"
|
|
943
|
+
) -> dict:
|
|
944
|
+
"""
|
|
945
|
+
Retrieves a list of knowledge bases (KBs) in the specified project.
|
|
946
|
+
|
|
947
|
+
:param name: str, optional - Name of the KB to filter by.
|
|
948
|
+
:param start: str, optional - Starting index for pagination (default: '0').
|
|
949
|
+
:param count: str, optional - Number of KBs to retrieve (default: '100').
|
|
950
|
+
:return: dict or str - List of KBs or error message.
|
|
951
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
952
|
+
"""
|
|
953
|
+
endpoint = LIST_KBS_V1
|
|
954
|
+
headers = {
|
|
955
|
+
"Authorization": self.api_service.token,
|
|
956
|
+
"ProjectId": self.project_id
|
|
957
|
+
}
|
|
958
|
+
params = {
|
|
959
|
+
"start": start,
|
|
960
|
+
"count": count
|
|
961
|
+
}
|
|
962
|
+
if name:
|
|
963
|
+
params["name"] = name
|
|
964
|
+
|
|
965
|
+
logger.debug(f"Listing tasks in project with ID {self.project_id}")
|
|
966
|
+
|
|
967
|
+
response = self.api_service.get(endpoint=endpoint, headers=headers, params=params)
|
|
968
|
+
validate_status_code(response)
|
|
969
|
+
return parse_json_response(response, f"list knowledge bases for project {self.project_id}")
|
|
970
|
+
def delete_kb(
|
|
971
|
+
self,
|
|
972
|
+
kb_id: str = None,
|
|
973
|
+
kb_name: str = None
|
|
974
|
+
) -> dict:
|
|
975
|
+
"""
|
|
976
|
+
Deletes a specific knowledge base (KB) by its ID or name.
|
|
977
|
+
|
|
978
|
+
:param kb_id: str, optional - Unique identifier of the KB.
|
|
979
|
+
:param kb_name: str, optional - Name of the KB.
|
|
980
|
+
:return: dict or str - Confirmation of deletion or error message.
|
|
981
|
+
:raises ValueError: If neither kb_id nor kb_name is provided.
|
|
982
|
+
:raises InvalidAPIResponseException: If an error occurs during deletion.
|
|
983
|
+
"""
|
|
984
|
+
if not (kb_id or kb_name):
|
|
985
|
+
raise ValueError("Either kb_id or kb_name must be provided.")
|
|
986
|
+
|
|
987
|
+
identifier = kb_id if kb_id else kb_name
|
|
988
|
+
endpoint = DELETE_KB_V1.format(kbId=identifier)
|
|
989
|
+
headers = {
|
|
990
|
+
"Authorization": self.api_service.token,
|
|
991
|
+
"ProjectId": self.project_id
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
if kb_id:
|
|
995
|
+
logger.debug(f"Deleting KB with ID {kb_id}")
|
|
996
|
+
else:
|
|
997
|
+
logger.debug(f"Deleting KB with name {kb_name}")
|
|
998
|
+
|
|
999
|
+
response = self.api_service.delete(endpoint=endpoint, headers=headers)
|
|
1000
|
+
|
|
1001
|
+
if response.status_code != 204:
|
|
1002
|
+
logger.error(f"Unable to delete knowledge base {kb_id or kb_name} from project {self.project_id}: JSONDecodeError parsing error (status {response.status_code}). Response: {response.text}")
|
|
1003
|
+
raise InvalidAPIResponseException(f"Unable to delete knowledge base {kb_id or kb_name} from project {self.project_id}: {response.text}")
|
|
1004
|
+
else:
|
|
1005
|
+
return {}
|
|
1006
|
+
|
|
1007
|
+
def list_jobs(
|
|
1008
|
+
self,
|
|
1009
|
+
start: str = "0",
|
|
1010
|
+
count: str = "100",
|
|
1011
|
+
topic: str = None,
|
|
1012
|
+
token: str = None,
|
|
1013
|
+
name: str = None
|
|
1014
|
+
) -> dict:
|
|
1015
|
+
"""
|
|
1016
|
+
Retrieves a specific list of jobs in the specified project.
|
|
1017
|
+
|
|
1018
|
+
:param start: str, optional - Starting index for pagination (default: '0').
|
|
1019
|
+
:param count: str, optional - Number of jobs to retrieve (default: '100').
|
|
1020
|
+
:param topic: str - optional - Topiccollege of the jobs to filter by.
|
|
1021
|
+
:param token: str, optional - Token of the jobs to filter by.
|
|
1022
|
+
:param name: str, optional - Name of the jobs to filter by.
|
|
1023
|
+
:return: dict or str - List of jobs or error message.
|
|
1024
|
+
:raises InvalidAPIResponseException: If an error occurs during retrieval.
|
|
1025
|
+
"""
|
|
1026
|
+
endpoint = LIST_JOBS_V1
|
|
1027
|
+
headers = {
|
|
1028
|
+
"Authorization": self.api_service.token,
|
|
1029
|
+
"ProjectId": self.project_id
|
|
1030
|
+
}
|
|
1031
|
+
params = {
|
|
1032
|
+
"start": start,
|
|
1033
|
+
"count": count
|
|
1034
|
+
}
|
|
1035
|
+
if topic:
|
|
1036
|
+
params["topic"] = topic
|
|
1037
|
+
if token:
|
|
1038
|
+
params["token"] = token
|
|
1039
|
+
if name:
|
|
1040
|
+
params["name"] = name
|
|
1041
|
+
|
|
1042
|
+
logger.debug(f"Listing jobs for project with ID {self.project_id}")
|
|
1043
|
+
|
|
1044
|
+
response = self.api_service.get(
|
|
1045
|
+
endpoint=endpoint,
|
|
1046
|
+
headers=headers,
|
|
1047
|
+
params=params
|
|
1048
|
+
)
|
|
1049
|
+
validate_status_code(response)
|
|
1050
|
+
return parse_json_response(response, f"list jobs for project {self.project_id}")
|
|
1051
|
+
|