ibm-watsonx-orchestrate 1.9.0b2__tar.gz → 1.10.0b0__tar.gz
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.
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/.gitignore +5 -1
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/PKG-INFO +1 -1
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/__init__.py +2 -1
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/types.py +2 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/python_tool.py +19 -7
- ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/agent_builder/voice_configurations/__init__.py +1 -0
- ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/agent_builder/voice_configurations/types.py +98 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/agents/agents_command.py +20 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/agents/agents_controller.py +170 -1
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/knowledge_bases/knowledge_bases_controller.py +19 -12
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/server/server_command.py +17 -4
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/tools/tools_controller.py +5 -0
- ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/cli/commands/voice_configurations/voice_configurations_command.py +58 -0
- ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/cli/commands/voice_configurations/voice_configurations_controller.py +173 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/main.py +2 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/agents/agent_client.py +64 -1
- ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/client/voice_configurations/voice_configurations_client.py +75 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/compose-lite.yml +15 -1
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/default.env +9 -6
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/flow.py +24 -19
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/LICENSE +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/pyproject.toml +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/agent.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/assistant_agent.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/external_agent.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/webchat_customizations/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/webchat_customizations/prompts.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/webchat_customizations/welcome_content.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/connections/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/connections/connections.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/connections/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/knowledge_bases/knowledge_base.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/knowledge_bases/knowledge_base_requests.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/knowledge_bases/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/model_policies/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/model_policies/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/models/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/models/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/toolkits/base_toolkit.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/toolkits/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/base_tool.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/flow_tool.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/openapi_tool.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/utils/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/channels_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/channels_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/webchat/channels_webchat_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/webchat/channels_webchat_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/chat/chat_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/connections/connections_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/connections/connections_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/copilot/copilot_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/copilot/copilot_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/copilot/copilot_server_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/environment/environment_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/environment/environment_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/environment/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/evaluations/evaluations_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/evaluations/evaluations_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/knowledge_bases/knowledge_bases_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/login/login_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/models/model_provider_mapper.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/models/models_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/models/models_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/server/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/observability/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/observability/langfuse/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/observability/langfuse/langfuse_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/observability/observability_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/settings_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_controller.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/tools/tools_command.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/tools/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/config.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/init_helper.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/agents/assistant_agent_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/agents/external_agent_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/analytics/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/analytics/llm/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/analytics/llm/analytics_llm_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/base_api_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/base_service_instance.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/client_errors.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/connections/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/connections/connections_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/connections/utils.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/copilot/cpe/copilot_cpe_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/credentials.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/knowledge_bases/knowledge_base_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/local_service_instance.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/model_policies/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/model_policies/model_policies_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/models/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/models/models_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/service_instance.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/toolkit/toolkit_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/tools/tempus_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/tools/tool_client.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/utils.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/proxy-config-single.yaml +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/sdk/ibm_watsonx_orchestrate-0.6.0-py3-none-any.whl +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/sdk/ibm_watsonx_orchestrate-0.6.0.tar.gz +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/start-up.sh +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/tempus/common-config.yaml +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/data_map.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/constants.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/decorators.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/events.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/node.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/types.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/utils.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/run/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/run/connections.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/exceptions.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/logging/__init__.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/logging/logger.py +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/logging/logging.yaml +0 -0
- {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/utils.py +0 -0
@@ -77,6 +77,8 @@ class BaseAgentSpec(BaseModel):
|
|
77
77
|
description: Annotated[str, Field(json_schema_extra={"min_length_str":1})]
|
78
78
|
context_access_enabled: bool = True
|
79
79
|
context_variables: Optional[List[str]] = []
|
80
|
+
voice_configuration_id: Optional[str] = None
|
81
|
+
voice_configuration: Optional[str] = None
|
80
82
|
|
81
83
|
def dump_spec(self, file: str) -> None:
|
82
84
|
dumped = self.model_dump(mode='json', exclude_unset=True, exclude_none=True)
|
@@ -187,15 +187,27 @@ def _fix_optional(schema):
|
|
187
187
|
replacements = {}
|
188
188
|
if schema.required is None:
|
189
189
|
schema.required = []
|
190
|
-
|
191
190
|
for k, v in schema.properties.items():
|
191
|
+
# Simple null type & required -> not required
|
192
192
|
if v.type == 'null' and k in schema.required:
|
193
193
|
not_required.append(k)
|
194
|
-
|
195
|
-
|
196
|
-
if
|
197
|
-
|
198
|
-
|
194
|
+
# Optional with null & required
|
195
|
+
if v.anyOf is not None and [x for x in v.anyOf if x.type == 'null']:
|
196
|
+
if k in schema.required:
|
197
|
+
# required with default -> not required
|
198
|
+
# required without default -> required & remove null from union
|
199
|
+
if v.default:
|
200
|
+
not_required.append(k)
|
201
|
+
else:
|
202
|
+
v.anyOf = list(filter(lambda x: x.type != 'null', v.anyOf))
|
203
|
+
if len(v.anyOf) == 1:
|
204
|
+
replacements[k] = v.anyOf[0]
|
205
|
+
else:
|
206
|
+
# not required with default -> no change
|
207
|
+
# not required without default -> means default input is 'None'
|
208
|
+
v.default = v.default if v.default else 'null'
|
209
|
+
|
210
|
+
|
199
211
|
schema.required = list(filter(lambda x: x not in not_required, schema.required if schema.required is not None else []))
|
200
212
|
for k, v in replacements.items():
|
201
213
|
combined = {
|
@@ -204,7 +216,7 @@ def _fix_optional(schema):
|
|
204
216
|
}
|
205
217
|
schema.properties[k] = JsonSchemaObject(**combined)
|
206
218
|
schema.properties[k].anyOf = None
|
207
|
-
|
219
|
+
|
208
220
|
for k in schema.properties.keys():
|
209
221
|
if schema.properties[k].type == 'object':
|
210
222
|
schema.properties[k] = _fix_optional(schema.properties[k])
|
@@ -0,0 +1 @@
|
|
1
|
+
from .types import VoiceConfiguration
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Annotated, Optional, List, Dict
|
3
|
+
from pydantic import BaseModel, Field, model_validator
|
4
|
+
|
5
|
+
def _validate_exactly_one_of_fields(object: BaseModel, object_name: str, fields: list[str]):
|
6
|
+
present_fields = [getattr(object,field) for field in fields if getattr(object,field) is not None]
|
7
|
+
|
8
|
+
if len(present_fields) != 1:
|
9
|
+
raise ValueError(f"{object_name} requires exactly one of {','.join(fields)}")
|
10
|
+
|
11
|
+
|
12
|
+
def _validate_language_uniqueness(config: BaseModel):
|
13
|
+
if hasattr(config,'language') and hasattr(config,'additional_languages'):
|
14
|
+
if config.language and config.additional_languages and config.language in config.additional_languages:
|
15
|
+
raise ValueError(f"Language '{config.language}' cannot be in both the default language and additional_languages")
|
16
|
+
|
17
|
+
|
18
|
+
class WatsonSTTConfig(BaseModel):
|
19
|
+
api_url: Annotated[str, Field(min_length=1,max_length=2048)]
|
20
|
+
api_key: Optional[Annotated[str, Field(min_length=1,max_length=2048)]] = None
|
21
|
+
bearer_token: Optional[Annotated[str, Field(min_length=1,max_length=2048)]] = None
|
22
|
+
model: Annotated[str, Field(min_length=1,max_length=256)]
|
23
|
+
|
24
|
+
class EmotechSTTConfig(BaseModel):
|
25
|
+
api_key: Annotated[str,Field(min_length=1,max_length=2048)]
|
26
|
+
api_url: Annotated[str,Field(min_length=1,max_length=2048)]
|
27
|
+
|
28
|
+
|
29
|
+
class SpeechToTextConfig(BaseModel):
|
30
|
+
provider: Annotated[str, Field(min_length=1,max_length=128)]
|
31
|
+
watson_stt_config: Optional[WatsonSTTConfig] = None
|
32
|
+
emotech_stt_config: Optional[EmotechSTTConfig] = None
|
33
|
+
|
34
|
+
@model_validator(mode='after')
|
35
|
+
def validate_providers(self):
|
36
|
+
_validate_exactly_one_of_fields(self,'SpeechToTextConfig',['watson_stt_config','emotech_stt_config'])
|
37
|
+
return self
|
38
|
+
|
39
|
+
class WatsonTTSConfig(BaseModel):
|
40
|
+
api_url: Annotated[str, Field(min_length=1,max_length=2048)]
|
41
|
+
api_key: Optional[Annotated[str, Field(min_length=1,max_length=2048)]] = None
|
42
|
+
bearer_token: Optional[Annotated[str, Field(min_length=1,max_length=2048)]] = None
|
43
|
+
voice: Annotated[str, Field(min_length=1,max_length=128)]
|
44
|
+
rate_percentage: Optional[int] = None
|
45
|
+
pitch_percentage: Optional[int] = None
|
46
|
+
language: Optional[str] = None
|
47
|
+
|
48
|
+
class EmotechTTSConfig(BaseModel):
|
49
|
+
api_url: Annotated[str, Field(min_length=1,max_length=2048)]
|
50
|
+
api_key: Annotated[str, Field(min_length=1,max_length=2048)]
|
51
|
+
voice: Optional[Annotated[str, Field(min_length=1,max_length=128)]]
|
52
|
+
|
53
|
+
class TextToSpeechConfig(BaseModel):
|
54
|
+
provider: Annotated[str, Field(min_length=1,max_length=128)]
|
55
|
+
watson_tts_config: Optional[WatsonTTSConfig] = None
|
56
|
+
emotech_tts_config: Optional[EmotechTTSConfig] = None
|
57
|
+
|
58
|
+
@model_validator(mode='after')
|
59
|
+
def validate_providers(self):
|
60
|
+
_validate_exactly_one_of_fields(self,'TextToSpeechConfig',['watson_tts_config','emotech_tts_config'])
|
61
|
+
return self
|
62
|
+
|
63
|
+
class AdditionalProperties(BaseModel):
|
64
|
+
speech_to_text: Optional[SpeechToTextConfig] = None
|
65
|
+
text_to_speech: Optional[TextToSpeechConfig] = None
|
66
|
+
|
67
|
+
class DTMFInput(BaseModel):
|
68
|
+
inter_digit_timeout_ms: Optional[int] = None
|
69
|
+
termination_key: Optional[str] = None
|
70
|
+
maximum_count: Optional[int] = None
|
71
|
+
ignore_speech: Optional[bool] = None
|
72
|
+
|
73
|
+
class AttachedAgent(BaseModel):
|
74
|
+
id: str
|
75
|
+
name: Optional[str] = None
|
76
|
+
display_name: Optional[str] = None
|
77
|
+
|
78
|
+
class VoiceConfiguration(BaseModel):
|
79
|
+
name: Annotated[str, Field(min_length=1,max_length=128)]
|
80
|
+
speech_to_text: SpeechToTextConfig
|
81
|
+
text_to_speech: TextToSpeechConfig
|
82
|
+
language: Optional[Annotated[str,Field(min_length=2,max_length=16)]] = None
|
83
|
+
additional_languages: Optional[dict[str,AdditionalProperties]] = None
|
84
|
+
dtmf_input: Optional[DTMFInput] = None
|
85
|
+
voice_configuration_id: Optional[str] = None
|
86
|
+
tenant_id: Optional[Annotated[str, Field(min_length=1,max_length=128)]] = None
|
87
|
+
attached_agents: Optional[list[AttachedAgent]] = None
|
88
|
+
|
89
|
+
@model_validator(mode='after')
|
90
|
+
def validate_language(self):
|
91
|
+
_validate_language_uniqueness(self)
|
92
|
+
return self
|
93
|
+
|
94
|
+
def dumps_spec(self) -> str:
|
95
|
+
dumped = self.model_dump(mode='json', exclude_none=True)
|
96
|
+
return json.dumps(dumped, indent=2)
|
97
|
+
|
98
|
+
|
@@ -253,3 +253,23 @@ def export_agent(
|
|
253
253
|
):
|
254
254
|
agents_controller = AgentsController()
|
255
255
|
agents_controller.export_agent(name=name, kind=kind, output_path=output_file, agent_only_flag=agent_only_flag)
|
256
|
+
|
257
|
+
@agents_app.command(name="deploy", help="Deploy Agent")
|
258
|
+
def deploy_agent(
|
259
|
+
name: Annotated[
|
260
|
+
str,
|
261
|
+
typer.Option("--name", "-n", help="Name of the agent you wish to deploy"),
|
262
|
+
]
|
263
|
+
):
|
264
|
+
agents_controller = AgentsController()
|
265
|
+
agents_controller.deploy_agent(name=name)
|
266
|
+
|
267
|
+
@agents_app.command(name="undeploy", help="Undeploy Agent")
|
268
|
+
def undeploy_agent(
|
269
|
+
name: Annotated[
|
270
|
+
str,
|
271
|
+
typer.Option("--name", "-n", help="Name of the agent you wish to undeploy"),
|
272
|
+
]
|
273
|
+
):
|
274
|
+
agents_controller = AgentsController()
|
275
|
+
agents_controller.undeploy_agent(name=name)
|
@@ -29,13 +29,17 @@ from ibm_watsonx_orchestrate.client.agents.agent_client import AgentClient, Agen
|
|
29
29
|
from ibm_watsonx_orchestrate.client.agents.external_agent_client import ExternalAgentClient
|
30
30
|
from ibm_watsonx_orchestrate.client.agents.assistant_agent_client import AssistantAgentClient
|
31
31
|
from ibm_watsonx_orchestrate.client.tools.tool_client import ToolClient
|
32
|
+
from ibm_watsonx_orchestrate.client.voice_configurations.voice_configurations_client import VoiceConfigurationsClient
|
32
33
|
from ibm_watsonx_orchestrate.utils.exceptions import BadRequest
|
33
34
|
from ibm_watsonx_orchestrate.client.connections import get_connections_client
|
34
35
|
from ibm_watsonx_orchestrate.client.knowledge_bases.knowledge_base_client import KnowledgeBaseClient
|
35
36
|
|
36
|
-
from ibm_watsonx_orchestrate.client.utils import instantiate_client
|
37
|
+
from ibm_watsonx_orchestrate.client.utils import instantiate_client, is_local_dev
|
37
38
|
from ibm_watsonx_orchestrate.utils.utils import check_file_in_zip
|
38
39
|
|
40
|
+
from rich.console import Console
|
41
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn
|
42
|
+
|
39
43
|
logger = logging.getLogger(__name__)
|
40
44
|
|
41
45
|
# Helper generic type for any agent
|
@@ -197,6 +201,7 @@ def get_app_id_from_conn_id(conn_id: str) -> str:
|
|
197
201
|
exit(1)
|
198
202
|
return app_id
|
199
203
|
|
204
|
+
|
200
205
|
def get_agent_details(name: str, client: AgentClient | ExternalAgentClient | AssistantAgentClient) -> dict:
|
201
206
|
agent_specs = client.get_draft_by_name(name)
|
202
207
|
if len(agent_specs) > 1:
|
@@ -219,6 +224,7 @@ class AgentsController:
|
|
219
224
|
self.assistant_client = None
|
220
225
|
self.tool_client = None
|
221
226
|
self.knowledge_base_client = None
|
227
|
+
self.voice_configuration_client = None
|
222
228
|
|
223
229
|
def get_native_client(self):
|
224
230
|
if not self.native_client:
|
@@ -245,6 +251,11 @@ class AgentsController:
|
|
245
251
|
self.knowledge_base_client = instantiate_client(KnowledgeBaseClient)
|
246
252
|
return self.knowledge_base_client
|
247
253
|
|
254
|
+
def get_voice_configuration_client(self):
|
255
|
+
if not self.voice_configuration_client:
|
256
|
+
self.voice_configuration_client = instantiate_client(VoiceConfigurationsClient)
|
257
|
+
return self.voice_configuration_client
|
258
|
+
|
248
259
|
@staticmethod
|
249
260
|
def import_agent(file: str, app_id: str) -> List[Agent | ExternalAgent | AssistantAgent]:
|
250
261
|
agents = parse_file(file)
|
@@ -520,6 +531,38 @@ class AgentsController:
|
|
520
531
|
guideline.tool = name
|
521
532
|
|
522
533
|
return ref_agent
|
534
|
+
|
535
|
+
def get_voice_config_name_from_id(self, voice_config_id: str) -> str | None:
|
536
|
+
client = self.get_voice_configuration_client()
|
537
|
+
config = client.get_by_id(voice_config_id)
|
538
|
+
return config.name if config else None
|
539
|
+
|
540
|
+
def get_voice_config_id_from_name(self, voice_config_name: str) -> str | None:
|
541
|
+
client = self.get_voice_configuration_client()
|
542
|
+
configs = client.get_by_name(voice_config_name)
|
543
|
+
|
544
|
+
if len(configs) == 0:
|
545
|
+
logger.error(f"No voice_configs with the name '{voice_config_name}' found. Failed to get config")
|
546
|
+
sys.exit(1)
|
547
|
+
|
548
|
+
if len(configs) > 1:
|
549
|
+
logger.error(f"Multiple voice_configs with the name '{voice_config_name}' found. Failed to get config")
|
550
|
+
sys.exit(1)
|
551
|
+
|
552
|
+
return configs[0].voice_configuration_id
|
553
|
+
|
554
|
+
|
555
|
+
def reference_voice_config(self,agent: Agent):
|
556
|
+
deref_agent = deepcopy(agent)
|
557
|
+
deref_agent.voice_configuration = self.get_voice_config_name_from_id(agent.voice_configuration_id)
|
558
|
+
del deref_agent.voice_configuration_id
|
559
|
+
return deref_agent
|
560
|
+
|
561
|
+
def dereference_voice_config(self,agent: Agent):
|
562
|
+
ref_agent = deepcopy(agent)
|
563
|
+
ref_agent.voice_configuration_id = self.get_voice_config_id_from_name(agent.voice_configuration)
|
564
|
+
del ref_agent.voice_configuration
|
565
|
+
return ref_agent
|
523
566
|
|
524
567
|
@staticmethod
|
525
568
|
def dereference_app_id(agent: ExternalAgent | AssistantAgent) -> ExternalAgent | AssistantAgent:
|
@@ -540,7 +583,18 @@ class AgentsController:
|
|
540
583
|
agent.config.connection_id = None
|
541
584
|
|
542
585
|
return agent
|
586
|
+
|
587
|
+
def dereference_common_agent_dependencies(self, agent: AnyAgentT) -> AnyAgentT:
|
588
|
+
if agent.voice_configuration:
|
589
|
+
agent = self.dereference_voice_config(agent)
|
590
|
+
|
591
|
+
return agent
|
592
|
+
|
593
|
+
def reference_common_agent_dependencies(self, agent: AnyAgentT) -> AnyAgentT:
|
594
|
+
if agent.voice_configuration_id:
|
595
|
+
agent = self.reference_voice_config(agent)
|
543
596
|
|
597
|
+
return agent
|
544
598
|
|
545
599
|
def dereference_native_agent_dependencies(self, agent: Agent) -> Agent:
|
546
600
|
if agent.collaborators and len(agent.collaborators):
|
@@ -584,6 +638,8 @@ class AgentsController:
|
|
584
638
|
|
585
639
|
# Convert all names used in an agent to the corresponding ids
|
586
640
|
def dereference_agent_dependencies(self, agent: AnyAgentT) -> AnyAgentT:
|
641
|
+
|
642
|
+
agent = self.dereference_common_agent_dependencies(agent)
|
587
643
|
if isinstance(agent, Agent):
|
588
644
|
return self.dereference_native_agent_dependencies(agent)
|
589
645
|
if isinstance(agent, ExternalAgent) or isinstance(agent, AssistantAgent):
|
@@ -591,6 +647,8 @@ class AgentsController:
|
|
591
647
|
|
592
648
|
# Convert all ids used in an agent to the corresponding names
|
593
649
|
def reference_agent_dependencies(self, agent: AnyAgentT) -> AnyAgentT:
|
650
|
+
|
651
|
+
agent = self.reference_common_agent_dependencies(agent)
|
594
652
|
if isinstance(agent, Agent):
|
595
653
|
return self.reference_native_agent_dependencies(agent)
|
596
654
|
if isinstance(agent, ExternalAgent) or isinstance(agent, AssistantAgent):
|
@@ -1111,3 +1169,114 @@ class AgentsController:
|
|
1111
1169
|
logger.info(f"Successfully wrote agents and tools to '{output_path}'")
|
1112
1170
|
zip_file_out.close()
|
1113
1171
|
|
1172
|
+
|
1173
|
+
def deploy_agent(self, name: str):
|
1174
|
+
if is_local_dev():
|
1175
|
+
logger.error("Agents cannot be deployed in Developer Edition")
|
1176
|
+
sys.exit(1)
|
1177
|
+
native_client = self.get_native_client()
|
1178
|
+
external_client = self.get_external_client()
|
1179
|
+
assistant_client = self.get_assistant_client()
|
1180
|
+
|
1181
|
+
existing_native_agents = native_client.get_draft_by_name(name)
|
1182
|
+
existing_external_agents = external_client.get_draft_by_name(name)
|
1183
|
+
existing_assistant_agents = assistant_client.get_draft_by_name(name)
|
1184
|
+
|
1185
|
+
if len(existing_native_agents) == 0 and (len(existing_external_agents) >= 1 or len(existing_assistant_agents) >= 1):
|
1186
|
+
logger.error(f"No native agent found with name '{name}'. Only Native Agents can be deployed to a Live Environment")
|
1187
|
+
sys.exit(1)
|
1188
|
+
if len(existing_native_agents) > 1:
|
1189
|
+
logger.error(f"Multiple native agents with the name '{name}' found. Failed to get agent")
|
1190
|
+
sys.exit(1)
|
1191
|
+
if len(existing_native_agents) == 0:
|
1192
|
+
logger.error(f"No native agents with the name '{name}' found. Failed to get agent")
|
1193
|
+
sys.exit(1)
|
1194
|
+
|
1195
|
+
|
1196
|
+
agent_details = existing_native_agents[0]
|
1197
|
+
agent_id = agent_details.get("id")
|
1198
|
+
|
1199
|
+
environments = native_client.get_environments_for_agent(agent_id)
|
1200
|
+
|
1201
|
+
live_environment = [env for env in environments if env.get("name") == "live"]
|
1202
|
+
if live_environment is None:
|
1203
|
+
logger.error("No live environment found for this tenant")
|
1204
|
+
sys.exit(1)
|
1205
|
+
|
1206
|
+
live_env_id = live_environment[0].get("id")
|
1207
|
+
|
1208
|
+
console = Console()
|
1209
|
+
with Progress(
|
1210
|
+
SpinnerColumn(spinner_name="dots"),
|
1211
|
+
TextColumn("[progress.description]{task.description}"),
|
1212
|
+
transient=True,
|
1213
|
+
console=console,
|
1214
|
+
) as progress:
|
1215
|
+
progress.add_task(description="Deploying agent to Live envrionment", total=None)
|
1216
|
+
|
1217
|
+
status = native_client.deploy(agent_id, live_env_id)
|
1218
|
+
|
1219
|
+
if status:
|
1220
|
+
logger.info(f"Successfully deployed agent {name}")
|
1221
|
+
else:
|
1222
|
+
logger.error(f"Error deploying agent {name}")
|
1223
|
+
|
1224
|
+
def undeploy_agent(self, name: str):
|
1225
|
+
if is_local_dev():
|
1226
|
+
logger.error("Agents cannot be undeployed in Developer Edition")
|
1227
|
+
sys.exit(1)
|
1228
|
+
|
1229
|
+
native_client = self.get_native_client()
|
1230
|
+
external_client = self.get_external_client()
|
1231
|
+
assistant_client = self.get_assistant_client()
|
1232
|
+
|
1233
|
+
existing_native_agents = native_client.get_draft_by_name(name)
|
1234
|
+
existing_external_agents = external_client.get_draft_by_name(name)
|
1235
|
+
existing_assistant_agents = assistant_client.get_draft_by_name(name)
|
1236
|
+
|
1237
|
+
if len(existing_native_agents) == 0 and (len(existing_external_agents) >= 1 or len(existing_assistant_agents) >= 1):
|
1238
|
+
logger.error(f"No native agent found with name '{name}'. Only Native Agents can be undeployed from a Live Environment")
|
1239
|
+
sys.exit(1)
|
1240
|
+
if len(existing_native_agents) > 1:
|
1241
|
+
logger.error(f"Multiple native agents with the name '{name}' found. Failed to get agent")
|
1242
|
+
sys.exit(1)
|
1243
|
+
if len(existing_native_agents) == 0:
|
1244
|
+
logger.error(f"No native agents with the name '{name}' found. Failed to get agent")
|
1245
|
+
sys.exit(1)
|
1246
|
+
|
1247
|
+
agent_details = existing_native_agents[0]
|
1248
|
+
agent_id = agent_details.get("id")
|
1249
|
+
|
1250
|
+
environments = native_client.get_environments_for_agent(agent_id)
|
1251
|
+
live_environment = [env for env in environments if env.get("name") == "live"]
|
1252
|
+
if live_environment is None:
|
1253
|
+
logger.error("No live environment found for this tenant")
|
1254
|
+
sys.exit(1)
|
1255
|
+
version_id = live_environment[0].get("current_version")
|
1256
|
+
|
1257
|
+
if version_id is None:
|
1258
|
+
agent_name = agent_details.get("name")
|
1259
|
+
logger.error(f"Agent {agent_name} does not exist in a Live environment")
|
1260
|
+
sys.exit(1)
|
1261
|
+
|
1262
|
+
draft_environment = [env for env in environments if env.get("name") == "draft"]
|
1263
|
+
if draft_environment is None:
|
1264
|
+
logger.error("No draft environment found for this tenant")
|
1265
|
+
sys.exit(1)
|
1266
|
+
draft_env_id = draft_environment[0].get("id")
|
1267
|
+
|
1268
|
+
console = Console()
|
1269
|
+
with Progress(
|
1270
|
+
SpinnerColumn(spinner_name="dots"),
|
1271
|
+
TextColumn("[progress.description]{task.description}"),
|
1272
|
+
transient=True,
|
1273
|
+
console=console,
|
1274
|
+
) as progress:
|
1275
|
+
progress.add_task(description="Undeploying agent to Draft envrionment", total=None)
|
1276
|
+
|
1277
|
+
status = native_client.undeploy(agent_id, version_id, draft_env_id)
|
1278
|
+
if status:
|
1279
|
+
logger.info(f"Successfully undeployed agent {name}")
|
1280
|
+
else:
|
1281
|
+
logger.error(f"Error undeploying agent {name}")
|
1282
|
+
|
@@ -72,6 +72,21 @@ class KnowledgeBaseController:
|
|
72
72
|
|
73
73
|
knowledge_bases = parse_file(file=file)
|
74
74
|
|
75
|
+
if app_id:
|
76
|
+
connections_client = get_connections_client()
|
77
|
+
connection_id = None
|
78
|
+
|
79
|
+
connections = connections_client.get_draft_by_app_id(app_id=app_id)
|
80
|
+
if not connections:
|
81
|
+
logger.error(f"No connection exists with the app-id '{app_id}'")
|
82
|
+
exit(1)
|
83
|
+
|
84
|
+
connection_id = connections.connection_id
|
85
|
+
|
86
|
+
for kb in knowledge_bases:
|
87
|
+
if kb.conversational_search_tool and kb.conversational_search_tool.index_config and len(kb.conversational_search_tool.index_config) > 0:
|
88
|
+
kb.conversational_search_tool.index_config[0].connection_id = connection_id
|
89
|
+
|
75
90
|
existing_knowledge_bases = client.get_by_names([kb.name for kb in knowledge_bases])
|
76
91
|
|
77
92
|
for kb in knowledge_bases:
|
@@ -97,18 +112,10 @@ class KnowledgeBaseController:
|
|
97
112
|
if len(kb.conversational_search_tool.index_config) != 1:
|
98
113
|
raise ValueError(f"Must provide exactly one conversational_search_tool.index_config. Provided {len(kb.conversational_search_tool.index_config)}.")
|
99
114
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
if app_id is not None:
|
105
|
-
connections = connections_client.get_draft_by_app_id(app_id=app_id)
|
106
|
-
if not connections:
|
107
|
-
logger.error(f"No connection exists with the app-id '{app_id}'")
|
108
|
-
exit(1)
|
109
|
-
|
110
|
-
connection_id = connections.connection_id
|
111
|
-
kb.conversational_search_tool.index_config[0].connection_id = connection_id
|
115
|
+
if (kb.conversational_search_tool.index_config[0].milvus or \
|
116
|
+
kb.conversational_search_tool.index_config[0].elastic_search) and \
|
117
|
+
not kb.conversational_search_tool.index_config[0].connection_id:
|
118
|
+
raise ValueError(f"Must provide credentials (via --app-id) when using milvus or elastic_search.")
|
112
119
|
|
113
120
|
kb.prioritize_built_in_index = False
|
114
121
|
client.create(payload=kb.model_dump(exclude_none=True))
|
@@ -370,9 +370,13 @@ def get_persisted_user_env() -> dict | None:
|
|
370
370
|
user_env = cfg.get(USER_ENV_CACHE_HEADER) if cfg.get(USER_ENV_CACHE_HEADER) else None
|
371
371
|
return user_env
|
372
372
|
|
373
|
-
def run_compose_lite(
|
374
|
-
|
375
|
-
|
373
|
+
def run_compose_lite(
|
374
|
+
final_env_file: Path,
|
375
|
+
experimental_with_langfuse=False,
|
376
|
+
experimental_with_ibm_telemetry=False,
|
377
|
+
with_doc_processing=False,
|
378
|
+
with_voice=False
|
379
|
+
) -> None:
|
376
380
|
compose_path = get_compose_file()
|
377
381
|
|
378
382
|
compose_command = ensure_docker_compose_installed()
|
@@ -408,6 +412,8 @@ def run_compose_lite(final_env_file: Path, experimental_with_langfuse=False, exp
|
|
408
412
|
profiles.append("ibm-telemetry")
|
409
413
|
if with_doc_processing:
|
410
414
|
profiles.append("docproc")
|
415
|
+
if with_voice:
|
416
|
+
profiles.append("voice")
|
411
417
|
|
412
418
|
command = compose_command[:]
|
413
419
|
for profile in profiles:
|
@@ -855,6 +861,11 @@ def server_start(
|
|
855
861
|
'--compose-file', '-f',
|
856
862
|
help='Provide the path to a custom docker-compose file to use instead of the default compose file'
|
857
863
|
),
|
864
|
+
with_voice: bool = typer.Option(
|
865
|
+
False,
|
866
|
+
'--with-voice', '-v',
|
867
|
+
help='Enable voice controller to interact with the chat via voice channels'
|
868
|
+
),
|
858
869
|
):
|
859
870
|
confirm_accepts_license_agreement(accept_terms_and_conditions)
|
860
871
|
|
@@ -896,6 +907,7 @@ def server_start(
|
|
896
907
|
if experimental_with_ibm_telemetry:
|
897
908
|
merged_env_dict['USE_IBM_TELEMETRY'] = 'true'
|
898
909
|
|
910
|
+
|
899
911
|
try:
|
900
912
|
dev_edition_source = get_dev_edition_source(merged_env_dict)
|
901
913
|
docker_login_by_dev_edition_source(merged_env_dict, dev_edition_source)
|
@@ -908,7 +920,8 @@ def server_start(
|
|
908
920
|
run_compose_lite(final_env_file=final_env_file,
|
909
921
|
experimental_with_langfuse=experimental_with_langfuse,
|
910
922
|
experimental_with_ibm_telemetry=experimental_with_ibm_telemetry,
|
911
|
-
with_doc_processing=with_doc_processing
|
923
|
+
with_doc_processing=with_doc_processing,
|
924
|
+
with_voice=with_voice)
|
912
925
|
|
913
926
|
run_db_migration()
|
914
927
|
|
@@ -464,6 +464,11 @@ The [bold]flow tool[/bold] is being imported from [green]`{file}`[/green].
|
|
464
464
|
continue
|
465
465
|
|
466
466
|
model = obj().to_json()
|
467
|
+
# Ensure metadata exists and is correct
|
468
|
+
if "metadata" not in model or not isinstance(model["metadata"], dict):
|
469
|
+
model["metadata"] = {}
|
470
|
+
if "source_kind" not in model["metadata"]:
|
471
|
+
model["metadata"]["source_kind"] = "adk/python"
|
467
472
|
break
|
468
473
|
|
469
474
|
elif file_path.suffix.lower() == ".json":
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import sys
|
2
|
+
from typing import Annotated
|
3
|
+
import typer
|
4
|
+
import logging
|
5
|
+
|
6
|
+
from ibm_watsonx_orchestrate.cli.commands.voice_configurations.voice_configurations_controller import VoiceConfigurationsController
|
7
|
+
|
8
|
+
logger = logging.getLogger(__name__)
|
9
|
+
|
10
|
+
voice_configurations_app = typer.Typer(no_args_is_help=True)
|
11
|
+
|
12
|
+
@voice_configurations_app.command(name="import", help="Import a voice configuration into the active environment from a file")
|
13
|
+
def import_voice_config(
|
14
|
+
file: Annotated[
|
15
|
+
str,
|
16
|
+
typer.Option(
|
17
|
+
"--file",
|
18
|
+
"-f",
|
19
|
+
help="YAML file with voice configuraton definition"
|
20
|
+
)
|
21
|
+
],
|
22
|
+
):
|
23
|
+
voice_config_controller = VoiceConfigurationsController()
|
24
|
+
imported_config = voice_config_controller.import_voice_config(file)
|
25
|
+
voice_config_controller.publish_or_update_voice_config(imported_config)
|
26
|
+
|
27
|
+
@voice_configurations_app.command(name="remove", help="Remove a voice configuration from the active environment")
|
28
|
+
def remove_voice_config(
|
29
|
+
voice_config_name: Annotated[
|
30
|
+
str,
|
31
|
+
typer.Option(
|
32
|
+
"--name",
|
33
|
+
"-n",
|
34
|
+
help="name of the voice configuration to remove"
|
35
|
+
)
|
36
|
+
] = None,
|
37
|
+
):
|
38
|
+
voice_config_controller = VoiceConfigurationsController()
|
39
|
+
if voice_config_name:
|
40
|
+
voice_config_controller.remove_voice_config_by_name(voice_config_name)
|
41
|
+
else:
|
42
|
+
raise TypeError("You must specify the name of a voice configuration")
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
@voice_configurations_app.command(name="list", help="List all voice configurations in the active environment")
|
47
|
+
def list_voice_configs(
|
48
|
+
verbose: Annotated[
|
49
|
+
bool,
|
50
|
+
typer.Option(
|
51
|
+
"--verbose",
|
52
|
+
"-v",
|
53
|
+
help="List full details of all voice configurations in json format"
|
54
|
+
)
|
55
|
+
] = False,
|
56
|
+
):
|
57
|
+
voice_config_controller = VoiceConfigurationsController()
|
58
|
+
voice_config_controller.list_voice_configs(verbose)
|