pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +9 -1
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +18 -45
- pygeai/assistant/data/clients.py +1 -0
- pygeai/assistant/data_analyst/clients.py +8 -12
- pygeai/assistant/managers.py +195 -157
- pygeai/assistant/mappers.py +4 -2
- pygeai/assistant/rag/clients.py +27 -67
- pygeai/assistant/rag/mappers.py +12 -6
- pygeai/assistant/rag/models.py +301 -159
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +308 -37
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +2 -8
- pygeai/chat/managers.py +9 -6
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +7 -10
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +9 -9
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +71 -9
- pygeai/cli/commands/chat.py +676 -19
- pygeai/cli/commands/common.py +28 -24
- pygeai/cli/commands/configuration.py +66 -13
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +58 -11
- pygeai/cli/commands/evaluation.py +38 -38
- pygeai/cli/commands/feedback.py +3 -4
- pygeai/cli/commands/files.py +7 -8
- pygeai/cli/commands/gam.py +85 -10
- pygeai/cli/commands/lab/ai_lab.py +340 -484
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +6 -7
- pygeai/cli/commands/migrate.py +1064 -436
- pygeai/cli/commands/organization.py +516 -11
- pygeai/cli/commands/rag.py +13 -14
- pygeai/cli/commands/rerank.py +3 -5
- pygeai/cli/commands/secrets.py +8 -9
- pygeai/cli/commands/usage_limits.py +18 -20
- pygeai/cli/commands/validators.py +144 -1
- pygeai/cli/commands/version.py +4 -5
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +170 -31
- pygeai/cli/geai_proxy.py +86 -25
- pygeai/cli/install_man.py +93 -22
- pygeai/cli/parsers.py +75 -25
- pygeai/cli/texts/help.py +265 -28
- pygeai/core/base/clients.py +53 -12
- pygeai/core/base/mappers.py +11 -2
- pygeai/core/base/session.py +95 -11
- pygeai/core/common/config.py +78 -14
- pygeai/core/common/exceptions.py +96 -6
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +23 -5
- pygeai/core/embeddings/managers.py +9 -4
- pygeai/core/embeddings/mappers.py +16 -2
- pygeai/core/embeddings/responses.py +9 -2
- pygeai/core/feedback/clients.py +8 -3
- pygeai/core/files/clients.py +23 -24
- pygeai/core/files/managers.py +121 -30
- pygeai/core/files/responses.py +4 -3
- pygeai/core/handlers.py +10 -1
- pygeai/core/llm/clients.py +22 -29
- pygeai/core/models.py +127 -11
- pygeai/core/plugins/clients.py +6 -6
- pygeai/core/rerank/clients.py +9 -3
- pygeai/core/rerank/managers.py +22 -5
- pygeai/core/secrets/clients.py +16 -37
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +159 -49
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +854 -14
- pygeai/evaluation/clients.py +7 -4
- pygeai/evaluation/dataset/clients.py +46 -44
- pygeai/evaluation/plan/clients.py +28 -26
- pygeai/evaluation/result/clients.py +38 -5
- pygeai/gam/clients.py +50 -28
- pygeai/gam/endpoints.py +2 -1
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -90
- pygeai/lab/agents/clients.py +203 -162
- pygeai/lab/agents/endpoints.py +4 -0
- pygeai/lab/agents/mappers.py +57 -7
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +571 -541
- pygeai/lab/models.py +108 -19
- pygeai/lab/processes/clients.py +332 -340
- pygeai/lab/processes/mappers.py +3 -3
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/clients.py +67 -63
- pygeai/lab/strategies/mappers.py +1 -1
- pygeai/lab/tools/clients.py +85 -118
- pygeai/lab/tools/endpoints.py +4 -0
- pygeai/lab/tools/mappers.py +5 -5
- pygeai/man/man1/geai-proxy.1 +116 -0
- pygeai/man/man1/geai.1 +2580 -66
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +468 -146
- pygeai/migration/tools.py +170 -3
- pygeai/organization/clients.py +245 -50
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/clients.py +34 -32
- pygeai/organization/limits/managers.py +108 -49
- pygeai/organization/managers.py +347 -53
- pygeai/organization/mappers.py +102 -2
- pygeai/organization/responses.py +58 -1
- pygeai/proxy/clients.py +6 -3
- pygeai/proxy/config.py +14 -1
- pygeai/proxy/managers.py +61 -33
- pygeai/proxy/servers.py +196 -51
- pygeai/proxy/tool.py +33 -16
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -82
- pygeai/tests/assistants/test_managers.py +191 -57
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +5 -5
- pygeai/tests/core/base/data/models.py +7 -0
- pygeai/tests/core/base/test_mappers.py +43 -11
- pygeai/tests/core/base/test_models.py +3 -1
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +124 -78
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +61 -39
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_models.py +500 -3
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +298 -56
- pygeai/tests/organization/test_clients.py +600 -30
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/delete_file.py +1 -4
- pygeai/tests/snippets/files/get_file_content.py +2 -4
- pygeai/tests/snippets/files/get_file_data.py +1 -4
- pygeai/tests/snippets/files/get_file_list.py +1 -6
- pygeai/tests/snippets/files/upload_file.py +1 -5
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
- pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
- pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
- pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
- pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/create_process.py +3 -5
- pygeai/tests/snippets/lab/processes/create_task.py +3 -5
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
- pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
- pygeai/tests/snippets/lab/runner_1.py +1 -1
- pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
- pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
- pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
- pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
- pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
- pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
- pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +2 -2
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
- pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
- docs/geai-proxy/README.md +0 -145
- docs/source/conf.py +0 -45
- pygeai/tests/core/test_managers.py +0 -233
- pygeai-0.1.51b3.dist-info/METADATA +0 -130
- pygeai-0.1.51b3.dist-info/RECORD +0 -324
- pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
- scripts/bump_beta_version.py +0 -56
- {scripts → pygeai/analytics}/__init__.py +0 -0
- /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import contextlib
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import traceback
|
|
5
|
+
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
from collections.abc import AsyncGenerator
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from fastapi import FastAPI
|
|
11
|
+
from pydantic import ValidationError
|
|
12
|
+
from sse_starlette.sse import EventSourceResponse
|
|
13
|
+
from starlette.applications import Starlette
|
|
14
|
+
from starlette.authentication import BaseUser
|
|
15
|
+
from starlette.requests import Request
|
|
16
|
+
from starlette.responses import JSONResponse, Response
|
|
17
|
+
|
|
18
|
+
from a2a.auth.user import UnauthenticatedUser
|
|
19
|
+
from a2a.auth.user import User as A2AUser
|
|
20
|
+
from a2a.server.context import ServerCallContext
|
|
21
|
+
from a2a.server.request_handlers.jsonrpc_handler import JSONRPCHandler
|
|
22
|
+
from a2a.server.request_handlers.request_handler import RequestHandler
|
|
23
|
+
from a2a.types import (
|
|
24
|
+
A2AError,
|
|
25
|
+
A2ARequest,
|
|
26
|
+
AgentCard,
|
|
27
|
+
CancelTaskRequest,
|
|
28
|
+
GetTaskPushNotificationConfigRequest,
|
|
29
|
+
GetTaskRequest,
|
|
30
|
+
InternalError,
|
|
31
|
+
InvalidRequestError,
|
|
32
|
+
JSONParseError,
|
|
33
|
+
JSONRPCError,
|
|
34
|
+
JSONRPCErrorResponse,
|
|
35
|
+
JSONRPCResponse,
|
|
36
|
+
SendMessageRequest,
|
|
37
|
+
SendStreamingMessageRequest,
|
|
38
|
+
SendStreamingMessageResponse,
|
|
39
|
+
SetTaskPushNotificationConfigRequest,
|
|
40
|
+
TaskResubscriptionRequest,
|
|
41
|
+
UnsupportedOperationError,
|
|
42
|
+
)
|
|
43
|
+
from a2a.utils.errors import MethodNotImplementedError
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
logger = logging.getLogger(__name__)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class StarletteUserProxy(A2AUser):
|
|
50
|
+
"""Adapts the Starlette User class to the A2A user representation."""
|
|
51
|
+
|
|
52
|
+
def __init__(self, user: BaseUser):
|
|
53
|
+
self._user = user
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def is_authenticated(self) -> bool:
|
|
57
|
+
"""Returns whether the current user is authenticated."""
|
|
58
|
+
return self._user.is_authenticated
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def user_name(self) -> str:
|
|
62
|
+
"""Returns the user name of the current user."""
|
|
63
|
+
return self._user.display_name
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class CallContextBuilder(ABC):
|
|
67
|
+
"""A class for building ServerCallContexts using the Starlette Request."""
|
|
68
|
+
|
|
69
|
+
@abstractmethod
|
|
70
|
+
def build(self, request: Request) -> ServerCallContext:
|
|
71
|
+
"""Builds a ServerCallContext from a Starlette Request."""
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class DefaultCallContextBuilder(CallContextBuilder):
|
|
75
|
+
"""A default implementation of CallContextBuilder."""
|
|
76
|
+
|
|
77
|
+
def build(self, request: Request) -> ServerCallContext:
|
|
78
|
+
"""Builds a ServerCallContext from a Starlette Request.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
request: The incoming Starlette Request object.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
A ServerCallContext instance populated with user and state
|
|
85
|
+
information from the request.
|
|
86
|
+
"""
|
|
87
|
+
user: A2AUser = UnauthenticatedUser()
|
|
88
|
+
state = {}
|
|
89
|
+
with contextlib.suppress(Exception):
|
|
90
|
+
user = StarletteUserProxy(request.user)
|
|
91
|
+
state['auth'] = request.auth
|
|
92
|
+
return ServerCallContext(user=user, state=state)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class JSONRPCApplication(ABC):
|
|
96
|
+
"""Base class for A2A JSONRPC applications.
|
|
97
|
+
|
|
98
|
+
Handles incoming JSON-RPC requests, routes them to the appropriate
|
|
99
|
+
handler methods, and manages response generation including Server-Sent Events
|
|
100
|
+
(SSE).
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
def __init__(
|
|
104
|
+
self,
|
|
105
|
+
agent_card: AgentCard,
|
|
106
|
+
http_handler: RequestHandler,
|
|
107
|
+
extended_agent_card: AgentCard | None = None,
|
|
108
|
+
context_builder: CallContextBuilder | None = None,
|
|
109
|
+
):
|
|
110
|
+
"""Initializes the A2AStarletteApplication.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
agent_card: The AgentCard describing the agent's capabilities.
|
|
114
|
+
http_handler: The handler instance responsible for processing A2A
|
|
115
|
+
requests via http.
|
|
116
|
+
extended_agent_card: An optional, distinct AgentCard to be served
|
|
117
|
+
at the authenticated extended card endpoint.
|
|
118
|
+
context_builder: The CallContextBuilder used to construct the
|
|
119
|
+
ServerCallContext passed to the http_handler. If None, no
|
|
120
|
+
ServerCallContext is passed.
|
|
121
|
+
"""
|
|
122
|
+
self.agent_card = agent_card
|
|
123
|
+
self.extended_agent_card = extended_agent_card
|
|
124
|
+
self.handler = JSONRPCHandler(
|
|
125
|
+
agent_card=agent_card, request_handler=http_handler
|
|
126
|
+
)
|
|
127
|
+
if (
|
|
128
|
+
self.agent_card.supportsAuthenticatedExtendedCard
|
|
129
|
+
and self.extended_agent_card is None
|
|
130
|
+
):
|
|
131
|
+
logger.error(
|
|
132
|
+
'AgentCard.supportsAuthenticatedExtendedCard is True, but no extended_agent_card was provided. The /agent/authenticatedExtendedCard endpoint will return 404.'
|
|
133
|
+
)
|
|
134
|
+
self._context_builder = context_builder or DefaultCallContextBuilder()
|
|
135
|
+
|
|
136
|
+
def _generate_error_response(
|
|
137
|
+
self, request_id: str | int | None, error: JSONRPCError | A2AError
|
|
138
|
+
) -> JSONResponse:
|
|
139
|
+
"""Creates a Starlette JSONResponse for a JSON-RPC error.
|
|
140
|
+
|
|
141
|
+
Logs the error based on its type.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
request_id: The ID of the request that caused the error.
|
|
145
|
+
error: The `JSONRPCError` or `A2AError` object.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
A `JSONResponse` object formatted as a JSON-RPC error response.
|
|
149
|
+
"""
|
|
150
|
+
error_resp = JSONRPCErrorResponse(
|
|
151
|
+
id=request_id,
|
|
152
|
+
error=error if isinstance(error, JSONRPCError) else error.root,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
log_level = (
|
|
156
|
+
logging.ERROR
|
|
157
|
+
if not isinstance(error, A2AError)
|
|
158
|
+
or isinstance(error.root, InternalError)
|
|
159
|
+
else logging.WARNING
|
|
160
|
+
)
|
|
161
|
+
logger.log(
|
|
162
|
+
log_level,
|
|
163
|
+
f'Request Error (ID: {request_id}): '
|
|
164
|
+
f"Code={error_resp.error.code}, Message='{error_resp.error.message}'"
|
|
165
|
+
f'{", Data=" + str(error_resp.error.data) if error_resp.error.data else ""}',
|
|
166
|
+
)
|
|
167
|
+
return JSONResponse(
|
|
168
|
+
error_resp.model_dump(mode='json', exclude_none=True),
|
|
169
|
+
status_code=200,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
async def _handle_requests(self, request: Request) -> Response:
|
|
173
|
+
"""Handles incoming POST requests to the main A2A endpoint.
|
|
174
|
+
|
|
175
|
+
Parses the request body as JSON, validates it against A2A request types,
|
|
176
|
+
dispatches it to the appropriate handler method, and returns the response.
|
|
177
|
+
Handles JSON parsing errors, validation errors, and other exceptions,
|
|
178
|
+
returning appropriate JSON-RPC error responses.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
request: The incoming Starlette Request object.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
A Starlette Response object (JSONResponse or EventSourceResponse).
|
|
185
|
+
|
|
186
|
+
Raises:
|
|
187
|
+
(Implicitly handled): Various exceptions are caught and converted
|
|
188
|
+
into JSON-RPC error responses by this method.
|
|
189
|
+
"""
|
|
190
|
+
request_id = None
|
|
191
|
+
body = None
|
|
192
|
+
|
|
193
|
+
try:
|
|
194
|
+
body = await request.json()
|
|
195
|
+
a2a_request = A2ARequest.model_validate(body)
|
|
196
|
+
call_context = self._context_builder.build(request)
|
|
197
|
+
|
|
198
|
+
request_id = a2a_request.root.id
|
|
199
|
+
request_obj = a2a_request.root
|
|
200
|
+
|
|
201
|
+
if isinstance(
|
|
202
|
+
request_obj,
|
|
203
|
+
TaskResubscriptionRequest | SendStreamingMessageRequest,
|
|
204
|
+
):
|
|
205
|
+
return await self._process_streaming_request(
|
|
206
|
+
request_id, a2a_request, call_context
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
return await self._process_non_streaming_request(
|
|
210
|
+
request_id, a2a_request, call_context
|
|
211
|
+
)
|
|
212
|
+
except MethodNotImplementedError:
|
|
213
|
+
traceback.print_exc()
|
|
214
|
+
return self._generate_error_response(
|
|
215
|
+
request_id, A2AError(root=UnsupportedOperationError())
|
|
216
|
+
)
|
|
217
|
+
except json.decoder.JSONDecodeError as e:
|
|
218
|
+
traceback.print_exc()
|
|
219
|
+
return self._generate_error_response(
|
|
220
|
+
None, A2AError(root=JSONParseError(message=str(e)))
|
|
221
|
+
)
|
|
222
|
+
except ValidationError as e:
|
|
223
|
+
traceback.print_exc()
|
|
224
|
+
return self._generate_error_response(
|
|
225
|
+
request_id,
|
|
226
|
+
A2AError(root=InvalidRequestError(data=json.loads(e.json()))),
|
|
227
|
+
)
|
|
228
|
+
except Exception as e:
|
|
229
|
+
logger.error(f'Unhandled exception: {e}')
|
|
230
|
+
traceback.print_exc()
|
|
231
|
+
return self._generate_error_response(
|
|
232
|
+
request_id, A2AError(root=InternalError(message=str(e)))
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
async def _process_streaming_request(
|
|
236
|
+
self,
|
|
237
|
+
request_id: str | int | None,
|
|
238
|
+
a2a_request: A2ARequest,
|
|
239
|
+
context: ServerCallContext,
|
|
240
|
+
) -> Response:
|
|
241
|
+
"""Processes streaming requests (message/stream or tasks/resubscribe).
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
request_id: The ID of the request.
|
|
245
|
+
a2a_request: The validated A2ARequest object.
|
|
246
|
+
context: The ServerCallContext for the request.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
An `EventSourceResponse` object to stream results to the client.
|
|
250
|
+
"""
|
|
251
|
+
request_obj = a2a_request.root
|
|
252
|
+
handler_result: Any = None
|
|
253
|
+
if isinstance(
|
|
254
|
+
request_obj,
|
|
255
|
+
SendStreamingMessageRequest,
|
|
256
|
+
):
|
|
257
|
+
handler_result = self.handler.on_message_send_stream(
|
|
258
|
+
request_obj, context
|
|
259
|
+
)
|
|
260
|
+
elif isinstance(request_obj, TaskResubscriptionRequest):
|
|
261
|
+
handler_result = self.handler.on_resubscribe_to_task(
|
|
262
|
+
request_obj, context
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
return self._create_response(handler_result)
|
|
266
|
+
|
|
267
|
+
async def _process_non_streaming_request(
|
|
268
|
+
self,
|
|
269
|
+
request_id: str | int | None,
|
|
270
|
+
a2a_request: A2ARequest,
|
|
271
|
+
context: ServerCallContext,
|
|
272
|
+
) -> Response:
|
|
273
|
+
"""Processes non-streaming requests (message/send, tasks/get, tasks/cancel, tasks/pushNotificationConfig/*).
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
request_id: The ID of the request.
|
|
277
|
+
a2a_request: The validated A2ARequest object.
|
|
278
|
+
context: The ServerCallContext for the request.
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
A `JSONResponse` object containing the result or error.
|
|
282
|
+
"""
|
|
283
|
+
request_obj = a2a_request.root
|
|
284
|
+
handler_result: Any = None
|
|
285
|
+
match request_obj:
|
|
286
|
+
case SendMessageRequest():
|
|
287
|
+
handler_result = await self.handler.on_message_send(
|
|
288
|
+
request_obj, context
|
|
289
|
+
)
|
|
290
|
+
case CancelTaskRequest():
|
|
291
|
+
handler_result = await self.handler.on_cancel_task(
|
|
292
|
+
request_obj, context
|
|
293
|
+
)
|
|
294
|
+
case GetTaskRequest():
|
|
295
|
+
handler_result = await self.handler.on_get_task(
|
|
296
|
+
request_obj, context
|
|
297
|
+
)
|
|
298
|
+
case SetTaskPushNotificationConfigRequest():
|
|
299
|
+
handler_result = await self.handler.set_push_notification(
|
|
300
|
+
request_obj,
|
|
301
|
+
context,
|
|
302
|
+
)
|
|
303
|
+
case GetTaskPushNotificationConfigRequest():
|
|
304
|
+
handler_result = await self.handler.get_push_notification(
|
|
305
|
+
request_obj,
|
|
306
|
+
context,
|
|
307
|
+
)
|
|
308
|
+
case _:
|
|
309
|
+
logger.error(
|
|
310
|
+
f'Unhandled validated request type: {type(request_obj)}'
|
|
311
|
+
)
|
|
312
|
+
error = UnsupportedOperationError(
|
|
313
|
+
message=f'Request type {type(request_obj).__name__} is unknown.'
|
|
314
|
+
)
|
|
315
|
+
handler_result = JSONRPCErrorResponse(
|
|
316
|
+
id=request_id, error=error
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
return self._create_response(handler_result)
|
|
320
|
+
|
|
321
|
+
def _create_response(
|
|
322
|
+
self,
|
|
323
|
+
handler_result: (
|
|
324
|
+
AsyncGenerator[SendStreamingMessageResponse]
|
|
325
|
+
| JSONRPCErrorResponse
|
|
326
|
+
| JSONRPCResponse
|
|
327
|
+
),
|
|
328
|
+
) -> Response:
|
|
329
|
+
"""Creates a Starlette Response based on the result from the request handler.
|
|
330
|
+
|
|
331
|
+
Handles:
|
|
332
|
+
- AsyncGenerator for Server-Sent Events (SSE).
|
|
333
|
+
- JSONRPCErrorResponse for explicit errors returned by handlers.
|
|
334
|
+
- Pydantic RootModels (like GetTaskResponse) containing success or error
|
|
335
|
+
payloads.
|
|
336
|
+
|
|
337
|
+
Args:
|
|
338
|
+
handler_result: The result from a request handler method. Can be an
|
|
339
|
+
async generator for streaming or a Pydantic model for non-streaming.
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
A Starlette JSONResponse or EventSourceResponse.
|
|
343
|
+
"""
|
|
344
|
+
if isinstance(handler_result, AsyncGenerator):
|
|
345
|
+
# Result is a stream of SendStreamingMessageResponse objects
|
|
346
|
+
async def event_generator(
|
|
347
|
+
stream: AsyncGenerator[SendStreamingMessageResponse],
|
|
348
|
+
) -> AsyncGenerator[dict[str, str]]:
|
|
349
|
+
async for item in stream:
|
|
350
|
+
yield {'data': item.root.model_dump_json(exclude_none=True)}
|
|
351
|
+
|
|
352
|
+
return EventSourceResponse(event_generator(handler_result))
|
|
353
|
+
if isinstance(handler_result, JSONRPCErrorResponse):
|
|
354
|
+
return JSONResponse(
|
|
355
|
+
handler_result.model_dump(
|
|
356
|
+
mode='json',
|
|
357
|
+
exclude_none=True,
|
|
358
|
+
)
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
return JSONResponse(
|
|
362
|
+
handler_result.root.model_dump(mode='json', exclude_none=True)
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
async def _handle_get_agent_card(self, request: Request) -> JSONResponse:
|
|
366
|
+
"""Handles GET requests for the agent card endpoint.
|
|
367
|
+
|
|
368
|
+
Args:
|
|
369
|
+
request: The incoming Starlette Request object.
|
|
370
|
+
|
|
371
|
+
Returns:
|
|
372
|
+
A JSONResponse containing the agent card data.
|
|
373
|
+
"""
|
|
374
|
+
# The public agent card is a direct serialization of the agent_card
|
|
375
|
+
# provided at initialization.
|
|
376
|
+
return JSONResponse(
|
|
377
|
+
self.agent_card.model_dump(mode='json', exclude_none=True)
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
async def _handle_get_authenticated_extended_agent_card(
|
|
381
|
+
self, request: Request
|
|
382
|
+
) -> JSONResponse:
|
|
383
|
+
"""Handles GET requests for the authenticated extended agent card."""
|
|
384
|
+
if not self.agent_card.supportsAuthenticatedExtendedCard:
|
|
385
|
+
return JSONResponse(
|
|
386
|
+
{'error': 'Extended agent card not supported or not enabled.'},
|
|
387
|
+
status_code=404,
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
# If an explicit extended_agent_card is provided, serve that.
|
|
391
|
+
if self.extended_agent_card:
|
|
392
|
+
return JSONResponse(
|
|
393
|
+
self.extended_agent_card.model_dump(
|
|
394
|
+
mode='json', exclude_none=True
|
|
395
|
+
)
|
|
396
|
+
)
|
|
397
|
+
# If supportsAuthenticatedExtendedCard is true, but no specific
|
|
398
|
+
# extended_agent_card was provided during server initialization,
|
|
399
|
+
# return a 404
|
|
400
|
+
return JSONResponse(
|
|
401
|
+
{
|
|
402
|
+
'error': 'Authenticated extended agent card is supported but not configured on the server.'
|
|
403
|
+
},
|
|
404
|
+
status_code=404,
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
@abstractmethod
|
|
408
|
+
def build(
|
|
409
|
+
self,
|
|
410
|
+
agent_card_url: str = '/.well-known/agent.json',
|
|
411
|
+
rpc_url: str = '/',
|
|
412
|
+
**kwargs: Any,
|
|
413
|
+
) -> FastAPI | Starlette:
|
|
414
|
+
"""Builds and returns the JSONRPC application instance.
|
|
415
|
+
|
|
416
|
+
Args:
|
|
417
|
+
agent_card_url: The URL for the agent card endpoint.
|
|
418
|
+
rpc_url: The URL for the A2A JSON-RPC endpoint
|
|
419
|
+
**kwargs: Additional keyword arguments to pass to the FastAPI constructor.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
A configured JSONRPC application instance.
|
|
423
|
+
"""
|
|
424
|
+
raise NotImplementedError(
|
|
425
|
+
'Subclasses must implement the build method to create the application instance.'
|
|
426
|
+
)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from starlette.applications import Starlette
|
|
6
|
+
from starlette.routing import Route
|
|
7
|
+
|
|
8
|
+
from a2a.server.apps.jsonrpc.jsonrpc_app import (
|
|
9
|
+
CallContextBuilder,
|
|
10
|
+
JSONRPCApplication,
|
|
11
|
+
)
|
|
12
|
+
from a2a.server.request_handlers.jsonrpc_handler import RequestHandler
|
|
13
|
+
from a2a.types import AgentCard
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class A2AStarletteApplication(JSONRPCApplication):
|
|
20
|
+
"""A Starlette application implementing the A2A protocol server endpoints.
|
|
21
|
+
|
|
22
|
+
Handles incoming JSON-RPC requests, routes them to the appropriate
|
|
23
|
+
handler methods, and manages response generation including Server-Sent Events
|
|
24
|
+
(SSE).
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
agent_card: AgentCard,
|
|
30
|
+
http_handler: RequestHandler,
|
|
31
|
+
extended_agent_card: AgentCard | None = None,
|
|
32
|
+
context_builder: CallContextBuilder | None = None,
|
|
33
|
+
):
|
|
34
|
+
"""Initializes the A2AStarletteApplication.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
agent_card: The AgentCard describing the agent's capabilities.
|
|
38
|
+
http_handler: The handler instance responsible for processing A2A
|
|
39
|
+
requests via http.
|
|
40
|
+
extended_agent_card: An optional, distinct AgentCard to be served
|
|
41
|
+
at the authenticated extended card endpoint.
|
|
42
|
+
context_builder: The CallContextBuilder used to construct the
|
|
43
|
+
ServerCallContext passed to the http_handler. If None, no
|
|
44
|
+
ServerCallContext is passed.
|
|
45
|
+
"""
|
|
46
|
+
super().__init__(
|
|
47
|
+
agent_card=agent_card,
|
|
48
|
+
http_handler=http_handler,
|
|
49
|
+
extended_agent_card=extended_agent_card,
|
|
50
|
+
context_builder=context_builder,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def routes(
|
|
54
|
+
self,
|
|
55
|
+
agent_card_url: str = '/.well-known/agent.json',
|
|
56
|
+
rpc_url: str = '/',
|
|
57
|
+
extended_agent_card_url: str = '/agent/authenticatedExtendedCard',
|
|
58
|
+
) -> list[Route]:
|
|
59
|
+
"""Returns the Starlette Routes for handling A2A requests.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
agent_card_url: The URL path for the agent card endpoint.
|
|
63
|
+
rpc_url: The URL path for the A2A JSON-RPC endpoint (POST requests).
|
|
64
|
+
extended_agent_card_url: The URL for the authenticated extended agent card endpoint.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
A list of Starlette Route objects.
|
|
68
|
+
"""
|
|
69
|
+
app_routes = [
|
|
70
|
+
Route(
|
|
71
|
+
rpc_url,
|
|
72
|
+
self._handle_requests,
|
|
73
|
+
methods=['POST'],
|
|
74
|
+
name='a2a_handler',
|
|
75
|
+
),
|
|
76
|
+
Route(
|
|
77
|
+
agent_card_url,
|
|
78
|
+
self._handle_get_agent_card,
|
|
79
|
+
methods=['GET'],
|
|
80
|
+
name='agent_card',
|
|
81
|
+
),
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
if self.agent_card.supportsAuthenticatedExtendedCard:
|
|
85
|
+
app_routes.append(
|
|
86
|
+
Route(
|
|
87
|
+
extended_agent_card_url,
|
|
88
|
+
self._handle_get_authenticated_extended_agent_card,
|
|
89
|
+
methods=['GET'],
|
|
90
|
+
name='authenticated_extended_agent_card',
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
return app_routes
|
|
94
|
+
|
|
95
|
+
def build(
|
|
96
|
+
self,
|
|
97
|
+
agent_card_url: str = '/.well-known/agent.json',
|
|
98
|
+
rpc_url: str = '/',
|
|
99
|
+
extended_agent_card_url: str = '/agent/authenticatedExtendedCard',
|
|
100
|
+
**kwargs: Any,
|
|
101
|
+
) -> Starlette:
|
|
102
|
+
"""Builds and returns the Starlette application instance.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
agent_card_url: The URL path for the agent card endpoint.
|
|
106
|
+
rpc_url: The URL path for the A2A JSON-RPC endpoint (POST requests).
|
|
107
|
+
extended_agent_card_url: The URL for the authenticated extended agent card endpoint.
|
|
108
|
+
**kwargs: Additional keyword arguments to pass to the Starlette constructor.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
A configured Starlette application instance.
|
|
112
|
+
"""
|
|
113
|
+
app_routes = self.routes(
|
|
114
|
+
agent_card_url=agent_card_url,
|
|
115
|
+
rpc_url=rpc_url,
|
|
116
|
+
extended_agent_card_url=extended_agent_card_url,
|
|
117
|
+
)
|
|
118
|
+
if 'routes' in kwargs:
|
|
119
|
+
kwargs['routes'].extend(app_routes)
|
|
120
|
+
else:
|
|
121
|
+
kwargs['routes'] = app_routes
|
|
122
|
+
|
|
123
|
+
return Starlette(**kwargs)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Defines the ServerCallContext class."""
|
|
2
|
+
|
|
3
|
+
import collections.abc
|
|
4
|
+
import typing
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
7
|
+
|
|
8
|
+
from a2a.auth.user import UnauthenticatedUser, User
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
State = collections.abc.MutableMapping[str, typing.Any]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ServerCallContext(BaseModel):
|
|
15
|
+
"""A context passed when calling a server method.
|
|
16
|
+
|
|
17
|
+
This class allows storing arbitrary user data in the state attribute.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
21
|
+
|
|
22
|
+
state: State = Field(default={})
|
|
23
|
+
user: User = Field(default=UnauthenticatedUser())
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Event handling components for the A2A server."""
|
|
2
|
+
|
|
3
|
+
from a2a.server.events.event_consumer import EventConsumer
|
|
4
|
+
from a2a.server.events.event_queue import Event, EventQueue
|
|
5
|
+
from a2a.server.events.in_memory_queue_manager import InMemoryQueueManager
|
|
6
|
+
from a2a.server.events.queue_manager import (
|
|
7
|
+
NoTaskQueue,
|
|
8
|
+
QueueManager,
|
|
9
|
+
TaskQueueExists,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
'Event',
|
|
15
|
+
'EventConsumer',
|
|
16
|
+
'EventQueue',
|
|
17
|
+
'InMemoryQueueManager',
|
|
18
|
+
'NoTaskQueue',
|
|
19
|
+
'QueueManager',
|
|
20
|
+
'TaskQueueExists',
|
|
21
|
+
]
|