pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +9 -1
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +18 -45
- pygeai/assistant/data/clients.py +1 -0
- pygeai/assistant/data_analyst/clients.py +8 -12
- pygeai/assistant/managers.py +195 -157
- pygeai/assistant/mappers.py +4 -2
- pygeai/assistant/rag/clients.py +27 -67
- pygeai/assistant/rag/mappers.py +12 -6
- pygeai/assistant/rag/models.py +301 -159
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +308 -37
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +2 -8
- pygeai/chat/managers.py +9 -6
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +7 -10
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +9 -9
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +71 -9
- pygeai/cli/commands/chat.py +676 -19
- pygeai/cli/commands/common.py +28 -24
- pygeai/cli/commands/configuration.py +66 -13
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +58 -11
- pygeai/cli/commands/evaluation.py +38 -38
- pygeai/cli/commands/feedback.py +3 -4
- pygeai/cli/commands/files.py +7 -8
- pygeai/cli/commands/gam.py +85 -10
- pygeai/cli/commands/lab/ai_lab.py +340 -484
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +6 -7
- pygeai/cli/commands/migrate.py +1064 -436
- pygeai/cli/commands/organization.py +516 -11
- pygeai/cli/commands/rag.py +13 -14
- pygeai/cli/commands/rerank.py +3 -5
- pygeai/cli/commands/secrets.py +8 -9
- pygeai/cli/commands/usage_limits.py +18 -20
- pygeai/cli/commands/validators.py +144 -1
- pygeai/cli/commands/version.py +4 -5
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +170 -31
- pygeai/cli/geai_proxy.py +86 -25
- pygeai/cli/install_man.py +93 -22
- pygeai/cli/parsers.py +75 -25
- pygeai/cli/texts/help.py +265 -28
- pygeai/core/base/clients.py +53 -12
- pygeai/core/base/mappers.py +11 -2
- pygeai/core/base/session.py +95 -11
- pygeai/core/common/config.py +78 -14
- pygeai/core/common/exceptions.py +96 -6
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +23 -5
- pygeai/core/embeddings/managers.py +9 -4
- pygeai/core/embeddings/mappers.py +16 -2
- pygeai/core/embeddings/responses.py +9 -2
- pygeai/core/feedback/clients.py +8 -3
- pygeai/core/files/clients.py +23 -24
- pygeai/core/files/managers.py +121 -30
- pygeai/core/files/responses.py +4 -3
- pygeai/core/handlers.py +10 -1
- pygeai/core/llm/clients.py +22 -29
- pygeai/core/models.py +127 -11
- pygeai/core/plugins/clients.py +6 -6
- pygeai/core/rerank/clients.py +9 -3
- pygeai/core/rerank/managers.py +22 -5
- pygeai/core/secrets/clients.py +16 -37
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +159 -49
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +854 -14
- pygeai/evaluation/clients.py +7 -4
- pygeai/evaluation/dataset/clients.py +46 -44
- pygeai/evaluation/plan/clients.py +28 -26
- pygeai/evaluation/result/clients.py +38 -5
- pygeai/gam/clients.py +50 -28
- pygeai/gam/endpoints.py +2 -1
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -90
- pygeai/lab/agents/clients.py +203 -162
- pygeai/lab/agents/endpoints.py +4 -0
- pygeai/lab/agents/mappers.py +57 -7
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +571 -541
- pygeai/lab/models.py +108 -19
- pygeai/lab/processes/clients.py +332 -340
- pygeai/lab/processes/mappers.py +3 -3
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/clients.py +67 -63
- pygeai/lab/strategies/mappers.py +1 -1
- pygeai/lab/tools/clients.py +85 -118
- pygeai/lab/tools/endpoints.py +4 -0
- pygeai/lab/tools/mappers.py +5 -5
- pygeai/man/man1/geai-proxy.1 +116 -0
- pygeai/man/man1/geai.1 +2580 -66
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +468 -146
- pygeai/migration/tools.py +170 -3
- pygeai/organization/clients.py +245 -50
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/clients.py +34 -32
- pygeai/organization/limits/managers.py +108 -49
- pygeai/organization/managers.py +347 -53
- pygeai/organization/mappers.py +102 -2
- pygeai/organization/responses.py +58 -1
- pygeai/proxy/clients.py +6 -3
- pygeai/proxy/config.py +14 -1
- pygeai/proxy/managers.py +61 -33
- pygeai/proxy/servers.py +196 -51
- pygeai/proxy/tool.py +33 -16
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -82
- pygeai/tests/assistants/test_managers.py +191 -57
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +5 -5
- pygeai/tests/core/base/data/models.py +7 -0
- pygeai/tests/core/base/test_mappers.py +43 -11
- pygeai/tests/core/base/test_models.py +3 -1
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +124 -78
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +61 -39
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_models.py +500 -3
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +298 -56
- pygeai/tests/organization/test_clients.py +600 -30
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/delete_file.py +1 -4
- pygeai/tests/snippets/files/get_file_content.py +2 -4
- pygeai/tests/snippets/files/get_file_data.py +1 -4
- pygeai/tests/snippets/files/get_file_list.py +1 -6
- pygeai/tests/snippets/files/upload_file.py +1 -5
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
- pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
- pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
- pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
- pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/create_process.py +3 -5
- pygeai/tests/snippets/lab/processes/create_task.py +3 -5
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
- pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
- pygeai/tests/snippets/lab/runner_1.py +1 -1
- pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
- pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
- pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
- pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
- pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
- pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
- pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +2 -2
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
- pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
- docs/geai-proxy/README.md +0 -145
- docs/source/conf.py +0 -45
- pygeai/tests/core/test_managers.py +0 -233
- pygeai-0.1.51b3.dist-info/METADATA +0 -130
- pygeai-0.1.51b3.dist-info/RECORD +0 -324
- pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
- scripts/bump_beta_version.py +0 -56
- {scripts → pygeai/analytics}/__init__.py +0 -0
- /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
pygeai/core/secrets/clients.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
from json import JSONDecodeError
|
|
2
1
|
from typing import Optional, List, Dict
|
|
3
2
|
|
|
3
|
+
from pygeai import logger
|
|
4
4
|
from pygeai.core.base.clients import BaseClient
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
5
6
|
from pygeai.core.secrets.endpoints import LIST_SECRETS_V1, GET_SECRET_V1, CREATE_SECRET_V1, UPDATE_SECRET_V1, \
|
|
6
7
|
SET_SECRET_ACCESSES_V1, GET_SECRET_ACCESSES_V1
|
|
8
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
9
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
7
10
|
|
|
8
11
|
|
|
9
12
|
class SecretClient(BaseClient):
|
|
@@ -42,12 +45,8 @@ class SecretClient(BaseClient):
|
|
|
42
45
|
endpoint=LIST_SECRETS_V1,
|
|
43
46
|
params=params
|
|
44
47
|
)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
except JSONDecodeError:
|
|
48
|
-
result = response.text
|
|
49
|
-
|
|
50
|
-
return result
|
|
48
|
+
validate_status_code(response)
|
|
49
|
+
return parse_json_response(response, "list secrets with params")
|
|
51
50
|
|
|
52
51
|
def get_secret(self, secret_id: str) -> dict:
|
|
53
52
|
"""
|
|
@@ -67,12 +66,8 @@ class SecretClient(BaseClient):
|
|
|
67
66
|
response = self.api_service.get(
|
|
68
67
|
endpoint=endpoint
|
|
69
68
|
)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
except JSONDecodeError:
|
|
73
|
-
result = response.text
|
|
74
|
-
|
|
75
|
-
return result
|
|
69
|
+
validate_status_code(response)
|
|
70
|
+
return parse_json_response(response, "get secret with ID", secret_id=secret_id)
|
|
76
71
|
|
|
77
72
|
def create_secret(
|
|
78
73
|
self,
|
|
@@ -109,12 +104,8 @@ class SecretClient(BaseClient):
|
|
|
109
104
|
endpoint=CREATE_SECRET_V1,
|
|
110
105
|
data=data
|
|
111
106
|
)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
except JSONDecodeError:
|
|
115
|
-
result = response.text
|
|
116
|
-
|
|
117
|
-
return result
|
|
107
|
+
validate_status_code(response)
|
|
108
|
+
return parse_json_response(response, "create secret with name", name=name)
|
|
118
109
|
|
|
119
110
|
def update_secret(
|
|
120
111
|
self,
|
|
@@ -155,12 +146,8 @@ class SecretClient(BaseClient):
|
|
|
155
146
|
endpoint=endpoint,
|
|
156
147
|
data=data
|
|
157
148
|
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
except JSONDecodeError:
|
|
161
|
-
result = response.text
|
|
162
|
-
|
|
163
|
-
return result
|
|
149
|
+
validate_status_code(response)
|
|
150
|
+
return parse_json_response(response, "update secret with ID", secret_id=secret_id)
|
|
164
151
|
|
|
165
152
|
def set_secret_accesses(
|
|
166
153
|
self,
|
|
@@ -200,12 +187,8 @@ class SecretClient(BaseClient):
|
|
|
200
187
|
endpoint=endpoint,
|
|
201
188
|
data=data
|
|
202
189
|
)
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
except JSONDecodeError:
|
|
206
|
-
result = response.text
|
|
207
|
-
|
|
208
|
-
return result
|
|
190
|
+
validate_status_code(response)
|
|
191
|
+
return parse_json_response(response, "set accesses for secret with ID", secret_id=secret_id)
|
|
209
192
|
|
|
210
193
|
def get_secret_accesses(self, secret_id: str) -> dict:
|
|
211
194
|
"""
|
|
@@ -225,9 +208,5 @@ class SecretClient(BaseClient):
|
|
|
225
208
|
response = self.api_service.get(
|
|
226
209
|
endpoint=endpoint
|
|
227
210
|
)
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
except JSONDecodeError:
|
|
231
|
-
result = response.text
|
|
232
|
-
|
|
233
|
-
return result
|
|
211
|
+
validate_status_code(response)
|
|
212
|
+
return parse_json_response(response, "get accesses for secret with ID", secret_id=secret_id)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
import requests as req
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ResponseMock:
|
|
7
|
+
def __init__(self, status_code: int, content: str, url: Optional[str], reason: str):
|
|
8
|
+
self.status_code = status_code
|
|
9
|
+
self.content = content
|
|
10
|
+
self.url = url
|
|
11
|
+
self.reason = reason
|
|
12
|
+
|
|
13
|
+
def raise_for_status(self):
|
|
14
|
+
if self.status_code >= 400:
|
|
15
|
+
raise req.exceptions.HTTPError(f"{self.status_code} {self.reason}")
|
|
16
|
+
|
|
17
|
+
def json(self):
|
|
18
|
+
return json.loads(self.content)
|
pygeai/core/services/rest.py
CHANGED
|
@@ -1,26 +1,36 @@
|
|
|
1
|
+
import json
|
|
1
2
|
from typing import Optional, List, Dict
|
|
2
|
-
|
|
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,18 +48,36 @@ class ApiService:
|
|
|
38
48
|
def token(self):
|
|
39
49
|
return self._token
|
|
40
50
|
|
|
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
|
+
|
|
41
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
|
-
|
|
49
|
-
:
|
|
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.
|
|
50
77
|
"""
|
|
78
|
+
response = FAILED_REQUEST_RESPONSE
|
|
51
79
|
try:
|
|
52
|
-
url =
|
|
80
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
53
81
|
|
|
54
82
|
with req.Session() as session:
|
|
55
83
|
if self.username and self.password:
|
|
@@ -69,22 +97,31 @@ class ApiService:
|
|
|
69
97
|
)
|
|
70
98
|
except Exception as e:
|
|
71
99
|
logger.error(f"Error sending GET request: {e}")
|
|
100
|
+
raise InvalidResponseException(f"Error sending GET request: {e}")
|
|
72
101
|
else:
|
|
73
|
-
|
|
102
|
+
logger.debug(f"GET request to URL: {response.url}")
|
|
103
|
+
|
|
104
|
+
return response
|
|
74
105
|
|
|
75
106
|
def post(self, endpoint: str, data: dict, headers: dict = None, verify: bool = True, form: bool = False):
|
|
76
107
|
"""
|
|
77
108
|
Sends a POST request to the specified API endpoint.
|
|
78
109
|
|
|
79
|
-
|
|
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).
|
|
80
115
|
:param data: dict - The payload to include in the POST request.
|
|
81
|
-
:param headers: dict -
|
|
82
|
-
:param verify: bool - Whether to verify SSL certificates
|
|
83
|
-
:param form: bool - Whether to send data
|
|
84
|
-
:return: Response object from the POST request.
|
|
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.
|
|
85
121
|
"""
|
|
122
|
+
response = FAILED_REQUEST_RESPONSE
|
|
86
123
|
try:
|
|
87
|
-
url =
|
|
124
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
88
125
|
|
|
89
126
|
with req.Session() as session:
|
|
90
127
|
if self.username and self.password:
|
|
@@ -111,8 +148,11 @@ class ApiService:
|
|
|
111
148
|
)
|
|
112
149
|
except Exception as e:
|
|
113
150
|
logger.error(f"Error sending POST request: {e}")
|
|
151
|
+
raise InvalidResponseException(f"Error sending POST request: {e}")
|
|
114
152
|
else:
|
|
115
|
-
|
|
153
|
+
logger.debug(f"POST request to URL: {response.url}")
|
|
154
|
+
|
|
155
|
+
return response
|
|
116
156
|
|
|
117
157
|
def stream_post(
|
|
118
158
|
self,
|
|
@@ -125,15 +165,20 @@ class ApiService:
|
|
|
125
165
|
"""
|
|
126
166
|
Sends a streaming POST request to the specified API endpoint.
|
|
127
167
|
|
|
128
|
-
|
|
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).
|
|
129
173
|
:param data: dict - The payload to include in the POST request.
|
|
130
|
-
:param headers: dict -
|
|
131
|
-
:param verify: bool - Whether to verify SSL certificates
|
|
132
|
-
:param form: bool - Whether to send data
|
|
133
|
-
:return: Generator
|
|
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.
|
|
134
179
|
"""
|
|
135
180
|
try:
|
|
136
|
-
url =
|
|
181
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
137
182
|
|
|
138
183
|
with req.Session() as session:
|
|
139
184
|
if self.username and self.password:
|
|
@@ -159,14 +204,14 @@ class ApiService:
|
|
|
159
204
|
)
|
|
160
205
|
|
|
161
206
|
response.raise_for_status()
|
|
162
|
-
|
|
207
|
+
logger.debug(f"Streaming POST request to URL {response.url}")
|
|
163
208
|
for line in response.iter_lines(decode_unicode=True):
|
|
164
209
|
if line:
|
|
165
210
|
yield line
|
|
166
211
|
|
|
167
212
|
except Exception as e:
|
|
168
213
|
logger.error(f"Error sending streaming POST request: {e}")
|
|
169
|
-
raise
|
|
214
|
+
raise InvalidResponseException(f"Error sending streaming POST request: {e}")
|
|
170
215
|
|
|
171
216
|
def post_file_binary(
|
|
172
217
|
self,
|
|
@@ -175,8 +220,22 @@ class ApiService:
|
|
|
175
220
|
verify: bool = True,
|
|
176
221
|
file=None
|
|
177
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
|
|
178
237
|
try:
|
|
179
|
-
url =
|
|
238
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
180
239
|
|
|
181
240
|
with req.Session() as session:
|
|
182
241
|
if self.username and self.password:
|
|
@@ -196,8 +255,11 @@ class ApiService:
|
|
|
196
255
|
)
|
|
197
256
|
except Exception as e:
|
|
198
257
|
logger.error(f"Error sending POST request with binary file: {e}")
|
|
258
|
+
raise InvalidResponseException(f"Error sending POST request with binary file: {e}")
|
|
199
259
|
else:
|
|
200
|
-
|
|
260
|
+
logger.debug(f"POST request with binary file to URL: {response.url}")
|
|
261
|
+
|
|
262
|
+
return response
|
|
201
263
|
|
|
202
264
|
def post_files_multipart(
|
|
203
265
|
self,
|
|
@@ -207,8 +269,24 @@ class ApiService:
|
|
|
207
269
|
verify: bool = True,
|
|
208
270
|
files: Optional[Dict[str, str]] = None,
|
|
209
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
|
|
210
288
|
try:
|
|
211
|
-
url =
|
|
289
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
212
290
|
|
|
213
291
|
with req.Session() as session:
|
|
214
292
|
if self.username and self.password:
|
|
@@ -231,22 +309,29 @@ class ApiService:
|
|
|
231
309
|
)
|
|
232
310
|
except Exception as e:
|
|
233
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}")
|
|
234
313
|
else:
|
|
235
|
-
|
|
314
|
+
logger.debug(f"POST request with multipart files to URL: {response.url}")
|
|
315
|
+
|
|
316
|
+
return response
|
|
236
317
|
|
|
237
318
|
def put(self, endpoint: str, data: dict, headers: dict = None, verify: bool = True):
|
|
238
319
|
"""
|
|
239
320
|
Sends a PUT request to the specified API endpoint.
|
|
240
321
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
:param
|
|
245
|
-
:
|
|
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.
|
|
246
331
|
"""
|
|
332
|
+
response = FAILED_REQUEST_RESPONSE
|
|
247
333
|
try:
|
|
248
|
-
|
|
249
|
-
url = f"{self.base_url}/{endpoint}"
|
|
334
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
250
335
|
|
|
251
336
|
with req.Session() as session:
|
|
252
337
|
if self.username and self.password:
|
|
@@ -268,21 +353,29 @@ class ApiService:
|
|
|
268
353
|
)
|
|
269
354
|
except Exception as e:
|
|
270
355
|
logger.error(f"Error sending PUT request: {e}")
|
|
356
|
+
raise InvalidResponseException(f"Error sending PUT request: {e}")
|
|
271
357
|
else:
|
|
272
|
-
|
|
358
|
+
logger.debug(f"PUT request to URL: {response.url}")
|
|
359
|
+
|
|
360
|
+
return response
|
|
273
361
|
|
|
274
362
|
def delete(self, endpoint: str, headers: dict = None, data: dict = None, verify: bool = True):
|
|
275
363
|
"""
|
|
276
364
|
Sends a DELETE request to the specified API endpoint.
|
|
277
365
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
:param
|
|
282
|
-
:
|
|
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.
|
|
283
375
|
"""
|
|
376
|
+
response = FAILED_REQUEST_RESPONSE
|
|
284
377
|
try:
|
|
285
|
-
url =
|
|
378
|
+
url = self._add_endpoint_to_url(endpoint)
|
|
286
379
|
|
|
287
380
|
with req.Session() as session:
|
|
288
381
|
if self.username and self.password:
|
|
@@ -302,8 +395,19 @@ class ApiService:
|
|
|
302
395
|
)
|
|
303
396
|
except Exception as e:
|
|
304
397
|
logger.error(f"Error sending DELETE request: {e}")
|
|
398
|
+
raise InvalidResponseException(f"Error sending DELETE request: {e}")
|
|
305
399
|
else:
|
|
306
|
-
|
|
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://'))
|
|
307
411
|
|
|
308
412
|
def _add_token_to_headers(self, headers: dict = None):
|
|
309
413
|
if not headers:
|
|
@@ -314,4 +418,10 @@ class ApiService:
|
|
|
314
418
|
if "Authorization" not in headers:
|
|
315
419
|
headers["Authorization"] = f"Bearer {self.token}"
|
|
316
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}")
|
|
424
|
+
else:
|
|
425
|
+
logger.debug("Added Authorization header")
|
|
426
|
+
|
|
317
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