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,327 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncIterable
|
|
4
|
+
|
|
5
|
+
from a2a.server.context import ServerCallContext
|
|
6
|
+
from a2a.server.request_handlers.request_handler import RequestHandler
|
|
7
|
+
from a2a.server.request_handlers.response_helpers import prepare_response_object
|
|
8
|
+
from a2a.types import (
|
|
9
|
+
AgentCard,
|
|
10
|
+
CancelTaskRequest,
|
|
11
|
+
CancelTaskResponse,
|
|
12
|
+
CancelTaskSuccessResponse,
|
|
13
|
+
GetTaskPushNotificationConfigRequest,
|
|
14
|
+
GetTaskPushNotificationConfigResponse,
|
|
15
|
+
GetTaskPushNotificationConfigSuccessResponse,
|
|
16
|
+
GetTaskRequest,
|
|
17
|
+
GetTaskResponse,
|
|
18
|
+
GetTaskSuccessResponse,
|
|
19
|
+
InternalError,
|
|
20
|
+
JSONRPCErrorResponse,
|
|
21
|
+
Message,
|
|
22
|
+
SendMessageRequest,
|
|
23
|
+
SendMessageResponse,
|
|
24
|
+
SendMessageSuccessResponse,
|
|
25
|
+
SendStreamingMessageRequest,
|
|
26
|
+
SendStreamingMessageResponse,
|
|
27
|
+
SendStreamingMessageSuccessResponse,
|
|
28
|
+
SetTaskPushNotificationConfigRequest,
|
|
29
|
+
SetTaskPushNotificationConfigResponse,
|
|
30
|
+
SetTaskPushNotificationConfigSuccessResponse,
|
|
31
|
+
Task,
|
|
32
|
+
TaskArtifactUpdateEvent,
|
|
33
|
+
TaskNotFoundError,
|
|
34
|
+
TaskPushNotificationConfig,
|
|
35
|
+
TaskResubscriptionRequest,
|
|
36
|
+
TaskStatusUpdateEvent,
|
|
37
|
+
)
|
|
38
|
+
from a2a.utils.errors import ServerError
|
|
39
|
+
from a2a.utils.helpers import validate
|
|
40
|
+
from a2a.utils.telemetry import SpanKind, trace_class
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
logger = logging.getLogger(__name__)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@trace_class(kind=SpanKind.SERVER)
|
|
47
|
+
class JSONRPCHandler:
|
|
48
|
+
"""Maps incoming JSON-RPC requests to the appropriate request handler method and formats responses."""
|
|
49
|
+
|
|
50
|
+
def __init__(
|
|
51
|
+
self,
|
|
52
|
+
agent_card: AgentCard,
|
|
53
|
+
request_handler: RequestHandler,
|
|
54
|
+
):
|
|
55
|
+
"""Initializes the JSONRPCHandler.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
agent_card: The AgentCard describing the agent's capabilities.
|
|
59
|
+
request_handler: The underlying `RequestHandler` instance to delegate requests to.
|
|
60
|
+
"""
|
|
61
|
+
self.agent_card = agent_card
|
|
62
|
+
self.request_handler = request_handler
|
|
63
|
+
|
|
64
|
+
async def on_message_send(
|
|
65
|
+
self,
|
|
66
|
+
request: SendMessageRequest,
|
|
67
|
+
context: ServerCallContext | None = None,
|
|
68
|
+
) -> SendMessageResponse:
|
|
69
|
+
"""Handles the 'message/send' JSON-RPC method.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
request: The incoming `SendMessageRequest` object.
|
|
73
|
+
context: Context provided by the server.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
A `SendMessageResponse` object containing the result (Task or Message)
|
|
77
|
+
or a JSON-RPC error response if a `ServerError` is raised by the handler.
|
|
78
|
+
"""
|
|
79
|
+
# TODO: Wrap in error handler to return error states
|
|
80
|
+
try:
|
|
81
|
+
task_or_message = await self.request_handler.on_message_send(
|
|
82
|
+
request.params, context
|
|
83
|
+
)
|
|
84
|
+
return prepare_response_object(
|
|
85
|
+
request.id,
|
|
86
|
+
task_or_message,
|
|
87
|
+
(Task, Message),
|
|
88
|
+
SendMessageSuccessResponse,
|
|
89
|
+
SendMessageResponse,
|
|
90
|
+
)
|
|
91
|
+
except ServerError as e:
|
|
92
|
+
return SendMessageResponse(
|
|
93
|
+
root=JSONRPCErrorResponse(
|
|
94
|
+
id=request.id, error=e.error if e.error else InternalError()
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
@validate(
|
|
99
|
+
lambda self: self.agent_card.capabilities.streaming,
|
|
100
|
+
'Streaming is not supported by the agent',
|
|
101
|
+
)
|
|
102
|
+
async def on_message_send_stream(
|
|
103
|
+
self,
|
|
104
|
+
request: SendStreamingMessageRequest,
|
|
105
|
+
context: ServerCallContext | None = None,
|
|
106
|
+
) -> AsyncIterable[SendStreamingMessageResponse]:
|
|
107
|
+
"""Handles the 'message/stream' JSON-RPC method.
|
|
108
|
+
|
|
109
|
+
Yields response objects as they are produced by the underlying handler's stream.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
request: The incoming `SendStreamingMessageRequest` object.
|
|
113
|
+
context: Context provided by the server.
|
|
114
|
+
|
|
115
|
+
Yields:
|
|
116
|
+
`SendStreamingMessageResponse` objects containing streaming events
|
|
117
|
+
(Task, Message, TaskStatusUpdateEvent, TaskArtifactUpdateEvent)
|
|
118
|
+
or JSON-RPC error responses if a `ServerError` is raised.
|
|
119
|
+
"""
|
|
120
|
+
try:
|
|
121
|
+
async for event in self.request_handler.on_message_send_stream(
|
|
122
|
+
request.params, context
|
|
123
|
+
):
|
|
124
|
+
yield prepare_response_object(
|
|
125
|
+
request.id,
|
|
126
|
+
event,
|
|
127
|
+
(
|
|
128
|
+
Task,
|
|
129
|
+
Message,
|
|
130
|
+
TaskArtifactUpdateEvent,
|
|
131
|
+
TaskStatusUpdateEvent,
|
|
132
|
+
),
|
|
133
|
+
SendStreamingMessageSuccessResponse,
|
|
134
|
+
SendStreamingMessageResponse,
|
|
135
|
+
)
|
|
136
|
+
except ServerError as e:
|
|
137
|
+
yield SendStreamingMessageResponse(
|
|
138
|
+
root=JSONRPCErrorResponse(
|
|
139
|
+
id=request.id, error=e.error if e.error else InternalError()
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
async def on_cancel_task(
|
|
144
|
+
self,
|
|
145
|
+
request: CancelTaskRequest,
|
|
146
|
+
context: ServerCallContext | None = None,
|
|
147
|
+
) -> CancelTaskResponse:
|
|
148
|
+
"""Handles the 'tasks/cancel' JSON-RPC method.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
request: The incoming `CancelTaskRequest` object.
|
|
152
|
+
context: Context provided by the server.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
A `CancelTaskResponse` object containing the updated Task or a JSON-RPC error.
|
|
156
|
+
"""
|
|
157
|
+
try:
|
|
158
|
+
task = await self.request_handler.on_cancel_task(
|
|
159
|
+
request.params, context
|
|
160
|
+
)
|
|
161
|
+
if task:
|
|
162
|
+
return prepare_response_object(
|
|
163
|
+
request.id,
|
|
164
|
+
task,
|
|
165
|
+
(Task,),
|
|
166
|
+
CancelTaskSuccessResponse,
|
|
167
|
+
CancelTaskResponse,
|
|
168
|
+
)
|
|
169
|
+
raise ServerError(error=TaskNotFoundError())
|
|
170
|
+
except ServerError as e:
|
|
171
|
+
return CancelTaskResponse(
|
|
172
|
+
root=JSONRPCErrorResponse(
|
|
173
|
+
id=request.id, error=e.error if e.error else InternalError()
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
async def on_resubscribe_to_task(
|
|
178
|
+
self,
|
|
179
|
+
request: TaskResubscriptionRequest,
|
|
180
|
+
context: ServerCallContext | None = None,
|
|
181
|
+
) -> AsyncIterable[SendStreamingMessageResponse]:
|
|
182
|
+
"""Handles the 'tasks/resubscribe' JSON-RPC method.
|
|
183
|
+
|
|
184
|
+
Yields response objects as they are produced by the underlying handler's stream.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
request: The incoming `TaskResubscriptionRequest` object.
|
|
188
|
+
context: Context provided by the server.
|
|
189
|
+
|
|
190
|
+
Yields:
|
|
191
|
+
`SendStreamingMessageResponse` objects containing streaming events
|
|
192
|
+
or JSON-RPC error responses if a `ServerError` is raised.
|
|
193
|
+
"""
|
|
194
|
+
try:
|
|
195
|
+
async for event in self.request_handler.on_resubscribe_to_task(
|
|
196
|
+
request.params, context
|
|
197
|
+
):
|
|
198
|
+
yield prepare_response_object(
|
|
199
|
+
request.id,
|
|
200
|
+
event,
|
|
201
|
+
(
|
|
202
|
+
Task,
|
|
203
|
+
Message,
|
|
204
|
+
TaskArtifactUpdateEvent,
|
|
205
|
+
TaskStatusUpdateEvent,
|
|
206
|
+
),
|
|
207
|
+
SendStreamingMessageSuccessResponse,
|
|
208
|
+
SendStreamingMessageResponse,
|
|
209
|
+
)
|
|
210
|
+
except ServerError as e:
|
|
211
|
+
yield SendStreamingMessageResponse(
|
|
212
|
+
root=JSONRPCErrorResponse(
|
|
213
|
+
id=request.id, error=e.error if e.error else InternalError()
|
|
214
|
+
)
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
async def get_push_notification(
|
|
218
|
+
self,
|
|
219
|
+
request: GetTaskPushNotificationConfigRequest,
|
|
220
|
+
context: ServerCallContext | None = None,
|
|
221
|
+
) -> GetTaskPushNotificationConfigResponse:
|
|
222
|
+
"""Handles the 'tasks/pushNotificationConfig/get' JSON-RPC method.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
request: The incoming `GetTaskPushNotificationConfigRequest` object.
|
|
226
|
+
context: Context provided by the server.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
A `GetTaskPushNotificationConfigResponse` object containing the config or a JSON-RPC error.
|
|
230
|
+
"""
|
|
231
|
+
try:
|
|
232
|
+
config = (
|
|
233
|
+
await self.request_handler.on_get_task_push_notification_config(
|
|
234
|
+
request.params, context
|
|
235
|
+
)
|
|
236
|
+
)
|
|
237
|
+
return prepare_response_object(
|
|
238
|
+
request.id,
|
|
239
|
+
config,
|
|
240
|
+
(TaskPushNotificationConfig,),
|
|
241
|
+
GetTaskPushNotificationConfigSuccessResponse,
|
|
242
|
+
GetTaskPushNotificationConfigResponse,
|
|
243
|
+
)
|
|
244
|
+
except ServerError as e:
|
|
245
|
+
return GetTaskPushNotificationConfigResponse(
|
|
246
|
+
root=JSONRPCErrorResponse(
|
|
247
|
+
id=request.id, error=e.error if e.error else InternalError()
|
|
248
|
+
)
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
@validate(
|
|
252
|
+
lambda self: self.agent_card.capabilities.pushNotifications,
|
|
253
|
+
'Push notifications are not supported by the agent',
|
|
254
|
+
)
|
|
255
|
+
async def set_push_notification(
|
|
256
|
+
self,
|
|
257
|
+
request: SetTaskPushNotificationConfigRequest,
|
|
258
|
+
context: ServerCallContext | None = None,
|
|
259
|
+
) -> SetTaskPushNotificationConfigResponse:
|
|
260
|
+
"""Handles the 'tasks/pushNotificationConfig/set' JSON-RPC method.
|
|
261
|
+
|
|
262
|
+
Requires the agent to support push notifications.
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
request: The incoming `SetTaskPushNotificationConfigRequest` object.
|
|
266
|
+
context: Context provided by the server.
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
A `SetTaskPushNotificationConfigResponse` object containing the config or a JSON-RPC error.
|
|
270
|
+
|
|
271
|
+
Raises:
|
|
272
|
+
ServerError: If push notifications are not supported by the agent
|
|
273
|
+
(due to the `@validate` decorator).
|
|
274
|
+
"""
|
|
275
|
+
try:
|
|
276
|
+
config = (
|
|
277
|
+
await self.request_handler.on_set_task_push_notification_config(
|
|
278
|
+
request.params, context
|
|
279
|
+
)
|
|
280
|
+
)
|
|
281
|
+
return prepare_response_object(
|
|
282
|
+
request.id,
|
|
283
|
+
config,
|
|
284
|
+
(TaskPushNotificationConfig,),
|
|
285
|
+
SetTaskPushNotificationConfigSuccessResponse,
|
|
286
|
+
SetTaskPushNotificationConfigResponse,
|
|
287
|
+
)
|
|
288
|
+
except ServerError as e:
|
|
289
|
+
return SetTaskPushNotificationConfigResponse(
|
|
290
|
+
root=JSONRPCErrorResponse(
|
|
291
|
+
id=request.id, error=e.error if e.error else InternalError()
|
|
292
|
+
)
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
async def on_get_task(
|
|
296
|
+
self,
|
|
297
|
+
request: GetTaskRequest,
|
|
298
|
+
context: ServerCallContext | None = None,
|
|
299
|
+
) -> GetTaskResponse:
|
|
300
|
+
"""Handles the 'tasks/get' JSON-RPC method.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
request: The incoming `GetTaskRequest` object.
|
|
304
|
+
context: Context provided by the server.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
A `GetTaskResponse` object containing the Task or a JSON-RPC error.
|
|
308
|
+
"""
|
|
309
|
+
try:
|
|
310
|
+
task = await self.request_handler.on_get_task(
|
|
311
|
+
request.params, context
|
|
312
|
+
)
|
|
313
|
+
if task:
|
|
314
|
+
return prepare_response_object(
|
|
315
|
+
request.id,
|
|
316
|
+
task,
|
|
317
|
+
(Task,),
|
|
318
|
+
GetTaskSuccessResponse,
|
|
319
|
+
GetTaskResponse,
|
|
320
|
+
)
|
|
321
|
+
raise ServerError(error=TaskNotFoundError())
|
|
322
|
+
except ServerError as e:
|
|
323
|
+
return GetTaskResponse(
|
|
324
|
+
root=JSONRPCErrorResponse(
|
|
325
|
+
id=request.id, error=e.error if e.error else InternalError()
|
|
326
|
+
)
|
|
327
|
+
)
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from collections.abc import AsyncGenerator
|
|
3
|
+
|
|
4
|
+
from a2a.server.context import ServerCallContext
|
|
5
|
+
from a2a.server.events.event_queue import Event
|
|
6
|
+
from a2a.types import (
|
|
7
|
+
Message,
|
|
8
|
+
MessageSendParams,
|
|
9
|
+
Task,
|
|
10
|
+
TaskIdParams,
|
|
11
|
+
TaskPushNotificationConfig,
|
|
12
|
+
TaskQueryParams,
|
|
13
|
+
UnsupportedOperationError,
|
|
14
|
+
)
|
|
15
|
+
from a2a.utils.errors import ServerError
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RequestHandler(ABC):
|
|
19
|
+
"""A2A request handler interface.
|
|
20
|
+
|
|
21
|
+
This interface defines the methods that an A2A server implementation must
|
|
22
|
+
provide to handle incoming JSON-RPC requests.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
async def on_get_task(
|
|
27
|
+
self,
|
|
28
|
+
params: TaskQueryParams,
|
|
29
|
+
context: ServerCallContext | None = None,
|
|
30
|
+
) -> Task | None:
|
|
31
|
+
"""Handles the 'tasks/get' method.
|
|
32
|
+
|
|
33
|
+
Retrieves the state and history of a specific task.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
params: Parameters specifying the task ID and optionally history length.
|
|
37
|
+
context: Context provided by the server.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
The `Task` object if found, otherwise `None`.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
async def on_cancel_task(
|
|
45
|
+
self,
|
|
46
|
+
params: TaskIdParams,
|
|
47
|
+
context: ServerCallContext | None = None,
|
|
48
|
+
) -> Task | None:
|
|
49
|
+
"""Handles the 'tasks/cancel' method.
|
|
50
|
+
|
|
51
|
+
Requests the agent to cancel an ongoing task.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
params: Parameters specifying the task ID.
|
|
55
|
+
context: Context provided by the server.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
The `Task` object with its status updated to canceled, or `None` if the task was not found.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
@abstractmethod
|
|
62
|
+
async def on_message_send(
|
|
63
|
+
self,
|
|
64
|
+
params: MessageSendParams,
|
|
65
|
+
context: ServerCallContext | None = None,
|
|
66
|
+
) -> Task | Message:
|
|
67
|
+
"""Handles the 'message/send' method (non-streaming).
|
|
68
|
+
|
|
69
|
+
Sends a message to the agent to create, continue, or restart a task,
|
|
70
|
+
and waits for the final result (Task or Message).
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
params: Parameters including the message and configuration.
|
|
74
|
+
context: Context provided by the server.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
The final `Task` object or a final `Message` object.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
@abstractmethod
|
|
81
|
+
async def on_message_send_stream(
|
|
82
|
+
self,
|
|
83
|
+
params: MessageSendParams,
|
|
84
|
+
context: ServerCallContext | None = None,
|
|
85
|
+
) -> AsyncGenerator[Event]:
|
|
86
|
+
"""Handles the 'message/stream' method (streaming).
|
|
87
|
+
|
|
88
|
+
Sends a message to the agent and yields stream events as they are
|
|
89
|
+
produced (Task updates, Message chunks, Artifact updates).
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
params: Parameters including the message and configuration.
|
|
93
|
+
context: Context provided by the server.
|
|
94
|
+
|
|
95
|
+
Yields:
|
|
96
|
+
`Event` objects from the agent's execution.
|
|
97
|
+
|
|
98
|
+
Raises:
|
|
99
|
+
ServerError(UnsupportedOperationError): By default, if not implemented.
|
|
100
|
+
"""
|
|
101
|
+
raise ServerError(error=UnsupportedOperationError())
|
|
102
|
+
yield
|
|
103
|
+
|
|
104
|
+
@abstractmethod
|
|
105
|
+
async def on_set_task_push_notification_config(
|
|
106
|
+
self,
|
|
107
|
+
params: TaskPushNotificationConfig,
|
|
108
|
+
context: ServerCallContext | None = None,
|
|
109
|
+
) -> TaskPushNotificationConfig:
|
|
110
|
+
"""Handles the 'tasks/pushNotificationConfig/set' method.
|
|
111
|
+
|
|
112
|
+
Sets or updates the push notification configuration for a task.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
params: Parameters including the task ID and push notification configuration.
|
|
116
|
+
context: Context provided by the server.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
The provided `TaskPushNotificationConfig` upon success.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
@abstractmethod
|
|
123
|
+
async def on_get_task_push_notification_config(
|
|
124
|
+
self,
|
|
125
|
+
params: TaskIdParams,
|
|
126
|
+
context: ServerCallContext | None = None,
|
|
127
|
+
) -> TaskPushNotificationConfig:
|
|
128
|
+
"""Handles the 'tasks/pushNotificationConfig/get' method.
|
|
129
|
+
|
|
130
|
+
Retrieves the current push notification configuration for a task.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
params: Parameters including the task ID.
|
|
134
|
+
context: Context provided by the server.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
The `TaskPushNotificationConfig` for the task.
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
@abstractmethod
|
|
141
|
+
async def on_resubscribe_to_task(
|
|
142
|
+
self,
|
|
143
|
+
params: TaskIdParams,
|
|
144
|
+
context: ServerCallContext | None = None,
|
|
145
|
+
) -> AsyncGenerator[Event]:
|
|
146
|
+
"""Handles the 'tasks/resubscribe' method.
|
|
147
|
+
|
|
148
|
+
Allows a client to re-subscribe to a running streaming task's event stream.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
params: Parameters including the task ID.
|
|
152
|
+
context: Context provided by the server.
|
|
153
|
+
|
|
154
|
+
Yields:
|
|
155
|
+
`Event` objects from the agent's ongoing execution for the specified task.
|
|
156
|
+
|
|
157
|
+
Raises:
|
|
158
|
+
ServerError(UnsupportedOperationError): By default, if not implemented.
|
|
159
|
+
"""
|
|
160
|
+
raise ServerError(error=UnsupportedOperationError())
|
|
161
|
+
yield
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""Helper functions for building A2A JSON-RPC responses."""
|
|
2
|
+
|
|
3
|
+
# response types
|
|
4
|
+
from typing import TypeVar
|
|
5
|
+
|
|
6
|
+
from a2a.types import (
|
|
7
|
+
A2AError,
|
|
8
|
+
CancelTaskResponse,
|
|
9
|
+
CancelTaskSuccessResponse,
|
|
10
|
+
GetTaskPushNotificationConfigResponse,
|
|
11
|
+
GetTaskPushNotificationConfigSuccessResponse,
|
|
12
|
+
GetTaskResponse,
|
|
13
|
+
GetTaskSuccessResponse,
|
|
14
|
+
InvalidAgentResponseError,
|
|
15
|
+
JSONRPCError,
|
|
16
|
+
JSONRPCErrorResponse,
|
|
17
|
+
Message,
|
|
18
|
+
SendMessageResponse,
|
|
19
|
+
SendMessageSuccessResponse,
|
|
20
|
+
SendStreamingMessageResponse,
|
|
21
|
+
SendStreamingMessageSuccessResponse,
|
|
22
|
+
SetTaskPushNotificationConfigResponse,
|
|
23
|
+
SetTaskPushNotificationConfigSuccessResponse,
|
|
24
|
+
Task,
|
|
25
|
+
TaskArtifactUpdateEvent,
|
|
26
|
+
TaskPushNotificationConfig,
|
|
27
|
+
TaskStatusUpdateEvent,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
RT = TypeVar(
|
|
32
|
+
'RT',
|
|
33
|
+
GetTaskResponse,
|
|
34
|
+
CancelTaskResponse,
|
|
35
|
+
SendMessageResponse,
|
|
36
|
+
SetTaskPushNotificationConfigResponse,
|
|
37
|
+
GetTaskPushNotificationConfigResponse,
|
|
38
|
+
SendStreamingMessageResponse,
|
|
39
|
+
)
|
|
40
|
+
"""Type variable for RootModel response types."""
|
|
41
|
+
|
|
42
|
+
# success types
|
|
43
|
+
SPT = TypeVar(
|
|
44
|
+
'SPT',
|
|
45
|
+
GetTaskSuccessResponse,
|
|
46
|
+
CancelTaskSuccessResponse,
|
|
47
|
+
SendMessageSuccessResponse,
|
|
48
|
+
SetTaskPushNotificationConfigSuccessResponse,
|
|
49
|
+
GetTaskPushNotificationConfigSuccessResponse,
|
|
50
|
+
SendStreamingMessageSuccessResponse,
|
|
51
|
+
)
|
|
52
|
+
"""Type variable for SuccessResponse types."""
|
|
53
|
+
|
|
54
|
+
# result types
|
|
55
|
+
EventTypes = (
|
|
56
|
+
Task
|
|
57
|
+
| Message
|
|
58
|
+
| TaskArtifactUpdateEvent
|
|
59
|
+
| TaskStatusUpdateEvent
|
|
60
|
+
| TaskPushNotificationConfig
|
|
61
|
+
| A2AError
|
|
62
|
+
| JSONRPCError
|
|
63
|
+
)
|
|
64
|
+
"""Type alias for possible event types produced by handlers."""
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def build_error_response(
|
|
68
|
+
request_id: str | int | None,
|
|
69
|
+
error: A2AError | JSONRPCError,
|
|
70
|
+
response_wrapper_type: type[RT],
|
|
71
|
+
) -> RT:
|
|
72
|
+
"""Helper method to build a JSONRPCErrorResponse wrapped in the appropriate response type.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
request_id: The ID of the request that caused the error.
|
|
76
|
+
error: The A2AError or JSONRPCError object.
|
|
77
|
+
response_wrapper_type: The Pydantic RootModel type that wraps the response
|
|
78
|
+
for the specific RPC method (e.g., `SendMessageResponse`).
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
A Pydantic model representing the JSON-RPC error response,
|
|
82
|
+
wrapped in the specified response type.
|
|
83
|
+
"""
|
|
84
|
+
return response_wrapper_type(
|
|
85
|
+
JSONRPCErrorResponse(
|
|
86
|
+
id=request_id,
|
|
87
|
+
error=error.root if isinstance(error, A2AError) else error,
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def prepare_response_object(
|
|
93
|
+
request_id: str | int | None,
|
|
94
|
+
response: EventTypes,
|
|
95
|
+
success_response_types: tuple[type, ...],
|
|
96
|
+
success_payload_type: type[SPT],
|
|
97
|
+
response_type: type[RT],
|
|
98
|
+
) -> RT:
|
|
99
|
+
"""Helper method to build appropriate JSONRPCResponse object for RPC methods.
|
|
100
|
+
|
|
101
|
+
Based on the type of the `response` object received from the handler,
|
|
102
|
+
it constructs either a success response wrapped in the appropriate payload type
|
|
103
|
+
or an error response.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
request_id: The ID of the request.
|
|
107
|
+
response: The object received from the request handler.
|
|
108
|
+
success_response_types: A tuple of expected Pydantic model types for a successful result.
|
|
109
|
+
success_payload_type: The Pydantic model type for the success payload
|
|
110
|
+
(e.g., `SendMessageSuccessResponse`).
|
|
111
|
+
response_type: The Pydantic RootModel type that wraps the final response
|
|
112
|
+
(e.g., `SendMessageResponse`).
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
A Pydantic model representing the final JSON-RPC response (success or error).
|
|
116
|
+
"""
|
|
117
|
+
if isinstance(response, success_response_types):
|
|
118
|
+
return response_type(
|
|
119
|
+
root=success_payload_type(id=request_id, result=response) # type:ignore
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
if isinstance(response, A2AError | JSONRPCError):
|
|
123
|
+
return build_error_response(request_id, response, response_type)
|
|
124
|
+
|
|
125
|
+
# If consumer_data is not an expected success type and not an error,
|
|
126
|
+
# it's an invalid type of response from the agent for this specific method.
|
|
127
|
+
response = A2AError(
|
|
128
|
+
root=InvalidAgentResponseError(
|
|
129
|
+
message='Agent returned invalid type response for this method'
|
|
130
|
+
)
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
return build_error_response(request_id, response, response_type)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Components for managing tasks within the A2A server."""
|
|
2
|
+
|
|
3
|
+
from a2a.server.tasks.inmemory_push_notifier import InMemoryPushNotifier
|
|
4
|
+
from a2a.server.tasks.inmemory_task_store import InMemoryTaskStore
|
|
5
|
+
from a2a.server.tasks.push_notifier import PushNotifier
|
|
6
|
+
from a2a.server.tasks.result_aggregator import ResultAggregator
|
|
7
|
+
from a2a.server.tasks.task_manager import TaskManager
|
|
8
|
+
from a2a.server.tasks.task_store import TaskStore
|
|
9
|
+
from a2a.server.tasks.task_updater import TaskUpdater
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
'InMemoryPushNotifier',
|
|
14
|
+
'InMemoryTaskStore',
|
|
15
|
+
'PushNotifier',
|
|
16
|
+
'ResultAggregator',
|
|
17
|
+
'TaskManager',
|
|
18
|
+
'TaskStore',
|
|
19
|
+
'TaskUpdater',
|
|
20
|
+
]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from a2a.server.tasks.push_notifier import PushNotifier
|
|
7
|
+
from a2a.types import PushNotificationConfig, Task
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class InMemoryPushNotifier(PushNotifier):
|
|
14
|
+
"""In-memory implementation of PushNotifier interface.
|
|
15
|
+
|
|
16
|
+
Stores push notification configurations in memory and uses an httpx client
|
|
17
|
+
to send notifications.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, httpx_client: httpx.AsyncClient) -> None:
|
|
21
|
+
"""Initializes the InMemoryPushNotifier.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
httpx_client: An async HTTP client instance to send notifications.
|
|
25
|
+
"""
|
|
26
|
+
self._client = httpx_client
|
|
27
|
+
self.lock = asyncio.Lock()
|
|
28
|
+
self._push_notification_infos: dict[str, PushNotificationConfig] = {}
|
|
29
|
+
|
|
30
|
+
async def set_info(
|
|
31
|
+
self, task_id: str, notification_config: PushNotificationConfig
|
|
32
|
+
) -> None:
|
|
33
|
+
"""Sets or updates the push notification configuration for a task in memory."""
|
|
34
|
+
async with self.lock:
|
|
35
|
+
self._push_notification_infos[task_id] = notification_config
|
|
36
|
+
|
|
37
|
+
async def get_info(self, task_id: str) -> PushNotificationConfig | None:
|
|
38
|
+
"""Retrieves the push notification configuration for a task from memory."""
|
|
39
|
+
async with self.lock:
|
|
40
|
+
return self._push_notification_infos.get(task_id)
|
|
41
|
+
|
|
42
|
+
async def delete_info(self, task_id: str) -> None:
|
|
43
|
+
"""Deletes the push notification configuration for a task from memory."""
|
|
44
|
+
async with self.lock:
|
|
45
|
+
if task_id in self._push_notification_infos:
|
|
46
|
+
del self._push_notification_infos[task_id]
|
|
47
|
+
|
|
48
|
+
async def send_notification(self, task: Task) -> None:
|
|
49
|
+
"""Sends a push notification for a task if configuration exists."""
|
|
50
|
+
push_info = await self.get_info(task.id)
|
|
51
|
+
if not push_info:
|
|
52
|
+
return
|
|
53
|
+
url = push_info.url
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
response = await self._client.post(
|
|
57
|
+
url, json=task.model_dump(mode='json', exclude_none=True)
|
|
58
|
+
)
|
|
59
|
+
response.raise_for_status()
|
|
60
|
+
logger.info(f'Push-notification sent for URL: {url}')
|
|
61
|
+
except Exception as e:
|
|
62
|
+
logger.error(f'Error sending push-notification: {e}')
|