pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +9 -1
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +18 -45
- pygeai/assistant/data/clients.py +1 -0
- pygeai/assistant/data_analyst/clients.py +8 -12
- pygeai/assistant/managers.py +195 -157
- pygeai/assistant/mappers.py +4 -2
- pygeai/assistant/rag/clients.py +27 -67
- pygeai/assistant/rag/mappers.py +12 -6
- pygeai/assistant/rag/models.py +301 -159
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +308 -37
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +2 -8
- pygeai/chat/managers.py +9 -6
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +7 -10
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +9 -9
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +71 -9
- pygeai/cli/commands/chat.py +676 -19
- pygeai/cli/commands/common.py +28 -24
- pygeai/cli/commands/configuration.py +66 -13
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +58 -11
- pygeai/cli/commands/evaluation.py +38 -38
- pygeai/cli/commands/feedback.py +3 -4
- pygeai/cli/commands/files.py +7 -8
- pygeai/cli/commands/gam.py +85 -10
- pygeai/cli/commands/lab/ai_lab.py +340 -484
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +6 -7
- pygeai/cli/commands/migrate.py +1064 -436
- pygeai/cli/commands/organization.py +516 -11
- pygeai/cli/commands/rag.py +13 -14
- pygeai/cli/commands/rerank.py +3 -5
- pygeai/cli/commands/secrets.py +8 -9
- pygeai/cli/commands/usage_limits.py +18 -20
- pygeai/cli/commands/validators.py +144 -1
- pygeai/cli/commands/version.py +4 -5
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +170 -31
- pygeai/cli/geai_proxy.py +86 -25
- pygeai/cli/install_man.py +93 -22
- pygeai/cli/parsers.py +75 -25
- pygeai/cli/texts/help.py +265 -28
- pygeai/core/base/clients.py +53 -12
- pygeai/core/base/mappers.py +11 -2
- pygeai/core/base/session.py +95 -11
- pygeai/core/common/config.py +78 -14
- pygeai/core/common/exceptions.py +96 -6
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +23 -5
- pygeai/core/embeddings/managers.py +9 -4
- pygeai/core/embeddings/mappers.py +16 -2
- pygeai/core/embeddings/responses.py +9 -2
- pygeai/core/feedback/clients.py +8 -3
- pygeai/core/files/clients.py +23 -24
- pygeai/core/files/managers.py +121 -30
- pygeai/core/files/responses.py +4 -3
- pygeai/core/handlers.py +10 -1
- pygeai/core/llm/clients.py +22 -29
- pygeai/core/models.py +127 -11
- pygeai/core/plugins/clients.py +6 -6
- pygeai/core/rerank/clients.py +9 -3
- pygeai/core/rerank/managers.py +22 -5
- pygeai/core/secrets/clients.py +16 -37
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +159 -49
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +854 -14
- pygeai/evaluation/clients.py +7 -4
- pygeai/evaluation/dataset/clients.py +46 -44
- pygeai/evaluation/plan/clients.py +28 -26
- pygeai/evaluation/result/clients.py +38 -5
- pygeai/gam/clients.py +50 -28
- pygeai/gam/endpoints.py +2 -1
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -90
- pygeai/lab/agents/clients.py +203 -162
- pygeai/lab/agents/endpoints.py +4 -0
- pygeai/lab/agents/mappers.py +57 -7
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +571 -541
- pygeai/lab/models.py +108 -19
- pygeai/lab/processes/clients.py +332 -340
- pygeai/lab/processes/mappers.py +3 -3
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/clients.py +67 -63
- pygeai/lab/strategies/mappers.py +1 -1
- pygeai/lab/tools/clients.py +85 -118
- pygeai/lab/tools/endpoints.py +4 -0
- pygeai/lab/tools/mappers.py +5 -5
- pygeai/man/man1/geai-proxy.1 +116 -0
- pygeai/man/man1/geai.1 +2580 -66
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +468 -146
- pygeai/migration/tools.py +170 -3
- pygeai/organization/clients.py +245 -50
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/clients.py +34 -32
- pygeai/organization/limits/managers.py +108 -49
- pygeai/organization/managers.py +347 -53
- pygeai/organization/mappers.py +102 -2
- pygeai/organization/responses.py +58 -1
- pygeai/proxy/clients.py +6 -3
- pygeai/proxy/config.py +14 -1
- pygeai/proxy/managers.py +61 -33
- pygeai/proxy/servers.py +196 -51
- pygeai/proxy/tool.py +33 -16
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -82
- pygeai/tests/assistants/test_managers.py +191 -57
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +5 -5
- pygeai/tests/core/base/data/models.py +7 -0
- pygeai/tests/core/base/test_mappers.py +43 -11
- pygeai/tests/core/base/test_models.py +3 -1
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +124 -78
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +61 -39
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_models.py +500 -3
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +298 -56
- pygeai/tests/organization/test_clients.py +600 -30
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/delete_file.py +1 -4
- pygeai/tests/snippets/files/get_file_content.py +2 -4
- pygeai/tests/snippets/files/get_file_data.py +1 -4
- pygeai/tests/snippets/files/get_file_list.py +1 -6
- pygeai/tests/snippets/files/upload_file.py +1 -5
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
- pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
- pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
- pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
- pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/create_process.py +3 -5
- pygeai/tests/snippets/lab/processes/create_task.py +3 -5
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
- pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
- pygeai/tests/snippets/lab/runner_1.py +1 -1
- pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
- pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
- pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
- pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
- pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
- pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
- pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +2 -2
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
- pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
- docs/geai-proxy/README.md +0 -145
- docs/source/conf.py +0 -45
- pygeai/tests/core/test_managers.py +0 -233
- pygeai-0.1.51b3.dist-info/METADATA +0 -130
- pygeai-0.1.51b3.dist-info/RECORD +0 -324
- pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
- scripts/bump_beta_version.py +0 -56
- {scripts → pygeai/analytics}/__init__.py +0 -0
- /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
pygeai/cli/commands/chat.py
CHANGED
|
@@ -1,23 +1,34 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import platform
|
|
3
|
+
import os
|
|
4
|
+
import subprocess
|
|
2
5
|
import sys
|
|
6
|
+
from importlib import resources
|
|
7
|
+
from pathlib import Path
|
|
3
8
|
|
|
9
|
+
from pygeai import logger
|
|
4
10
|
from pygeai.chat.clients import ChatClient
|
|
5
11
|
from pygeai.chat.iris import Iris
|
|
12
|
+
from pygeai.chat.session import AgentChatSession
|
|
6
13
|
from pygeai.cli.commands import Command, Option, ArgumentsEnum
|
|
7
14
|
from pygeai.cli.commands.builders import build_help_text
|
|
8
15
|
from pygeai.cli.commands.common import get_messages, get_boolean_value, get_penalty_float_value
|
|
16
|
+
from pygeai.cli.commands.lab.utils import get_project_id
|
|
9
17
|
from pygeai.cli.texts.help import CHAT_HELP_TEXT
|
|
10
|
-
from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError
|
|
18
|
+
from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError, InvalidAgentException
|
|
11
19
|
from prompt_toolkit import PromptSession
|
|
12
20
|
from prompt_toolkit.history import InMemoryHistory
|
|
13
21
|
|
|
22
|
+
from pygeai.core.utils.console import Console
|
|
23
|
+
from pygeai.lab.agents.clients import AgentClient
|
|
24
|
+
|
|
14
25
|
|
|
15
26
|
def show_help():
|
|
16
27
|
"""
|
|
17
28
|
Displays help text in stdout
|
|
18
29
|
"""
|
|
19
30
|
help_text = build_help_text(chat_commands, CHAT_HELP_TEXT)
|
|
20
|
-
|
|
31
|
+
Console.write_stdout(help_text)
|
|
21
32
|
|
|
22
33
|
|
|
23
34
|
def get_chat_completion(option_list: list):
|
|
@@ -41,6 +52,7 @@ def get_chat_completion(option_list: list):
|
|
|
41
52
|
store = None
|
|
42
53
|
metadata = None
|
|
43
54
|
user = None
|
|
55
|
+
reasoning_effort = None
|
|
44
56
|
|
|
45
57
|
for option_flag, option_arg in option_list:
|
|
46
58
|
if option_flag.name == "model":
|
|
@@ -113,6 +125,8 @@ def get_chat_completion(option_list: list):
|
|
|
113
125
|
raise WrongArgumentError("metadata must be a valid JSON object")
|
|
114
126
|
if option_flag.name == "user":
|
|
115
127
|
user = option_arg
|
|
128
|
+
if option_flag.name == "reasoning_effort":
|
|
129
|
+
reasoning_effort = option_arg
|
|
116
130
|
|
|
117
131
|
messages = get_messages(message_list)
|
|
118
132
|
|
|
@@ -140,16 +154,17 @@ def get_chat_completion(option_list: list):
|
|
|
140
154
|
stream_options=stream_options,
|
|
141
155
|
store=store,
|
|
142
156
|
metadata=metadata,
|
|
143
|
-
user=user
|
|
157
|
+
user=user,
|
|
158
|
+
reasoning_effort=reasoning_effort
|
|
144
159
|
)
|
|
145
160
|
if stream:
|
|
146
|
-
|
|
161
|
+
Console.write_stdout("Streaming chat completion:")
|
|
147
162
|
for chunk in result:
|
|
148
|
-
|
|
163
|
+
Console.write_stdout(f"{chunk}", end="")
|
|
149
164
|
sys.stdout.flush()
|
|
150
|
-
|
|
165
|
+
Console.write_stdout()
|
|
151
166
|
else:
|
|
152
|
-
|
|
167
|
+
Console.write_stdout(f"Chat completion detail: \n{result}\n")
|
|
153
168
|
|
|
154
169
|
|
|
155
170
|
chat_completion_options = [
|
|
@@ -284,6 +299,14 @@ chat_completion_options = [
|
|
|
284
299
|
"Optional string identifier for the end-user to monitor abuse.",
|
|
285
300
|
True
|
|
286
301
|
),
|
|
302
|
+
Option(
|
|
303
|
+
"reasoning_effort",
|
|
304
|
+
["--reasoning-effort"],
|
|
305
|
+
"Optional string to control the depth of reasoning applied by supported models. "
|
|
306
|
+
"Possible values: 'low', 'medium', 'high'. Supported by OpenAI models from version 5, "
|
|
307
|
+
"Claude models from version 4.1, and Gemini models from version 2.0.",
|
|
308
|
+
True
|
|
309
|
+
),
|
|
287
310
|
]
|
|
288
311
|
|
|
289
312
|
|
|
@@ -294,15 +317,15 @@ def chat_with_iris():
|
|
|
294
317
|
history = InMemoryHistory()
|
|
295
318
|
session = PromptSession(">> Ask Iris: ", history=history)
|
|
296
319
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
First, we need to define some key details for your agent. You can specify its role and purpose or give it a name, and I'll help you set up the rest. Once we have that, we'll refine its knowledge and behavior
|
|
320
|
+
Console.write_stdout(f"#=================================================#")
|
|
321
|
+
Console.write_stdout(f"#--------------------- IRIS ----------------------#")
|
|
322
|
+
Console.write_stdout(f"#=================================================#")
|
|
323
|
+
Console.write_stdout(f"# This is the start of your conversation with Iris. Type 'exit' or press Ctrl+C to close the chat.\n")
|
|
324
|
+
Console.write_stdout("""- Iris: Hello! I'm Iris. I'll guide you step by step to create your agent.
|
|
325
|
+
First, we need to define some key details for your agent. You can specify its role and purpose or give it a name, and I'll help you set up the rest. Once we have that, we'll refine its knowledge and behavior.""")
|
|
303
326
|
try:
|
|
304
327
|
while (user_input := session.prompt()) != "exit":
|
|
305
|
-
|
|
328
|
+
Console.write_stdout(f"- User: {user_input}")
|
|
306
329
|
new_message = {
|
|
307
330
|
"role": "user",
|
|
308
331
|
"content": user_input
|
|
@@ -311,15 +334,15 @@ First, we need to define some key details for your agent. You can specify its ro
|
|
|
311
334
|
|
|
312
335
|
result = iris.stream_answer(messages)
|
|
313
336
|
answer = ""
|
|
314
|
-
|
|
337
|
+
Console.write_stdout("- Iris: ")
|
|
315
338
|
for chunk in result:
|
|
316
339
|
answer += chunk
|
|
317
|
-
|
|
340
|
+
Console.write_stdout(f"{chunk}", end="")
|
|
318
341
|
sys.stdout.flush()
|
|
319
|
-
|
|
342
|
+
Console.write_stdout()
|
|
320
343
|
|
|
321
344
|
new_answer = {
|
|
322
|
-
"role": "
|
|
345
|
+
"role": "assistant",
|
|
323
346
|
"content": answer
|
|
324
347
|
}
|
|
325
348
|
messages.append(new_answer)
|
|
@@ -328,9 +351,607 @@ First, we need to define some key details for your agent. You can specify its ro
|
|
|
328
351
|
sys.exit(0)
|
|
329
352
|
|
|
330
353
|
except Exception as e:
|
|
331
|
-
|
|
354
|
+
logger.error(f"Error chatting with Iris: {e}")
|
|
355
|
+
Console.write_stderr("An unexpected error has occurred. Please contact the developers.")
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def chat_with_agent(option_list: list):
|
|
359
|
+
agent_name = None
|
|
360
|
+
use_gui = False
|
|
361
|
+
save_session_file = None
|
|
362
|
+
restore_session_file = None
|
|
363
|
+
for option_flag, option_arg in option_list:
|
|
364
|
+
if option_flag.name == "agent_name":
|
|
365
|
+
agent_name = option_arg
|
|
366
|
+
if option_flag.name == "gui":
|
|
367
|
+
use_gui = True
|
|
368
|
+
if option_flag.name == "save_session":
|
|
369
|
+
save_session_file = option_arg
|
|
370
|
+
if option_flag.name == "restore_session":
|
|
371
|
+
restore_session_file = option_arg
|
|
372
|
+
|
|
373
|
+
if not agent_name:
|
|
374
|
+
raise MissingRequirementException(f"Agent name must be specified.")
|
|
375
|
+
|
|
376
|
+
project_id = get_project_id()
|
|
377
|
+
agent_data = AgentClient(project_id=project_id).get_agent(agent_id=agent_name)
|
|
378
|
+
if 'errors' in agent_data:
|
|
379
|
+
raise InvalidAgentException(f"There is no agent with that name: {agent_data.get('errors')}")
|
|
380
|
+
|
|
381
|
+
if use_gui:
|
|
382
|
+
try:
|
|
383
|
+
import streamlit
|
|
384
|
+
except ImportError:
|
|
385
|
+
logger.error("Streamlit not installed")
|
|
386
|
+
Console.write_stderr("Streamlit is required for GUI mode. Install it with 'pip install streamlit'.")
|
|
387
|
+
sys.exit(1)
|
|
388
|
+
|
|
389
|
+
try:
|
|
390
|
+
ui_path = resources.files("pygeai.chat").joinpath("ui.py")
|
|
391
|
+
ui_file_path = str(ui_path)
|
|
392
|
+
|
|
393
|
+
# Add the top-level project root to PYTHONPATH
|
|
394
|
+
package_root = str(Path(ui_file_path).resolve().parents[2])
|
|
395
|
+
env = os.environ.copy()
|
|
396
|
+
env["PYTHONPATH"] = package_root + os.pathsep + env.get("PYTHONPATH", "")
|
|
397
|
+
|
|
398
|
+
streamlit_cmd = [
|
|
399
|
+
sys.executable, "-m", "streamlit", "run", ui_file_path,
|
|
400
|
+
"--server.address", "127.0.0.1",
|
|
401
|
+
"--", "--agent-name", agent_name
|
|
402
|
+
]
|
|
403
|
+
|
|
404
|
+
if platform.system() == "Linux":
|
|
405
|
+
streamlit_cmd.insert(5, "--server.headless=true")
|
|
406
|
+
|
|
407
|
+
process = subprocess.Popen(
|
|
408
|
+
streamlit_cmd,
|
|
409
|
+
stdout=subprocess.PIPE,
|
|
410
|
+
stderr=subprocess.PIPE,
|
|
411
|
+
text=True
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
url = "http://localhost:8501"
|
|
415
|
+
if platform.system() == "Linux":
|
|
416
|
+
Console.write_stdout(f"Open Streamlit app at {url} (or next port like 8502 if 8501 is taken)")
|
|
417
|
+
|
|
418
|
+
try:
|
|
419
|
+
stdout, stderr = process.communicate()
|
|
420
|
+
if stderr:
|
|
421
|
+
logger.error(f"Streamlit stderr:\n{stderr}")
|
|
422
|
+
Console.write_stderr(f"Streamlit error:\n{stderr}")
|
|
423
|
+
except KeyboardInterrupt:
|
|
424
|
+
process.terminate()
|
|
425
|
+
Console.write_stdout("Streamlit stopped.")
|
|
426
|
+
sys.exit(0)
|
|
427
|
+
|
|
428
|
+
except FileNotFoundError:
|
|
429
|
+
logger.error("Could not locate pygeai/chat/ui.py")
|
|
430
|
+
Console.write_stderr("Streamlit UI file not found. Ensure pygeai is installed correctly.")
|
|
431
|
+
sys.exit(1)
|
|
432
|
+
except Exception as e:
|
|
433
|
+
logger.error(f"Streamlit error: {e}")
|
|
434
|
+
Console.write_stderr(
|
|
435
|
+
f"Failed to launch Streamlit. Check port with 'lsof -i :8501' and kill any process, or try {url}.")
|
|
436
|
+
sys.exit(1)
|
|
437
|
+
else:
|
|
438
|
+
chat_session = AgentChatSession(agent_name)
|
|
439
|
+
messages = list()
|
|
440
|
+
|
|
441
|
+
# Restore session if specified
|
|
442
|
+
if restore_session_file:
|
|
443
|
+
try:
|
|
444
|
+
with open(restore_session_file, 'r') as f:
|
|
445
|
+
restored_data = json.load(f)
|
|
446
|
+
if isinstance(restored_data, list):
|
|
447
|
+
messages = restored_data
|
|
448
|
+
Console.write_stdout(f"Restored conversation from {restore_session_file}")
|
|
449
|
+
# Display restored conversation history
|
|
450
|
+
Console.write_stdout(f"#=================================================#")
|
|
451
|
+
Console.write_stdout(f"# CHAT SESSION WITH {agent_name} ")
|
|
452
|
+
Console.write_stdout(f"#=================================================#")
|
|
453
|
+
for msg in messages:
|
|
454
|
+
role = msg.get("role", "unknown")
|
|
455
|
+
content = msg.get("content", "")
|
|
456
|
+
if role == "assistant":
|
|
457
|
+
Console.write_stdout(f"- Agent: {content}")
|
|
458
|
+
elif role == "user":
|
|
459
|
+
Console.write_stdout(f"- User: {content}")
|
|
460
|
+
else:
|
|
461
|
+
raise WrongArgumentError("Session file must contain a list of messages in JSON format.")
|
|
462
|
+
except FileNotFoundError:
|
|
463
|
+
logger.error(f"Session file {restore_session_file} not found.")
|
|
464
|
+
Console.write_stderr(f"Session file {restore_session_file} not found. Starting a new conversation.")
|
|
465
|
+
except json.JSONDecodeError:
|
|
466
|
+
logger.error(f"Invalid JSON format in {restore_session_file}.")
|
|
467
|
+
Console.write_stderr(f"Invalid JSON format in {restore_session_file}. Starting a new conversation.")
|
|
468
|
+
except Exception as e:
|
|
469
|
+
logger.error(f"Error restoring session: {e}")
|
|
470
|
+
Console.write_stderr(f"Error restoring session from {restore_session_file}. Starting a new conversation.")
|
|
471
|
+
|
|
472
|
+
# If no session was restored or messages are empty, get the agent's introduction
|
|
473
|
+
if not messages:
|
|
474
|
+
introduction_message = chat_session.get_answer(
|
|
475
|
+
["You're about to speak to a user. Introduce yourself in a clear and concise manner, "
|
|
476
|
+
"stating who you are and what you do. Nothing else."]
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
if "Agent not found" in str(introduction_message):
|
|
480
|
+
raise WrongArgumentError(
|
|
481
|
+
"The specified agent doesn't seem to exist. Please review the name and try again.")
|
|
482
|
+
|
|
483
|
+
Console.write_stdout(f"#=================================================#")
|
|
484
|
+
Console.write_stdout(f"# CHAT SESSION WITH {agent_name} ")
|
|
485
|
+
Console.write_stdout(f"#=================================================#")
|
|
486
|
+
Console.write_stdout(introduction_message)
|
|
487
|
+
messages.append({"role": "assistant", "content": introduction_message})
|
|
488
|
+
|
|
489
|
+
history = InMemoryHistory()
|
|
490
|
+
session = PromptSession(f">> Ask {agent_name}: ", history=history)
|
|
491
|
+
|
|
492
|
+
# Save session function
|
|
493
|
+
def save_session(messages, file_path):
|
|
494
|
+
try:
|
|
495
|
+
with open(file_path, 'w') as f:
|
|
496
|
+
json.dump(messages, f, indent=2)
|
|
497
|
+
logger.info(f"Session saved to {file_path}")
|
|
498
|
+
except Exception as e:
|
|
499
|
+
logger.error(f"Error saving session to {file_path}: {e}")
|
|
500
|
+
Console.write_stderr(f"Failed to save session to {file_path}: {e}")
|
|
501
|
+
|
|
502
|
+
try:
|
|
503
|
+
while (user_input := session.prompt()) != "exit":
|
|
504
|
+
Console.write_stdout(f"- User: {user_input}")
|
|
505
|
+
new_message = {
|
|
506
|
+
"role": "user",
|
|
507
|
+
"content": user_input
|
|
508
|
+
}
|
|
509
|
+
messages.append(new_message)
|
|
510
|
+
|
|
511
|
+
# Save session after user input if specified
|
|
512
|
+
if save_session_file:
|
|
513
|
+
save_session(messages, save_session_file)
|
|
514
|
+
|
|
515
|
+
result = chat_session.stream_answer(messages)
|
|
516
|
+
answer = ""
|
|
517
|
+
Console.write_stdout("- Agent: ")
|
|
518
|
+
for chunk in result:
|
|
519
|
+
answer += chunk
|
|
520
|
+
Console.write_stdout(f"{chunk}", end="")
|
|
521
|
+
sys.stdout.flush()
|
|
522
|
+
Console.write_stdout()
|
|
523
|
+
|
|
524
|
+
new_answer = {
|
|
525
|
+
"role": "assistant",
|
|
526
|
+
"content": answer
|
|
527
|
+
}
|
|
528
|
+
messages.append(new_answer)
|
|
529
|
+
|
|
530
|
+
# Save session after agent response if specified
|
|
531
|
+
if save_session_file:
|
|
532
|
+
save_session(messages, save_session_file)
|
|
533
|
+
|
|
534
|
+
except KeyboardInterrupt:
|
|
535
|
+
print("\nExiting chat...")
|
|
536
|
+
# Final save before exit if specified
|
|
537
|
+
if save_session_file:
|
|
538
|
+
save_session(messages, save_session_file)
|
|
539
|
+
sys.exit(0)
|
|
540
|
+
except WrongArgumentError as e:
|
|
541
|
+
Console.write_stderr(f"There was an error: {e}")
|
|
542
|
+
except Exception as e:
|
|
543
|
+
logger.error(f"Error chatting with Agent: {e}")
|
|
544
|
+
Console.write_stderr("An unexpected error has occurred. Please contact the developers.")
|
|
545
|
+
# Save session on error if specified
|
|
546
|
+
if save_session_file:
|
|
547
|
+
save_session(messages, save_session_file)
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
chat_with_agent_options = [
|
|
551
|
+
Option(
|
|
552
|
+
"agent_name",
|
|
553
|
+
["--agent-name", "--name", "-n"],
|
|
554
|
+
"You can use the internal name, public name and agent id in order to chat interactively with any agent",
|
|
555
|
+
True
|
|
556
|
+
),
|
|
557
|
+
Option(
|
|
558
|
+
"gui",
|
|
559
|
+
["--gui", "-g"],
|
|
560
|
+
"Launch a Streamlit GUI chat interface. No need to specify argument next to the option",
|
|
561
|
+
False
|
|
562
|
+
),
|
|
563
|
+
Option(
|
|
564
|
+
"save_session",
|
|
565
|
+
["--save-session", "--ss"],
|
|
566
|
+
"Save the conversation to a JSON file. Provide the file path as the argument.",
|
|
567
|
+
True
|
|
568
|
+
),
|
|
569
|
+
Option(
|
|
570
|
+
"restore_session",
|
|
571
|
+
["--restore-session", "--rs"],
|
|
572
|
+
"Restore a conversation from a JSON file. Provide the file path as the argument.",
|
|
573
|
+
True
|
|
574
|
+
),
|
|
575
|
+
]
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
def get_generate_image(option_list: list):
|
|
579
|
+
model = None
|
|
580
|
+
prompt = None
|
|
581
|
+
n = None
|
|
582
|
+
quality = None
|
|
583
|
+
size = None
|
|
584
|
+
aspect_ratio = None
|
|
585
|
+
|
|
586
|
+
for option_flag, option_arg in option_list:
|
|
587
|
+
if option_flag.name == "model":
|
|
588
|
+
model = option_arg
|
|
589
|
+
if option_flag.name == "prompt":
|
|
590
|
+
prompt = option_arg
|
|
591
|
+
if option_flag.name == "n":
|
|
592
|
+
try:
|
|
593
|
+
n = int(option_arg)
|
|
594
|
+
if n < 1 or n > 10:
|
|
595
|
+
raise WrongArgumentError("n must be an integer between 1 and 10.")
|
|
596
|
+
except ValueError:
|
|
597
|
+
raise WrongArgumentError("n must be a valid integer.")
|
|
598
|
+
if option_flag.name == "quality":
|
|
599
|
+
quality = option_arg
|
|
600
|
+
if option_flag.name == "size":
|
|
601
|
+
size = option_arg
|
|
602
|
+
if option_flag.name == "aspect_ratio":
|
|
603
|
+
aspect_ratio = option_arg
|
|
604
|
+
|
|
605
|
+
if not (model and prompt and n is not None and quality and size):
|
|
606
|
+
raise MissingRequirementException("Cannot generate image without specifying model, prompt, n, quality, and size.")
|
|
607
|
+
|
|
608
|
+
client = ChatClient()
|
|
609
|
+
try:
|
|
610
|
+
result = client.generate_image(
|
|
611
|
+
model=model,
|
|
612
|
+
prompt=prompt,
|
|
613
|
+
n=n,
|
|
614
|
+
quality=quality,
|
|
615
|
+
size=size,
|
|
616
|
+
aspect_ratio=aspect_ratio
|
|
617
|
+
)
|
|
618
|
+
Console.write_stdout(f"Image generation result: \n{result}\n")
|
|
619
|
+
except Exception as e:
|
|
620
|
+
logger.error(f"Error generating image: {e}")
|
|
621
|
+
Console.write_stderr(f"Failed to generate image: {e}")
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
generate_image_options = [
|
|
625
|
+
Option(
|
|
626
|
+
"model",
|
|
627
|
+
["--model", "-m"],
|
|
628
|
+
"The model specification for image generation, e.g., 'openai/gpt-image-1'.",
|
|
629
|
+
True
|
|
630
|
+
),
|
|
631
|
+
Option(
|
|
632
|
+
"prompt",
|
|
633
|
+
["--prompt", "-p"],
|
|
634
|
+
"Description of the desired image.",
|
|
635
|
+
True
|
|
636
|
+
),
|
|
637
|
+
Option(
|
|
638
|
+
"n",
|
|
639
|
+
["--n"],
|
|
640
|
+
"Number of images to generate (1-10, depending on the model).",
|
|
641
|
+
True
|
|
642
|
+
),
|
|
643
|
+
Option(
|
|
644
|
+
"quality",
|
|
645
|
+
["--quality", "-q"],
|
|
646
|
+
"Rendering quality, e.g., 'high'.",
|
|
647
|
+
True
|
|
648
|
+
),
|
|
649
|
+
Option(
|
|
650
|
+
"size",
|
|
651
|
+
["--size", "-s"],
|
|
652
|
+
"Image dimensions, e.g., '1024x1024'.",
|
|
653
|
+
True
|
|
654
|
+
),
|
|
655
|
+
Option(
|
|
656
|
+
"aspect_ratio",
|
|
657
|
+
["--aspect-ratio", "-ar"],
|
|
658
|
+
"Relationship between image’s width and height, e.g., '1:1', '9:16', '16:9', '3:4', '4:3'.",
|
|
659
|
+
True
|
|
660
|
+
),
|
|
661
|
+
]
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
def get_edit_image(option_list: list):
|
|
665
|
+
model = None
|
|
666
|
+
prompt = None
|
|
667
|
+
image = None
|
|
668
|
+
size = None
|
|
669
|
+
n = 1
|
|
670
|
+
quality = None
|
|
671
|
+
|
|
672
|
+
for option_flag, option_arg in option_list:
|
|
673
|
+
if option_flag.name == "model":
|
|
674
|
+
model = option_arg
|
|
675
|
+
if option_flag.name == "prompt":
|
|
676
|
+
prompt = option_arg
|
|
677
|
+
if option_flag.name == "image":
|
|
678
|
+
image = option_arg
|
|
679
|
+
if option_flag.name == "size":
|
|
680
|
+
size = option_arg
|
|
681
|
+
if option_flag.name == "n":
|
|
682
|
+
try:
|
|
683
|
+
n = int(option_arg)
|
|
684
|
+
if n < 1 or n > 10:
|
|
685
|
+
raise WrongArgumentError("n must be an integer between 1 and 10.")
|
|
686
|
+
except ValueError:
|
|
687
|
+
raise WrongArgumentError("n must be a valid integer.")
|
|
688
|
+
if option_flag.name == "quality":
|
|
689
|
+
quality = option_arg
|
|
690
|
+
|
|
691
|
+
if not (model and prompt and image and size):
|
|
692
|
+
raise MissingRequirementException("Cannot edit image without specifying model, prompt, image, and size.")
|
|
693
|
+
|
|
694
|
+
client = ChatClient()
|
|
695
|
+
try:
|
|
696
|
+
result = client.edit_image(
|
|
697
|
+
model=model,
|
|
698
|
+
prompt=prompt,
|
|
699
|
+
image=image,
|
|
700
|
+
size=size,
|
|
701
|
+
n=n,
|
|
702
|
+
quality=quality
|
|
703
|
+
)
|
|
704
|
+
Console.write_stdout(f"Image editing result: \n{result}\n")
|
|
705
|
+
except Exception as e:
|
|
706
|
+
logger.error(f"Error editing image: {e}")
|
|
707
|
+
Console.write_stderr(f"Failed to edit image: {e}")
|
|
332
708
|
|
|
333
709
|
|
|
710
|
+
edit_image_options = [
|
|
711
|
+
Option(
|
|
712
|
+
"model",
|
|
713
|
+
["--model", "-m"],
|
|
714
|
+
"The model specification for image editing, e.g., 'openai/gpt-image-1'.",
|
|
715
|
+
True
|
|
716
|
+
),
|
|
717
|
+
Option(
|
|
718
|
+
"prompt",
|
|
719
|
+
["--prompt", "-p"],
|
|
720
|
+
"Description of the desired edit, e.g., 'remove the ball'.",
|
|
721
|
+
True
|
|
722
|
+
),
|
|
723
|
+
Option(
|
|
724
|
+
"image",
|
|
725
|
+
["--image", "-img"],
|
|
726
|
+
"URL of the image to be edited, e.g., 'https://example.com/image.jpg'.",
|
|
727
|
+
True
|
|
728
|
+
),
|
|
729
|
+
Option(
|
|
730
|
+
"size",
|
|
731
|
+
["--size", "-s"],
|
|
732
|
+
"Desired dimensions of the output image in pixels, e.g., '1024x1024'.",
|
|
733
|
+
True
|
|
734
|
+
),
|
|
735
|
+
Option(
|
|
736
|
+
"n",
|
|
737
|
+
["--n"],
|
|
738
|
+
"Number of edited images to generate (1-10, depending on the model). Default is 1.",
|
|
739
|
+
True
|
|
740
|
+
),
|
|
741
|
+
Option(
|
|
742
|
+
"quality",
|
|
743
|
+
["--quality", "-q"],
|
|
744
|
+
"Rendering quality, e.g., 'high', 'medium', 'low'.",
|
|
745
|
+
True
|
|
746
|
+
),
|
|
747
|
+
]
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
def get_response(option_list: list):
|
|
751
|
+
model = None
|
|
752
|
+
input_text = None
|
|
753
|
+
files = None
|
|
754
|
+
tools = None
|
|
755
|
+
tool_choice = None
|
|
756
|
+
temperature = None
|
|
757
|
+
max_output_tokens = None
|
|
758
|
+
top_p = None
|
|
759
|
+
metadata = None
|
|
760
|
+
user = None
|
|
761
|
+
instructions = None
|
|
762
|
+
reasoning = None
|
|
763
|
+
truncation = None
|
|
764
|
+
parallel_tool_calls = None
|
|
765
|
+
store = None
|
|
766
|
+
stream = False
|
|
767
|
+
|
|
768
|
+
for option_flag, option_arg in option_list:
|
|
769
|
+
if option_flag.name == "model":
|
|
770
|
+
model = option_arg
|
|
771
|
+
if option_flag.name == "input":
|
|
772
|
+
input_text = option_arg
|
|
773
|
+
if option_flag.name == "files":
|
|
774
|
+
try:
|
|
775
|
+
files = json.loads(option_arg) if option_arg else None
|
|
776
|
+
if files and not isinstance(files, list):
|
|
777
|
+
raise WrongArgumentError("files must be a JSON array of file paths")
|
|
778
|
+
except json.JSONDecodeError:
|
|
779
|
+
raise WrongArgumentError("files must be a valid JSON array")
|
|
780
|
+
if option_flag.name == "tools":
|
|
781
|
+
try:
|
|
782
|
+
tools = json.loads(option_arg) if option_arg else None
|
|
783
|
+
except json.JSONDecodeError:
|
|
784
|
+
raise WrongArgumentError("tools must be a valid JSON array")
|
|
785
|
+
if option_flag.name == "tool_choice":
|
|
786
|
+
try:
|
|
787
|
+
tool_choice = json.loads(option_arg) if option_arg else None
|
|
788
|
+
except json.JSONDecodeError:
|
|
789
|
+
tool_choice = option_arg
|
|
790
|
+
if option_flag.name == "temperature":
|
|
791
|
+
temperature = float(option_arg) if option_arg is not None else None
|
|
792
|
+
if option_flag.name == "max_output_tokens":
|
|
793
|
+
max_output_tokens = int(option_arg) if option_arg is not None else None
|
|
794
|
+
if option_flag.name == "top_p":
|
|
795
|
+
top_p = float(option_arg) if option_arg else None
|
|
796
|
+
if option_flag.name == "metadata":
|
|
797
|
+
try:
|
|
798
|
+
metadata = json.loads(option_arg) if option_arg else None
|
|
799
|
+
except json.JSONDecodeError:
|
|
800
|
+
raise WrongArgumentError("metadata must be a valid JSON object")
|
|
801
|
+
if option_flag.name == "user":
|
|
802
|
+
user = option_arg
|
|
803
|
+
if option_flag.name == "instructions":
|
|
804
|
+
instructions = option_arg
|
|
805
|
+
if option_flag.name == "reasoning":
|
|
806
|
+
try:
|
|
807
|
+
reasoning = json.loads(option_arg) if option_arg else None
|
|
808
|
+
except json.JSONDecodeError:
|
|
809
|
+
raise WrongArgumentError("reasoning must be a valid JSON object")
|
|
810
|
+
if option_flag.name == "truncation":
|
|
811
|
+
truncation = option_arg
|
|
812
|
+
if option_flag.name == "parallel_tool_calls":
|
|
813
|
+
parallel_tool_calls = get_boolean_value(option_arg) if option_arg else None
|
|
814
|
+
if option_flag.name == "store":
|
|
815
|
+
store = get_boolean_value(option_arg) if option_arg else None
|
|
816
|
+
if option_flag.name == "stream":
|
|
817
|
+
if option_arg:
|
|
818
|
+
stream = get_boolean_value(option_arg)
|
|
819
|
+
|
|
820
|
+
if not (model and input_text):
|
|
821
|
+
raise MissingRequirementException("Cannot get response without specifying model and input")
|
|
822
|
+
|
|
823
|
+
client = ChatClient()
|
|
824
|
+
try:
|
|
825
|
+
result = client.get_response(
|
|
826
|
+
model=model,
|
|
827
|
+
input=input_text,
|
|
828
|
+
files=files,
|
|
829
|
+
tools=tools,
|
|
830
|
+
tool_choice=tool_choice,
|
|
831
|
+
temperature=temperature,
|
|
832
|
+
max_output_tokens=max_output_tokens,
|
|
833
|
+
top_p=top_p,
|
|
834
|
+
metadata=metadata,
|
|
835
|
+
user=user,
|
|
836
|
+
instructions=instructions,
|
|
837
|
+
reasoning=reasoning,
|
|
838
|
+
truncation=truncation,
|
|
839
|
+
parallel_tool_calls=parallel_tool_calls,
|
|
840
|
+
store=store,
|
|
841
|
+
stream=stream
|
|
842
|
+
)
|
|
843
|
+
if stream:
|
|
844
|
+
Console.write_stdout("Streaming response:")
|
|
845
|
+
for chunk in result:
|
|
846
|
+
Console.write_stdout(f"{chunk}", end="")
|
|
847
|
+
sys.stdout.flush()
|
|
848
|
+
Console.write_stdout()
|
|
849
|
+
else:
|
|
850
|
+
Console.write_stdout(f"Response result: \n{json.dumps(result, indent=2)}\n")
|
|
851
|
+
except Exception as e:
|
|
852
|
+
logger.error(f"Error getting response: {e}")
|
|
853
|
+
Console.write_stderr(f"Failed to get response: {e}")
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
response_options = [
|
|
857
|
+
Option(
|
|
858
|
+
"model",
|
|
859
|
+
["--model", "-m"],
|
|
860
|
+
"The model specification, e.g., 'openai/o1-pro'.",
|
|
861
|
+
True
|
|
862
|
+
),
|
|
863
|
+
Option(
|
|
864
|
+
"input",
|
|
865
|
+
["--input", "-i"],
|
|
866
|
+
"The user input text.",
|
|
867
|
+
True
|
|
868
|
+
),
|
|
869
|
+
Option(
|
|
870
|
+
"files",
|
|
871
|
+
["--files", "-f"],
|
|
872
|
+
"JSON array of file paths (images or PDFs) to include in the request, e.g., '[\"image.jpg\", \"doc.pdf\"]'.",
|
|
873
|
+
True
|
|
874
|
+
),
|
|
875
|
+
Option(
|
|
876
|
+
"tools",
|
|
877
|
+
["--tools"],
|
|
878
|
+
"Optional JSON array of tools (e.g., functions) the model may call.",
|
|
879
|
+
True
|
|
880
|
+
),
|
|
881
|
+
Option(
|
|
882
|
+
"tool_choice",
|
|
883
|
+
["--tool-choice"],
|
|
884
|
+
"Optional string (e.g., \"none\", \"auto\") or JSON object to control which tool is called.",
|
|
885
|
+
True
|
|
886
|
+
),
|
|
887
|
+
Option(
|
|
888
|
+
"temperature",
|
|
889
|
+
["--temperature", "--temp"],
|
|
890
|
+
"Float value to set randomness of the response (between 0 and 2).",
|
|
891
|
+
True
|
|
892
|
+
),
|
|
893
|
+
Option(
|
|
894
|
+
"max_output_tokens",
|
|
895
|
+
["--max-output-tokens"],
|
|
896
|
+
"Integer value to set max tokens in the output.",
|
|
897
|
+
True
|
|
898
|
+
),
|
|
899
|
+
Option(
|
|
900
|
+
"top_p",
|
|
901
|
+
["--top-p"],
|
|
902
|
+
"Optional float value for nucleus sampling (between 0 and 1).",
|
|
903
|
+
True
|
|
904
|
+
),
|
|
905
|
+
Option(
|
|
906
|
+
"metadata",
|
|
907
|
+
["--metadata"],
|
|
908
|
+
"Optional JSON object with up to 16 key-value pairs to attach to the object.",
|
|
909
|
+
True
|
|
910
|
+
),
|
|
911
|
+
Option(
|
|
912
|
+
"user",
|
|
913
|
+
["--user"],
|
|
914
|
+
"Optional string identifier for the end-user.",
|
|
915
|
+
True
|
|
916
|
+
),
|
|
917
|
+
Option(
|
|
918
|
+
"instructions",
|
|
919
|
+
["--instructions"],
|
|
920
|
+
"Optional additional instructions for the model.",
|
|
921
|
+
True
|
|
922
|
+
),
|
|
923
|
+
Option(
|
|
924
|
+
"reasoning",
|
|
925
|
+
["--reasoning"],
|
|
926
|
+
"Optional JSON object for reasoning configuration, e.g., {\"effort\": \"medium\"}.",
|
|
927
|
+
True
|
|
928
|
+
),
|
|
929
|
+
Option(
|
|
930
|
+
"truncation",
|
|
931
|
+
["--truncation"],
|
|
932
|
+
"Optional truncation strategy, e.g., \"disabled\".",
|
|
933
|
+
True
|
|
934
|
+
),
|
|
935
|
+
Option(
|
|
936
|
+
"parallel_tool_calls",
|
|
937
|
+
["--parallel-tool-calls"],
|
|
938
|
+
"Optional boolean to enable parallel tool calls. Possible values: 0: OFF; 1: ON",
|
|
939
|
+
True
|
|
940
|
+
),
|
|
941
|
+
Option(
|
|
942
|
+
"store",
|
|
943
|
+
["--store"],
|
|
944
|
+
"Optional boolean to store the output. Possible values: 0: OFF; 1: ON",
|
|
945
|
+
True
|
|
946
|
+
),
|
|
947
|
+
Option(
|
|
948
|
+
"stream",
|
|
949
|
+
["--stream"],
|
|
950
|
+
"Whether to stream the response. Possible values: 0: OFF; 1: ON",
|
|
951
|
+
True
|
|
952
|
+
),
|
|
953
|
+
]
|
|
954
|
+
|
|
334
955
|
chat_commands = [
|
|
335
956
|
Command(
|
|
336
957
|
"help",
|
|
@@ -359,5 +980,41 @@ chat_commands = [
|
|
|
359
980
|
[],
|
|
360
981
|
[]
|
|
361
982
|
),
|
|
983
|
+
Command(
|
|
984
|
+
"agent",
|
|
985
|
+
["agent"],
|
|
986
|
+
"Interactive chat with Agent",
|
|
987
|
+
chat_with_agent,
|
|
988
|
+
ArgumentsEnum.REQUIRED,
|
|
989
|
+
[],
|
|
990
|
+
chat_with_agent_options
|
|
991
|
+
),
|
|
992
|
+
Command(
|
|
993
|
+
"generate_image",
|
|
994
|
+
["generate-image", "gen-img"],
|
|
995
|
+
"Generate an image using the specified model and parameters",
|
|
996
|
+
get_generate_image,
|
|
997
|
+
ArgumentsEnum.REQUIRED,
|
|
998
|
+
[],
|
|
999
|
+
generate_image_options
|
|
1000
|
+
),
|
|
1001
|
+
Command(
|
|
1002
|
+
"edit_image",
|
|
1003
|
+
["edit-image", "edit-img"],
|
|
1004
|
+
"Edit an existing image using the specified model and parameters",
|
|
1005
|
+
get_edit_image,
|
|
1006
|
+
ArgumentsEnum.REQUIRED,
|
|
1007
|
+
[],
|
|
1008
|
+
edit_image_options
|
|
1009
|
+
),
|
|
1010
|
+
Command(
|
|
1011
|
+
"response",
|
|
1012
|
+
["response", "resp"],
|
|
1013
|
+
"Get a response using the Responses API with support for images and PDFs",
|
|
1014
|
+
get_response,
|
|
1015
|
+
ArgumentsEnum.REQUIRED,
|
|
1016
|
+
[],
|
|
1017
|
+
response_options
|
|
1018
|
+
),
|
|
362
1019
|
|
|
363
1020
|
]
|