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.
Files changed (132) hide show
  1. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/.gitignore +5 -1
  2. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/PKG-INFO +1 -1
  3. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/__init__.py +2 -1
  4. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/types.py +2 -0
  5. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/python_tool.py +19 -7
  6. ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/agent_builder/voice_configurations/__init__.py +1 -0
  7. ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/agent_builder/voice_configurations/types.py +98 -0
  8. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/agents/agents_command.py +20 -0
  9. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/agents/agents_controller.py +170 -1
  10. {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
  11. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/server/server_command.py +17 -4
  12. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/tools/tools_controller.py +5 -0
  13. ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/cli/commands/voice_configurations/voice_configurations_command.py +58 -0
  14. ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/cli/commands/voice_configurations/voice_configurations_controller.py +173 -0
  15. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/main.py +2 -0
  16. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/agents/agent_client.py +64 -1
  17. ibm_watsonx_orchestrate-1.10.0b0/src/ibm_watsonx_orchestrate/client/voice_configurations/voice_configurations_client.py +75 -0
  18. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/compose-lite.yml +15 -1
  19. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/default.env +9 -6
  20. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/flow.py +24 -19
  21. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/LICENSE +0 -0
  22. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/pyproject.toml +0 -0
  23. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/__init__.py +0 -0
  24. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/__init__.py +0 -0
  25. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/agent.py +0 -0
  26. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/assistant_agent.py +0 -0
  27. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/agents/external_agent.py +0 -0
  28. {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
  29. {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
  30. {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
  31. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/connections/__init__.py +0 -0
  32. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/connections/connections.py +0 -0
  33. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/connections/types.py +0 -0
  34. {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
  35. {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
  36. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/knowledge_bases/types.py +0 -0
  37. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/model_policies/__init__.py +0 -0
  38. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/model_policies/types.py +0 -0
  39. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/models/__init__.py +0 -0
  40. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/models/types.py +0 -0
  41. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/toolkits/base_toolkit.py +0 -0
  42. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/toolkits/types.py +0 -0
  43. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/__init__.py +0 -0
  44. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/base_tool.py +0 -0
  45. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/flow_tool.py +0 -0
  46. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/openapi_tool.py +0 -0
  47. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/tools/types.py +0 -0
  48. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/agent_builder/utils/__init__.py +0 -0
  49. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/__init__.py +0 -0
  50. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/__init__.py +0 -0
  51. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/channels_command.py +0 -0
  52. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/channels_controller.py +0 -0
  53. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/channels/types.py +0 -0
  54. {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
  55. {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
  56. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/chat/chat_command.py +0 -0
  57. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/connections/connections_command.py +0 -0
  58. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/connections/connections_controller.py +0 -0
  59. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/copilot/copilot_command.py +0 -0
  60. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/copilot/copilot_controller.py +0 -0
  61. {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
  62. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/environment/environment_command.py +0 -0
  63. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/environment/environment_controller.py +0 -0
  64. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/environment/types.py +0 -0
  65. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/evaluations/evaluations_command.py +0 -0
  66. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/evaluations/evaluations_controller.py +0 -0
  67. {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
  68. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/login/login_command.py +0 -0
  69. {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
  70. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/models/models_command.py +0 -0
  71. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/models/models_controller.py +0 -0
  72. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/server/types.py +0 -0
  73. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/__init__.py +0 -0
  74. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/observability/__init__.py +0 -0
  75. {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
  76. {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
  77. {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
  78. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/settings/settings_command.py +0 -0
  79. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_command.py +0 -0
  80. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_controller.py +0 -0
  81. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/tools/tools_command.py +0 -0
  82. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/commands/tools/types.py +0 -0
  83. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/config.py +0 -0
  84. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/cli/init_helper.py +0 -0
  85. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/__init__.py +0 -0
  86. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/agents/assistant_agent_client.py +0 -0
  87. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/agents/external_agent_client.py +0 -0
  88. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/analytics/__init__.py +0 -0
  89. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/analytics/llm/__init__.py +0 -0
  90. {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
  91. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/base_api_client.py +0 -0
  92. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/base_service_instance.py +0 -0
  93. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/client.py +0 -0
  94. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/client_errors.py +0 -0
  95. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/connections/__init__.py +0 -0
  96. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/connections/connections_client.py +0 -0
  97. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/connections/utils.py +0 -0
  98. {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
  99. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/credentials.py +0 -0
  100. {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
  101. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/local_service_instance.py +0 -0
  102. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/model_policies/__init__.py +0 -0
  103. {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
  104. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/models/__init__.py +0 -0
  105. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/models/models_client.py +0 -0
  106. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/service_instance.py +0 -0
  107. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/toolkit/toolkit_client.py +0 -0
  108. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/tools/tempus_client.py +0 -0
  109. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/tools/tool_client.py +0 -0
  110. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/client/utils.py +0 -0
  111. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/proxy-config-single.yaml +0 -0
  112. {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
  113. {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
  114. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/start-up.sh +0 -0
  115. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/docker/tempus/common-config.yaml +0 -0
  116. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/__init__.py +0 -0
  117. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/data_map.py +0 -0
  118. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/__init__.py +0 -0
  119. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/constants.py +0 -0
  120. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/decorators.py +0 -0
  121. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/flows/events.py +0 -0
  122. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/node.py +0 -0
  123. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/types.py +0 -0
  124. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/flow_builder/utils.py +0 -0
  125. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/run/__init__.py +0 -0
  126. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/run/connections.py +0 -0
  127. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/__init__.py +0 -0
  128. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/exceptions.py +0 -0
  129. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/logging/__init__.py +0 -0
  130. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/logging/logger.py +0 -0
  131. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/logging/logging.yaml +0 -0
  132. {ibm_watsonx_orchestrate-1.9.0b2 → ibm_watsonx_orchestrate-1.10.0b0}/src/ibm_watsonx_orchestrate/utils/utils.py +0 -0
@@ -74,4 +74,8 @@ sdk/python/ibm_watsonx_orchestrate/ibm_watsonx_orchestrate/utils/__pycache__/
74
74
  .env.*
75
75
  .idea/
76
76
  .vscode/
77
- coverage/
77
+ coverage/
78
+
79
+ # Ignore local examples
80
+ examples/local/
81
+ examples/*/local/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ibm-watsonx-orchestrate
3
- Version: 1.9.0b2
3
+ Version: 1.10.0b0
4
4
  Summary: IBM watsonx.orchestrate SDK
5
5
  Author-email: IBM <support@ibm.com>
6
6
  License: MIT License
@@ -5,7 +5,8 @@
5
5
 
6
6
  pkg_name = "ibm-watsonx-orchestrate"
7
7
 
8
- __version__ = "1.9.0b2"
8
+ __version__ = "1.10.0b0"
9
+
9
10
 
10
11
 
11
12
 
@@ -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
- if v.anyOf is not None and next(filter(lambda x: x.type == 'null', v.anyOf)) and k in schema.required:
195
- v.anyOf = list(filter(lambda x: x.type != 'null', v.anyOf))
196
- if len(v.anyOf) == 1:
197
- replacements[k] = v.anyOf[0]
198
- not_required.append(k)
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,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
- if app_id:
102
- connections_client = get_connections_client()
103
- connection_id = None
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(final_env_file: Path, experimental_with_langfuse=False, experimental_with_ibm_telemetry=False, with_doc_processing=False) -> None:
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)