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
pygeai/chat/clients.py
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import json
|
|
2
|
+
from json import JSONDecodeError
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import List, Dict, Optional, Union, Generator
|
|
2
5
|
|
|
3
|
-
from pygeai
|
|
6
|
+
from pygeai import logger
|
|
7
|
+
from pygeai.chat.endpoints import CHAT_V1, GENERATE_IMAGE_V1, EDIT_IMAGE_V1, RESPONSES_V1
|
|
4
8
|
from pygeai.core.base.clients import BaseClient
|
|
9
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
10
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
11
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
5
12
|
|
|
6
13
|
|
|
7
14
|
class ChatClient(BaseClient):
|
|
@@ -10,69 +17,437 @@ class ChatClient(BaseClient):
|
|
|
10
17
|
response = self.api_service.post(
|
|
11
18
|
endpoint=CHAT_V1
|
|
12
19
|
)
|
|
13
|
-
|
|
14
|
-
return
|
|
20
|
+
validate_status_code(response)
|
|
21
|
+
return parse_json_response(response, "chat")
|
|
15
22
|
|
|
16
23
|
def chat_completion(
|
|
17
24
|
self,
|
|
18
25
|
model: str,
|
|
19
|
-
messages:
|
|
26
|
+
messages: List[Dict[str, str]],
|
|
20
27
|
stream: bool = False,
|
|
21
|
-
temperature:
|
|
22
|
-
max_tokens: int = None,
|
|
23
|
-
thread_id: str = None,
|
|
24
|
-
frequency_penalty: float = None,
|
|
25
|
-
presence_penalty: float = None
|
|
26
|
-
|
|
28
|
+
temperature: Optional[float] = None,
|
|
29
|
+
max_tokens: Optional[int] = None,
|
|
30
|
+
thread_id: Optional[str] = None,
|
|
31
|
+
frequency_penalty: Optional[float] = None,
|
|
32
|
+
presence_penalty: Optional[float] = None,
|
|
33
|
+
variables: Optional[List] = None,
|
|
34
|
+
top_p: Optional[float] = None,
|
|
35
|
+
stop: Optional[Union[str, List[str]]] = None,
|
|
36
|
+
response_format: Optional[Dict] = None,
|
|
37
|
+
tools: Optional[List[Dict]] = None,
|
|
38
|
+
tool_choice: Optional[Union[str, Dict]] = None,
|
|
39
|
+
logprobs: Optional[bool] = None,
|
|
40
|
+
top_logprobs: Optional[int] = None,
|
|
41
|
+
seed: Optional[int] = None,
|
|
42
|
+
stream_options: Optional[Dict] = None,
|
|
43
|
+
store: Optional[bool] = None,
|
|
44
|
+
metadata: Optional[Dict] = None,
|
|
45
|
+
user: Optional[str] = None,
|
|
46
|
+
reasoning_effort: Optional[str] = None
|
|
47
|
+
) -> Union[dict, str, Generator[str, None, None]]:
|
|
27
48
|
"""
|
|
28
49
|
Generates a chat completion response using the specified model and parameters.
|
|
29
50
|
|
|
30
51
|
:param model: str - The model specification in the format
|
|
31
52
|
"saia:<assistant_type>:<assistant_name>|<bot_id>". Determines the assistant type and associated configuration. (Required)
|
|
32
|
-
:param messages:
|
|
53
|
+
:param messages: List[Dict[str, str]] - A list of messages to include in the chat completion. Each message should be a dictionary with
|
|
33
54
|
the following structure:
|
|
34
55
|
{
|
|
35
|
-
"role": "string",
|
|
36
|
-
"content": "string"
|
|
56
|
+
"role": "string",
|
|
57
|
+
"content": "string"
|
|
37
58
|
} (Required)
|
|
38
59
|
:param stream: bool - Whether the response should be streamed. Possible values:
|
|
39
|
-
- False:
|
|
40
|
-
- True:
|
|
41
|
-
:param temperature:
|
|
60
|
+
- False: Returns the complete response as a dictionary or string (default).
|
|
61
|
+
- True: Returns a generator yielding content strings as they are received.
|
|
62
|
+
:param temperature: Optional[float] - Controls the randomness of the response. Higher values (e.g., 2.0) produce more random responses,
|
|
42
63
|
while lower values (e.g., 0.2) produce more deterministic responses. (Optional)
|
|
43
|
-
:param max_tokens: int - The maximum number of tokens to generate in the response. (Optional)
|
|
44
|
-
:param thread_id: str - An optional UUID to identify the conversation thread. (Optional)
|
|
45
|
-
:param frequency_penalty: float - A value between -2.0 and 2.0. Positive values decrease the model's likelihood of
|
|
64
|
+
:param max_tokens: Optional[int] - The maximum number of tokens to generate in the response. (Optional)
|
|
65
|
+
:param thread_id: Optional[str] - An optional UUID to identify the conversation thread. (Optional)
|
|
66
|
+
:param frequency_penalty: Optional[float] - A value between -2.0 and 2.0. Positive values decrease the model's likelihood of
|
|
46
67
|
repeating tokens based on their frequency in the text so far. (Optional)
|
|
47
|
-
:param presence_penalty: float - A value between -2.0 and 2.0. Positive values increase the model's likelihood of
|
|
68
|
+
:param presence_penalty: Optional[float] - A value between -2.0 and 2.0. Positive values increase the model's likelihood of
|
|
48
69
|
discussing new topics by penalizing tokens that have already appeared in the text. (Optional)
|
|
49
|
-
:
|
|
70
|
+
:param variables: Optional[List] - A list of additional variables. These must be defined at the time of creation, otherwise
|
|
71
|
+
their use will throw an error. (Optional)
|
|
72
|
+
:param top_p: Optional[float] - An alternative to temperature, nucleus sampling considers tokens with top_p probability mass. (Optional)
|
|
73
|
+
:param stop: Optional[Union[str, List[str]]] - Up to 4 sequences where the API stops generating further tokens. (Optional)
|
|
74
|
+
:param response_format: Optional[Dict] - Specifies the output format, e.g., JSON schema for structured outputs. (Optional)
|
|
75
|
+
:param tools: Optional[List[Dict]] - A list of tools (e.g., functions) the model may call. (Optional)
|
|
76
|
+
:param tool_choice: Optional[Union[str, Dict]] - Controls which tool is called (e.g., "none", "auto", or specific tool). (Optional)
|
|
77
|
+
:param logprobs: Optional[bool] - Whether to return log probabilities of output tokens. (Optional)
|
|
78
|
+
:param top_logprobs: Optional[int] - Number of most likely tokens to return with log probabilities (0-20). (Optional)
|
|
79
|
+
:param seed: Optional[int] - For deterministic sampling, in Beta. (Optional)
|
|
80
|
+
:param stream_options: Optional[Dict] - Options for streaming, e.g., include_usage. (Optional)
|
|
81
|
+
:param store: Optional[bool] - Whether to store the output for model distillation or evals. (Optional)
|
|
82
|
+
:param metadata: Optional[Dict] - Up to 16 key-value pairs to attach to the object. (Optional)
|
|
83
|
+
:param user: Optional[str] - A unique identifier for the end-user to monitor abuse. (Optional)
|
|
84
|
+
:param reasoning_effort: Optional[str] - Controls the depth of reasoning applied by supported models.
|
|
85
|
+
Possible values: "low", "medium", "high". Supported by OpenAI models from version 5,
|
|
86
|
+
Claude models from version 4.1, and Gemini models from version 2.0. (Optional)
|
|
87
|
+
:return: Union[dict, str, Generator[str, None, None]] - For non-streaming (stream=False), returns a dictionary containing the chat completion
|
|
88
|
+
result or a string if JSON decoding fails. For streaming (stream=True), returns a generator yielding content strings extracted from the
|
|
89
|
+
streaming response chunks.
|
|
50
90
|
"""
|
|
51
91
|
data = {
|
|
52
92
|
'model': model,
|
|
53
93
|
'messages': messages,
|
|
54
94
|
'stream': stream
|
|
55
95
|
}
|
|
56
|
-
if temperature:
|
|
96
|
+
if temperature is not None:
|
|
57
97
|
data['temperature'] = temperature
|
|
58
98
|
|
|
59
99
|
if max_tokens:
|
|
60
|
-
|
|
61
|
-
data['max_tokens'] = max_tokens
|
|
62
|
-
|
|
63
|
-
if thread_id:
|
|
64
|
-
data['threadId'] = thread_id
|
|
100
|
+
data['max_completion_tokens'] = max_tokens
|
|
65
101
|
|
|
66
|
-
if frequency_penalty:
|
|
102
|
+
if frequency_penalty is not None:
|
|
67
103
|
data['frequency_penalty'] = frequency_penalty
|
|
68
104
|
|
|
69
|
-
if presence_penalty:
|
|
105
|
+
if presence_penalty is not None:
|
|
70
106
|
data['presence_penalty'] = presence_penalty
|
|
71
107
|
|
|
108
|
+
if variables is not None and any(variables):
|
|
109
|
+
data['variables'] = variables
|
|
110
|
+
|
|
111
|
+
if top_p is not None:
|
|
112
|
+
data['top_p'] = top_p
|
|
113
|
+
|
|
114
|
+
if stop is not None:
|
|
115
|
+
data['stop'] = stop
|
|
116
|
+
|
|
117
|
+
if response_format is not None:
|
|
118
|
+
data['response_format'] = response_format
|
|
119
|
+
|
|
120
|
+
if tools is not None:
|
|
121
|
+
data['tools'] = tools
|
|
122
|
+
|
|
123
|
+
if tool_choice is not None:
|
|
124
|
+
data['tool_choice'] = tool_choice
|
|
125
|
+
|
|
126
|
+
if logprobs is not None:
|
|
127
|
+
data['logprobs'] = logprobs
|
|
128
|
+
|
|
129
|
+
if top_logprobs is not None:
|
|
130
|
+
data['top_logprobs'] = top_logprobs
|
|
131
|
+
|
|
132
|
+
if seed is not None:
|
|
133
|
+
data['seed'] = seed
|
|
134
|
+
|
|
135
|
+
if stream_options is not None:
|
|
136
|
+
data['stream_options'] = stream_options
|
|
137
|
+
|
|
138
|
+
if store is not None:
|
|
139
|
+
data['store'] = store
|
|
140
|
+
|
|
141
|
+
if metadata is not None:
|
|
142
|
+
data['metadata'] = metadata
|
|
143
|
+
|
|
144
|
+
if user is not None:
|
|
145
|
+
data['user'] = user
|
|
146
|
+
|
|
147
|
+
if reasoning_effort is not None:
|
|
148
|
+
data['reasoning_effort'] = reasoning_effort
|
|
149
|
+
|
|
150
|
+
headers = {}
|
|
151
|
+
if thread_id:
|
|
152
|
+
headers["saia-conversation-id"] = thread_id
|
|
153
|
+
|
|
154
|
+
logger.debug(f"Generating chat completion with data: {data}")
|
|
155
|
+
|
|
156
|
+
if stream:
|
|
157
|
+
response = self.api_service.stream_post(
|
|
158
|
+
endpoint=CHAT_V1,
|
|
159
|
+
data=data,
|
|
160
|
+
headers=headers
|
|
161
|
+
)
|
|
162
|
+
return self.stream_chat_generator(response)
|
|
163
|
+
else:
|
|
164
|
+
response = self.api_service.post(
|
|
165
|
+
endpoint=CHAT_V1,
|
|
166
|
+
data=data,
|
|
167
|
+
headers=headers
|
|
168
|
+
)
|
|
169
|
+
validate_status_code(response)
|
|
170
|
+
|
|
171
|
+
result = parse_json_response(response, "process chat request")
|
|
172
|
+
|
|
173
|
+
logger.debug(f"Chat completion result: {result}")
|
|
174
|
+
|
|
175
|
+
return result
|
|
176
|
+
|
|
177
|
+
def stream_chat_generator(self, response) -> Generator[str, None, None]:
|
|
178
|
+
"""
|
|
179
|
+
Processes a streaming response and yields content strings.
|
|
180
|
+
|
|
181
|
+
:param response: The streaming response from the API.
|
|
182
|
+
:return: Generator[str, None, None] - Yields content strings extracted from streaming chunks.
|
|
183
|
+
"""
|
|
184
|
+
try:
|
|
185
|
+
for line in response:
|
|
186
|
+
if line.startswith("data:"):
|
|
187
|
+
chunk = line[5:].strip()
|
|
188
|
+
if chunk == "[DONE]":
|
|
189
|
+
break
|
|
190
|
+
try:
|
|
191
|
+
json_data = json.loads(chunk)
|
|
192
|
+
if (
|
|
193
|
+
json_data.get("choices")
|
|
194
|
+
and len(json_data["choices"]) > 0
|
|
195
|
+
and "delta" in json_data["choices"][0]
|
|
196
|
+
and "content" in json_data["choices"][0]["delta"]
|
|
197
|
+
):
|
|
198
|
+
content = json_data["choices"][0]["delta"]["content"]
|
|
199
|
+
yield content
|
|
200
|
+
except JSONDecodeError as e:
|
|
201
|
+
continue
|
|
202
|
+
except Exception as e:
|
|
203
|
+
raise InvalidAPIResponseException(f"Unable to process streaming chat response: {e}")
|
|
204
|
+
|
|
205
|
+
def stream_response_generator(self, response) -> Generator[str, None, None]:
|
|
206
|
+
"""
|
|
207
|
+
Processes a streaming response from the Responses API and yields content strings.
|
|
208
|
+
|
|
209
|
+
:param response: The streaming response from the API.
|
|
210
|
+
:return: Generator[str, None, None] - Yields content strings extracted from streaming chunks.
|
|
211
|
+
"""
|
|
212
|
+
try:
|
|
213
|
+
for line in response:
|
|
214
|
+
if line.startswith("data:"):
|
|
215
|
+
chunk = line[5:].strip()
|
|
216
|
+
if chunk == "[DONE]":
|
|
217
|
+
break
|
|
218
|
+
try:
|
|
219
|
+
json_data = json.loads(chunk)
|
|
220
|
+
if (
|
|
221
|
+
json_data.get("choices")
|
|
222
|
+
and len(json_data["choices"]) > 0
|
|
223
|
+
and "delta" in json_data["choices"][0]
|
|
224
|
+
and "content" in json_data["choices"][0]["delta"]
|
|
225
|
+
):
|
|
226
|
+
content = json_data["choices"][0]["delta"]["content"]
|
|
227
|
+
yield content
|
|
228
|
+
except JSONDecodeError as e:
|
|
229
|
+
continue
|
|
230
|
+
except Exception as e:
|
|
231
|
+
raise InvalidAPIResponseException(f"Unable to process streaming response: {e}")
|
|
232
|
+
|
|
233
|
+
def generate_image(
|
|
234
|
+
self,
|
|
235
|
+
model: str,
|
|
236
|
+
prompt: str,
|
|
237
|
+
n: int,
|
|
238
|
+
quality: str,
|
|
239
|
+
size: str,
|
|
240
|
+
aspect_ratio: Optional[str] = None
|
|
241
|
+
) -> dict:
|
|
242
|
+
"""
|
|
243
|
+
Generates an image based on the provided parameters.
|
|
244
|
+
|
|
245
|
+
:param model: str - The model specification for image generation, e.g., "openai/gpt-image-1". (Required)
|
|
246
|
+
:param prompt: str - Description of the desired image. (Required)
|
|
247
|
+
:param n: int - Number of images to generate (1-10, depending on the model). (Required)
|
|
248
|
+
:param quality: str - Rendering quality, e.g., "high". (Required)
|
|
249
|
+
:param size: str - Image dimensions, e.g., "1024x1024". (Required)
|
|
250
|
+
:param aspect_ratio: Optional[str] - Relationship between image's width and height, e.g., "1:1", "9:16", "16:9", "3:4", "4:3". (Optional)
|
|
251
|
+
:return: dict - The API response containing the generated image data.
|
|
252
|
+
:raises InvalidAPIResponseException: If the API response cannot be processed.
|
|
253
|
+
"""
|
|
254
|
+
data = {
|
|
255
|
+
'model': model,
|
|
256
|
+
'prompt': prompt,
|
|
257
|
+
'n': n,
|
|
258
|
+
'quality': quality,
|
|
259
|
+
'size': size
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if aspect_ratio:
|
|
263
|
+
data['aspect_ratio'] = aspect_ratio
|
|
264
|
+
|
|
265
|
+
logger.debug(f"Generating image with data: {data}")
|
|
266
|
+
|
|
72
267
|
response = self.api_service.post(
|
|
73
|
-
endpoint=
|
|
268
|
+
endpoint=GENERATE_IMAGE_V1,
|
|
74
269
|
data=data
|
|
75
270
|
)
|
|
76
|
-
|
|
271
|
+
|
|
272
|
+
validate_status_code(response)
|
|
273
|
+
|
|
274
|
+
result = parse_json_response(response, "generate image")
|
|
275
|
+
logger.debug(f"Image generation result: {result}")
|
|
77
276
|
return result
|
|
78
277
|
|
|
278
|
+
def edit_image(
|
|
279
|
+
self,
|
|
280
|
+
model: str,
|
|
281
|
+
prompt: str,
|
|
282
|
+
image: str,
|
|
283
|
+
size: str,
|
|
284
|
+
n: int = 1,
|
|
285
|
+
quality: Optional[str] = None
|
|
286
|
+
) -> dict:
|
|
287
|
+
"""
|
|
288
|
+
Edits an existing image based on the provided parameters.
|
|
289
|
+
|
|
290
|
+
:param model: str - The model specification for image editing, e.g., "openai/gpt-image-1". (Required)
|
|
291
|
+
:param prompt: str - Description of the desired edit, e.g., "remove background people". (Required)
|
|
292
|
+
:param image: str - URL of the image to be edited, e.g., "https://example.com/image.jpg". (Required)
|
|
293
|
+
:param size: str - Desired dimensions of the output image in pixels, e.g., "1024x1024". (Required)
|
|
294
|
+
:param n: int - Number of edited images to generate (1-10, depending on the model). Default is 1. (Optional)
|
|
295
|
+
:param quality: Optional[str] - Rendering quality, e.g., "high", "medium", "low". (Optional)
|
|
296
|
+
:return: dict - The API response containing the edited image data.
|
|
297
|
+
:raises InvalidAPIResponseException: If the API response cannot be processed.
|
|
298
|
+
"""
|
|
299
|
+
data = {
|
|
300
|
+
'model': model,
|
|
301
|
+
'prompt': prompt,
|
|
302
|
+
'image': image,
|
|
303
|
+
'size': size,
|
|
304
|
+
'n': n
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if quality:
|
|
308
|
+
data['quality'] = quality
|
|
309
|
+
|
|
310
|
+
logger.debug(f"Editing image with data: {data}")
|
|
311
|
+
|
|
312
|
+
response = self.api_service.post(
|
|
313
|
+
endpoint=EDIT_IMAGE_V1,
|
|
314
|
+
data=data
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
validate_status_code(response)
|
|
318
|
+
|
|
319
|
+
result = parse_json_response(response, "edit image")
|
|
320
|
+
logger.debug(f"Image editing result: {result}")
|
|
321
|
+
return result
|
|
322
|
+
|
|
323
|
+
def get_response(
|
|
324
|
+
self,
|
|
325
|
+
model: str,
|
|
326
|
+
input: str,
|
|
327
|
+
files: Optional[List[str]] = None,
|
|
328
|
+
tools: Optional[List[Dict]] = None,
|
|
329
|
+
tool_choice: Optional[Union[str, Dict]] = None,
|
|
330
|
+
temperature: Optional[float] = None,
|
|
331
|
+
max_output_tokens: Optional[int] = None,
|
|
332
|
+
top_p: Optional[float] = None,
|
|
333
|
+
metadata: Optional[Dict] = None,
|
|
334
|
+
user: Optional[str] = None,
|
|
335
|
+
instructions: Optional[str] = None,
|
|
336
|
+
reasoning: Optional[Dict] = None,
|
|
337
|
+
truncation: Optional[str] = None,
|
|
338
|
+
parallel_tool_calls: Optional[bool] = None,
|
|
339
|
+
store: Optional[bool] = None,
|
|
340
|
+
stream: bool = False
|
|
341
|
+
) -> Union[dict, str, Generator[str, None, None]]:
|
|
342
|
+
"""
|
|
343
|
+
Generates a response using the Responses API with support for images and PDF files.
|
|
344
|
+
|
|
345
|
+
:param model: str - The model specification, e.g., "openai/o1-pro". (Required)
|
|
346
|
+
:param input: str - The user input text. (Required)
|
|
347
|
+
:param files: Optional[List[str]] - List of file paths (images or PDFs) to include in the request. (Optional)
|
|
348
|
+
:param tools: Optional[List[Dict]] - A list of tools (e.g., functions) the model may call. (Optional)
|
|
349
|
+
:param tool_choice: Optional[Union[str, Dict]] - Controls which tool is called (e.g., "none", "auto", or specific tool). (Optional)
|
|
350
|
+
:param temperature: Optional[float] - Controls the randomness of the response. (Optional)
|
|
351
|
+
:param max_output_tokens: Optional[int] - The maximum number of tokens to generate in the response. (Optional)
|
|
352
|
+
:param top_p: Optional[float] - Nucleus sampling parameter. (Optional)
|
|
353
|
+
:param metadata: Optional[Dict] - Up to 16 key-value pairs to attach to the object. (Optional)
|
|
354
|
+
:param user: Optional[str] - A unique identifier for the end-user. (Optional)
|
|
355
|
+
:param instructions: Optional[str] - Additional instructions for the model. (Optional)
|
|
356
|
+
:param reasoning: Optional[Dict] - Reasoning configuration, e.g., {"effort": "medium"}. (Optional)
|
|
357
|
+
:param truncation: Optional[str] - Truncation strategy, e.g., "disabled". (Optional)
|
|
358
|
+
:param parallel_tool_calls: Optional[bool] - Whether to enable parallel tool calls. (Optional)
|
|
359
|
+
:param store: Optional[bool] - Whether to store the output. (Optional)
|
|
360
|
+
:param stream: bool - Whether the response should be streamed. Possible values:
|
|
361
|
+
- False: Returns the complete response as a dictionary or string (default).
|
|
362
|
+
- True: Returns a generator yielding content strings as they are received. (Optional)
|
|
363
|
+
:return: Union[dict, str, Generator[str, None, None]] - For non-streaming (stream=False), returns a dictionary containing the response
|
|
364
|
+
result or a string if JSON decoding fails. For streaming (stream=True), returns a generator yielding content strings extracted from the
|
|
365
|
+
streaming response chunks.
|
|
366
|
+
:raises InvalidAPIResponseException: If the API response cannot be processed.
|
|
367
|
+
"""
|
|
368
|
+
data = {
|
|
369
|
+
'model': model,
|
|
370
|
+
'input': input,
|
|
371
|
+
'stream': stream
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if temperature is not None:
|
|
375
|
+
data['temperature'] = temperature
|
|
376
|
+
|
|
377
|
+
if max_output_tokens is not None:
|
|
378
|
+
data['max_output_tokens'] = max_output_tokens
|
|
379
|
+
|
|
380
|
+
if top_p is not None:
|
|
381
|
+
data['top_p'] = top_p
|
|
382
|
+
|
|
383
|
+
if tools is not None:
|
|
384
|
+
data['tools'] = tools
|
|
385
|
+
|
|
386
|
+
if tool_choice is not None:
|
|
387
|
+
data['tool_choice'] = tool_choice
|
|
388
|
+
|
|
389
|
+
if metadata is not None:
|
|
390
|
+
data['metadata'] = metadata
|
|
391
|
+
|
|
392
|
+
if user is not None:
|
|
393
|
+
data['user'] = user
|
|
394
|
+
|
|
395
|
+
if instructions is not None:
|
|
396
|
+
data['instructions'] = instructions
|
|
397
|
+
|
|
398
|
+
if reasoning is not None:
|
|
399
|
+
data['reasoning'] = reasoning
|
|
400
|
+
|
|
401
|
+
if truncation is not None:
|
|
402
|
+
data['truncation'] = truncation
|
|
403
|
+
|
|
404
|
+
if parallel_tool_calls is not None:
|
|
405
|
+
data['parallel_tool_calls'] = parallel_tool_calls
|
|
406
|
+
|
|
407
|
+
if store is not None:
|
|
408
|
+
data['store'] = store
|
|
409
|
+
|
|
410
|
+
logger.debug(f"Generating response with data: {data}")
|
|
411
|
+
|
|
412
|
+
if files:
|
|
413
|
+
if stream:
|
|
414
|
+
raise InvalidAPIResponseException("Streaming is not supported when uploading files")
|
|
415
|
+
|
|
416
|
+
file_handles = []
|
|
417
|
+
try:
|
|
418
|
+
files_dict = {}
|
|
419
|
+
for idx, file_path in enumerate(files):
|
|
420
|
+
path = Path(file_path)
|
|
421
|
+
if not path.is_file():
|
|
422
|
+
raise FileNotFoundError(f"File not found: {file_path}")
|
|
423
|
+
|
|
424
|
+
file_handle = path.open("rb")
|
|
425
|
+
file_handles.append(file_handle)
|
|
426
|
+
files_dict[f"file{idx}"] = file_handle
|
|
427
|
+
|
|
428
|
+
response = self.api_service.post_files_multipart(
|
|
429
|
+
endpoint=RESPONSES_V1,
|
|
430
|
+
data=data,
|
|
431
|
+
files=files_dict
|
|
432
|
+
)
|
|
433
|
+
finally:
|
|
434
|
+
for fh in file_handles:
|
|
435
|
+
fh.close()
|
|
436
|
+
else:
|
|
437
|
+
if stream:
|
|
438
|
+
response = self.api_service.stream_post(
|
|
439
|
+
endpoint=RESPONSES_V1,
|
|
440
|
+
data=data
|
|
441
|
+
)
|
|
442
|
+
return self.stream_response_generator(response)
|
|
443
|
+
else:
|
|
444
|
+
response = self.api_service.post(
|
|
445
|
+
endpoint=RESPONSES_V1,
|
|
446
|
+
data=data
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
validate_status_code(response)
|
|
450
|
+
result = parse_json_response(response, "get response")
|
|
451
|
+
logger.debug(f"Response result: {result}")
|
|
452
|
+
|
|
453
|
+
return result
|
pygeai/chat/endpoints.py
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
CHAT_V1 = "/chat" # POST Chat endpoint
|
|
2
2
|
CHAT_COMPLETION_V1 = "/chat/completion" # POST Chat completion endpoint
|
|
3
|
+
GENERATE_IMAGE_V1 = "/images" # POST Generate image
|
|
4
|
+
EDIT_IMAGE_V1 = "/images/edits" # POST Edit image
|
|
5
|
+
RESPONSES_V1 = "/responses" # POST Responses API endpoint
|
pygeai/chat/iris.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from pygeai.chat.clients import ChatClient
|
|
2
|
+
from pygeai.chat.settings import LLM_SETTINGS
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Iris:
|
|
6
|
+
def __init__(self):
|
|
7
|
+
self.client = ChatClient()
|
|
8
|
+
|
|
9
|
+
def stream_answer(self, messages):
|
|
10
|
+
result = self.client.chat_completion(
|
|
11
|
+
model="saia:agent:com.globant.iris",
|
|
12
|
+
messages=messages,
|
|
13
|
+
stream=True,
|
|
14
|
+
**LLM_SETTINGS
|
|
15
|
+
)
|
|
16
|
+
return result
|
|
17
|
+
|
pygeai/chat/managers.py
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from pygeai import logger
|
|
2
|
+
from pygeai.core.common.exceptions import APIError
|
|
3
|
+
from pygeai.core.handlers import ErrorHandler
|
|
4
|
+
from pygeai.core.models import ChatMessageList, \
|
|
5
|
+
ChatVariableList, LlmSettings, ChatToolList, ToolChoice
|
|
6
|
+
from pygeai.assistant.mappers import AssistantResponseMapper
|
|
7
|
+
from pygeai.chat.clients import ChatClient
|
|
8
|
+
from pygeai.core.responses import ChatResponse, ProviderResponse
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ChatManager:
|
|
12
|
+
|
|
13
|
+
def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
|
|
14
|
+
self.__chat_client = ChatClient(api_key, base_url, alias)
|
|
15
|
+
|
|
16
|
+
def chat_completion(
|
|
17
|
+
self,
|
|
18
|
+
model: str,
|
|
19
|
+
messages: ChatMessageList,
|
|
20
|
+
llm_settings: LlmSettings,
|
|
21
|
+
thread_id: str = None,
|
|
22
|
+
variables: ChatVariableList = None,
|
|
23
|
+
tool_choice: ToolChoice = None,
|
|
24
|
+
tools: ChatToolList = None,
|
|
25
|
+
) -> ProviderResponse:
|
|
26
|
+
"""
|
|
27
|
+
Generates a chat completion response using the specified language model.
|
|
28
|
+
|
|
29
|
+
This method sends a chat completion request to the ChatClient with the provided
|
|
30
|
+
model, messages, and settings. It processes the response by mapping errors if
|
|
31
|
+
present or converting it into an assistant response format.
|
|
32
|
+
|
|
33
|
+
:param model: str - The identifier of the language model to use.
|
|
34
|
+
:param messages: ChatMessageList - A list of chat messages to provide context for the completion.
|
|
35
|
+
:param llm_settings: LlmSettings - Configuration settings for the language model,
|
|
36
|
+
including temperature, max tokens, and penalties.
|
|
37
|
+
:param thread_id: str, optional - An optional identifier for the conversation thread.
|
|
38
|
+
:param variables: ChatVariableList, optional - Additional variables to include in the request.
|
|
39
|
+
:param tool_choice: ToolChoice, optional - Indicates which tool to call.
|
|
40
|
+
:param tools: ChatToolList, optional - Additional tools the model may call
|
|
41
|
+
:return: ProviderResponse - The structured chat response.
|
|
42
|
+
:raises APIError: If the API returns errors.
|
|
43
|
+
"""
|
|
44
|
+
response_data = self.__chat_client.chat_completion(
|
|
45
|
+
model=model,
|
|
46
|
+
messages=messages.to_list(),
|
|
47
|
+
stream=False,
|
|
48
|
+
temperature=llm_settings.temperature,
|
|
49
|
+
max_tokens=llm_settings.max_tokens,
|
|
50
|
+
thread_id=thread_id,
|
|
51
|
+
frequency_penalty=llm_settings.frequency_penalty,
|
|
52
|
+
presence_penalty=llm_settings.presence_penalty,
|
|
53
|
+
variables=variables.to_list() if variables else None,
|
|
54
|
+
tool_choice=tool_choice.to_dict() if tool_choice else None,
|
|
55
|
+
tools=tools.to_list() if tools else None
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
if ErrorHandler.has_errors(response_data):
|
|
59
|
+
error = ErrorHandler.extract_error(response_data)
|
|
60
|
+
logger.error(f"Error received while chatting while sending chat request: {error}")
|
|
61
|
+
raise APIError(f"Error received while chatting while sending chat request: {error}")
|
|
62
|
+
|
|
63
|
+
result = AssistantResponseMapper.map_to_provider_response(response_data)
|
|
64
|
+
return result
|
pygeai/chat/session.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from pygeai import logger
|
|
2
|
+
from pygeai.chat.clients import ChatClient
|
|
3
|
+
|
|
4
|
+
from pygeai.chat.settings import LLM_SETTINGS
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AgentChatSession:
|
|
9
|
+
|
|
10
|
+
def __init__(self, agent_name: str):
|
|
11
|
+
self.client = ChatClient()
|
|
12
|
+
self.agent_name = agent_name
|
|
13
|
+
|
|
14
|
+
def stream_answer(self, messages):
|
|
15
|
+
result = self.client.chat_completion(
|
|
16
|
+
model=f"saia:agent:{self.agent_name}",
|
|
17
|
+
messages=messages,
|
|
18
|
+
stream=True,
|
|
19
|
+
**LLM_SETTINGS
|
|
20
|
+
)
|
|
21
|
+
return result
|
|
22
|
+
|
|
23
|
+
def get_answer(self, messages):
|
|
24
|
+
answer = ""
|
|
25
|
+
try:
|
|
26
|
+
result = self.client.chat_completion(
|
|
27
|
+
model=f"saia:agent:{self.agent_name}",
|
|
28
|
+
messages=messages,
|
|
29
|
+
stream=False,
|
|
30
|
+
**LLM_SETTINGS
|
|
31
|
+
)
|
|
32
|
+
answer = result['choices'][0]['message']['content']
|
|
33
|
+
except Exception as e:
|
|
34
|
+
logger.error(f"Unable to communicate with specified agent {self.agent_name}: {e}")
|
|
35
|
+
raise InvalidAPIResponseException(f"Unable to communicate with specified agent {self.agent_name}: {e}")
|
|
36
|
+
|
|
37
|
+
return answer
|
|
38
|
+
|