pygeai 0.1.6__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +11 -2
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +48 -57
- pygeai/assistant/data/__init__.py +0 -0
- pygeai/assistant/data/clients.py +15 -0
- pygeai/assistant/data_analyst/__init__.py +0 -0
- pygeai/assistant/data_analyst/clients.py +75 -0
- pygeai/assistant/data_analyst/endpoints.py +2 -0
- pygeai/assistant/endpoints.py +0 -2
- pygeai/assistant/managers.py +738 -0
- pygeai/assistant/mappers.py +153 -0
- pygeai/assistant/rag/clients.py +132 -21
- pygeai/assistant/rag/mappers.py +228 -0
- pygeai/assistant/rag/models.py +396 -0
- pygeai/assistant/rag/responses.py +10 -0
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +406 -31
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +17 -0
- pygeai/chat/managers.py +64 -0
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +9 -12
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +11 -11
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +201 -7
- pygeai/cli/commands/chat.py +875 -14
- pygeai/cli/commands/common.py +30 -26
- pygeai/cli/commands/configuration.py +84 -9
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +187 -0
- pygeai/cli/commands/evaluation.py +2069 -0
- pygeai/cli/commands/feedback.py +93 -0
- pygeai/cli/commands/files.py +312 -0
- pygeai/cli/commands/flows/__init__.py +0 -0
- pygeai/cli/commands/gam.py +349 -0
- pygeai/cli/commands/lab/__init__.py +0 -0
- pygeai/cli/commands/lab/ai_lab.py +4110 -0
- pygeai/cli/commands/lab/common.py +135 -0
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +164 -0
- pygeai/cli/commands/migrate.py +1198 -0
- pygeai/cli/commands/options.py +86 -0
- pygeai/cli/commands/organization.py +560 -98
- pygeai/cli/commands/rag.py +306 -10
- pygeai/cli/commands/rerank.py +108 -0
- pygeai/cli/commands/secrets.py +357 -0
- pygeai/cli/commands/usage_limits.py +583 -0
- pygeai/cli/commands/validators.py +209 -0
- pygeai/cli/commands/version.py +44 -0
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +171 -30
- pygeai/cli/geai_proxy.py +318 -0
- pygeai/cli/install_man.py +107 -0
- pygeai/cli/parsers.py +78 -25
- pygeai/cli/texts/help.py +712 -55
- pygeai/core/__init__.py +9 -1
- pygeai/core/base/clients.py +61 -10
- pygeai/core/base/mappers.py +208 -30
- pygeai/core/base/models.py +8 -308
- pygeai/core/base/responses.py +18 -1
- pygeai/core/base/session.py +110 -17
- pygeai/core/common/config.py +98 -16
- pygeai/core/common/decorators.py +44 -0
- pygeai/core/common/exceptions.py +104 -4
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +93 -0
- pygeai/core/embeddings/endpoints.py +1 -0
- pygeai/core/embeddings/managers.py +62 -0
- pygeai/core/embeddings/mappers.py +52 -0
- pygeai/core/embeddings/models.py +14 -0
- pygeai/core/embeddings/responses.py +31 -0
- pygeai/core/feedback/__init__.py +0 -0
- pygeai/core/feedback/clients.py +50 -0
- pygeai/core/feedback/endpoints.py +1 -0
- pygeai/core/feedback/models.py +10 -0
- pygeai/core/files/__init__.py +0 -0
- pygeai/core/files/clients.py +156 -0
- pygeai/core/files/endpoints.py +5 -0
- pygeai/core/files/managers.py +224 -0
- pygeai/core/files/mappers.py +44 -0
- pygeai/core/files/models.py +24 -0
- pygeai/core/files/responses.py +19 -0
- pygeai/core/handlers.py +32 -0
- pygeai/core/llm/__init__.py +0 -0
- pygeai/core/llm/clients.py +53 -0
- pygeai/core/llm/endpoints.py +4 -0
- pygeai/core/models.py +799 -0
- pygeai/core/plugins/__init__.py +0 -0
- pygeai/core/plugins/clients.py +32 -0
- pygeai/core/plugins/endpoints.py +1 -0
- pygeai/core/plugins/models.py +86 -0
- pygeai/core/rerank/__init__.py +0 -0
- pygeai/core/rerank/clients.py +35 -0
- pygeai/core/rerank/endpoints.py +1 -0
- pygeai/core/rerank/managers.py +47 -0
- pygeai/core/rerank/mappers.py +23 -0
- pygeai/core/rerank/models.py +27 -0
- pygeai/core/responses.py +104 -0
- pygeai/core/secrets/__init__.py +0 -0
- pygeai/core/secrets/clients.py +212 -0
- pygeai/core/secrets/endpoints.py +7 -0
- pygeai/core/services/llm/__init__.py +0 -0
- pygeai/core/services/llm/model.py +186 -0
- pygeai/core/services/llm/providers.py +15 -0
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +311 -89
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +870 -0
- pygeai/evaluation/__init__.py +0 -0
- pygeai/evaluation/clients.py +19 -0
- pygeai/evaluation/dataset/__init__.py +0 -0
- pygeai/evaluation/dataset/clients.py +514 -0
- pygeai/evaluation/dataset/endpoints.py +26 -0
- pygeai/evaluation/plan/__init__.py +0 -0
- pygeai/evaluation/plan/clients.py +302 -0
- pygeai/evaluation/plan/endpoints.py +16 -0
- pygeai/evaluation/result/__init__.py +0 -0
- pygeai/evaluation/result/clients.py +70 -0
- pygeai/evaluation/result/endpoints.py +2 -0
- pygeai/flows/__init__.py +0 -0
- pygeai/flows/endpoints.py +362 -0
- pygeai/flows/models.py +1304 -0
- pygeai/gam/__init__.py +0 -0
- pygeai/gam/clients.py +178 -0
- pygeai/gam/endpoints.py +4 -0
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -0
- pygeai/lab/agents/__init__.py +0 -0
- pygeai/lab/agents/clients.py +426 -0
- pygeai/lab/agents/endpoints.py +12 -0
- pygeai/lab/agents/mappers.py +319 -0
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +1558 -0
- pygeai/lab/models.py +1719 -0
- pygeai/lab/processes/__init__.py +0 -0
- pygeai/lab/processes/clients.py +1051 -0
- pygeai/lab/processes/endpoints.py +26 -0
- pygeai/lab/processes/mappers.py +395 -0
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/__init__.py +0 -0
- pygeai/lab/strategies/clients.py +212 -0
- pygeai/lab/strategies/endpoints.py +5 -0
- pygeai/lab/strategies/mappers.py +58 -0
- pygeai/lab/tools/__init__.py +0 -0
- pygeai/lab/tools/clients.py +465 -0
- pygeai/lab/tools/endpoints.py +13 -0
- pygeai/lab/tools/mappers.py +131 -0
- pygeai/man/__init__.py +1 -0
- pygeai/man/man1/__init__.py +1 -0
- pygeai/man/man1/geai-proxy.1 +246 -0
- pygeai/man/man1/geai.1 +2615 -0
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +603 -0
- pygeai/migration/tools.py +180 -0
- pygeai/organization/clients.py +246 -18
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/__init__.py +0 -0
- pygeai/organization/limits/clients.py +281 -0
- pygeai/organization/limits/endpoints.py +15 -0
- pygeai/organization/limits/managers.py +331 -0
- pygeai/organization/limits/mappers.py +21 -0
- pygeai/organization/managers.py +537 -0
- pygeai/organization/mappers.py +111 -46
- pygeai/organization/responses.py +61 -11
- pygeai/proxy/__init__.py +0 -0
- pygeai/proxy/clients.py +216 -0
- pygeai/proxy/config.py +128 -0
- pygeai/proxy/managers.py +232 -0
- pygeai/proxy/servers.py +304 -0
- pygeai/proxy/tool.py +69 -0
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/__init__.py +0 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_mappers.py +189 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -80
- pygeai/tests/assistants/test_managers.py +198 -0
- pygeai/tests/assistants/test_mappers.py +111 -0
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/__init__.py +0 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +154 -0
- pygeai/tests/core/base/__init__.py +0 -0
- pygeai/tests/core/base/data/__init__.py +0 -0
- pygeai/tests/core/base/data/mappers.py +117 -0
- pygeai/tests/core/base/data/models.py +312 -0
- pygeai/tests/core/base/test_mappers.py +569 -0
- pygeai/tests/core/base/test_models.py +261 -0
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/__init__.py +0 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +219 -0
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/__init__.py +0 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +99 -0
- pygeai/tests/core/rerank/test_mappers.py +54 -0
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/__init__.py +0 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_mappers.py +245 -0
- pygeai/tests/lab/test_models.py +1154 -0
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/__init__.py +0 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +402 -0
- pygeai/tests/organization/test_clients.py +615 -64
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/__init__.py +0 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/assistants/__init__.py +0 -0
- pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
- pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
- pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
- pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
- pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
- pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
- pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
- pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
- pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
- pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
- pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
- pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
- pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
- pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
- pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
- pygeai/tests/snippets/assistants/send_feedback.py +14 -0
- pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/__init__.py +0 -0
- pygeai/tests/snippets/chat/cancel_request.py +7 -0
- pygeai/tests/snippets/chat/chat_completion.py +28 -0
- pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
- pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
- pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
- pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
- pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_request_status.py +7 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/chat/send_chat_request.py +33 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/__init__.py +0 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/__init__.py +0 -0
- pygeai/tests/snippets/files/delete_file.py +9 -0
- pygeai/tests/snippets/files/get_file_content.py +10 -0
- pygeai/tests/snippets/files/get_file_data.py +9 -0
- pygeai/tests/snippets/files/get_file_list.py +6 -0
- pygeai/tests/snippets/files/upload_file.py +13 -0
- pygeai/tests/snippets/gam/__init__.py +0 -0
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/__init__.py +0 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
- pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
- pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
- pygeai/tests/snippets/lab/agents/__init__.py +0 -0
- pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
- pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
- pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
- pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/create_process.py +24 -0
- pygeai/tests/snippets/lab/processes/create_task.py +8 -0
- pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
- pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
- pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
- pygeai/tests/snippets/lab/runner_1.py +212 -0
- pygeai/tests/snippets/lab/samples/__init__.py +0 -0
- pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
- pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
- pygeai/tests/snippets/lab/tools/__init__.py +0 -0
- pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
- pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
- pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
- pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
- pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
- pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
- pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/__init__.py +0 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +23 -0
- pygeai/tests/snippets/organization/delete_project.py +7 -0
- pygeai/tests/snippets/organization/export_request_data.py +7 -0
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_data.py +7 -0
- pygeai/tests/snippets/organization/get_project_list.py +8 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
- pygeai/tests/snippets/organization/update_project.py +14 -0
- pygeai/tests/snippets/rerank/__init__.py +0 -0
- pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
- pygeai/tests/snippets/secrets/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/__init__.py +0 -0
- pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
- pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
- pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
- pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
- pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
- {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
- docs/source/conf.py +0 -45
- pygeai/core/clients.py +0 -240
- pygeai/tests/core/test_clients.py +0 -49
- pygeai-0.1.6.dist-info/METADATA +0 -92
- pygeai-0.1.6.dist-info/RECORD +0 -65
- pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
- pygeai-0.1.6.dist-info/entry_points.txt +0 -2
- /pygeai/{agent → analytics}/__init__.py +0 -0
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from collections.abc import AsyncGenerator
|
|
5
|
+
from typing import Any
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
|
|
10
|
+
from httpx_sse import SSEError, aconnect_sse
|
|
11
|
+
from pydantic import ValidationError
|
|
12
|
+
|
|
13
|
+
from a2a.client.errors import A2AClientHTTPError, A2AClientJSONError
|
|
14
|
+
from a2a.types import (
|
|
15
|
+
AgentCard,
|
|
16
|
+
CancelTaskRequest,
|
|
17
|
+
CancelTaskResponse,
|
|
18
|
+
GetTaskPushNotificationConfigRequest,
|
|
19
|
+
GetTaskPushNotificationConfigResponse,
|
|
20
|
+
GetTaskRequest,
|
|
21
|
+
GetTaskResponse,
|
|
22
|
+
SendMessageRequest,
|
|
23
|
+
SendMessageResponse,
|
|
24
|
+
SendStreamingMessageRequest,
|
|
25
|
+
SendStreamingMessageResponse,
|
|
26
|
+
SetTaskPushNotificationConfigRequest,
|
|
27
|
+
SetTaskPushNotificationConfigResponse,
|
|
28
|
+
)
|
|
29
|
+
from a2a.utils.telemetry import SpanKind, trace_class
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class A2ACardResolver:
|
|
36
|
+
"""Agent Card resolver."""
|
|
37
|
+
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
httpx_client: httpx.AsyncClient,
|
|
41
|
+
base_url: str,
|
|
42
|
+
agent_card_path: str = '/.well-known/agent.json',
|
|
43
|
+
):
|
|
44
|
+
"""Initializes the A2ACardResolver.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
httpx_client: An async HTTP client instance (e.g., httpx.AsyncClient).
|
|
48
|
+
base_url: The base URL of the agent's host.
|
|
49
|
+
agent_card_path: The path to the agent card endpoint, relative to the base URL.
|
|
50
|
+
"""
|
|
51
|
+
self.base_url = base_url.rstrip('/')
|
|
52
|
+
self.agent_card_path = agent_card_path.lstrip('/')
|
|
53
|
+
self.httpx_client = httpx_client
|
|
54
|
+
|
|
55
|
+
async def get_agent_card(
|
|
56
|
+
self,
|
|
57
|
+
relative_card_path: str | None = None,
|
|
58
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
59
|
+
) -> AgentCard:
|
|
60
|
+
"""Fetches an agent card from a specified path relative to the base_url.
|
|
61
|
+
|
|
62
|
+
If relative_card_path is None, it defaults to the resolver's configured
|
|
63
|
+
agent_card_path (for the public agent card).
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
relative_card_path: Optional path to the agent card endpoint,
|
|
67
|
+
relative to the base URL. If None, uses the default public
|
|
68
|
+
agent card path.
|
|
69
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
70
|
+
underlying httpx.get request.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
An `AgentCard` object representing the agent's capabilities.
|
|
74
|
+
|
|
75
|
+
Raises:
|
|
76
|
+
A2AClientHTTPError: If an HTTP error occurs during the request.
|
|
77
|
+
A2AClientJSONError: If the response body cannot be decoded as JSON
|
|
78
|
+
or validated against the AgentCard schema.
|
|
79
|
+
"""
|
|
80
|
+
if relative_card_path is None:
|
|
81
|
+
# Use the default public agent card path configured during initialization
|
|
82
|
+
path_segment = self.agent_card_path
|
|
83
|
+
else:
|
|
84
|
+
path_segment = relative_card_path.lstrip('/')
|
|
85
|
+
|
|
86
|
+
target_url = f'{self.base_url}/{path_segment}'
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
response = await self.httpx_client.get(
|
|
90
|
+
target_url,
|
|
91
|
+
**(http_kwargs or {}),
|
|
92
|
+
)
|
|
93
|
+
response.raise_for_status()
|
|
94
|
+
agent_card_data = response.json()
|
|
95
|
+
logger.info(
|
|
96
|
+
'Successfully fetched agent card data from %s: %s',
|
|
97
|
+
target_url,
|
|
98
|
+
agent_card_data,
|
|
99
|
+
)
|
|
100
|
+
agent_card = AgentCard.model_validate(agent_card_data)
|
|
101
|
+
except httpx.HTTPStatusError as e:
|
|
102
|
+
raise A2AClientHTTPError(
|
|
103
|
+
e.response.status_code,
|
|
104
|
+
f'Failed to fetch agent card from {target_url}: {e}',
|
|
105
|
+
) from e
|
|
106
|
+
except json.JSONDecodeError as e:
|
|
107
|
+
raise A2AClientJSONError(
|
|
108
|
+
f'Failed to parse JSON for agent card from {target_url}: {e}'
|
|
109
|
+
) from e
|
|
110
|
+
except httpx.RequestError as e:
|
|
111
|
+
raise A2AClientHTTPError(
|
|
112
|
+
503,
|
|
113
|
+
f'Network communication error fetching agent card from {target_url}: {e}',
|
|
114
|
+
) from e
|
|
115
|
+
except ValidationError as e: # Pydantic validation error
|
|
116
|
+
raise A2AClientJSONError(
|
|
117
|
+
f'Failed to validate agent card structure from {target_url}: {e.json()}'
|
|
118
|
+
) from e
|
|
119
|
+
|
|
120
|
+
return agent_card
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@trace_class(kind=SpanKind.CLIENT)
|
|
124
|
+
class A2AClient:
|
|
125
|
+
"""A2A Client for interacting with an A2A agent."""
|
|
126
|
+
|
|
127
|
+
def __init__(
|
|
128
|
+
self,
|
|
129
|
+
httpx_client: httpx.AsyncClient,
|
|
130
|
+
agent_card: AgentCard | None = None,
|
|
131
|
+
url: str | None = None,
|
|
132
|
+
):
|
|
133
|
+
"""Initializes the A2AClient.
|
|
134
|
+
|
|
135
|
+
Requires either an `AgentCard` or a direct `url` to the agent's RPC endpoint.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
httpx_client: An async HTTP client instance (e.g., httpx.AsyncClient).
|
|
139
|
+
agent_card: The agent card object. If provided, `url` is taken from `agent_card.url`.
|
|
140
|
+
url: The direct URL to the agent's A2A RPC endpoint. Required if `agent_card` is None.
|
|
141
|
+
|
|
142
|
+
Raises:
|
|
143
|
+
ValueError: If neither `agent_card` nor `url` is provided.
|
|
144
|
+
"""
|
|
145
|
+
if agent_card:
|
|
146
|
+
self.url = agent_card.url
|
|
147
|
+
elif url:
|
|
148
|
+
self.url = url
|
|
149
|
+
else:
|
|
150
|
+
raise ValueError('Must provide either agent_card or url')
|
|
151
|
+
|
|
152
|
+
self.httpx_client = httpx_client
|
|
153
|
+
|
|
154
|
+
@staticmethod
|
|
155
|
+
async def get_client_from_agent_card_url(
|
|
156
|
+
httpx_client: httpx.AsyncClient,
|
|
157
|
+
base_url: str,
|
|
158
|
+
agent_card_path: str = '/.well-known/agent.json',
|
|
159
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
160
|
+
) -> 'A2AClient':
|
|
161
|
+
"""Fetches the public AgentCard and initializes an A2A client.
|
|
162
|
+
|
|
163
|
+
This method will always fetch the public agent card. If an authenticated
|
|
164
|
+
or extended agent card is required, the A2ACardResolver should be used
|
|
165
|
+
directly to fetch the specific card, and then the A2AClient should be
|
|
166
|
+
instantiated with it.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
httpx_client: An async HTTP client instance (e.g., httpx.AsyncClient).
|
|
170
|
+
base_url: The base URL of the agent's host.
|
|
171
|
+
agent_card_path: The path to the agent card endpoint, relative to the base URL.
|
|
172
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
173
|
+
underlying httpx.get request when fetching the agent card.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
An initialized `A2AClient` instance.
|
|
177
|
+
|
|
178
|
+
Raises:
|
|
179
|
+
A2AClientHTTPError: If an HTTP error occurs fetching the agent card.
|
|
180
|
+
A2AClientJSONError: If the agent card response is invalid.
|
|
181
|
+
"""
|
|
182
|
+
agent_card: AgentCard = await A2ACardResolver(
|
|
183
|
+
httpx_client, base_url=base_url, agent_card_path=agent_card_path
|
|
184
|
+
).get_agent_card(
|
|
185
|
+
http_kwargs=http_kwargs
|
|
186
|
+
) # Fetches public card by default
|
|
187
|
+
return A2AClient(httpx_client=httpx_client, agent_card=agent_card)
|
|
188
|
+
|
|
189
|
+
async def send_message(
|
|
190
|
+
self,
|
|
191
|
+
request: SendMessageRequest,
|
|
192
|
+
*,
|
|
193
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
194
|
+
) -> SendMessageResponse:
|
|
195
|
+
"""Sends a non-streaming message request to the agent.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
request: The `SendMessageRequest` object containing the message and configuration.
|
|
199
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
200
|
+
underlying httpx.post request.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
A `SendMessageResponse` object containing the agent's response (Task or Message) or an error.
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
A2AClientHTTPError: If an HTTP error occurs during the request.
|
|
207
|
+
A2AClientJSONError: If the response body cannot be decoded as JSON or validated.
|
|
208
|
+
"""
|
|
209
|
+
if not request.id:
|
|
210
|
+
request.id = str(uuid4())
|
|
211
|
+
|
|
212
|
+
return SendMessageResponse(
|
|
213
|
+
**await self._send_request(
|
|
214
|
+
request.model_dump(mode='json', exclude_none=True),
|
|
215
|
+
http_kwargs,
|
|
216
|
+
)
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
async def send_message_streaming(
|
|
220
|
+
self,
|
|
221
|
+
request: SendStreamingMessageRequest,
|
|
222
|
+
*,
|
|
223
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
224
|
+
) -> AsyncGenerator[SendStreamingMessageResponse]:
|
|
225
|
+
"""Sends a streaming message request to the agent and yields responses as they arrive.
|
|
226
|
+
|
|
227
|
+
This method uses Server-Sent Events (SSE) to receive a stream of updates from the agent.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
request: The `SendStreamingMessageRequest` object containing the message and configuration.
|
|
231
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
232
|
+
underlying httpx.post request. A default `timeout=None` is set but can be overridden.
|
|
233
|
+
|
|
234
|
+
Yields:
|
|
235
|
+
`SendStreamingMessageResponse` objects as they are received in the SSE stream.
|
|
236
|
+
These can be Task, Message, TaskStatusUpdateEvent, or TaskArtifactUpdateEvent.
|
|
237
|
+
|
|
238
|
+
Raises:
|
|
239
|
+
A2AClientHTTPError: If an HTTP or SSE protocol error occurs during the request.
|
|
240
|
+
A2AClientJSONError: If an SSE event data cannot be decoded as JSON or validated.
|
|
241
|
+
"""
|
|
242
|
+
if not request.id:
|
|
243
|
+
request.id = str(uuid4())
|
|
244
|
+
|
|
245
|
+
# Default to no timeout for streaming, can be overridden by http_kwargs
|
|
246
|
+
http_kwargs_with_timeout: dict[str, Any] = {
|
|
247
|
+
'timeout': None,
|
|
248
|
+
**(http_kwargs or {}),
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async with aconnect_sse(
|
|
252
|
+
self.httpx_client,
|
|
253
|
+
'POST',
|
|
254
|
+
self.url,
|
|
255
|
+
json=request.model_dump(mode='json', exclude_none=True),
|
|
256
|
+
**http_kwargs_with_timeout,
|
|
257
|
+
) as event_source:
|
|
258
|
+
try:
|
|
259
|
+
async for sse in event_source.aiter_sse():
|
|
260
|
+
yield SendStreamingMessageResponse(**json.loads(sse.data))
|
|
261
|
+
except SSEError as e:
|
|
262
|
+
raise A2AClientHTTPError(
|
|
263
|
+
400,
|
|
264
|
+
f'Invalid SSE response or protocol error: {e}',
|
|
265
|
+
) from e
|
|
266
|
+
except json.JSONDecodeError as e:
|
|
267
|
+
raise A2AClientJSONError(str(e)) from e
|
|
268
|
+
except httpx.RequestError as e:
|
|
269
|
+
raise A2AClientHTTPError(
|
|
270
|
+
503, f'Network communication error: {e}'
|
|
271
|
+
) from e
|
|
272
|
+
|
|
273
|
+
async def _send_request(
|
|
274
|
+
self,
|
|
275
|
+
rpc_request_payload: dict[str, Any],
|
|
276
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
277
|
+
) -> dict[str, Any]:
|
|
278
|
+
"""Sends a non-streaming JSON-RPC request to the agent.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
rpc_request_payload: JSON RPC payload for sending the request.
|
|
282
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
283
|
+
underlying httpx.post request.
|
|
284
|
+
|
|
285
|
+
Returns:
|
|
286
|
+
The JSON response payload as a dictionary.
|
|
287
|
+
|
|
288
|
+
Raises:
|
|
289
|
+
A2AClientHTTPError: If an HTTP error occurs during the request.
|
|
290
|
+
A2AClientJSONError: If the response body cannot be decoded as JSON.
|
|
291
|
+
"""
|
|
292
|
+
try:
|
|
293
|
+
response = await self.httpx_client.post(
|
|
294
|
+
self.url, json=rpc_request_payload, **(http_kwargs or {})
|
|
295
|
+
)
|
|
296
|
+
response.raise_for_status()
|
|
297
|
+
return response.json()
|
|
298
|
+
except httpx.HTTPStatusError as e:
|
|
299
|
+
raise A2AClientHTTPError(e.response.status_code, str(e)) from e
|
|
300
|
+
except json.JSONDecodeError as e:
|
|
301
|
+
raise A2AClientJSONError(str(e)) from e
|
|
302
|
+
except httpx.RequestError as e:
|
|
303
|
+
raise A2AClientHTTPError(
|
|
304
|
+
503, f'Network communication error: {e}'
|
|
305
|
+
) from e
|
|
306
|
+
|
|
307
|
+
async def get_task(
|
|
308
|
+
self,
|
|
309
|
+
request: GetTaskRequest,
|
|
310
|
+
*,
|
|
311
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
312
|
+
) -> GetTaskResponse:
|
|
313
|
+
"""Retrieves the current state and history of a specific task.
|
|
314
|
+
|
|
315
|
+
Args:
|
|
316
|
+
request: The `GetTaskRequest` object specifying the task ID and history length.
|
|
317
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
318
|
+
underlying httpx.post request.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
A `GetTaskResponse` object containing the Task or an error.
|
|
322
|
+
|
|
323
|
+
Raises:
|
|
324
|
+
A2AClientHTTPError: If an HTTP error occurs during the request.
|
|
325
|
+
A2AClientJSONError: If the response body cannot be decoded as JSON or validated.
|
|
326
|
+
"""
|
|
327
|
+
if not request.id:
|
|
328
|
+
request.id = str(uuid4())
|
|
329
|
+
|
|
330
|
+
return GetTaskResponse(
|
|
331
|
+
**await self._send_request(
|
|
332
|
+
request.model_dump(mode='json', exclude_none=True),
|
|
333
|
+
http_kwargs,
|
|
334
|
+
)
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
async def cancel_task(
|
|
338
|
+
self,
|
|
339
|
+
request: CancelTaskRequest,
|
|
340
|
+
*,
|
|
341
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
342
|
+
) -> CancelTaskResponse:
|
|
343
|
+
"""Requests the agent to cancel a specific task.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
request: The `CancelTaskRequest` object specifying the task ID.
|
|
347
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
348
|
+
underlying httpx.post request.
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
A `CancelTaskResponse` object containing the updated Task with canceled status or an error.
|
|
352
|
+
|
|
353
|
+
Raises:
|
|
354
|
+
A2AClientHTTPError: If an HTTP error occurs during the request.
|
|
355
|
+
A2AClientJSONError: If the response body cannot be decoded as JSON or validated.
|
|
356
|
+
"""
|
|
357
|
+
if not request.id:
|
|
358
|
+
request.id = str(uuid4())
|
|
359
|
+
|
|
360
|
+
return CancelTaskResponse(
|
|
361
|
+
**await self._send_request(
|
|
362
|
+
request.model_dump(mode='json', exclude_none=True),
|
|
363
|
+
http_kwargs,
|
|
364
|
+
)
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
async def set_task_callback(
|
|
368
|
+
self,
|
|
369
|
+
request: SetTaskPushNotificationConfigRequest,
|
|
370
|
+
*,
|
|
371
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
372
|
+
) -> SetTaskPushNotificationConfigResponse:
|
|
373
|
+
"""Sets or updates the push notification configuration for a specific task.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
request: The `SetTaskPushNotificationConfigRequest` object specifying the task ID and configuration.
|
|
377
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
378
|
+
underlying httpx.post request.
|
|
379
|
+
|
|
380
|
+
Returns:
|
|
381
|
+
A `SetTaskPushNotificationConfigResponse` object containing the confirmation or an error.
|
|
382
|
+
|
|
383
|
+
Raises:
|
|
384
|
+
A2AClientHTTPError: If an HTTP error occurs during the request.
|
|
385
|
+
A2AClientJSONError: If the response body cannot be decoded as JSON or validated.
|
|
386
|
+
"""
|
|
387
|
+
if not request.id:
|
|
388
|
+
request.id = str(uuid4())
|
|
389
|
+
|
|
390
|
+
return SetTaskPushNotificationConfigResponse(
|
|
391
|
+
**await self._send_request(
|
|
392
|
+
request.model_dump(mode='json', exclude_none=True),
|
|
393
|
+
http_kwargs,
|
|
394
|
+
)
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
async def get_task_callback(
|
|
398
|
+
self,
|
|
399
|
+
request: GetTaskPushNotificationConfigRequest,
|
|
400
|
+
*,
|
|
401
|
+
http_kwargs: dict[str, Any] | None = None,
|
|
402
|
+
) -> GetTaskPushNotificationConfigResponse:
|
|
403
|
+
"""Retrieves the push notification configuration for a specific task.
|
|
404
|
+
|
|
405
|
+
Args:
|
|
406
|
+
request: The `GetTaskPushNotificationConfigRequest` object specifying the task ID.
|
|
407
|
+
http_kwargs: Optional dictionary of keyword arguments to pass to the
|
|
408
|
+
underlying httpx.post request.
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
A `GetTaskPushNotificationConfigResponse` object containing the configuration or an error.
|
|
412
|
+
|
|
413
|
+
Raises:
|
|
414
|
+
A2AClientHTTPError: If an HTTP error occurs during the request.
|
|
415
|
+
A2AClientJSONError: If the response body cannot be decoded as JSON or validated.
|
|
416
|
+
"""
|
|
417
|
+
if not request.id:
|
|
418
|
+
request.id = str(uuid4())
|
|
419
|
+
|
|
420
|
+
return GetTaskPushNotificationConfigResponse(
|
|
421
|
+
**await self._send_request(
|
|
422
|
+
request.model_dump(mode='json', exclude_none=True),
|
|
423
|
+
http_kwargs,
|
|
424
|
+
)
|
|
425
|
+
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Custom exceptions for the A2A client."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class A2AClientError(Exception):
|
|
5
|
+
"""Base exception for A2A Client errors."""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class A2AClientHTTPError(A2AClientError):
|
|
9
|
+
"""Client exception for HTTP errors received from the server."""
|
|
10
|
+
|
|
11
|
+
def __init__(self, status_code: int, message: str):
|
|
12
|
+
"""Initializes the A2AClientHTTPError.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
status_code: The HTTP status code of the response.
|
|
16
|
+
message: A descriptive error message.
|
|
17
|
+
"""
|
|
18
|
+
self.status_code = status_code
|
|
19
|
+
self.message = message
|
|
20
|
+
super().__init__(f'HTTP Error {status_code}: {message}')
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class A2AClientJSONError(A2AClientError):
|
|
24
|
+
"""Client exception for JSON errors during response parsing or validation."""
|
|
25
|
+
|
|
26
|
+
def __init__(self, message: str):
|
|
27
|
+
"""Initializes the A2AClientJSONError.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
message: A descriptive error message.
|
|
31
|
+
"""
|
|
32
|
+
self.message = message
|
|
33
|
+
super().__init__(f'JSON Error: {message}')
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Helper functions for the A2A client."""
|
|
2
|
+
|
|
3
|
+
from uuid import uuid4
|
|
4
|
+
|
|
5
|
+
from a2a.types import Message, Part, Role, TextPart
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def create_text_message_object(
|
|
9
|
+
role: Role = Role.user, content: str = ''
|
|
10
|
+
) -> Message:
|
|
11
|
+
"""Create a Message object containing a single TextPart.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
role: The role of the message sender (user or agent). Defaults to Role.user.
|
|
15
|
+
content: The text content of the message. Defaults to an empty string.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
A `Message` object with a new UUID messageId.
|
|
19
|
+
"""
|
|
20
|
+
return Message(
|
|
21
|
+
role=role, parts=[Part(TextPart(text=content))], messageId=str(uuid4())
|
|
22
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Server-side components for implementing an A2A agent."""
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Components for executing agent logic within the A2A server."""
|
|
2
|
+
|
|
3
|
+
from a2a.server.agent_execution.agent_executor import AgentExecutor
|
|
4
|
+
from a2a.server.agent_execution.context import RequestContext
|
|
5
|
+
from a2a.server.agent_execution.request_context_builder import (
|
|
6
|
+
RequestContextBuilder,
|
|
7
|
+
)
|
|
8
|
+
from a2a.server.agent_execution.simple_request_context_builder import (
|
|
9
|
+
SimpleRequestContextBuilder,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
'AgentExecutor',
|
|
15
|
+
'RequestContext',
|
|
16
|
+
'RequestContextBuilder',
|
|
17
|
+
'SimpleRequestContextBuilder',
|
|
18
|
+
]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
from a2a.server.agent_execution.context import RequestContext
|
|
4
|
+
from a2a.server.events.event_queue import EventQueue
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AgentExecutor(ABC):
|
|
8
|
+
"""Agent Executor interface.
|
|
9
|
+
|
|
10
|
+
Implementations of this interface contain the core logic of the agent,
|
|
11
|
+
executing tasks based on requests and publishing updates to an event queue.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
@abstractmethod
|
|
15
|
+
async def execute(
|
|
16
|
+
self, context: RequestContext, event_queue: EventQueue
|
|
17
|
+
) -> None:
|
|
18
|
+
"""Execute the agent's logic for a given request context.
|
|
19
|
+
|
|
20
|
+
The agent should read necessary information from the `context` and
|
|
21
|
+
publish `Task` or `Message` events, or `TaskStatusUpdateEvent` /
|
|
22
|
+
`TaskArtifactUpdateEvent` to the `event_queue`. This method should
|
|
23
|
+
return once the agent's execution for this request is complete or
|
|
24
|
+
yields control (e.g., enters an input-required state).
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
context: The request context containing the message, task ID, etc.
|
|
28
|
+
event_queue: The queue to publish events to.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
@abstractmethod
|
|
32
|
+
async def cancel(
|
|
33
|
+
self, context: RequestContext, event_queue: EventQueue
|
|
34
|
+
) -> None:
|
|
35
|
+
"""Request the agent to cancel an ongoing task.
|
|
36
|
+
|
|
37
|
+
The agent should attempt to stop the task identified by the task_id
|
|
38
|
+
in the context and publish a `TaskStatusUpdateEvent` with state
|
|
39
|
+
`TaskState.canceled` to the `event_queue`.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
context: The request context containing the task ID to cancel.
|
|
43
|
+
event_queue: The queue to publish the cancellation status update to.
|
|
44
|
+
"""
|