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,44 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import sys
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
from pygeai.core.common.exceptions import ServerResponseError
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def measure_execution_time(func):
|
|
9
|
+
"""
|
|
10
|
+
Measure execution time of method or function.
|
|
11
|
+
"""
|
|
12
|
+
@functools.wraps(func)
|
|
13
|
+
def wrapper(*args, **kwargs):
|
|
14
|
+
sys.stdout.write(f"Measuring execution time for: {func.__name__}")
|
|
15
|
+
try:
|
|
16
|
+
start_time = time.time()
|
|
17
|
+
result = func(*args, **kwargs)
|
|
18
|
+
finish_time = time.time()
|
|
19
|
+
time_difference = finish_time - start_time
|
|
20
|
+
execution_time = round(time_difference, 6)
|
|
21
|
+
except Exception as e:
|
|
22
|
+
sys.stdout.write(f"Error measuring execution time: {e}")
|
|
23
|
+
else:
|
|
24
|
+
sys.stdout.write(f"Function {func.__name__} executed in {execution_time} s")
|
|
25
|
+
return result
|
|
26
|
+
|
|
27
|
+
return wrapper
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def handler_server_error(func):
|
|
31
|
+
"""
|
|
32
|
+
Intercepts server errors
|
|
33
|
+
"""
|
|
34
|
+
@functools.wraps(func)
|
|
35
|
+
def wrapper(*args, **kwargs):
|
|
36
|
+
result = func(*args, **kwargs)
|
|
37
|
+
if "error" in result:
|
|
38
|
+
raise ServerResponseError(
|
|
39
|
+
f"There was an error communicating with the server: {result.get('error')}"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
return result
|
|
43
|
+
|
|
44
|
+
return wrapper
|
pygeai/core/common/exceptions.py
CHANGED
|
@@ -6,19 +6,119 @@ class GEAIException(Exception):
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class UnknownArgumentError(GEAIException):
|
|
9
|
-
"""
|
|
10
|
-
|
|
9
|
+
"""Raised when an unknown or invalid command/option is provided"""
|
|
10
|
+
|
|
11
|
+
def __init__(self, message: str, arg: str = None, available_commands=None, available_options=None):
|
|
12
|
+
"""
|
|
13
|
+
Initialize an UnknownArgumentError with context.
|
|
14
|
+
|
|
15
|
+
:param message: str - The error message.
|
|
16
|
+
:param arg: str - The unknown argument that was provided.
|
|
17
|
+
:param available_commands: list - Available commands for suggestion.
|
|
18
|
+
:param available_options: list - Available options for suggestion.
|
|
19
|
+
"""
|
|
20
|
+
super().__init__(message)
|
|
21
|
+
self.arg = arg
|
|
22
|
+
self.available_commands = available_commands
|
|
23
|
+
self.available_options = available_options
|
|
11
24
|
|
|
12
25
|
|
|
13
26
|
class MissingRequirementException(GEAIException):
|
|
14
|
-
"""
|
|
27
|
+
"""Raised when a required parameter or argument is missing"""
|
|
15
28
|
pass
|
|
16
29
|
|
|
17
30
|
|
|
18
31
|
class WrongArgumentError(GEAIException):
|
|
19
|
-
"""
|
|
32
|
+
"""Raised when arguments are incorrectly formatted or invalid"""
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ValidationError(WrongArgumentError):
|
|
37
|
+
"""
|
|
38
|
+
Raised when input validation fails with detailed context.
|
|
39
|
+
|
|
40
|
+
Extends WrongArgumentError to provide structured validation errors
|
|
41
|
+
with field-specific information and examples.
|
|
42
|
+
"""
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
message: str,
|
|
46
|
+
field: str = None,
|
|
47
|
+
expected: str = None,
|
|
48
|
+
received: str = None,
|
|
49
|
+
example: str = None
|
|
50
|
+
):
|
|
51
|
+
"""
|
|
52
|
+
Initialize a ValidationError with detailed context.
|
|
53
|
+
|
|
54
|
+
:param message: str - The main error message.
|
|
55
|
+
:param field: str - Name of the field that failed validation.
|
|
56
|
+
:param expected: str - Description of what was expected.
|
|
57
|
+
:param received: str - Description of what was received.
|
|
58
|
+
:param example: str - Example of valid input.
|
|
59
|
+
"""
|
|
60
|
+
super().__init__(message)
|
|
61
|
+
self.field = field
|
|
62
|
+
self.expected = expected
|
|
63
|
+
self.received = received
|
|
64
|
+
self.example = example
|
|
65
|
+
|
|
66
|
+
def __str__(self) -> str:
|
|
67
|
+
"""
|
|
68
|
+
Format the error message with all available context.
|
|
69
|
+
|
|
70
|
+
:return: str - Formatted error message with field details.
|
|
71
|
+
"""
|
|
72
|
+
parts = [super().__str__()]
|
|
73
|
+
|
|
74
|
+
if self.field:
|
|
75
|
+
parts.append(f" Field: {self.field}")
|
|
76
|
+
if self.expected:
|
|
77
|
+
parts.append(f" Expected: {self.expected}")
|
|
78
|
+
if self.received:
|
|
79
|
+
parts.append(f" Received: {self.received}")
|
|
80
|
+
if self.example:
|
|
81
|
+
parts.append(f" Example: {self.example}")
|
|
82
|
+
|
|
83
|
+
return "\n".join(parts)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class ServerResponseError(GEAIException):
|
|
87
|
+
"""Raised when the server returns an error response"""
|
|
88
|
+
pass
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class APIError(GEAIException):
|
|
92
|
+
"""Raised when an API request fails"""
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class InvalidPathException(GEAIException):
|
|
97
|
+
"""Raised when a file or directory path is invalid or not found"""
|
|
20
98
|
pass
|
|
21
99
|
|
|
22
100
|
|
|
101
|
+
class InvalidJSONException(GEAIException):
|
|
102
|
+
"""Raised when JSON data cannot be parsed or is malformed"""
|
|
103
|
+
pass
|
|
104
|
+
|
|
23
105
|
|
|
106
|
+
class InvalidAPIResponseException(GEAIException):
|
|
107
|
+
"""Raised when the API response format is unexpected or invalid"""
|
|
108
|
+
pass
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class InvalidResponseException(GEAIException):
|
|
112
|
+
"""Raised when a response cannot be retrieved or processed"""
|
|
113
|
+
pass
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class InvalidAgentException(GEAIException):
|
|
117
|
+
"""Raised when an agent cannot be retrieved, validated, or is misconfigured"""
|
|
118
|
+
pass
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class APIResponseError(GEAIException):
|
|
122
|
+
"""Raised when there is an error in the API response"""
|
|
123
|
+
pass
|
|
24
124
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from pygeai.core.embeddings.clients import EmbeddingsClient
|
|
2
|
+
from pygeai.core.embeddings.managers import EmbeddingsManager
|
|
3
|
+
from pygeai.core.embeddings.models import EmbeddingConfiguration
|
|
4
|
+
from pygeai.core.embeddings.responses import (
|
|
5
|
+
EmbeddingResponse,
|
|
6
|
+
EmbeddingData,
|
|
7
|
+
UsageInfo,
|
|
8
|
+
TokenDetails
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
'EmbeddingsClient',
|
|
13
|
+
'EmbeddingsManager',
|
|
14
|
+
'EmbeddingConfiguration',
|
|
15
|
+
'EmbeddingResponse',
|
|
16
|
+
'EmbeddingData',
|
|
17
|
+
'UsageInfo',
|
|
18
|
+
'TokenDetails'
|
|
19
|
+
]
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
|
|
2
|
+
from pygeai import logger
|
|
3
|
+
from pygeai.core.base.clients import BaseClient
|
|
4
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException, APIResponseError
|
|
5
|
+
from pygeai.core.embeddings.endpoints import GENERATE_EMBEDDINGS
|
|
6
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
7
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EmbeddingsClient(BaseClient):
|
|
11
|
+
|
|
12
|
+
def generate_embeddings(
|
|
13
|
+
self,
|
|
14
|
+
input_list: list,
|
|
15
|
+
model: str,
|
|
16
|
+
encoding_format: str = None,
|
|
17
|
+
dimensions: int = None,
|
|
18
|
+
user: str = None,
|
|
19
|
+
input_type: str = None,
|
|
20
|
+
timeout: int = None,
|
|
21
|
+
cache: bool = False
|
|
22
|
+
) -> dict:
|
|
23
|
+
"""
|
|
24
|
+
Generates an embedding vector representing the provided input(s) using the specified model.
|
|
25
|
+
|
|
26
|
+
This method calls the API to create a vector representation of the input(s), which can be used
|
|
27
|
+
in machine learning models and algorithms. The request is sent to the embeddings API endpoint.
|
|
28
|
+
|
|
29
|
+
:param input_list: list - A list of strings representing the input(s) to embed.
|
|
30
|
+
Each input must not exceed the maximum input tokens for the model
|
|
31
|
+
and cannot be an empty string.
|
|
32
|
+
:param model: str - The provider/modelId to use for generating embeddings.
|
|
33
|
+
:param encoding_format: str, optional - The format for the returned embeddings, either 'float'
|
|
34
|
+
(default) or 'base64'. Only supported by OpenAI.
|
|
35
|
+
:param dimensions: int, optional - The number of dimensions for the resulting output embeddings.
|
|
36
|
+
Only supported in text-embedding-3* and later models.
|
|
37
|
+
:param user: str, optional - A unique identifier representing the end-user. Specific to OpenAI.
|
|
38
|
+
:param input_type: str, optional - Defines how the input data will be used when generating
|
|
39
|
+
embeddings. Check if the selected embeddings model supports this option.
|
|
40
|
+
:param timeout: int, optional - The maximum time, in seconds, to wait for the API to respond.
|
|
41
|
+
Defaults to 600 seconds.
|
|
42
|
+
:param cache: bool, optional - Whether to enable caching for the embeddings. Defaults to False.
|
|
43
|
+
|
|
44
|
+
:return: dict - A dictionary containing the embedding results, including the model used, the generated
|
|
45
|
+
embedding vectors, and usage statistics.
|
|
46
|
+
:raises ValueError: If validation fails for input parameters.
|
|
47
|
+
"""
|
|
48
|
+
if not input_list or len(input_list) == 0:
|
|
49
|
+
raise ValueError("input_list cannot be empty")
|
|
50
|
+
|
|
51
|
+
for idx, inp in enumerate(input_list):
|
|
52
|
+
if not inp or (isinstance(inp, str) and inp.strip() == ""):
|
|
53
|
+
raise ValueError(f"Input at index {idx} cannot be empty")
|
|
54
|
+
|
|
55
|
+
if encoding_format is not None and encoding_format not in ['float', 'base64']:
|
|
56
|
+
raise ValueError("encoding_format must be either 'float' or 'base64'")
|
|
57
|
+
|
|
58
|
+
if dimensions is not None and dimensions <= 0:
|
|
59
|
+
raise ValueError("dimensions must be a positive integer")
|
|
60
|
+
|
|
61
|
+
data = {
|
|
62
|
+
'model': model,
|
|
63
|
+
'input': input_list,
|
|
64
|
+
}
|
|
65
|
+
if encoding_format is not None:
|
|
66
|
+
data["encoding_format"] = encoding_format
|
|
67
|
+
|
|
68
|
+
if dimensions is not None:
|
|
69
|
+
data["dimensions"] = dimensions
|
|
70
|
+
|
|
71
|
+
if user is not None:
|
|
72
|
+
data["user"] = user
|
|
73
|
+
|
|
74
|
+
if input_type is not None:
|
|
75
|
+
data["input_type"] = input_type
|
|
76
|
+
|
|
77
|
+
if timeout is not None:
|
|
78
|
+
data["timeout"] = timeout
|
|
79
|
+
|
|
80
|
+
logger.debug(f"Generating embeddings with data: {data}")
|
|
81
|
+
|
|
82
|
+
headers = {}
|
|
83
|
+
if cache:
|
|
84
|
+
headers['X-Saia-Cache-Enabled'] = "true"
|
|
85
|
+
|
|
86
|
+
response = self.api_service.post(
|
|
87
|
+
endpoint=GENERATE_EMBEDDINGS,
|
|
88
|
+
data=data,
|
|
89
|
+
headers=headers
|
|
90
|
+
)
|
|
91
|
+
validate_status_code(response)
|
|
92
|
+
return parse_json_response(response, "generate embeddings")
|
|
93
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
GENERATE_EMBEDDINGS = "/embeddings" # POST -> Creates an embedding vector representing the input
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from pygeai import logger
|
|
2
|
+
from pygeai.core.base.mappers import ErrorMapper
|
|
3
|
+
from pygeai.core.common.exceptions import APIError
|
|
4
|
+
from pygeai.core.embeddings.clients import EmbeddingsClient
|
|
5
|
+
from pygeai.core.embeddings.mappers import EmbeddingsResponseMapper
|
|
6
|
+
from pygeai.core.embeddings.models import EmbeddingConfiguration
|
|
7
|
+
from pygeai.core.embeddings.responses import EmbeddingResponse
|
|
8
|
+
from pygeai.core.handlers import ErrorHandler
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class EmbeddingsManager:
|
|
12
|
+
|
|
13
|
+
def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
|
|
14
|
+
self.__client = EmbeddingsClient(api_key, base_url, alias)
|
|
15
|
+
|
|
16
|
+
def generate_embeddings(
|
|
17
|
+
self,
|
|
18
|
+
configuration: EmbeddingConfiguration
|
|
19
|
+
) -> EmbeddingResponse:
|
|
20
|
+
"""
|
|
21
|
+
Generates an embedding vector representing the provided input(s) using the specified model.
|
|
22
|
+
|
|
23
|
+
This method calls the API to create a vector representation of the input(s), which can be used
|
|
24
|
+
in machine learning models and algorithms. The request is sent to the embeddings API endpoint.
|
|
25
|
+
|
|
26
|
+
:param configuration: EmbeddingConfiguration - An instance containing the configuration for generating
|
|
27
|
+
embeddings, including:
|
|
28
|
+
- inputs: list - A list of strings representing the input(s) to embed. Each input must not
|
|
29
|
+
exceed the maximum input tokens for the model and cannot be an empty string.
|
|
30
|
+
- model: str - The provider/modelId to use for generating embeddings.
|
|
31
|
+
- encoding_format: str, optional - The format for the returned embeddings, either 'float'
|
|
32
|
+
(default) or 'base64'. Only supported by OpenAI.
|
|
33
|
+
- dimensions: int, optional - The number of dimensions for the resulting output embeddings.
|
|
34
|
+
Only supported in text-embedding-3* and later models.
|
|
35
|
+
- user: str, optional - A unique identifier representing the end-user. Specific to OpenAI.
|
|
36
|
+
- input_type: str, optional - Defines how the input data will be used when generating
|
|
37
|
+
embeddings. Check if the selected embeddings model supports this option.
|
|
38
|
+
- timeout: int, optional - The maximum time, in seconds, to wait for the API to respond.
|
|
39
|
+
Defaults to 600 seconds.
|
|
40
|
+
- cache: bool, optional - Whether to enable caching for the embeddings. Defaults to False.
|
|
41
|
+
|
|
42
|
+
:return: EmbeddingResponse - A response object containing the generated embeddings and usage information.
|
|
43
|
+
:raises APIError - If the API returns errors.
|
|
44
|
+
"""
|
|
45
|
+
response_data = self.__client.generate_embeddings(
|
|
46
|
+
input_list=configuration.inputs,
|
|
47
|
+
model=configuration.model,
|
|
48
|
+
encoding_format=configuration.encoding_format,
|
|
49
|
+
dimensions=configuration.dimensions,
|
|
50
|
+
user=configuration.user,
|
|
51
|
+
input_type=configuration.input_type,
|
|
52
|
+
timeout=configuration.timeout,
|
|
53
|
+
cache=configuration.cache,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if ErrorHandler.has_errors(response_data):
|
|
57
|
+
error = ErrorHandler.extract_error(response_data)
|
|
58
|
+
logger.error(f"Error received while generating embeddings: {error}")
|
|
59
|
+
raise APIError(f"Error received while generating embeddings: {error}")
|
|
60
|
+
|
|
61
|
+
result = EmbeddingsResponseMapper.map_to_embedding_response(response_data)
|
|
62
|
+
return result
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from pygeai.core.embeddings.responses import EmbeddingResponse, EmbeddingData, UsageInfo, TokenDetails
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class EmbeddingsResponseMapper:
|
|
5
|
+
|
|
6
|
+
@classmethod
|
|
7
|
+
def map_to_embedding_response(cls, data: dict) -> EmbeddingResponse:
|
|
8
|
+
embedding_data_list = cls.map_to_embedding_data_list(data.get('data', []))
|
|
9
|
+
usage_info = cls.map_to_usage_info(data.get('usage', {}))
|
|
10
|
+
|
|
11
|
+
return EmbeddingResponse(
|
|
12
|
+
data=embedding_data_list,
|
|
13
|
+
usage=usage_info,
|
|
14
|
+
model=data.get('model', ''),
|
|
15
|
+
object=data.get('object', '')
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def map_to_embedding_data_list(cls, data: list) -> list[EmbeddingData]:
|
|
20
|
+
embedding_data_list = []
|
|
21
|
+
for item in data:
|
|
22
|
+
embedding_data = EmbeddingData(
|
|
23
|
+
index=item.get('index', 0),
|
|
24
|
+
embedding=item.get('embedding', []),
|
|
25
|
+
object=item.get('object', '')
|
|
26
|
+
)
|
|
27
|
+
embedding_data_list.append(embedding_data)
|
|
28
|
+
return embedding_data_list
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def map_to_usage_info(cls, data: dict) -> UsageInfo:
|
|
32
|
+
completion_tokens_details_data = data.get('completion_tokens_details')
|
|
33
|
+
prompt_tokens_details_data = data.get('prompt_tokens_details')
|
|
34
|
+
|
|
35
|
+
return UsageInfo(
|
|
36
|
+
prompt_tokens=data.get('prompt_tokens', 0),
|
|
37
|
+
total_cost=data.get('total_cost', 0.0),
|
|
38
|
+
total_tokens=data.get('total_tokens', 0),
|
|
39
|
+
currency=data.get('currency', ''),
|
|
40
|
+
prompt_cost=data.get('prompt_cost', 0.0),
|
|
41
|
+
completion_tokens_details=cls._parse_token_details(completion_tokens_details_data),
|
|
42
|
+
prompt_tokens_details=cls._parse_token_details(prompt_tokens_details_data)
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def _parse_token_details(cls, data: dict) -> TokenDetails | None:
|
|
47
|
+
if data is None:
|
|
48
|
+
return None
|
|
49
|
+
return TokenDetails(
|
|
50
|
+
reasoning_tokens=data.get('reasoning_tokens'),
|
|
51
|
+
cached_tokens=data.get('cached_tokens')
|
|
52
|
+
)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from typing import List, Optional
|
|
2
|
+
|
|
3
|
+
from pydantic.main import BaseModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EmbeddingConfiguration(BaseModel):
|
|
7
|
+
inputs: List[str]
|
|
8
|
+
model: str
|
|
9
|
+
encoding_format: Optional[str] = None
|
|
10
|
+
dimensions: Optional[int] = None
|
|
11
|
+
user: Optional[str] = None
|
|
12
|
+
input_type: Optional[str] = None
|
|
13
|
+
timeout: Optional[int] = None
|
|
14
|
+
cache: Optional[bool] = False
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import List, Union, Optional
|
|
2
|
+
|
|
3
|
+
from pydantic.main import BaseModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TokenDetails(BaseModel):
|
|
7
|
+
reasoning_tokens: Optional[int] = None
|
|
8
|
+
cached_tokens: Optional[int] = None
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class EmbeddingData(BaseModel):
|
|
12
|
+
index: int
|
|
13
|
+
embedding: Union[List[float], str]
|
|
14
|
+
object: str
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class UsageInfo(BaseModel):
|
|
18
|
+
prompt_tokens: int
|
|
19
|
+
total_cost: float
|
|
20
|
+
total_tokens: int
|
|
21
|
+
currency: str
|
|
22
|
+
prompt_cost: float
|
|
23
|
+
completion_tokens_details: Optional[TokenDetails] = None
|
|
24
|
+
prompt_tokens_details: Optional[TokenDetails] = None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class EmbeddingResponse(BaseModel):
|
|
28
|
+
data: List[EmbeddingData]
|
|
29
|
+
usage: UsageInfo
|
|
30
|
+
model: str
|
|
31
|
+
object: str
|
|
File without changes
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from typing import Any, Union
|
|
2
|
+
|
|
3
|
+
from pygeai import logger
|
|
4
|
+
from pygeai.core.base.clients import BaseClient
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
6
|
+
from pygeai.core.feedback.endpoints import SEND_FEEDBACK_V1
|
|
7
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
8
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class FeedbackClient(BaseClient):
|
|
12
|
+
|
|
13
|
+
def send_feedback(
|
|
14
|
+
self,
|
|
15
|
+
request_id: str,
|
|
16
|
+
origin: str = "user-feedback",
|
|
17
|
+
answer_score: int = 1,
|
|
18
|
+
comments: str = None
|
|
19
|
+
) -> dict:
|
|
20
|
+
"""
|
|
21
|
+
Sends feedback for an assistant's response.
|
|
22
|
+
|
|
23
|
+
This method submits user feedback to the Feedback API, associating it with a specific request.
|
|
24
|
+
The feedback includes an origin identifier, a score indicating the response quality, and an optional comment.
|
|
25
|
+
|
|
26
|
+
:param request_id: str - The request associated with a user's execution.
|
|
27
|
+
:param origin: str - The origin of the feedback. Should be set to "user-feedback".
|
|
28
|
+
:param answer_score: int - The score for the response.
|
|
29
|
+
- 1: Good
|
|
30
|
+
- 2: Bad
|
|
31
|
+
:param comments: str, optional - Additional feedback comments. Defaults to None.
|
|
32
|
+
:return: dict - The parsed JSON response from the API. The expected response is an empty JSON object ({}).
|
|
33
|
+
"""
|
|
34
|
+
data = {
|
|
35
|
+
"origin": origin,
|
|
36
|
+
"answerScore": answer_score,
|
|
37
|
+
}
|
|
38
|
+
if comments:
|
|
39
|
+
data["comments"] = comments
|
|
40
|
+
|
|
41
|
+
logger.debug(f"Providing feedback with data: {data}")
|
|
42
|
+
|
|
43
|
+
endpoint = SEND_FEEDBACK_V1.format(requestId=request_id)
|
|
44
|
+
response = self.api_service.post(
|
|
45
|
+
endpoint=endpoint,
|
|
46
|
+
data=data
|
|
47
|
+
)
|
|
48
|
+
validate_status_code(response)
|
|
49
|
+
return parse_json_response(response, "send feedback. JSON parsing error")
|
|
50
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
SEND_FEEDBACK_V1 = "v1/feedback/request/{requestId}" # POST -> Add feedback to a request associated with a user's execution; note the requestId parameters are returned on every assistant reply.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from pydantic import BaseModel, Field
|
|
2
|
+
|
|
3
|
+
from pygeai.core import CustomBaseModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class FeedbackRequest(CustomBaseModel):
|
|
7
|
+
request_id: str = Field(..., alias="requestId")
|
|
8
|
+
origin: str = Field("user-feedback", alias="origin")
|
|
9
|
+
answer_score: int = Field(..., alias="answerScore")
|
|
10
|
+
comments: str = Field(None, alias="comments")
|
|
File without changes
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from json import JSONDecodeError
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from pygeai import logger
|
|
6
|
+
from pygeai.core.base.clients import BaseClient
|
|
7
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
8
|
+
from pygeai.core.files.endpoints import UPLOAD_FILE_V1, GET_FILE_V1, DELETE_FILE_V1, GET_FILE_CONTENT_V1, \
|
|
9
|
+
GET_ALL_FILES_V1
|
|
10
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
11
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class FileClient(BaseClient):
|
|
15
|
+
|
|
16
|
+
def upload_file(
|
|
17
|
+
self,
|
|
18
|
+
file_path: str,
|
|
19
|
+
organization_id: str,
|
|
20
|
+
project_id: str,
|
|
21
|
+
folder: str = None,
|
|
22
|
+
file_name: str = None
|
|
23
|
+
) -> dict:
|
|
24
|
+
"""
|
|
25
|
+
Uploads a file to the system.
|
|
26
|
+
|
|
27
|
+
:param file_path: str - Path to the file to be uploaded.
|
|
28
|
+
:param organization_id: str - The organization ID.
|
|
29
|
+
:param project_id: str - The project ID.
|
|
30
|
+
:param folder: str, optional - Destination folder (default is None, which means temporary storage).
|
|
31
|
+
:param file_name: str, optional - Custom file name (defaults to the uploaded file's name).
|
|
32
|
+
|
|
33
|
+
:return: dict - API response containing file ID and URL.
|
|
34
|
+
"""
|
|
35
|
+
file_path = Path(file_path)
|
|
36
|
+
if not file_path.is_file():
|
|
37
|
+
raise FileNotFoundError(f"File not found: {file_path}")
|
|
38
|
+
|
|
39
|
+
headers = {
|
|
40
|
+
"organizationId": organization_id,
|
|
41
|
+
"projectId": project_id,
|
|
42
|
+
}
|
|
43
|
+
if file_name:
|
|
44
|
+
headers["fileName"] = file_name
|
|
45
|
+
if folder:
|
|
46
|
+
headers["folder"] = folder
|
|
47
|
+
|
|
48
|
+
files = {"file": file_path.open("rb")}
|
|
49
|
+
|
|
50
|
+
logger.debug(f"Uploading file {file_name}")
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
response = self.api_service.post_files_multipart(
|
|
54
|
+
endpoint=UPLOAD_FILE_V1,
|
|
55
|
+
headers=headers,
|
|
56
|
+
files=files
|
|
57
|
+
)
|
|
58
|
+
validate_status_code(response)
|
|
59
|
+
return parse_json_response(response, "upload file in project", file_name=file_name, project_id=project_id)
|
|
60
|
+
|
|
61
|
+
finally:
|
|
62
|
+
files["file"].close()
|
|
63
|
+
|
|
64
|
+
def get_file(self, organization: str, project: str, file_id: str) -> dict:
|
|
65
|
+
"""
|
|
66
|
+
Retrieves details of a specific file by its ID.
|
|
67
|
+
|
|
68
|
+
:param organization: str - The ID of the organization that owns the file.
|
|
69
|
+
:param project: str - The ID of the project associated with the file.
|
|
70
|
+
:param file_id: str - The unique identifier of the file.
|
|
71
|
+
:return: dict - The file metadata as a dictionary.
|
|
72
|
+
"""
|
|
73
|
+
endpoint = GET_FILE_V1.format(fileId=file_id)
|
|
74
|
+
response = self.api_service.get(
|
|
75
|
+
endpoint=endpoint,
|
|
76
|
+
params={
|
|
77
|
+
"organization": organization,
|
|
78
|
+
"project": project
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
logger.debug(f"Retrieving file details for id {file_id}")
|
|
82
|
+
validate_status_code(response)
|
|
83
|
+
return parse_json_response(response, "retrieve file details for id in project", file_id=file_id, project=project)
|
|
84
|
+
|
|
85
|
+
def delete_file(self, organization: str, project: str, file_id: str) -> dict:
|
|
86
|
+
"""
|
|
87
|
+
Deletes a file by its ID.
|
|
88
|
+
|
|
89
|
+
:param organization: str - The ID of the organization that owns the file.
|
|
90
|
+
:param project: str - The ID of the project associated with the file.
|
|
91
|
+
:param file_id: str - The unique identifier of the file.
|
|
92
|
+
:return: dict - Response indicating the success or failure of the deletion.
|
|
93
|
+
"""
|
|
94
|
+
endpoint = DELETE_FILE_V1.format(fileId=file_id)
|
|
95
|
+
headers = {
|
|
96
|
+
"Accept": "application/json",
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
logger.debug(f"Deleting file with id {file_id}")
|
|
100
|
+
|
|
101
|
+
response = self.api_service.delete(
|
|
102
|
+
endpoint=endpoint,
|
|
103
|
+
headers=headers,
|
|
104
|
+
data={
|
|
105
|
+
"organization": organization,
|
|
106
|
+
"project": project
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
validate_status_code(response)
|
|
110
|
+
return parse_json_response(response, "delete file with id in project", file_id=file_id, project=project)
|
|
111
|
+
|
|
112
|
+
def get_file_content(self, organization: str, project: str, file_id: str) -> bytes:
|
|
113
|
+
"""
|
|
114
|
+
Retrieves the raw content of a file by its ID.
|
|
115
|
+
|
|
116
|
+
:param organization: str - The ID of the organization that owns the file.
|
|
117
|
+
:param project: str - The ID of the project associated with the file.
|
|
118
|
+
:param file_id: str - The unique identifier of the file.
|
|
119
|
+
:return: bytes - The file content in binary format.
|
|
120
|
+
"""
|
|
121
|
+
endpoint = GET_FILE_CONTENT_V1.format(fileId=file_id)
|
|
122
|
+
|
|
123
|
+
logger.debug(f"Retrieving raw content of file with id {file_id}")
|
|
124
|
+
|
|
125
|
+
response = self.api_service.get(
|
|
126
|
+
endpoint=endpoint,
|
|
127
|
+
params={
|
|
128
|
+
"organization": organization,
|
|
129
|
+
"project": project
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
return response.content
|
|
133
|
+
|
|
134
|
+
def get_file_list(
|
|
135
|
+
self,
|
|
136
|
+
organization: str,
|
|
137
|
+
project: str
|
|
138
|
+
) -> dict:
|
|
139
|
+
"""
|
|
140
|
+
Retrieves a list of all files associated with a given organization and project.
|
|
141
|
+
|
|
142
|
+
:param organization: str - The ID of the organization.
|
|
143
|
+
:param project: str - The ID of the project.
|
|
144
|
+
:return: dict - A dictionary containing the list of files.
|
|
145
|
+
"""
|
|
146
|
+
logger.debug(f"Retrieving file list for project {project}")
|
|
147
|
+
|
|
148
|
+
response = self.api_service.get(
|
|
149
|
+
endpoint=GET_ALL_FILES_V1,
|
|
150
|
+
params={
|
|
151
|
+
"organization": organization,
|
|
152
|
+
"project": project
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
validate_status_code(response)
|
|
156
|
+
return parse_json_response(response, "retrieve file list for project", project=project)
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
UPLOAD_FILE_V1 = "v1/files" # POST -> Uploads a file
|
|
2
|
+
GET_FILE_V1 = "v1/files/{fileId}" # GET -> Gets a file by Id
|
|
3
|
+
DELETE_FILE_V1 = "v1/files/{fileId}" # DELETE -> Deletes a file by Id
|
|
4
|
+
GET_FILE_CONTENT_V1 = "v1/files/{fileId}/content" # GET -> Gets the content of a file by Id
|
|
5
|
+
GET_ALL_FILES_V1 = "v1/files/all" # GET -> Gets all files
|