pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pygeai/__init__.py +9 -1
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +18 -45
- pygeai/assistant/data/clients.py +1 -0
- pygeai/assistant/data_analyst/clients.py +8 -12
- pygeai/assistant/managers.py +195 -157
- pygeai/assistant/mappers.py +4 -2
- pygeai/assistant/rag/clients.py +27 -67
- pygeai/assistant/rag/mappers.py +12 -6
- pygeai/assistant/rag/models.py +301 -159
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +308 -37
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +2 -8
- pygeai/chat/managers.py +9 -6
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +7 -10
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +9 -9
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +71 -9
- pygeai/cli/commands/chat.py +676 -19
- pygeai/cli/commands/common.py +28 -24
- pygeai/cli/commands/configuration.py +66 -13
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +58 -11
- pygeai/cli/commands/evaluation.py +38 -38
- pygeai/cli/commands/feedback.py +3 -4
- pygeai/cli/commands/files.py +7 -8
- pygeai/cli/commands/gam.py +85 -10
- pygeai/cli/commands/lab/ai_lab.py +340 -484
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +6 -7
- pygeai/cli/commands/migrate.py +1064 -436
- pygeai/cli/commands/organization.py +516 -11
- pygeai/cli/commands/rag.py +13 -14
- pygeai/cli/commands/rerank.py +3 -5
- pygeai/cli/commands/secrets.py +8 -9
- pygeai/cli/commands/usage_limits.py +18 -20
- pygeai/cli/commands/validators.py +144 -1
- pygeai/cli/commands/version.py +4 -5
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +170 -31
- pygeai/cli/geai_proxy.py +86 -25
- pygeai/cli/install_man.py +93 -22
- pygeai/cli/parsers.py +75 -25
- pygeai/cli/texts/help.py +265 -28
- pygeai/core/base/clients.py +53 -12
- pygeai/core/base/mappers.py +11 -2
- pygeai/core/base/session.py +95 -11
- pygeai/core/common/config.py +78 -14
- pygeai/core/common/exceptions.py +96 -6
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +23 -5
- pygeai/core/embeddings/managers.py +9 -4
- pygeai/core/embeddings/mappers.py +16 -2
- pygeai/core/embeddings/responses.py +9 -2
- pygeai/core/feedback/clients.py +8 -3
- pygeai/core/files/clients.py +23 -24
- pygeai/core/files/managers.py +121 -30
- pygeai/core/files/responses.py +4 -3
- pygeai/core/handlers.py +10 -1
- pygeai/core/llm/clients.py +22 -29
- pygeai/core/models.py +127 -11
- pygeai/core/plugins/clients.py +6 -6
- pygeai/core/rerank/clients.py +9 -3
- pygeai/core/rerank/managers.py +22 -5
- pygeai/core/secrets/clients.py +16 -37
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +159 -49
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +854 -14
- pygeai/evaluation/clients.py +7 -4
- pygeai/evaluation/dataset/clients.py +46 -44
- pygeai/evaluation/plan/clients.py +28 -26
- pygeai/evaluation/result/clients.py +38 -5
- pygeai/gam/clients.py +50 -28
- pygeai/gam/endpoints.py +2 -1
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -90
- pygeai/lab/agents/clients.py +203 -162
- pygeai/lab/agents/endpoints.py +4 -0
- pygeai/lab/agents/mappers.py +57 -7
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +571 -541
- pygeai/lab/models.py +108 -19
- pygeai/lab/processes/clients.py +332 -340
- pygeai/lab/processes/mappers.py +3 -3
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/clients.py +67 -63
- pygeai/lab/strategies/mappers.py +1 -1
- pygeai/lab/tools/clients.py +85 -118
- pygeai/lab/tools/endpoints.py +4 -0
- pygeai/lab/tools/mappers.py +5 -5
- pygeai/man/man1/geai-proxy.1 +116 -0
- pygeai/man/man1/geai.1 +2580 -66
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +468 -146
- pygeai/migration/tools.py +170 -3
- pygeai/organization/clients.py +245 -50
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/clients.py +34 -32
- pygeai/organization/limits/managers.py +108 -49
- pygeai/organization/managers.py +347 -53
- pygeai/organization/mappers.py +102 -2
- pygeai/organization/responses.py +58 -1
- pygeai/proxy/clients.py +6 -3
- pygeai/proxy/config.py +14 -1
- pygeai/proxy/managers.py +61 -33
- pygeai/proxy/servers.py +196 -51
- pygeai/proxy/tool.py +33 -16
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -82
- pygeai/tests/assistants/test_managers.py +191 -57
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +5 -5
- pygeai/tests/core/base/data/models.py +7 -0
- pygeai/tests/core/base/test_mappers.py +43 -11
- pygeai/tests/core/base/test_models.py +3 -1
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +124 -78
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +61 -39
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_models.py +500 -3
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +298 -56
- pygeai/tests/organization/test_clients.py +600 -30
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/delete_file.py +1 -4
- pygeai/tests/snippets/files/get_file_content.py +2 -4
- pygeai/tests/snippets/files/get_file_data.py +1 -4
- pygeai/tests/snippets/files/get_file_list.py +1 -6
- pygeai/tests/snippets/files/upload_file.py +1 -5
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
- pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
- pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
- pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
- pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/create_process.py +3 -5
- pygeai/tests/snippets/lab/processes/create_task.py +3 -5
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
- pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
- pygeai/tests/snippets/lab/runner_1.py +1 -1
- pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
- pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
- pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
- pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
- pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
- pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
- pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +2 -2
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
- pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
- docs/geai-proxy/README.md +0 -145
- docs/source/conf.py +0 -45
- pygeai/tests/core/test_managers.py +0 -233
- pygeai-0.1.51b3.dist-info/METADATA +0 -130
- pygeai-0.1.51b3.dist-info/RECORD +0 -324
- pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
- scripts/bump_beta_version.py +0 -56
- {scripts → pygeai/analytics}/__init__.py +0 -0
- /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
pygeai/core/files/managers.py
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import tempfile
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from pygeai import logger
|
|
6
|
+
from pygeai.admin.clients import AdminClient
|
|
1
7
|
from pygeai.core.base.mappers import ErrorMapper, ResponseMapper
|
|
2
8
|
from pygeai.core.base.responses import EmptyResponse
|
|
3
9
|
from pygeai.core.files.clients import FileClient
|
|
@@ -5,6 +11,7 @@ from pygeai.core.files.models import UploadFile, File, FileList
|
|
|
5
11
|
from pygeai.core.files.mappers import FileResponseMapper
|
|
6
12
|
from pygeai.core.files.responses import UploadFileResponse
|
|
7
13
|
from pygeai.core.handlers import ErrorHandler
|
|
14
|
+
from pygeai.core.common.exceptions import APIError
|
|
8
15
|
|
|
9
16
|
|
|
10
17
|
class FileManager:
|
|
@@ -17,7 +24,7 @@ class FileManager:
|
|
|
17
24
|
self,
|
|
18
25
|
api_key: str = None,
|
|
19
26
|
base_url: str = None,
|
|
20
|
-
alias: str =
|
|
27
|
+
alias: str = None,
|
|
21
28
|
organization_id: str = None,
|
|
22
29
|
project_id: str = None
|
|
23
30
|
):
|
|
@@ -26,8 +33,26 @@ class FileManager:
|
|
|
26
33
|
base_url,
|
|
27
34
|
alias
|
|
28
35
|
)
|
|
29
|
-
self.
|
|
30
|
-
self.
|
|
36
|
+
self.organization_id = self.__get_organization_id() if not organization_id else organization_id
|
|
37
|
+
self.project_id = self.__get_project_id() if not project_id else project_id
|
|
38
|
+
|
|
39
|
+
def __get_organization_id(self):
|
|
40
|
+
response = None
|
|
41
|
+
try:
|
|
42
|
+
response = AdminClient().validate_api_token()
|
|
43
|
+
return response.get("organizationId")
|
|
44
|
+
except Exception as e:
|
|
45
|
+
logger.error(f"Error retrieving organization_id from GEAI. Response: {response}: {e}")
|
|
46
|
+
raise APIError(f"Error retrieving organization_id from GEAI: {e}")
|
|
47
|
+
|
|
48
|
+
def __get_project_id(self):
|
|
49
|
+
response = None
|
|
50
|
+
try:
|
|
51
|
+
response = AdminClient().validate_api_token()
|
|
52
|
+
return response.get("projectId")
|
|
53
|
+
except Exception as e:
|
|
54
|
+
logger.error(f"Error retrieving project_id from GEAI. Response: {response}: {e}")
|
|
55
|
+
raise APIError(f"Error retrieving project_id from GEAI: {e}")
|
|
31
56
|
|
|
32
57
|
def upload_file(
|
|
33
58
|
self,
|
|
@@ -36,20 +61,26 @@ class FileManager:
|
|
|
36
61
|
"""
|
|
37
62
|
Uploads a file to the specified organization and project.
|
|
38
63
|
|
|
64
|
+
This method sends a request to the file client to upload a file based on the provided
|
|
65
|
+
`UploadFile` object.
|
|
66
|
+
|
|
39
67
|
:param file: UploadFile - The file object containing file path, name, and folder details.
|
|
40
68
|
:return: UploadFileResponse - The response object containing the uploaded file details.
|
|
69
|
+
:raises APIError: If the API returns errors.
|
|
41
70
|
"""
|
|
42
71
|
response_data = self.__client.upload_file(
|
|
43
72
|
file_path=file.path,
|
|
44
|
-
organization_id=self.
|
|
45
|
-
project_id=self.
|
|
73
|
+
organization_id=self.organization_id,
|
|
74
|
+
project_id=self.project_id,
|
|
46
75
|
folder=file.folder,
|
|
47
76
|
file_name=file.name,
|
|
48
77
|
)
|
|
49
78
|
if ErrorHandler.has_errors(response_data):
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
79
|
+
error = ErrorHandler.extract_error(response_data)
|
|
80
|
+
logger.error(f"Error received while uploading file: {error}")
|
|
81
|
+
raise APIError(f"Error received while uploading file: {error}")
|
|
82
|
+
|
|
83
|
+
result = FileResponseMapper.map_to_upload_file_response(response_data)
|
|
53
84
|
return result
|
|
54
85
|
|
|
55
86
|
def get_file_data(
|
|
@@ -59,18 +90,24 @@ class FileManager:
|
|
|
59
90
|
"""
|
|
60
91
|
Retrieves metadata of a specific file by its ID.
|
|
61
92
|
|
|
93
|
+
This method sends a request to the file client to retrieve metadata for a file
|
|
94
|
+
identified by `file_id`.
|
|
95
|
+
|
|
62
96
|
:param file_id: str - The unique identifier of the file.
|
|
63
97
|
:return: File - A file object containing metadata about the requested file.
|
|
98
|
+
:raises APIError: If the API returns errors.
|
|
64
99
|
"""
|
|
65
100
|
response_data = self.__client.get_file(
|
|
66
|
-
organization=self.
|
|
67
|
-
project=self.
|
|
101
|
+
organization=self.organization_id,
|
|
102
|
+
project=self.project_id,
|
|
68
103
|
file_id=file_id
|
|
69
104
|
)
|
|
70
105
|
if ErrorHandler.has_errors(response_data):
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
106
|
+
error = ErrorHandler.extract_error(response_data)
|
|
107
|
+
logger.error(f"Error received while retrieving file data: {error}")
|
|
108
|
+
raise APIError(f"Error received while retrieving file data: {error}")
|
|
109
|
+
|
|
110
|
+
result = FileResponseMapper.map_to_file(response_data)
|
|
74
111
|
return result
|
|
75
112
|
|
|
76
113
|
def delete_file(
|
|
@@ -80,18 +117,23 @@ class FileManager:
|
|
|
80
117
|
"""
|
|
81
118
|
Deletes a file from the specified organization and project.
|
|
82
119
|
|
|
120
|
+
This method sends a request to the file client to delete a file identified by `file_id`.
|
|
121
|
+
|
|
83
122
|
:param file_id: str - The unique identifier of the file to be deleted.
|
|
84
|
-
:return: EmptyResponse - Response indicating the success
|
|
123
|
+
:return: EmptyResponse - Response indicating the success of the operation.
|
|
124
|
+
:raises APIError: If the API returns errors.
|
|
85
125
|
"""
|
|
86
126
|
response_data = self.__client.delete_file(
|
|
87
|
-
organization=self.
|
|
88
|
-
project=self.
|
|
127
|
+
organization=self.organization_id,
|
|
128
|
+
project=self.project_id,
|
|
89
129
|
file_id=file_id
|
|
90
130
|
)
|
|
91
131
|
if ErrorHandler.has_errors(response_data):
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
132
|
+
error = ErrorHandler.extract_error(response_data)
|
|
133
|
+
logger.error(f"Error received while deleting file: {error}")
|
|
134
|
+
raise APIError(f"Error received while deleting file: {error}")
|
|
135
|
+
|
|
136
|
+
result = ResponseMapper.map_to_empty_response(response_data or "File deleted successfully")
|
|
95
137
|
return result
|
|
96
138
|
|
|
97
139
|
def get_file_content(
|
|
@@ -101,33 +143,82 @@ class FileManager:
|
|
|
101
143
|
"""
|
|
102
144
|
Retrieves the raw content of a specific file.
|
|
103
145
|
|
|
146
|
+
This method sends a request to the file client to retrieve the binary content of a file
|
|
147
|
+
identified by `file_id`.
|
|
148
|
+
|
|
104
149
|
:param file_id: str - The unique identifier of the file.
|
|
105
150
|
:return: bytes - The binary content of the file.
|
|
151
|
+
:raises APIError: If the API returns errors.
|
|
106
152
|
"""
|
|
107
153
|
response_data = self.__client.get_file_content(
|
|
108
|
-
organization=self.
|
|
109
|
-
project=self.
|
|
154
|
+
organization=self.organization_id,
|
|
155
|
+
project=self.project_id,
|
|
110
156
|
file_id=file_id
|
|
111
157
|
)
|
|
112
158
|
if isinstance(response_data, dict) and "errors" in response_data:
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
159
|
+
error = ErrorHandler.extract_error(response_data)
|
|
160
|
+
logger.error(f"Error received while retrieving file content: {error}")
|
|
161
|
+
raise APIError(f"Error received while retrieving file content: {error}")
|
|
162
|
+
|
|
163
|
+
result = response_data
|
|
116
164
|
return result
|
|
117
165
|
|
|
118
166
|
def get_file_list(self) -> FileList:
|
|
119
167
|
"""
|
|
120
|
-
|
|
168
|
+
Retrieves a list of all files associated with a given organization and project.
|
|
169
|
+
|
|
170
|
+
This method queries the file client to fetch a list of files for the specified
|
|
171
|
+
organization and project.
|
|
121
172
|
|
|
122
173
|
:return: FileList - A list of file objects associated with the organization and project.
|
|
174
|
+
:raises APIError: If the API returns errors.
|
|
123
175
|
"""
|
|
124
176
|
response_data = self.__client.get_file_list(
|
|
125
|
-
organization=self.
|
|
126
|
-
project=self.
|
|
177
|
+
organization=self.organization_id,
|
|
178
|
+
project=self.project_id
|
|
127
179
|
)
|
|
128
180
|
if ErrorHandler.has_errors(response_data):
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
181
|
+
error = ErrorHandler.extract_error(response_data)
|
|
182
|
+
logger.error(f"Error received while retrieving file list: {error}")
|
|
183
|
+
raise APIError(f"Error received while retrieving file list: {error}")
|
|
184
|
+
|
|
185
|
+
result = FileResponseMapper.map_to_file_list_response(response_data)
|
|
132
186
|
return result
|
|
133
187
|
|
|
188
|
+
def upload_file_from_content(
|
|
189
|
+
self,
|
|
190
|
+
file_name: str,
|
|
191
|
+
content: bytes,
|
|
192
|
+
folder: Optional[str] = None
|
|
193
|
+
) -> UploadFileResponse:
|
|
194
|
+
"""
|
|
195
|
+
Uploads a file from binary content to the specified organization and project.
|
|
196
|
+
|
|
197
|
+
This method creates a temporary file from the provided content, uploads it,
|
|
198
|
+
and then cleans up the temporary file.
|
|
199
|
+
|
|
200
|
+
:param file_name: str - The name for the uploaded file.
|
|
201
|
+
:param content: bytes - The binary content of the file.
|
|
202
|
+
:param folder: str, optional - Destination folder (default is None, which means temporary storage).
|
|
203
|
+
:return: UploadFileResponse - The response object containing the uploaded file details.
|
|
204
|
+
:raises APIError: If the API returns errors.
|
|
205
|
+
"""
|
|
206
|
+
temp_file = None
|
|
207
|
+
try:
|
|
208
|
+
suffix = Path(file_name).suffix or ""
|
|
209
|
+
with tempfile.NamedTemporaryFile(mode='wb', suffix=suffix, delete=False) as temp_file:
|
|
210
|
+
temp_file.write(content)
|
|
211
|
+
temp_file_path = temp_file.name
|
|
212
|
+
|
|
213
|
+
upload_file = UploadFile(
|
|
214
|
+
path=temp_file_path,
|
|
215
|
+
name=file_name,
|
|
216
|
+
folder=folder
|
|
217
|
+
)
|
|
218
|
+
return self.upload_file(upload_file)
|
|
219
|
+
finally:
|
|
220
|
+
if temp_file:
|
|
221
|
+
try:
|
|
222
|
+
Path(temp_file_path).unlink(missing_ok=True)
|
|
223
|
+
except Exception as e:
|
|
224
|
+
logger.warning(f"Failed to delete temporary file {temp_file_path}: {e}")
|
pygeai/core/files/responses.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
from typing import Optional
|
|
1
2
|
from pydantic.main import BaseModel
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
class UploadFileResponse(BaseModel):
|
|
5
|
-
id: str
|
|
6
|
-
url: str
|
|
7
|
-
success: bool
|
|
6
|
+
id: Optional[str] = None
|
|
7
|
+
url: Optional[str] = None
|
|
8
|
+
success: Optional[bool] = None
|
|
8
9
|
|
|
9
10
|
def to_dict(self):
|
|
10
11
|
return {
|
pygeai/core/handlers.py
CHANGED
|
@@ -6,7 +6,16 @@ class ErrorHandler:
|
|
|
6
6
|
@classmethod
|
|
7
7
|
def has_errors(cls, response):
|
|
8
8
|
error_found = False
|
|
9
|
-
if
|
|
9
|
+
if (
|
|
10
|
+
"errors" in response or
|
|
11
|
+
"error" in response or
|
|
12
|
+
(
|
|
13
|
+
"message" in response and
|
|
14
|
+
isinstance(response.get("message"), list) and
|
|
15
|
+
len(response.get("message")) > 0 and
|
|
16
|
+
response.get("message")[0].get("type") == "error"
|
|
17
|
+
)
|
|
18
|
+
):
|
|
10
19
|
error_found = True
|
|
11
20
|
|
|
12
21
|
return error_found
|
pygeai/core/llm/clients.py
CHANGED
|
@@ -1,41 +1,38 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from json import JSONDecodeError
|
|
3
1
|
|
|
2
|
+
from pygeai import logger
|
|
4
3
|
from pygeai.core.base.clients import BaseClient
|
|
4
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
5
5
|
from pygeai.core.llm.endpoints import GET_PROVIDER_LIST_V2, GET_PROVIDER_DATA_V2, GET_PROVIDER_MODELS_V2, \
|
|
6
6
|
GET_MODEL_DATA_V2
|
|
7
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
8
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
7
9
|
|
|
8
10
|
|
|
9
11
|
class LlmClient(BaseClient):
|
|
10
12
|
|
|
11
13
|
def get_provider_list(self) -> dict:
|
|
14
|
+
logger.debug("Obtaining provider list")
|
|
12
15
|
response = self.api_service.get(endpoint=GET_PROVIDER_LIST_V2)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
except JSONDecodeError as e:
|
|
16
|
-
result = response.text
|
|
17
|
-
|
|
18
|
-
return result
|
|
16
|
+
validate_status_code(response)
|
|
17
|
+
return parse_json_response(response, "obtain provider list")
|
|
19
18
|
|
|
20
19
|
def get_provider_data(self, provider_name: str) -> dict:
|
|
21
20
|
endpoint = GET_PROVIDER_DATA_V2.format(providerName=provider_name)
|
|
22
|
-
response = self.api_service.get(endpoint=endpoint)
|
|
23
|
-
try:
|
|
24
|
-
result = response.json()
|
|
25
|
-
except JSONDecodeError as e:
|
|
26
|
-
result = response.text
|
|
27
21
|
|
|
28
|
-
|
|
22
|
+
logger.debug(f"Obtaining provider data for {provider_name}")
|
|
23
|
+
|
|
24
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
25
|
+
validate_status_code(response)
|
|
26
|
+
return parse_json_response(response, "obtain provider data", provider_name=provider_name)
|
|
29
27
|
|
|
30
28
|
def get_provider_models(self, provider_name: str) -> dict:
|
|
31
29
|
endpoint = GET_PROVIDER_MODELS_V2.format(providerName=provider_name)
|
|
32
|
-
response = self.api_service.get(endpoint=endpoint)
|
|
33
|
-
try:
|
|
34
|
-
result = response.json()
|
|
35
|
-
except JSONDecodeError as e:
|
|
36
|
-
result = response.text
|
|
37
30
|
|
|
38
|
-
|
|
31
|
+
logger.debug(f"Obtaining provider models for {provider_name}")
|
|
32
|
+
|
|
33
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
34
|
+
validate_status_code(response)
|
|
35
|
+
return parse_json_response(response, "obtain provider models", provider_name=provider_name)
|
|
39
36
|
|
|
40
37
|
def get_model_data(
|
|
41
38
|
self,
|
|
@@ -47,14 +44,10 @@ class LlmClient(BaseClient):
|
|
|
47
44
|
providerName=provider_name,
|
|
48
45
|
modelNameOrId=model_name or model_id
|
|
49
46
|
)
|
|
50
|
-
response = self.api_service.get(endpoint=endpoint)
|
|
51
|
-
try:
|
|
52
|
-
result = response.json()
|
|
53
|
-
except JSONDecodeError as e:
|
|
54
|
-
result = response.text
|
|
55
|
-
|
|
56
|
-
return result
|
|
57
|
-
|
|
58
|
-
|
|
59
47
|
|
|
48
|
+
logger.debug(f"Obtaining model data for {provider_name}/{model_name or model_id}")
|
|
60
49
|
|
|
50
|
+
response = self.api_service.get(endpoint=endpoint)
|
|
51
|
+
model_identifier = model_name or model_id
|
|
52
|
+
validate_status_code(response)
|
|
53
|
+
return parse_json_response(response, f"obtain model data for {provider_name}/{model_identifier}")
|
pygeai/core/models.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
2
|
|
|
3
|
-
from pydantic import Field, field_validator
|
|
3
|
+
from pydantic import Field, field_validator, model_validator
|
|
4
4
|
from typing import Optional, Literal, Any, List, Union, Iterator
|
|
5
5
|
|
|
6
6
|
from pygeai.core import CustomBaseModel
|
|
@@ -247,23 +247,32 @@ class Project(CustomBaseModel):
|
|
|
247
247
|
|
|
248
248
|
class RequestItem(CustomBaseModel):
|
|
249
249
|
"""
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
"intent": "string",
|
|
253
|
-
"timestamp": "string",
|
|
254
|
-
"prompt": "string",
|
|
255
|
-
"output": "string",
|
|
256
|
-
"inputText": "string",
|
|
257
|
-
"status": "string"
|
|
258
|
-
}
|
|
250
|
+
Represents a request item with metadata about an API interaction.
|
|
251
|
+
Follows a JSON schema with camelCase aliases for external compatibility.
|
|
259
252
|
"""
|
|
253
|
+
api_token: str = Field(..., alias="apiToken")
|
|
260
254
|
assistant: str = Field(..., alias="assistant")
|
|
255
|
+
cost: float = Field(..., alias="cost")
|
|
256
|
+
elapsed_time_ms: int = Field(..., alias="elapsedTimeMs")
|
|
257
|
+
end_timestamp: datetime = Field(..., alias="endTimestamp")
|
|
258
|
+
feedback: Optional[str] = Field(None, alias="feedback")
|
|
261
259
|
intent: Optional[str] = Field(None, alias="intent")
|
|
262
|
-
|
|
260
|
+
module: str = Field(..., alias="module")
|
|
263
261
|
prompt: Optional[str] = Field(None, alias="prompt")
|
|
264
262
|
output: Optional[str] = Field(None, alias="output")
|
|
265
263
|
input_text: Optional[str] = Field(None, alias="inputText")
|
|
264
|
+
rag_sources_consulted: Optional[str] = Field(None, alias="ragSourcesConsulted")
|
|
265
|
+
session_id: str = Field(..., alias="sessionId")
|
|
266
|
+
start_timestamp: datetime = Field(..., alias="startTimestamp")
|
|
266
267
|
status: str = Field(..., alias="status")
|
|
268
|
+
timestamp: datetime = Field(..., alias="timestamp")
|
|
269
|
+
|
|
270
|
+
@model_validator(mode="after")
|
|
271
|
+
def validate_status(self):
|
|
272
|
+
valid_statuses = {"succeeded", "failed", "pending"}
|
|
273
|
+
if self.status not in valid_statuses:
|
|
274
|
+
raise ValueError(f"Status must be one of {valid_statuses}")
|
|
275
|
+
return self
|
|
267
276
|
|
|
268
277
|
def to_dict(self):
|
|
269
278
|
return self.model_dump(by_alias=True, exclude_none=True)
|
|
@@ -681,3 +690,110 @@ class DataAnalystAssistant(Assistant):
|
|
|
681
690
|
|
|
682
691
|
class ChatWithDataAssistant(Assistant):
|
|
683
692
|
type: Literal["ChatWithData"] = "ChatWithData"
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
class Role(CustomBaseModel):
|
|
696
|
+
"""
|
|
697
|
+
{
|
|
698
|
+
"id": "string",
|
|
699
|
+
"name": "string",
|
|
700
|
+
"externalId": "string",
|
|
701
|
+
"type": "string",
|
|
702
|
+
"origin": "string"
|
|
703
|
+
}
|
|
704
|
+
"""
|
|
705
|
+
id: str = Field(..., alias="id")
|
|
706
|
+
name: str = Field(..., alias="name")
|
|
707
|
+
external_id: Optional[str] = Field(None, alias="externalId")
|
|
708
|
+
type: Optional[str] = Field(None, alias="type")
|
|
709
|
+
origin: Optional[str] = Field(None, alias="origin")
|
|
710
|
+
|
|
711
|
+
def to_dict(self):
|
|
712
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
|
713
|
+
|
|
714
|
+
def __str__(self):
|
|
715
|
+
return str(self.to_dict())
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
class Member(CustomBaseModel):
|
|
719
|
+
"""
|
|
720
|
+
{
|
|
721
|
+
"email": "string",
|
|
722
|
+
"roles": [...]
|
|
723
|
+
}
|
|
724
|
+
"""
|
|
725
|
+
email: str = Field(..., alias="email")
|
|
726
|
+
roles: Optional[List[Role]] = Field(default_factory=list, alias="roles")
|
|
727
|
+
|
|
728
|
+
@field_validator("roles", mode="before")
|
|
729
|
+
@classmethod
|
|
730
|
+
def normalize_roles(cls, value):
|
|
731
|
+
if isinstance(value, list):
|
|
732
|
+
return [Role.model_validate(item) if isinstance(item, dict) else item for item in value]
|
|
733
|
+
return value
|
|
734
|
+
|
|
735
|
+
def to_dict(self):
|
|
736
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
|
737
|
+
|
|
738
|
+
def __str__(self):
|
|
739
|
+
return str(self.to_dict())
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
class ProjectMembership(CustomBaseModel):
|
|
743
|
+
"""
|
|
744
|
+
{
|
|
745
|
+
"organizationId": "string",
|
|
746
|
+
"organizationName": "string",
|
|
747
|
+
"projectDescription": "string",
|
|
748
|
+
"projectId": "string",
|
|
749
|
+
"projectName": "string",
|
|
750
|
+
"roles": [...]
|
|
751
|
+
}
|
|
752
|
+
"""
|
|
753
|
+
organization_id: Optional[str] = Field(None, alias="organizationId")
|
|
754
|
+
organization_name: Optional[str] = Field(None, alias="organizationName")
|
|
755
|
+
project_description: Optional[str] = Field(None, alias="projectDescription")
|
|
756
|
+
project_id: str = Field(..., alias="projectId")
|
|
757
|
+
project_name: str = Field(..., alias="projectName")
|
|
758
|
+
roles: Optional[List[Role]] = Field(default_factory=list, alias="roles")
|
|
759
|
+
|
|
760
|
+
@field_validator("roles", mode="before")
|
|
761
|
+
@classmethod
|
|
762
|
+
def normalize_roles(cls, value):
|
|
763
|
+
if isinstance(value, list):
|
|
764
|
+
return [Role.model_validate(item) if isinstance(item, dict) else item for item in value]
|
|
765
|
+
return value
|
|
766
|
+
|
|
767
|
+
def to_dict(self):
|
|
768
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
|
769
|
+
|
|
770
|
+
def __str__(self):
|
|
771
|
+
return str(self.to_dict())
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
class OrganizationMembership(CustomBaseModel):
|
|
775
|
+
"""
|
|
776
|
+
{
|
|
777
|
+
"isStationAvailable": true,
|
|
778
|
+
"organizationId": "string",
|
|
779
|
+
"organizationName": "string",
|
|
780
|
+
"projects": [...]
|
|
781
|
+
}
|
|
782
|
+
"""
|
|
783
|
+
is_station_available: Optional[bool] = Field(None, alias="isStationAvailable")
|
|
784
|
+
organization_id: str = Field(..., alias="organizationId")
|
|
785
|
+
organization_name: str = Field(..., alias="organizationName")
|
|
786
|
+
projects: Optional[List[ProjectMembership]] = Field(default_factory=list, alias="projects")
|
|
787
|
+
|
|
788
|
+
@field_validator("projects", mode="before")
|
|
789
|
+
@classmethod
|
|
790
|
+
def normalize_projects(cls, value):
|
|
791
|
+
if isinstance(value, list):
|
|
792
|
+
return [ProjectMembership.model_validate(item) if isinstance(item, dict) else item for item in value]
|
|
793
|
+
return value
|
|
794
|
+
|
|
795
|
+
def to_dict(self):
|
|
796
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
|
797
|
+
|
|
798
|
+
def __str__(self):
|
|
799
|
+
return str(self.to_dict())
|
pygeai/core/plugins/clients.py
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
from json import JSONDecodeError
|
|
2
1
|
from typing import Optional, List, Dict
|
|
3
2
|
|
|
3
|
+
from pygeai import logger
|
|
4
4
|
from pygeai.core.base.clients import BaseClient
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
5
6
|
from pygeai.core.plugins.endpoints import LIST_ASSISTANTS_PLUGINS_V1
|
|
7
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
8
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
class PluginClient(BaseClient):
|
|
@@ -24,9 +27,6 @@ class PluginClient(BaseClient):
|
|
|
24
27
|
endpoint=LIST_ASSISTANTS_PLUGINS_V1,
|
|
25
28
|
params=params
|
|
26
29
|
)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
except JSONDecodeError:
|
|
30
|
-
result = response.text
|
|
30
|
+
validate_status_code(response)
|
|
31
|
+
return parse_json_response(response, f"list assistants for organization {organization_id} and project {project_id}")
|
|
31
32
|
|
|
32
|
-
return result
|
pygeai/core/rerank/clients.py
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import json
|
|
2
1
|
from typing import Any, Union
|
|
3
2
|
|
|
3
|
+
from pygeai import logger
|
|
4
4
|
from pygeai.core.base.clients import BaseClient
|
|
5
|
+
from pygeai.core.common.exceptions import InvalidAPIResponseException
|
|
5
6
|
from pygeai.core.rerank.endpoints import RERANK_V1
|
|
7
|
+
from pygeai.core.utils.validators import validate_status_code
|
|
8
|
+
from pygeai.core.utils.parsers import parse_json_response
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
class RerankClient(BaseClient):
|
|
@@ -20,10 +23,13 @@ class RerankClient(BaseClient):
|
|
|
20
23
|
"documents": documents,
|
|
21
24
|
"top_n": top_n
|
|
22
25
|
}
|
|
26
|
+
|
|
27
|
+
logger.debug(f"Generating rerank with data: {data}")
|
|
28
|
+
|
|
23
29
|
response = self.api_service.post(
|
|
24
30
|
endpoint=RERANK_V1,
|
|
25
31
|
data=data
|
|
26
32
|
)
|
|
27
|
-
|
|
28
|
-
return
|
|
33
|
+
validate_status_code(response)
|
|
34
|
+
return parse_json_response(response, "rerank chunks for query with model", query=query, model=model)
|
|
29
35
|
|
pygeai/core/rerank/managers.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
from pygeai
|
|
1
|
+
from pygeai import logger
|
|
2
|
+
from pygeai.core.common.exceptions import APIError
|
|
2
3
|
from pygeai.core.handlers import ErrorHandler
|
|
3
4
|
from pygeai.core.rerank.clients import RerankClient
|
|
4
5
|
from pygeai.core.rerank.mappers import RerankResponseMapper
|
|
@@ -7,7 +8,7 @@ from pygeai.core.rerank.models import RerankResponse
|
|
|
7
8
|
|
|
8
9
|
class RerankManager:
|
|
9
10
|
|
|
10
|
-
def __init__(self, api_key: str = None, base_url: str = None, alias: str =
|
|
11
|
+
def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
|
|
11
12
|
self.__client = RerankClient(api_key, base_url, alias)
|
|
12
13
|
|
|
13
14
|
def rerank_chunks(
|
|
@@ -17,6 +18,20 @@ class RerankManager:
|
|
|
17
18
|
documents: list[str],
|
|
18
19
|
top_n: int = 3
|
|
19
20
|
) -> RerankResponse:
|
|
21
|
+
"""
|
|
22
|
+
Reranks a list of documents based on their relevance to the given query.
|
|
23
|
+
|
|
24
|
+
This method sends a rerank request to the RerankClient using the specified
|
|
25
|
+
model, query, and list of documents. It processes the API response by
|
|
26
|
+
checking for errors and mapping the result into a structured RerankResponse.
|
|
27
|
+
|
|
28
|
+
:param query: str - The query string used to evaluate document relevance.
|
|
29
|
+
:param model: str - The identifier of the reranking model to use.
|
|
30
|
+
:param documents: list[str] - A list of document strings to be evaluated and reranked.
|
|
31
|
+
:param top_n: int, optional - The number of top-ranked documents to return. Defaults to 3.
|
|
32
|
+
:return: RerankResponse - The structured reranking response containing the top documents and scores.
|
|
33
|
+
:raises APIError: If the API returns errors.
|
|
34
|
+
"""
|
|
20
35
|
response_data = self.__client.rerank_chunks(
|
|
21
36
|
query=query,
|
|
22
37
|
model=model,
|
|
@@ -24,7 +39,9 @@ class RerankManager:
|
|
|
24
39
|
top_n=top_n
|
|
25
40
|
)
|
|
26
41
|
if ErrorHandler.has_errors(response_data):
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
42
|
+
error = ErrorHandler.extract_error(response_data)
|
|
43
|
+
logger.error(f"Error received while reranking chunks: {error}")
|
|
44
|
+
raise APIError(f"Error received while reranking chunks: {error}")
|
|
45
|
+
|
|
46
|
+
result = RerankResponseMapper.map_to_rerank_response(response_data)
|
|
30
47
|
return result
|