pygeai 0.1.6__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pygeai/__init__.py +11 -2
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +48 -57
- pygeai/assistant/data/__init__.py +0 -0
- pygeai/assistant/data/clients.py +15 -0
- pygeai/assistant/data_analyst/__init__.py +0 -0
- pygeai/assistant/data_analyst/clients.py +75 -0
- pygeai/assistant/data_analyst/endpoints.py +2 -0
- pygeai/assistant/endpoints.py +0 -2
- pygeai/assistant/managers.py +738 -0
- pygeai/assistant/mappers.py +153 -0
- pygeai/assistant/rag/clients.py +132 -21
- pygeai/assistant/rag/mappers.py +228 -0
- pygeai/assistant/rag/models.py +396 -0
- pygeai/assistant/rag/responses.py +10 -0
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +406 -31
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +17 -0
- pygeai/chat/managers.py +64 -0
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +9 -12
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +11 -11
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +201 -7
- pygeai/cli/commands/chat.py +875 -14
- pygeai/cli/commands/common.py +30 -26
- pygeai/cli/commands/configuration.py +84 -9
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +187 -0
- pygeai/cli/commands/evaluation.py +2069 -0
- pygeai/cli/commands/feedback.py +93 -0
- pygeai/cli/commands/files.py +312 -0
- pygeai/cli/commands/flows/__init__.py +0 -0
- pygeai/cli/commands/gam.py +349 -0
- pygeai/cli/commands/lab/__init__.py +0 -0
- pygeai/cli/commands/lab/ai_lab.py +4110 -0
- pygeai/cli/commands/lab/common.py +135 -0
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +164 -0
- pygeai/cli/commands/migrate.py +1198 -0
- pygeai/cli/commands/options.py +86 -0
- pygeai/cli/commands/organization.py +560 -98
- pygeai/cli/commands/rag.py +306 -10
- pygeai/cli/commands/rerank.py +108 -0
- pygeai/cli/commands/secrets.py +357 -0
- pygeai/cli/commands/usage_limits.py +583 -0
- pygeai/cli/commands/validators.py +209 -0
- pygeai/cli/commands/version.py +44 -0
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +171 -30
- pygeai/cli/geai_proxy.py +318 -0
- pygeai/cli/install_man.py +107 -0
- pygeai/cli/parsers.py +78 -25
- pygeai/cli/texts/help.py +712 -55
- pygeai/core/__init__.py +9 -1
- pygeai/core/base/clients.py +61 -10
- pygeai/core/base/mappers.py +208 -30
- pygeai/core/base/models.py +8 -308
- pygeai/core/base/responses.py +18 -1
- pygeai/core/base/session.py +110 -17
- pygeai/core/common/config.py +98 -16
- pygeai/core/common/decorators.py +44 -0
- pygeai/core/common/exceptions.py +104 -4
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +93 -0
- pygeai/core/embeddings/endpoints.py +1 -0
- pygeai/core/embeddings/managers.py +62 -0
- pygeai/core/embeddings/mappers.py +52 -0
- pygeai/core/embeddings/models.py +14 -0
- pygeai/core/embeddings/responses.py +31 -0
- pygeai/core/feedback/__init__.py +0 -0
- pygeai/core/feedback/clients.py +50 -0
- pygeai/core/feedback/endpoints.py +1 -0
- pygeai/core/feedback/models.py +10 -0
- pygeai/core/files/__init__.py +0 -0
- pygeai/core/files/clients.py +156 -0
- pygeai/core/files/endpoints.py +5 -0
- pygeai/core/files/managers.py +224 -0
- pygeai/core/files/mappers.py +44 -0
- pygeai/core/files/models.py +24 -0
- pygeai/core/files/responses.py +19 -0
- pygeai/core/handlers.py +32 -0
- pygeai/core/llm/__init__.py +0 -0
- pygeai/core/llm/clients.py +53 -0
- pygeai/core/llm/endpoints.py +4 -0
- pygeai/core/models.py +799 -0
- pygeai/core/plugins/__init__.py +0 -0
- pygeai/core/plugins/clients.py +32 -0
- pygeai/core/plugins/endpoints.py +1 -0
- pygeai/core/plugins/models.py +86 -0
- pygeai/core/rerank/__init__.py +0 -0
- pygeai/core/rerank/clients.py +35 -0
- pygeai/core/rerank/endpoints.py +1 -0
- pygeai/core/rerank/managers.py +47 -0
- pygeai/core/rerank/mappers.py +23 -0
- pygeai/core/rerank/models.py +27 -0
- pygeai/core/responses.py +104 -0
- pygeai/core/secrets/__init__.py +0 -0
- pygeai/core/secrets/clients.py +212 -0
- pygeai/core/secrets/endpoints.py +7 -0
- pygeai/core/services/llm/__init__.py +0 -0
- pygeai/core/services/llm/model.py +186 -0
- pygeai/core/services/llm/providers.py +15 -0
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +311 -89
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +870 -0
- pygeai/evaluation/__init__.py +0 -0
- pygeai/evaluation/clients.py +19 -0
- pygeai/evaluation/dataset/__init__.py +0 -0
- pygeai/evaluation/dataset/clients.py +514 -0
- pygeai/evaluation/dataset/endpoints.py +26 -0
- pygeai/evaluation/plan/__init__.py +0 -0
- pygeai/evaluation/plan/clients.py +302 -0
- pygeai/evaluation/plan/endpoints.py +16 -0
- pygeai/evaluation/result/__init__.py +0 -0
- pygeai/evaluation/result/clients.py +70 -0
- pygeai/evaluation/result/endpoints.py +2 -0
- pygeai/flows/__init__.py +0 -0
- pygeai/flows/endpoints.py +362 -0
- pygeai/flows/models.py +1304 -0
- pygeai/gam/__init__.py +0 -0
- pygeai/gam/clients.py +178 -0
- pygeai/gam/endpoints.py +4 -0
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -0
- pygeai/lab/agents/__init__.py +0 -0
- pygeai/lab/agents/clients.py +426 -0
- pygeai/lab/agents/endpoints.py +12 -0
- pygeai/lab/agents/mappers.py +319 -0
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +1558 -0
- pygeai/lab/models.py +1719 -0
- pygeai/lab/processes/__init__.py +0 -0
- pygeai/lab/processes/clients.py +1051 -0
- pygeai/lab/processes/endpoints.py +26 -0
- pygeai/lab/processes/mappers.py +395 -0
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/__init__.py +0 -0
- pygeai/lab/strategies/clients.py +212 -0
- pygeai/lab/strategies/endpoints.py +5 -0
- pygeai/lab/strategies/mappers.py +58 -0
- pygeai/lab/tools/__init__.py +0 -0
- pygeai/lab/tools/clients.py +465 -0
- pygeai/lab/tools/endpoints.py +13 -0
- pygeai/lab/tools/mappers.py +131 -0
- pygeai/man/__init__.py +1 -0
- pygeai/man/man1/__init__.py +1 -0
- pygeai/man/man1/geai-proxy.1 +246 -0
- pygeai/man/man1/geai.1 +2615 -0
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +603 -0
- pygeai/migration/tools.py +180 -0
- pygeai/organization/clients.py +246 -18
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/__init__.py +0 -0
- pygeai/organization/limits/clients.py +281 -0
- pygeai/organization/limits/endpoints.py +15 -0
- pygeai/organization/limits/managers.py +331 -0
- pygeai/organization/limits/mappers.py +21 -0
- pygeai/organization/managers.py +537 -0
- pygeai/organization/mappers.py +111 -46
- pygeai/organization/responses.py +61 -11
- pygeai/proxy/__init__.py +0 -0
- pygeai/proxy/clients.py +216 -0
- pygeai/proxy/config.py +128 -0
- pygeai/proxy/managers.py +232 -0
- pygeai/proxy/servers.py +304 -0
- pygeai/proxy/tool.py +69 -0
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/__init__.py +0 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_mappers.py +189 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -80
- pygeai/tests/assistants/test_managers.py +198 -0
- pygeai/tests/assistants/test_mappers.py +111 -0
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/__init__.py +0 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +154 -0
- pygeai/tests/core/base/__init__.py +0 -0
- pygeai/tests/core/base/data/__init__.py +0 -0
- pygeai/tests/core/base/data/mappers.py +117 -0
- pygeai/tests/core/base/data/models.py +312 -0
- pygeai/tests/core/base/test_mappers.py +569 -0
- pygeai/tests/core/base/test_models.py +261 -0
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/__init__.py +0 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +219 -0
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/__init__.py +0 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +99 -0
- pygeai/tests/core/rerank/test_mappers.py +54 -0
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/__init__.py +0 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_mappers.py +245 -0
- pygeai/tests/lab/test_models.py +1154 -0
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/__init__.py +0 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +402 -0
- pygeai/tests/organization/test_clients.py +615 -64
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/__init__.py +0 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/assistants/__init__.py +0 -0
- pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
- pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
- pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
- pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
- pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
- pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
- pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
- pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
- pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
- pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
- pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
- pygeai/tests/snippets/assistants/send_feedback.py +14 -0
- pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/__init__.py +0 -0
- pygeai/tests/snippets/chat/cancel_request.py +7 -0
- pygeai/tests/snippets/chat/chat_completion.py +28 -0
- pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
- pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
- pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
- pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
- pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_request_status.py +7 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/chat/send_chat_request.py +33 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/__init__.py +0 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/__init__.py +0 -0
- pygeai/tests/snippets/files/delete_file.py +9 -0
- pygeai/tests/snippets/files/get_file_content.py +10 -0
- pygeai/tests/snippets/files/get_file_data.py +9 -0
- pygeai/tests/snippets/files/get_file_list.py +6 -0
- pygeai/tests/snippets/files/upload_file.py +13 -0
- pygeai/tests/snippets/gam/__init__.py +0 -0
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/__init__.py +0 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
- pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
- pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
- pygeai/tests/snippets/lab/agents/__init__.py +0 -0
- pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
- pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
- pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
- pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/create_process.py +24 -0
- pygeai/tests/snippets/lab/processes/create_task.py +8 -0
- pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
- pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
- pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
- pygeai/tests/snippets/lab/runner_1.py +212 -0
- pygeai/tests/snippets/lab/samples/__init__.py +0 -0
- pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
- pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
- pygeai/tests/snippets/lab/tools/__init__.py +0 -0
- pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
- pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
- pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
- pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
- pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
- pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/__init__.py +0 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +23 -0
- pygeai/tests/snippets/organization/delete_project.py +7 -0
- pygeai/tests/snippets/organization/export_request_data.py +7 -0
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_data.py +7 -0
- pygeai/tests/snippets/organization/get_project_list.py +8 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
- pygeai/tests/snippets/organization/update_project.py +14 -0
- pygeai/tests/snippets/rerank/__init__.py +0 -0
- pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
- pygeai/tests/snippets/secrets/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
- pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
- docs/source/conf.py +0 -45
- pygeai/core/clients.py +0 -240
- pygeai/tests/core/test_clients.py +0 -49
- pygeai-0.1.6.dist-info/METADATA +0 -92
- pygeai-0.1.6.dist-info/RECORD +0 -65
- pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
- pygeai-0.1.6.dist-info/entry_points.txt +0 -2
- /pygeai/{agent → analytics}/__init__.py +0 -0
pygeai/core/services/rest.py
CHANGED
|
@@ -1,26 +1,36 @@
|
|
|
1
1
|
import json
|
|
2
|
-
|
|
2
|
+
from typing import Optional, List, Dict
|
|
3
3
|
import requests as req
|
|
4
|
-
import
|
|
4
|
+
from pygeai import logger
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidResponseException
|
|
6
|
+
from pygeai.core.services.response import ResponseMock
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
FAILED_REQUEST_RESPONSE = ResponseMock(
|
|
9
|
+
status_code=0,
|
|
10
|
+
content=json.dumps({"error": "Unknown error occurred"}),
|
|
11
|
+
url=None,
|
|
12
|
+
reason="Unknown Error"
|
|
13
|
+
)
|
|
7
14
|
|
|
8
15
|
|
|
9
16
|
class ApiService:
|
|
10
17
|
"""
|
|
11
|
-
Generic service for interacting with
|
|
18
|
+
Generic service for interacting with REST APIs.
|
|
12
19
|
|
|
13
20
|
:param base_url: str - The base URL of the API.
|
|
14
|
-
:param username: str -
|
|
15
|
-
:param password: str -
|
|
16
|
-
:param token: str -
|
|
21
|
+
:param username: str - Username for basic authentication (optional).
|
|
22
|
+
:param password: str - Password for basic authentication (optional).
|
|
23
|
+
:param token: str - Bearer token for authentication (optional).
|
|
24
|
+
:param project_id: str - Project ID for OAuth authentication (optional, keyword-only).
|
|
17
25
|
"""
|
|
18
26
|
|
|
19
|
-
def __init__(self, base_url, username: str = None, password: str = None, token: str = None
|
|
27
|
+
def __init__(self, base_url, username: str = None, password: str = None, token: str = None, *,
|
|
28
|
+
project_id: str = None):
|
|
20
29
|
self._base_url = base_url
|
|
21
30
|
self._username = username
|
|
22
31
|
self._password = password
|
|
23
32
|
self._token = token
|
|
33
|
+
self._project_id = project_id
|
|
24
34
|
|
|
25
35
|
@property
|
|
26
36
|
def base_url(self):
|
|
@@ -38,74 +48,194 @@ class ApiService:
|
|
|
38
48
|
def token(self):
|
|
39
49
|
return self._token
|
|
40
50
|
|
|
41
|
-
|
|
51
|
+
@token.setter
|
|
52
|
+
def token(self, token: str):
|
|
53
|
+
self._token = token
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def project_id(self):
|
|
57
|
+
return self._project_id
|
|
58
|
+
|
|
59
|
+
@project_id.setter
|
|
60
|
+
def project_id(self, project_id: str):
|
|
61
|
+
self._project_id = project_id
|
|
62
|
+
|
|
63
|
+
def get(self, endpoint: str, params: dict = None, headers: dict = None, verify: bool = True):
|
|
42
64
|
"""
|
|
43
65
|
Sends a GET request to the specified API endpoint.
|
|
44
66
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
67
|
+
This method constructs the full URL by appending the endpoint to the base URL and sends a GET request
|
|
68
|
+
using the provided query parameters and headers. Authentication is applied if username/password or token
|
|
69
|
+
is provided.
|
|
70
|
+
|
|
71
|
+
:param endpoint: str - The API endpoint to send the request to (relative to the base URL).
|
|
72
|
+
:param params: dict, optional - Query parameters to include in the request.
|
|
73
|
+
:param headers: dict, optional - Additional headers to include in the request.
|
|
74
|
+
:param verify: bool - Whether to verify SSL certificates (default: True).
|
|
75
|
+
:return: Response - The response object from the GET request.
|
|
76
|
+
:raises InvalidResponseException: If an error occurs during the request execution.
|
|
49
77
|
"""
|
|
78
|
+
response = FAILED_REQUEST_RESPONSE
|
|
50
79
|
try:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
url = f"{base_url}/{endpoint}"
|
|
80
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
54
81
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
params=params,
|
|
59
|
-
auth=(
|
|
82
|
+
with req.Session() as session:
|
|
83
|
+
if self.username and self.password:
|
|
84
|
+
session.auth = (
|
|
60
85
|
self.username,
|
|
61
86
|
self.password
|
|
62
87
|
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
response =
|
|
69
|
-
url=url,
|
|
70
|
-
params=params,
|
|
71
|
-
headers=headers
|
|
72
|
-
)
|
|
73
|
-
elif headers:
|
|
74
|
-
response = req.get(
|
|
88
|
+
elif self.token:
|
|
89
|
+
headers = self._add_token_to_headers(headers)
|
|
90
|
+
|
|
91
|
+
session.verify = verify
|
|
92
|
+
|
|
93
|
+
response = session.get(
|
|
75
94
|
url=url,
|
|
76
95
|
params=params,
|
|
77
96
|
headers=headers
|
|
78
97
|
)
|
|
79
|
-
else:
|
|
80
|
-
response = req.get(
|
|
81
|
-
url=url,
|
|
82
|
-
params=params,
|
|
83
|
-
)
|
|
84
98
|
except Exception as e:
|
|
85
99
|
logger.error(f"Error sending GET request: {e}")
|
|
100
|
+
raise InvalidResponseException(f"Error sending GET request: {e}")
|
|
86
101
|
else:
|
|
87
|
-
|
|
102
|
+
logger.debug(f"GET request to URL: {response.url}")
|
|
88
103
|
|
|
89
|
-
|
|
104
|
+
return response
|
|
105
|
+
|
|
106
|
+
def post(self, endpoint: str, data: dict, headers: dict = None, verify: bool = True, form: bool = False):
|
|
90
107
|
"""
|
|
91
108
|
Sends a POST request to the specified API endpoint.
|
|
92
109
|
|
|
93
|
-
|
|
110
|
+
This method constructs the full URL by appending the endpoint to the base URL and sends a POST request
|
|
111
|
+
with the provided data, either as JSON or form data. Authentication is applied if username/password or token
|
|
112
|
+
is provided.
|
|
113
|
+
|
|
114
|
+
:param endpoint: str - The API endpoint to send the request to (relative to the base URL).
|
|
94
115
|
:param data: dict - The payload to include in the POST request.
|
|
95
|
-
:param headers: dict -
|
|
96
|
-
:param verify: bool - Whether to verify SSL certificates
|
|
97
|
-
:
|
|
116
|
+
:param headers: dict, optional - Additional headers to include in the request.
|
|
117
|
+
:param verify: bool - Whether to verify SSL certificates (default: True).
|
|
118
|
+
:param form: bool - Whether to send data as form data instead of JSON (default: False).
|
|
119
|
+
:return: Response - The response object from the POST request.
|
|
120
|
+
:raises InvalidResponseException: If an error occurs during the request execution.
|
|
98
121
|
"""
|
|
122
|
+
response = FAILED_REQUEST_RESPONSE
|
|
99
123
|
try:
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
124
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
125
|
+
|
|
126
|
+
with req.Session() as session:
|
|
127
|
+
if self.username and self.password:
|
|
128
|
+
session.auth = (
|
|
129
|
+
self.username,
|
|
130
|
+
self.password
|
|
131
|
+
)
|
|
132
|
+
elif self.token:
|
|
133
|
+
headers = self._add_token_to_headers(headers)
|
|
134
|
+
|
|
135
|
+
session.verify = verify
|
|
107
136
|
|
|
108
|
-
|
|
137
|
+
if form:
|
|
138
|
+
response = session.post(
|
|
139
|
+
url=url,
|
|
140
|
+
data=data,
|
|
141
|
+
headers=headers
|
|
142
|
+
)
|
|
143
|
+
else:
|
|
144
|
+
response = session.post(
|
|
145
|
+
url=url,
|
|
146
|
+
json=data,
|
|
147
|
+
headers=headers
|
|
148
|
+
)
|
|
149
|
+
except Exception as e:
|
|
150
|
+
logger.error(f"Error sending POST request: {e}")
|
|
151
|
+
raise InvalidResponseException(f"Error sending POST request: {e}")
|
|
152
|
+
else:
|
|
153
|
+
logger.debug(f"POST request to URL: {response.url}")
|
|
154
|
+
|
|
155
|
+
return response
|
|
156
|
+
|
|
157
|
+
def stream_post(
|
|
158
|
+
self,
|
|
159
|
+
endpoint: str,
|
|
160
|
+
data: dict,
|
|
161
|
+
headers: dict = None,
|
|
162
|
+
verify: bool = True,
|
|
163
|
+
form: bool = False
|
|
164
|
+
):
|
|
165
|
+
"""
|
|
166
|
+
Sends a streaming POST request to the specified API endpoint.
|
|
167
|
+
|
|
168
|
+
This method constructs the full URL by appending the endpoint to the base URL and sends a streaming POST
|
|
169
|
+
request with the provided data, either as JSON or form data. It yields chunks of the response as they are
|
|
170
|
+
received. Authentication is applied if username/password or token is provided.
|
|
171
|
+
|
|
172
|
+
:param endpoint: str - The API endpoint to send the request to (relative to the base URL).
|
|
173
|
+
:param data: dict - The payload to include in the POST request.
|
|
174
|
+
:param headers: dict, optional - Additional headers to include in the request.
|
|
175
|
+
:param verify: bool - Whether to verify SSL certificates (default: True).
|
|
176
|
+
:param form: bool - Whether to send data as form data instead of JSON (default: False).
|
|
177
|
+
:return: Generator[str] - Yields chunks of the streaming response as strings.
|
|
178
|
+
:raises InvalidResponseException: If an error occurs during the request execution or streaming.
|
|
179
|
+
"""
|
|
180
|
+
try:
|
|
181
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
182
|
+
|
|
183
|
+
with req.Session() as session:
|
|
184
|
+
if self.username and self.password:
|
|
185
|
+
session.auth = (self.username, self.password)
|
|
186
|
+
elif self.token:
|
|
187
|
+
headers = self._add_token_to_headers(headers)
|
|
188
|
+
|
|
189
|
+
session.verify = verify
|
|
190
|
+
|
|
191
|
+
if form:
|
|
192
|
+
response = session.post(
|
|
193
|
+
url=url,
|
|
194
|
+
data=data,
|
|
195
|
+
headers=headers,
|
|
196
|
+
stream=True
|
|
197
|
+
)
|
|
198
|
+
else:
|
|
199
|
+
response = session.post(
|
|
200
|
+
url=url,
|
|
201
|
+
json=data,
|
|
202
|
+
headers=headers,
|
|
203
|
+
stream=True
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
response.raise_for_status()
|
|
207
|
+
logger.debug(f"Streaming POST request to URL {response.url}")
|
|
208
|
+
for line in response.iter_lines(decode_unicode=True):
|
|
209
|
+
if line:
|
|
210
|
+
yield line
|
|
211
|
+
|
|
212
|
+
except Exception as e:
|
|
213
|
+
logger.error(f"Error sending streaming POST request: {e}")
|
|
214
|
+
raise InvalidResponseException(f"Error sending streaming POST request: {e}")
|
|
215
|
+
|
|
216
|
+
def post_file_binary(
|
|
217
|
+
self,
|
|
218
|
+
endpoint: str,
|
|
219
|
+
headers: dict = None,
|
|
220
|
+
verify: bool = True,
|
|
221
|
+
file=None
|
|
222
|
+
):
|
|
223
|
+
"""
|
|
224
|
+
Sends a POST request with a binary file to the specified API endpoint.
|
|
225
|
+
|
|
226
|
+
This method constructs the full URL by appending the endpoint to the base URL and sends a POST request
|
|
227
|
+
with the provided binary file data. Authentication is applied if username/password or token is provided.
|
|
228
|
+
|
|
229
|
+
:param endpoint: str - The API endpoint to send the request to (relative to the base URL).
|
|
230
|
+
:param headers: dict, optional - Additional headers to include in the request.
|
|
231
|
+
:param verify: bool - Whether to verify SSL certificates (default: True).
|
|
232
|
+
:param file: Binary file data to include in the request.
|
|
233
|
+
:return: Response - The response object from the POST request.
|
|
234
|
+
:raises InvalidResponseException: If an error occurs during the request execution.
|
|
235
|
+
"""
|
|
236
|
+
response = FAILED_REQUEST_RESPONSE
|
|
237
|
+
try:
|
|
238
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
109
239
|
|
|
110
240
|
with req.Session() as session:
|
|
111
241
|
if self.username and self.password:
|
|
@@ -113,40 +243,95 @@ class ApiService:
|
|
|
113
243
|
self.username,
|
|
114
244
|
self.password
|
|
115
245
|
)
|
|
246
|
+
elif self.token:
|
|
247
|
+
headers = self._add_token_to_headers(headers)
|
|
248
|
+
|
|
116
249
|
session.verify = verify
|
|
117
250
|
|
|
118
251
|
response = session.post(
|
|
119
252
|
url=url,
|
|
120
|
-
|
|
121
|
-
|
|
253
|
+
headers=headers,
|
|
254
|
+
data=file
|
|
122
255
|
)
|
|
123
256
|
except Exception as e:
|
|
124
|
-
logger.error(f"Error sending POST request: {e}")
|
|
257
|
+
logger.error(f"Error sending POST request with binary file: {e}")
|
|
258
|
+
raise InvalidResponseException(f"Error sending POST request with binary file: {e}")
|
|
125
259
|
else:
|
|
126
|
-
|
|
260
|
+
logger.debug(f"POST request with binary file to URL: {response.url}")
|
|
261
|
+
|
|
262
|
+
return response
|
|
263
|
+
|
|
264
|
+
def post_files_multipart(
|
|
265
|
+
self,
|
|
266
|
+
endpoint: str,
|
|
267
|
+
data: Optional[dict] = None,
|
|
268
|
+
headers: Optional[dict] = None,
|
|
269
|
+
verify: bool = True,
|
|
270
|
+
files: Optional[Dict[str, str]] = None,
|
|
271
|
+
):
|
|
272
|
+
"""
|
|
273
|
+
Sends a POST request with multipart files to the specified API endpoint.
|
|
274
|
+
|
|
275
|
+
This method constructs the full URL by appending the endpoint to the base URL and sends a POST request
|
|
276
|
+
with multipart form data, including files and optional additional data. Authentication is applied if
|
|
277
|
+
username/password or token is provided.
|
|
278
|
+
|
|
279
|
+
:param endpoint: str - The API endpoint to send the request to (relative to the base URL).
|
|
280
|
+
:param data: dict, optional - Additional form data to include in the request.
|
|
281
|
+
:param headers: dict, optional - Additional headers to include in the request.
|
|
282
|
+
:param verify: bool - Whether to verify SSL certificates (default: True).
|
|
283
|
+
:param files: Dict[str, str], optional - Dictionary of file names and their corresponding file paths or file-like objects.
|
|
284
|
+
:return: Response - The response object from the POST request.
|
|
285
|
+
:raises InvalidResponseException: If an error occurs during the request execution.
|
|
286
|
+
"""
|
|
287
|
+
response = FAILED_REQUEST_RESPONSE
|
|
288
|
+
try:
|
|
289
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
290
|
+
|
|
291
|
+
with req.Session() as session:
|
|
292
|
+
if self.username and self.password:
|
|
293
|
+
session.auth = (
|
|
294
|
+
self.username,
|
|
295
|
+
self.password
|
|
296
|
+
)
|
|
297
|
+
elif self.token:
|
|
298
|
+
headers = self._add_token_to_headers(headers)
|
|
299
|
+
|
|
300
|
+
session.verify = verify
|
|
301
|
+
|
|
302
|
+
# headers["Content-Type"] = "multipart/form-data"
|
|
303
|
+
|
|
304
|
+
response = session.post(
|
|
305
|
+
url=url,
|
|
306
|
+
headers=headers,
|
|
307
|
+
data=data,
|
|
308
|
+
files=files
|
|
309
|
+
)
|
|
310
|
+
except Exception as e:
|
|
311
|
+
logger.error(f"Error sending POST request with files multipart: {e}")
|
|
312
|
+
raise InvalidResponseException(f"Error sending POST request with files multipart request: {e}")
|
|
313
|
+
else:
|
|
314
|
+
logger.debug(f"POST request with multipart files to URL: {response.url}")
|
|
315
|
+
|
|
316
|
+
return response
|
|
127
317
|
|
|
128
318
|
def put(self, endpoint: str, data: dict, headers: dict = None, verify: bool = True):
|
|
129
319
|
"""
|
|
130
320
|
Sends a PUT request to the specified API endpoint.
|
|
131
321
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
:param
|
|
136
|
-
:
|
|
322
|
+
This method constructs the full URL by appending the endpoint to the base URL and sends a PUT request
|
|
323
|
+
with the provided JSON data. Authentication is applied if username/password or token is provided.
|
|
324
|
+
|
|
325
|
+
:param endpoint: str - The API endpoint to send the request to (relative to the base URL).
|
|
326
|
+
:param data: dict - The payload to include in the PUT request (sent as JSON).
|
|
327
|
+
:param headers: dict, optional - Additional headers to include in the request.
|
|
328
|
+
:param verify: bool - Whether to verify SSL certificates (default: True).
|
|
329
|
+
:return: Response - The response object from the PUT request.
|
|
330
|
+
:raises InvalidResponseException: If an error occurs during the request execution.
|
|
137
331
|
"""
|
|
332
|
+
response = FAILED_REQUEST_RESPONSE
|
|
138
333
|
try:
|
|
139
|
-
|
|
140
|
-
if not headers:
|
|
141
|
-
headers = {
|
|
142
|
-
"Authorization": f"Bearer {self.token}",
|
|
143
|
-
"Content-Type": "application/json"
|
|
144
|
-
}
|
|
145
|
-
else:
|
|
146
|
-
headers["Authorization"] = f"Bearer {self.token}"
|
|
147
|
-
headers["Content-Type"] = "application/json"
|
|
148
|
-
|
|
149
|
-
url = f"{base_url}/{endpoint}"
|
|
334
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
150
335
|
|
|
151
336
|
with req.Session() as session:
|
|
152
337
|
if self.username and self.password:
|
|
@@ -154,8 +339,13 @@ class ApiService:
|
|
|
154
339
|
self.username,
|
|
155
340
|
self.password
|
|
156
341
|
)
|
|
342
|
+
elif self.token:
|
|
343
|
+
headers = self._add_token_to_headers(headers)
|
|
344
|
+
|
|
157
345
|
session.verify = verify
|
|
158
346
|
|
|
347
|
+
headers["Content-Type"] = "application/json"
|
|
348
|
+
|
|
159
349
|
response = session.put(
|
|
160
350
|
url=url,
|
|
161
351
|
json=data,
|
|
@@ -163,28 +353,29 @@ class ApiService:
|
|
|
163
353
|
)
|
|
164
354
|
except Exception as e:
|
|
165
355
|
logger.error(f"Error sending PUT request: {e}")
|
|
356
|
+
raise InvalidResponseException(f"Error sending PUT request: {e}")
|
|
166
357
|
else:
|
|
167
|
-
|
|
358
|
+
logger.debug(f"PUT request to URL: {response.url}")
|
|
168
359
|
|
|
169
|
-
|
|
360
|
+
return response
|
|
361
|
+
|
|
362
|
+
def delete(self, endpoint: str, headers: dict = None, data: dict = None, verify: bool = True):
|
|
170
363
|
"""
|
|
171
364
|
Sends a DELETE request to the specified API endpoint.
|
|
172
365
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
:
|
|
366
|
+
This method constructs the full URL by appending the endpoint to the base URL and sends a DELETE request
|
|
367
|
+
with optional query parameters and headers. Authentication is applied if username/password or token is provided.
|
|
368
|
+
|
|
369
|
+
:param endpoint: str - The API endpoint to send the request to (relative to the base URL).
|
|
370
|
+
:param headers: dict, optional - Additional headers to include in the request.
|
|
371
|
+
:param data: dict, optional - Query parameters to include in the request.
|
|
372
|
+
:param verify: bool - Whether to verify SSL certificates (default: True).
|
|
373
|
+
:return: Response - The response object from the DELETE request.
|
|
374
|
+
:raises InvalidResponseException: If an error occurs during the request execution.
|
|
177
375
|
"""
|
|
376
|
+
response = FAILED_REQUEST_RESPONSE
|
|
178
377
|
try:
|
|
179
|
-
|
|
180
|
-
if not headers:
|
|
181
|
-
headers = {
|
|
182
|
-
"Authorization": f"Bearer {self.token}"
|
|
183
|
-
}
|
|
184
|
-
else:
|
|
185
|
-
headers["Authorization"] = f"Bearer {self.token}"
|
|
186
|
-
|
|
187
|
-
url = f"{base_url}/{endpoint}"
|
|
378
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
188
379
|
|
|
189
380
|
with req.Session() as session:
|
|
190
381
|
if self.username and self.password:
|
|
@@ -192,14 +383,45 @@ class ApiService:
|
|
|
192
383
|
self.username,
|
|
193
384
|
self.password
|
|
194
385
|
)
|
|
386
|
+
elif self.token:
|
|
387
|
+
headers = self._add_token_to_headers(headers)
|
|
388
|
+
|
|
195
389
|
session.verify = verify
|
|
196
390
|
|
|
197
391
|
response = session.delete(
|
|
198
392
|
url=url,
|
|
199
|
-
headers=headers
|
|
393
|
+
headers=headers,
|
|
394
|
+
params=data
|
|
200
395
|
)
|
|
201
396
|
except Exception as e:
|
|
202
397
|
logger.error(f"Error sending DELETE request: {e}")
|
|
398
|
+
raise InvalidResponseException(f"Error sending DELETE request: {e}")
|
|
399
|
+
else:
|
|
400
|
+
logger.debug(f"DELETE request to URL: {response.url}")
|
|
401
|
+
|
|
402
|
+
return response
|
|
403
|
+
|
|
404
|
+
def _add_endpoint_to_url(self, endpoint: str):
|
|
405
|
+
clean_base_url = self.base_url.rstrip('/')
|
|
406
|
+
url = f"{clean_base_url}/{endpoint.lstrip('/')}" if self._has_valid_protocol(clean_base_url) else f"https://{clean_base_url}/{endpoint}"
|
|
407
|
+
return url
|
|
408
|
+
|
|
409
|
+
def _has_valid_protocol(self, url: str):
|
|
410
|
+
return url.startswith(('http://', 'https://'))
|
|
411
|
+
|
|
412
|
+
def _add_token_to_headers(self, headers: dict = None):
|
|
413
|
+
if not headers:
|
|
414
|
+
headers = {
|
|
415
|
+
"Authorization": f"Bearer {self.token}"
|
|
416
|
+
}
|
|
417
|
+
else:
|
|
418
|
+
if "Authorization" not in headers:
|
|
419
|
+
headers["Authorization"] = f"Bearer {self.token}"
|
|
420
|
+
|
|
421
|
+
if self.project_id and "ProjectId" not in headers:
|
|
422
|
+
headers["ProjectId"] = self.project_id
|
|
423
|
+
logger.debug(f"Added Authorization header with ProjectId: {self.project_id}")
|
|
203
424
|
else:
|
|
204
|
-
|
|
425
|
+
logger.debug("Added Authorization header")
|
|
205
426
|
|
|
427
|
+
return headers
|
|
File without changes
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class StreamWriter(ABC):
|
|
6
|
+
"""
|
|
7
|
+
Abstract base class for custom stream writers.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
@abstractmethod
|
|
11
|
+
def write_stdout(self, message: str = "", end: str = "\n"):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
@abstractmethod
|
|
15
|
+
def write_stderr(self, message: str = "", end: str = "\n"):
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
class ConsoleMeta(type):
|
|
19
|
+
def __getattr__(cls, name):
|
|
20
|
+
writer = cls._writer
|
|
21
|
+
attr = getattr(writer, name, None)
|
|
22
|
+
if callable(attr):
|
|
23
|
+
return attr
|
|
24
|
+
|
|
25
|
+
def noop(*args, **kwargs):
|
|
26
|
+
pass
|
|
27
|
+
return noop
|
|
28
|
+
|
|
29
|
+
class Console(metaclass=ConsoleMeta):
|
|
30
|
+
"""
|
|
31
|
+
A utility class for writing messages to standard output and standard error streams.
|
|
32
|
+
|
|
33
|
+
This class provides static methods to write messages to `sys.stdout` and `sys.stderr`
|
|
34
|
+
with customizable end characters. It serves as a simple abstraction for console output
|
|
35
|
+
operations, ensuring consistent handling of messages in command-line applications.
|
|
36
|
+
|
|
37
|
+
Additionally, it allows setting a custom stream writer to override the default behavior,
|
|
38
|
+
enabling redirection of output to alternative targets such as loggers, files, or testing sinks.
|
|
39
|
+
"""
|
|
40
|
+
class DefaultStreamWriter(StreamWriter):
|
|
41
|
+
"""
|
|
42
|
+
Default StreamWriter that writes to sys.stdout and sys.stderr.
|
|
43
|
+
"""
|
|
44
|
+
def write_stdout(self, message: str = "", end: str = "\n"):
|
|
45
|
+
sys.stdout.write(f"{message}{end}")
|
|
46
|
+
sys.stdout.flush()
|
|
47
|
+
|
|
48
|
+
def write_stderr(self, message: str = "", end: str = "\n"):
|
|
49
|
+
sys.stderr.write(f"{message}{end}")
|
|
50
|
+
sys.stderr.flush()
|
|
51
|
+
|
|
52
|
+
_writer: StreamWriter = DefaultStreamWriter()
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
def write_stdout(message: str = "", end: str = "\n"):
|
|
56
|
+
"""
|
|
57
|
+
Writes a message to the standard output stream (sys.stdout).
|
|
58
|
+
|
|
59
|
+
:param message: str - The message to write. Defaults to an empty string.
|
|
60
|
+
:param end: str - The string to append after the message. Defaults to a newline ('\n').
|
|
61
|
+
:return: None - No return value; output is written to sys.stdout.
|
|
62
|
+
"""
|
|
63
|
+
Console._writer.write_stdout(message, end)
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def write_stderr(message: str = "", end: str = "\n"):
|
|
67
|
+
"""
|
|
68
|
+
Writes a message to the standard error stream (sys.stderr).
|
|
69
|
+
|
|
70
|
+
:param message: str - The message to write. Defaults to an empty string.
|
|
71
|
+
:param end: str - The string to append after the message. Defaults to a newline ('\n').
|
|
72
|
+
:return: None - No return value; output is written to sys.stderr.
|
|
73
|
+
"""
|
|
74
|
+
Console._writer.write_stderr(message, end)
|
|
75
|
+
|
|
76
|
+
@staticmethod
|
|
77
|
+
def set_writer(writer: StreamWriter):
|
|
78
|
+
"""
|
|
79
|
+
Sets a custom StreamWriter to handle console output.
|
|
80
|
+
|
|
81
|
+
:param writer: StreamWriter - Implementation of the StreamWriter interface.
|
|
82
|
+
"""
|
|
83
|
+
Console._writer = writer
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from json import JSONDecodeError
|
|
2
|
+
|
|
3
|
+
from pygeai import logger
|
|
4
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def parse_json_response(response, operation: str, **context):
|
|
8
|
+
"""
|
|
9
|
+
Parse JSON response with standardized error handling.
|
|
10
|
+
|
|
11
|
+
:param response: HTTP response object
|
|
12
|
+
:param operation: Description of operation (e.g., "get project API token")
|
|
13
|
+
:param context: Additional context (e.g., api_token_id="123")
|
|
14
|
+
:return: Parsed JSON response
|
|
15
|
+
:raises InvalidAPIResponseException: If JSON parsing fails
|
|
16
|
+
"""
|
|
17
|
+
try:
|
|
18
|
+
return response.json()
|
|
19
|
+
except JSONDecodeError as e:
|
|
20
|
+
full_msg = f"Unable to {operation}"
|
|
21
|
+
if context:
|
|
22
|
+
if len(context) == 1:
|
|
23
|
+
# Single context value: append as 'value'
|
|
24
|
+
value = list(context.values())[0]
|
|
25
|
+
full_msg += f" '{value}'"
|
|
26
|
+
else:
|
|
27
|
+
# Multiple context values: format as (key1='value1', key2='value2')
|
|
28
|
+
context_str = ", ".join([f"{k}='{v}'" for k, v in context.items()])
|
|
29
|
+
full_msg += f" ({context_str})"
|
|
30
|
+
|
|
31
|
+
logger.error(f"{full_msg}: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
|
|
32
|
+
raise InvalidAPIResponseException(f"{full_msg}: {response.text}")
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from pygeai import logger
|
|
2
|
+
from pygeai.core.common.exceptions import APIResponseError
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def validate_status_code(response):
|
|
6
|
+
if response.status_code >= 300:
|
|
7
|
+
logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
|
|
8
|
+
raise APIResponseError(f"API returned an error: {response.text}")
|
|
9
|
+
|
|
10
|
+
|
pygeai/dbg/__init__.py
CHANGED