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,153 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from typing import Dict, Any, Optional, List
|
|
3
|
+
|
|
4
|
+
from pygeai.core.responses import NewAssistantResponse, ChatResponse, ProviderResponse, \
|
|
5
|
+
UsageDetails, TokenDetails, Choice, ChatMessage
|
|
6
|
+
from pygeai.core.base.mappers import ModelMapper
|
|
7
|
+
from pygeai.core.models import Assistant
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AssistantResponseMapper:
|
|
11
|
+
|
|
12
|
+
@classmethod
|
|
13
|
+
def map_to_assistant_response(cls, data: dict) -> Assistant:
|
|
14
|
+
assistant = ModelMapper.map_to_assistant(data)
|
|
15
|
+
|
|
16
|
+
return assistant
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def map_to_assistant_created_response(cls, data: dict) -> NewAssistantResponse:
|
|
20
|
+
response = NewAssistantResponse()
|
|
21
|
+
if 'assistantId' in data:
|
|
22
|
+
response.assistant = ModelMapper.map_to_assistant(data)
|
|
23
|
+
else:
|
|
24
|
+
response.project = ModelMapper.map_to_project(data)
|
|
25
|
+
|
|
26
|
+
return response
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def map_to_chat_request_response(cls, data: Dict[str, Any]) -> ChatResponse:
|
|
30
|
+
"""
|
|
31
|
+
Maps a dictionary to a `ChatResponse` object.
|
|
32
|
+
|
|
33
|
+
:param data: dict - The dictionary containing chat response details.
|
|
34
|
+
:return: ChatResponse - The mapped `ChatResponse` object.
|
|
35
|
+
"""
|
|
36
|
+
provider_response = data.get("providerResponse")
|
|
37
|
+
return ChatResponse(
|
|
38
|
+
progress=data.get("progress"),
|
|
39
|
+
provider_name=data.get("providerName"),
|
|
40
|
+
provider_response=cls.map_to_provider_response(provider_response) if provider_response else None,
|
|
41
|
+
request_id=data.get("requestId"),
|
|
42
|
+
status=data.get("status"),
|
|
43
|
+
success=data.get("success"),
|
|
44
|
+
text=data.get("text")
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def map_to_provider_response(cls, provider_response: Any) -> ProviderResponse:
|
|
49
|
+
"""
|
|
50
|
+
Parses the provider response, which may be a JSON string.
|
|
51
|
+
|
|
52
|
+
:param provider_response: Any - The raw provider response.
|
|
53
|
+
:return: ProviderResponse - The parsed `ProviderResponse` object.
|
|
54
|
+
"""
|
|
55
|
+
if isinstance(provider_response, str):
|
|
56
|
+
provider_response = json.loads(provider_response)
|
|
57
|
+
|
|
58
|
+
choices = provider_response.get("choices")
|
|
59
|
+
usage_data = provider_response.get("usage")
|
|
60
|
+
return ProviderResponse(
|
|
61
|
+
created=provider_response.get("created"),
|
|
62
|
+
usage=cls._parse_usage(usage_data) if usage_data else None,
|
|
63
|
+
model=provider_response.get("model"),
|
|
64
|
+
service_tier=provider_response.get("service_tier"),
|
|
65
|
+
id=provider_response.get("id"),
|
|
66
|
+
system_fingerprint=provider_response.get("system_fingerprint"),
|
|
67
|
+
choices=cls._parse_choices(choices) if choices else [],
|
|
68
|
+
object=provider_response.get("object")
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def _parse_usage(cls, usage_data: Dict[str, Any]) -> UsageDetails:
|
|
73
|
+
"""
|
|
74
|
+
Parses usage details from a dictionary.
|
|
75
|
+
|
|
76
|
+
:param usage_data: dict - The usage details data.
|
|
77
|
+
:return: UsageDetails - The parsed `UsageDetails` object.
|
|
78
|
+
"""
|
|
79
|
+
completion_tokens_details_data = usage_data.get("completion_tokens_details")
|
|
80
|
+
prompt_tokens_details_data = usage_data.get("prompt_tokens_details")
|
|
81
|
+
return UsageDetails(
|
|
82
|
+
completion_tokens=usage_data.get("completion_tokens", 0),
|
|
83
|
+
prompt_tokens=usage_data.get("prompt_tokens", 0),
|
|
84
|
+
total_cost=usage_data.get("total_cost", 0.0),
|
|
85
|
+
completion_tokens_details=cls._parse_completion_tokens_details(completion_tokens_details_data) if completion_tokens_details_data else None,
|
|
86
|
+
prompt_tokens_details=cls._parse_prompt_tokens_details(prompt_tokens_details_data) if prompt_tokens_details_data else None,
|
|
87
|
+
total_tokens=usage_data.get("total_tokens", 0),
|
|
88
|
+
currency=usage_data.get("currency", "USD"),
|
|
89
|
+
completion_cost=usage_data.get("completion_cost", 0.0),
|
|
90
|
+
prompt_cost=usage_data.get("prompt_cost", 0.0)
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
@classmethod
|
|
94
|
+
def _parse_completion_tokens_details(cls, details: Dict[str, Any]) -> Optional[TokenDetails]:
|
|
95
|
+
"""
|
|
96
|
+
Parses completion tokens details.
|
|
97
|
+
|
|
98
|
+
:param details: dict - The completion tokens details.
|
|
99
|
+
:return: CompletionTokensDetails - The parsed details object.
|
|
100
|
+
"""
|
|
101
|
+
if not details:
|
|
102
|
+
return None
|
|
103
|
+
return TokenDetails(
|
|
104
|
+
reasoning_tokens=details.get("reasoning_tokens")
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
@classmethod
|
|
108
|
+
def _parse_prompt_tokens_details(cls, details: Dict[str, Any]) -> Optional[TokenDetails]:
|
|
109
|
+
"""
|
|
110
|
+
Parses prompt tokens details.
|
|
111
|
+
|
|
112
|
+
:param details: dict - The prompt tokens details.
|
|
113
|
+
:return: PromptTokensDetails - The parsed details object.
|
|
114
|
+
"""
|
|
115
|
+
if not details:
|
|
116
|
+
return None
|
|
117
|
+
return TokenDetails(
|
|
118
|
+
cached_tokens=details.get("cached_tokens")
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@classmethod
|
|
122
|
+
def _parse_choices(cls, choices: list) -> List[Choice]:
|
|
123
|
+
"""
|
|
124
|
+
Parses choices from a list.
|
|
125
|
+
|
|
126
|
+
:param choices: list - The choices data.
|
|
127
|
+
:return: List[Choice] - A list of parsed `Choice` objects.
|
|
128
|
+
"""
|
|
129
|
+
return [
|
|
130
|
+
Choice(
|
|
131
|
+
finish_reason=choice.get("finish_reason"),
|
|
132
|
+
index=choice.get("index"),
|
|
133
|
+
message=cls._parse_message(choice.get("message")) if 'message' in choice else None
|
|
134
|
+
)
|
|
135
|
+
for choice in choices
|
|
136
|
+
]
|
|
137
|
+
|
|
138
|
+
@classmethod
|
|
139
|
+
def _parse_message(cls, message_data: Dict[str, Any]) -> ChatMessage:
|
|
140
|
+
"""
|
|
141
|
+
Parses a chat message.
|
|
142
|
+
|
|
143
|
+
:param message_data: dict - The chat message data.
|
|
144
|
+
:return: ChatMessage - The parsed `ChatMessage` object.
|
|
145
|
+
"""
|
|
146
|
+
return ChatMessage(
|
|
147
|
+
role=message_data.get("role"),
|
|
148
|
+
function_call=message_data.get("function_call"),
|
|
149
|
+
refusal=message_data.get("refusal"),
|
|
150
|
+
tool_calls=message_data.get("tool_calls"),
|
|
151
|
+
content=message_data.get("content")
|
|
152
|
+
)
|
|
153
|
+
|
pygeai/assistant/rag/clients.py
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import logging
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any
|
|
2
5
|
|
|
6
|
+
from pygeai import logger
|
|
3
7
|
from pygeai.assistant.rag.endpoints import GET_ASSISTANTS_FROM_PROJECT_V1, GET_ASSISTANT_V1, CREATE_ASSISTANT_V1, \
|
|
4
8
|
UPDATE_ASSISTANT_V1, DELETE_ASSISTANT_V1, GET_DOCUMENTS_V1, DELETE_ALL_DOCUMENTS_V1, RETRIEVE_DOCUMENT_V1, \
|
|
5
9
|
UPLOAD_DOCUMENT_V1, DELETE_DOCUMENT_V1, EXECUTE_QUERY_V1
|
|
6
10
|
from pygeai.core.base.clients import BaseClient
|
|
7
11
|
import urllib.parse
|
|
8
12
|
|
|
13
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
14
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
15
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
16
|
+
|
|
9
17
|
|
|
10
18
|
class RAGAssistantClient(BaseClient):
|
|
11
19
|
|
|
@@ -14,13 +22,14 @@ class RAGAssistantClient(BaseClient):
|
|
|
14
22
|
|
|
15
23
|
def get_assistants_from_project(self) -> dict:
|
|
16
24
|
response = self.api_service.get(endpoint=GET_ASSISTANTS_FROM_PROJECT_V1)
|
|
17
|
-
|
|
18
|
-
return
|
|
25
|
+
validate_status_code(response)
|
|
26
|
+
return parse_json_response(response, "get assistants from project")
|
|
19
27
|
|
|
20
28
|
def get_assistant_data(self, name: str) -> dict:
|
|
21
29
|
endpoint = GET_ASSISTANT_V1.format(name=name)
|
|
22
30
|
response = self.api_service.get(endpoint=endpoint)
|
|
23
|
-
|
|
31
|
+
validate_status_code(response)
|
|
32
|
+
return parse_json_response(response, "get assistant data for name", name=name)
|
|
24
33
|
|
|
25
34
|
def create_assistant(
|
|
26
35
|
self,
|
|
@@ -38,7 +47,7 @@ class RAGAssistantClient(BaseClient):
|
|
|
38
47
|
:param description: str, optional - A description of the RAG assistant's purpose or functionality.
|
|
39
48
|
:param template: str, optional - Name of an existing RAG template to base the configuration on. Defaults to None.
|
|
40
49
|
:param search_options: dict, optional - A dictionary containing search configuration options.
|
|
41
|
-
- "
|
|
50
|
+
- "history_count": int - Number of historical interactions to include in the search context.
|
|
42
51
|
- "llm": A dictionary with LLM configuration:
|
|
43
52
|
- "cache": bool - Whether to enable caching for the LLM.
|
|
44
53
|
- "frequencyPenalty": float - Frequency penalty parameter for LLM responses.
|
|
@@ -69,11 +78,11 @@ class RAGAssistantClient(BaseClient):
|
|
|
69
78
|
:param index_options: dict, optional - A dictionary containing index configuration options.
|
|
70
79
|
- "chunks": Configuration for document chunking:
|
|
71
80
|
- "chunkOverlap": int - Overlap size between chunks in the main document.
|
|
72
|
-
- "
|
|
81
|
+
- "chunk_size": int - Size of each chunk in the main document.
|
|
73
82
|
- "useParentDocument": bool - Whether to enable parent-child relationships.
|
|
74
|
-
- "
|
|
83
|
+
- "child_document": Configuration for child documents:
|
|
75
84
|
- "childK": float - Parameter for child document processing.
|
|
76
|
-
- "
|
|
85
|
+
- "chunk_size": float - Chunk size for child documents.
|
|
77
86
|
- "chunkOverlap": float - Overlap size between child document chunks.
|
|
78
87
|
:param welcome_data: dict, optional - A dictionary containing welcome data for the assistant.
|
|
79
88
|
- "title": str - Title of the welcome message.
|
|
@@ -100,7 +109,8 @@ class RAGAssistantClient(BaseClient):
|
|
|
100
109
|
endpoint=CREATE_ASSISTANT_V1,
|
|
101
110
|
data=data
|
|
102
111
|
)
|
|
103
|
-
|
|
112
|
+
validate_status_code(response)
|
|
113
|
+
return parse_json_response(response, "create assistant with name", name=name)
|
|
104
114
|
|
|
105
115
|
def update_assistant(
|
|
106
116
|
self,
|
|
@@ -133,45 +143,146 @@ class RAGAssistantClient(BaseClient):
|
|
|
133
143
|
endpoint=endpoint,
|
|
134
144
|
data=data
|
|
135
145
|
)
|
|
136
|
-
|
|
146
|
+
validate_status_code(response)
|
|
147
|
+
return parse_json_response(response, "update assistant with name", name=name)
|
|
137
148
|
|
|
138
149
|
def delete_assistant(self, name: str) -> dict:
|
|
139
150
|
safe_name = self.get_url_safe_name(name)
|
|
140
151
|
endpoint = DELETE_ASSISTANT_V1.format(name=safe_name)
|
|
141
152
|
response = self.api_service.delete(endpoint=endpoint)
|
|
142
|
-
|
|
153
|
+
validate_status_code(response)
|
|
154
|
+
return parse_json_response(response, "delete assistant with name", name=name)
|
|
143
155
|
|
|
144
|
-
def get_documents(
|
|
156
|
+
def get_documents(
|
|
157
|
+
self,
|
|
158
|
+
name: str,
|
|
159
|
+
skip: int = 0,
|
|
160
|
+
count: int = 10
|
|
161
|
+
) -> dict:
|
|
145
162
|
safe_name = self.get_url_safe_name(name)
|
|
146
163
|
endpoint = GET_DOCUMENTS_V1.format(name=safe_name)
|
|
147
|
-
response = self.api_service.get(
|
|
148
|
-
|
|
164
|
+
response = self.api_service.get(
|
|
165
|
+
endpoint=endpoint,
|
|
166
|
+
params={
|
|
167
|
+
"skip": skip,
|
|
168
|
+
"count": count
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
validate_status_code(response)
|
|
172
|
+
return parse_json_response(response, "get documents for assistant", name=name)
|
|
149
173
|
|
|
150
174
|
def delete_all_documents(self, name: str) -> dict:
|
|
151
175
|
safe_name = self.get_url_safe_name(name)
|
|
152
176
|
endpoint = DELETE_ALL_DOCUMENTS_V1.format(name=safe_name)
|
|
153
177
|
response = self.api_service.delete(endpoint=endpoint)
|
|
154
|
-
|
|
178
|
+
validate_status_code(response)
|
|
179
|
+
return parse_json_response(response, "delete all documents for assistant", name=name)
|
|
155
180
|
|
|
156
181
|
def retrieve_document(self, name: str, document_id: str) -> dict:
|
|
157
182
|
safe_name = self.get_url_safe_name(name)
|
|
158
183
|
endpoint = RETRIEVE_DOCUMENT_V1.format(name=safe_name, id=document_id)
|
|
159
184
|
response = self.api_service.get(endpoint=endpoint)
|
|
160
|
-
|
|
185
|
+
validate_status_code(response)
|
|
186
|
+
return parse_json_response(response, "retrieve document", document_id=document_id)
|
|
161
187
|
|
|
162
|
-
def upload_document(
|
|
188
|
+
def upload_document(
|
|
189
|
+
self,
|
|
190
|
+
name: str,
|
|
191
|
+
file_path: str,
|
|
192
|
+
upload_type: str = "multipart",
|
|
193
|
+
metadata: dict = None,
|
|
194
|
+
content_type: str = "application/pdf"
|
|
195
|
+
) -> dict:
|
|
163
196
|
safe_name = self.get_url_safe_name(name)
|
|
164
197
|
endpoint = UPLOAD_DOCUMENT_V1.format(name=safe_name)
|
|
165
|
-
|
|
166
|
-
|
|
198
|
+
|
|
199
|
+
if upload_type == "binary":
|
|
200
|
+
response = self._upload_binary_document(endpoint, file_path, content_type)
|
|
201
|
+
elif upload_type == "multipart":
|
|
202
|
+
response = self._upload_multipart_document(endpoint, file_path, content_type, metadata)
|
|
203
|
+
else:
|
|
204
|
+
raise ValueError("Invalid upload_type. Use 'binary' or 'multipart'.")
|
|
205
|
+
|
|
206
|
+
validate_status_code(response)
|
|
207
|
+
return parse_json_response(response, "upload document for assistant", name=name)
|
|
208
|
+
|
|
209
|
+
def _upload_binary_document(self, endpoint: str, file_path: str, content_type: str):
|
|
210
|
+
"""
|
|
211
|
+
Uploads a binary file to the specified API endpoint.
|
|
212
|
+
|
|
213
|
+
:param endpoint: str - The API endpoint where the file will be uploaded.
|
|
214
|
+
:param file_path: str - The path to the file to be uploaded.
|
|
215
|
+
:param content_type: str - The MIME type of the file (e.g., "application/pdf", "text/plain").
|
|
216
|
+
:return: Response object from the API request.
|
|
217
|
+
"""
|
|
218
|
+
headers = dict()
|
|
219
|
+
headers["filename"] = Path(file_path).name
|
|
220
|
+
headers["Content-Type"] = content_type
|
|
221
|
+
|
|
222
|
+
with open(file_path, "rb") as file:
|
|
223
|
+
response = self.api_service.post_file_binary(
|
|
224
|
+
endpoint=endpoint,
|
|
225
|
+
headers=headers,
|
|
226
|
+
file=file
|
|
227
|
+
)
|
|
228
|
+
return response
|
|
229
|
+
|
|
230
|
+
def _upload_multipart_document(self, endpoint: str, file_path: str, content_type: str, metadata: Any):
|
|
231
|
+
"""
|
|
232
|
+
Uploads a file using multipart/form-data encoding, optionally including metadata.
|
|
233
|
+
|
|
234
|
+
:param endpoint: str - The API endpoint where the file will be uploaded.
|
|
235
|
+
:param file_path: str - The path to the file to be uploaded.
|
|
236
|
+
:param content_type: str - The MIME type of the file (e.g., "application/pdf", "text/plain").
|
|
237
|
+
:param metadata: Any - Metadata to be included in the request. Can be a dictionary (sent as JSON) or a file path.
|
|
238
|
+
|
|
239
|
+
:raises ValueError: If metadata is neither a dictionary nor a valid file path.
|
|
240
|
+
:return: Response object from the API request, or None if an error occurs.
|
|
241
|
+
"""
|
|
242
|
+
files_payload = []
|
|
243
|
+
file_name = Path(file_path).name
|
|
244
|
+
file_obj = open(file_path, "rb")
|
|
245
|
+
files_payload.append(
|
|
246
|
+
("file", (file_name, file_obj, content_type))
|
|
247
|
+
)
|
|
248
|
+
if metadata:
|
|
249
|
+
if isinstance(metadata, dict):
|
|
250
|
+
files_payload.append(
|
|
251
|
+
("metadata", (None, json.dumps(metadata), "application/json"))
|
|
252
|
+
)
|
|
253
|
+
elif isinstance(metadata, str) and Path(metadata).is_file():
|
|
254
|
+
metadata_path = Path(metadata)
|
|
255
|
+
files_payload.append(
|
|
256
|
+
("metadata", metadata_path.open("rb"))
|
|
257
|
+
)
|
|
258
|
+
else:
|
|
259
|
+
raise ValueError("Metadata should be a dictionary or a valid file path.")
|
|
260
|
+
try:
|
|
261
|
+
response = self.api_service.post_files_multipart(
|
|
262
|
+
endpoint=endpoint,
|
|
263
|
+
files=files_payload
|
|
264
|
+
)
|
|
265
|
+
except Exception as e:
|
|
266
|
+
logging.error(f"Unable to receive answer from POST request: {e}")
|
|
267
|
+
else:
|
|
268
|
+
return response
|
|
269
|
+
finally:
|
|
270
|
+
for _, (file_name, file_obj, _) in files_payload:
|
|
271
|
+
if hasattr(file_obj, "close"):
|
|
272
|
+
file_obj.close()
|
|
167
273
|
|
|
168
274
|
def delete_document(self, name: str, document_id: str) -> dict:
|
|
169
275
|
safe_name = self.get_url_safe_name(name)
|
|
170
276
|
endpoint = DELETE_DOCUMENT_V1.format(name=safe_name, id=document_id)
|
|
171
277
|
response = self.api_service.delete(endpoint=endpoint)
|
|
172
|
-
|
|
278
|
+
validate_status_code(response)
|
|
279
|
+
return parse_json_response(response, "delete document", document_id=document_id)
|
|
173
280
|
|
|
174
281
|
def execute_query(self, query: dict) -> dict:
|
|
175
|
-
response = self.api_service.post(
|
|
176
|
-
|
|
282
|
+
response = self.api_service.post(
|
|
283
|
+
endpoint=EXECUTE_QUERY_V1,
|
|
284
|
+
data=query
|
|
285
|
+
)
|
|
286
|
+
validate_status_code(response)
|
|
287
|
+
return parse_json_response(response, "execute query")
|
|
177
288
|
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
|
|
3
|
+
from pygeai.assistant.rag.responses import DocumentListResponse
|
|
4
|
+
from pygeai.core.base.mappers import ModelMapper
|
|
5
|
+
from pygeai.core.models import ChatVariable, \
|
|
6
|
+
ChatVariableList
|
|
7
|
+
from pygeai.assistant.rag.models import Search, RetrieverOptions, EmbeddingsOptions, IngestionOptions, \
|
|
8
|
+
SearchOptions, ChildOptions, ChildDocumentOptions, ChunkOptions, IndexOptions, RAGAssistant, Document, \
|
|
9
|
+
DocumentMetadata
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RAGAssistantMapper(ModelMapper):
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def map_to_rag_assistant(cls, data: dict) -> RAGAssistant:
|
|
16
|
+
welcome_data_data = data.get('welcomeData')
|
|
17
|
+
welcome_data = cls.map_to_welcome_data(welcome_data_data) if welcome_data_data else None
|
|
18
|
+
|
|
19
|
+
search_options_data = data.get('searchOptions')
|
|
20
|
+
search_options = cls.map_to_search_options(search_options_data) if search_options_data else None
|
|
21
|
+
|
|
22
|
+
llm_settings_data = data.get('llmSettings') or search_options_data.get('llm')
|
|
23
|
+
llm_settings = cls.map_to_llm_settings(llm_settings_data) if llm_settings_data else None
|
|
24
|
+
|
|
25
|
+
index_options_data = data.get('indexOptions')
|
|
26
|
+
index_options = cls.map_to_index_options(index_options_data) if index_options_data else None
|
|
27
|
+
|
|
28
|
+
return RAGAssistant(
|
|
29
|
+
name=data.get("name"),
|
|
30
|
+
type="rag",
|
|
31
|
+
status=data.get("status"),
|
|
32
|
+
description=data.get("description"),
|
|
33
|
+
prompt=data.get("prompt"),
|
|
34
|
+
template=data.get('template'),
|
|
35
|
+
search_options=search_options,
|
|
36
|
+
index_options=index_options,
|
|
37
|
+
welcome_data=welcome_data,
|
|
38
|
+
llm_settings=llm_settings
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def map_to_search_options(cls, data: dict) -> SearchOptions:
|
|
43
|
+
"""
|
|
44
|
+
Maps a dictionary to a `SearchOptions` object.
|
|
45
|
+
|
|
46
|
+
:param data: dict - The dictionary containing search options details.
|
|
47
|
+
:return: SearchOptions - The mapped `SearchOptions` object.
|
|
48
|
+
"""
|
|
49
|
+
llm_data = data.get("llm")
|
|
50
|
+
search_data = data.get("search")
|
|
51
|
+
retriever_data = data.get("retriever")
|
|
52
|
+
embeddings_data = data.get('embeddings')
|
|
53
|
+
ingestion_data = data.get('ingestion')
|
|
54
|
+
variables_data = data.get('variables')
|
|
55
|
+
return SearchOptions(
|
|
56
|
+
history_count=data.get("historyCount"),
|
|
57
|
+
llm=ModelMapper.map_to_llm_settings(llm_data) if llm_data else None,
|
|
58
|
+
search=cls.map_to_search(search_data) if search_data else None,
|
|
59
|
+
retriever=cls.map_to_retriever_options(retriever_data) if retriever_data else None,
|
|
60
|
+
chain=data.get('chain'),
|
|
61
|
+
embeddings=cls.map_to_embeddings(embeddings_data) if embeddings_data else None,
|
|
62
|
+
ingestion=cls.map_to_ingestion(ingestion_data) if ingestion_data else None,
|
|
63
|
+
options=data.get('options'),
|
|
64
|
+
rerank=data.get('rerank'),
|
|
65
|
+
variables=cls.map_to_variable_list(variables_data) if variables_data else None,
|
|
66
|
+
vector_store=data.get('vector_store'),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def map_to_search(cls, data: dict) -> Search:
|
|
71
|
+
return Search(
|
|
72
|
+
k=data.get("k"),
|
|
73
|
+
type=data.get("type", "similarity"),
|
|
74
|
+
fetch_k=data.get("fetchK"),
|
|
75
|
+
lambda_=data.get("lambda"),
|
|
76
|
+
prompt=data.get("prompt"),
|
|
77
|
+
return_source_documents=data.get("returnSourceDocuments"),
|
|
78
|
+
score_threshold=data.get("scoreThreshold"),
|
|
79
|
+
template=data.get("template")
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
@classmethod
|
|
83
|
+
def map_to_retriever_options(cls, data: dict) -> RetrieverOptions:
|
|
84
|
+
return RetrieverOptions(
|
|
85
|
+
type=data.get("type"),
|
|
86
|
+
search_type=data.get("searchType", "similarity"),
|
|
87
|
+
step=data.get("step", "all"),
|
|
88
|
+
prompt=data.get("prompt")
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
def map_to_index_options(cls, data: dict) -> IndexOptions:
|
|
93
|
+
"""
|
|
94
|
+
Maps a dictionary to an `IndexOptions` object.
|
|
95
|
+
|
|
96
|
+
:param data: dict - The dictionary containing index options details.
|
|
97
|
+
:return: IndexOptions - The mapped `IndexOptions` object.
|
|
98
|
+
"""
|
|
99
|
+
return IndexOptions(
|
|
100
|
+
chunks=cls.map_to_chunk_options(data.get("chunks")),
|
|
101
|
+
use_parent_document=data.get("useParentDocument", False),
|
|
102
|
+
child_document=cls.map_to_child_document_options(data.get("childDocument"))
|
|
103
|
+
if data.get("useParentDocument") else None
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
@classmethod
|
|
107
|
+
def map_to_chunk_options(cls, data: dict) -> ChunkOptions:
|
|
108
|
+
return ChunkOptions(
|
|
109
|
+
chunk_overlap=data.get("chunkOverlap"),
|
|
110
|
+
chunk_size=data.get("chunkSize")
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
@classmethod
|
|
114
|
+
def map_to_child_document_options(cls, data: dict) -> ChildDocumentOptions:
|
|
115
|
+
return ChildDocumentOptions(
|
|
116
|
+
child_k=data.get("childK"),
|
|
117
|
+
child=cls.map_to_child_options(data.get("child"))
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
@classmethod
|
|
121
|
+
def map_to_child_options(cls, data: dict) -> ChildOptions:
|
|
122
|
+
return ChildOptions(
|
|
123
|
+
chunk_size=data.get("chunkSize"),
|
|
124
|
+
chunk_overlap=data.get("chunkOverlap"),
|
|
125
|
+
content_processing=data.get("contentProcessing", "")
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def map_to_embeddings(cls, data: dict) -> Optional[EmbeddingsOptions]:
|
|
130
|
+
"""
|
|
131
|
+
Maps a dictionary to an `EmbeddingsOptions` object.
|
|
132
|
+
|
|
133
|
+
:param data: dict - The dictionary containing embeddings options details.
|
|
134
|
+
:return: EmbeddingsOptions - The mapped `EmbeddingsOptions` object.
|
|
135
|
+
"""
|
|
136
|
+
return EmbeddingsOptions(
|
|
137
|
+
dimensions=data.get('dimensions'),
|
|
138
|
+
model_name=data.get('modelName'),
|
|
139
|
+
provider=data.get('provider'),
|
|
140
|
+
use_proxy=data.get('useProxy')
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
@classmethod
|
|
144
|
+
def map_to_ingestion(cls, data: dict) -> Optional[IngestionOptions]:
|
|
145
|
+
"""
|
|
146
|
+
Maps a dictionary to an `IngestionOptions` object.
|
|
147
|
+
|
|
148
|
+
:param data: dict - The dictionary containing ingestion options details.
|
|
149
|
+
:return: IngestionOptions - The mapped `IngestionOptions` object.
|
|
150
|
+
"""
|
|
151
|
+
return IngestionOptions(
|
|
152
|
+
geai_options=data.get('geaiOptions'),
|
|
153
|
+
llama_parse_options=data.get('llamaParseOptions'),
|
|
154
|
+
provider=data.get('provider')
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
@classmethod
|
|
158
|
+
def map_to_variable_list(cls, data: list) -> Optional[ChatVariableList]:
|
|
159
|
+
"""
|
|
160
|
+
Maps a list of dictionaries to a `ChatVariableList` object.
|
|
161
|
+
|
|
162
|
+
:param data: list - The list containing chat variable details.
|
|
163
|
+
:return: ChatVariableList - The mapped `ChatVariableList` object.
|
|
164
|
+
"""
|
|
165
|
+
variables = list()
|
|
166
|
+
for variable in data:
|
|
167
|
+
for k, v in variable.items():
|
|
168
|
+
variables.append(
|
|
169
|
+
ChatVariable(
|
|
170
|
+
key=k,
|
|
171
|
+
value=v
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
return ChatVariableList(variables=variables)
|
|
176
|
+
|
|
177
|
+
@classmethod
|
|
178
|
+
def map_to_document_list_response(cls, data: dict) -> DocumentListResponse:
|
|
179
|
+
documents = cls.map_to_document_list(data)
|
|
180
|
+
count = data.get('count')
|
|
181
|
+
|
|
182
|
+
return DocumentListResponse(
|
|
183
|
+
count=count,
|
|
184
|
+
documents=documents
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
@classmethod
|
|
188
|
+
def map_to_document_list(cls, data: dict) -> list[Document]:
|
|
189
|
+
document_list = list()
|
|
190
|
+
documents = data.get("documents")
|
|
191
|
+
if documents is not None and any(documents):
|
|
192
|
+
for document_data in documents:
|
|
193
|
+
document = cls.map_to_document(document_data)
|
|
194
|
+
document_list.append(document)
|
|
195
|
+
|
|
196
|
+
return document_list
|
|
197
|
+
|
|
198
|
+
@classmethod
|
|
199
|
+
def map_to_document(cls, data: dict) -> Document:
|
|
200
|
+
metadata = cls.map_to_document_metadata_list(data)
|
|
201
|
+
|
|
202
|
+
return Document(
|
|
203
|
+
id=data.get('id'),
|
|
204
|
+
chunks=data.get('chunks'),
|
|
205
|
+
extension=data.get('extension'),
|
|
206
|
+
index_status=data.get('indexStatus'),
|
|
207
|
+
metadata=metadata,
|
|
208
|
+
timestamp=data.get('timestamp'),
|
|
209
|
+
url=data.get('url'),
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
@classmethod
|
|
213
|
+
def map_to_document_metadata_list(cls, data: dict) -> List[DocumentMetadata]:
|
|
214
|
+
metadata_list = list()
|
|
215
|
+
metadata = data.get('metadata')
|
|
216
|
+
if metadata is not None and any(metadata):
|
|
217
|
+
for metadata_data in metadata:
|
|
218
|
+
new_metadata = cls.map_to_document_metadata(metadata_data)
|
|
219
|
+
metadata_list.append(new_metadata)
|
|
220
|
+
|
|
221
|
+
return metadata_list
|
|
222
|
+
|
|
223
|
+
@classmethod
|
|
224
|
+
def map_to_document_metadata(cls, data: dict) -> DocumentMetadata:
|
|
225
|
+
return DocumentMetadata(
|
|
226
|
+
key=data.get('key'),
|
|
227
|
+
value=data.get('value')
|
|
228
|
+
)
|