ibm-watsonx-orchestrate 1.10.0b0__py3-none-any.whl → 1.10.1__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.
Files changed (29) hide show
  1. ibm_watsonx_orchestrate/__init__.py +1 -2
  2. ibm_watsonx_orchestrate/agent_builder/connections/__init__.py +1 -1
  3. ibm_watsonx_orchestrate/agent_builder/connections/connections.py +6 -3
  4. ibm_watsonx_orchestrate/agent_builder/connections/types.py +68 -17
  5. ibm_watsonx_orchestrate/agent_builder/knowledge_bases/types.py +47 -3
  6. ibm_watsonx_orchestrate/agent_builder/toolkits/types.py +18 -15
  7. ibm_watsonx_orchestrate/agent_builder/tools/types.py +1 -1
  8. ibm_watsonx_orchestrate/cli/commands/connections/connections_command.py +40 -11
  9. ibm_watsonx_orchestrate/cli/commands/connections/connections_controller.py +96 -30
  10. ibm_watsonx_orchestrate/cli/commands/knowledge_bases/knowledge_bases_controller.py +32 -10
  11. ibm_watsonx_orchestrate/cli/commands/server/server_command.py +95 -17
  12. ibm_watsonx_orchestrate/cli/commands/server/types.py +14 -6
  13. ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_command.py +43 -10
  14. ibm_watsonx_orchestrate/cli/commands/toolkit/toolkit_controller.py +52 -25
  15. ibm_watsonx_orchestrate/client/connections/connections_client.py +4 -3
  16. ibm_watsonx_orchestrate/client/knowledge_bases/knowledge_base_client.py +4 -4
  17. ibm_watsonx_orchestrate/docker/compose-lite.yml +52 -13
  18. ibm_watsonx_orchestrate/docker/default.env +21 -14
  19. ibm_watsonx_orchestrate/flow_builder/data_map.py +4 -1
  20. ibm_watsonx_orchestrate/flow_builder/flows/__init__.py +2 -0
  21. ibm_watsonx_orchestrate/flow_builder/flows/flow.py +204 -17
  22. ibm_watsonx_orchestrate/flow_builder/node.py +114 -19
  23. ibm_watsonx_orchestrate/flow_builder/types.py +206 -34
  24. ibm_watsonx_orchestrate/run/connections.py +2 -2
  25. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.10.1.dist-info}/METADATA +1 -1
  26. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.10.1.dist-info}/RECORD +29 -29
  27. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.10.1.dist-info}/WHEEL +0 -0
  28. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.10.1.dist-info}/entry_points.txt +0 -0
  29. {ibm_watsonx_orchestrate-1.10.0b0.dist-info → ibm_watsonx_orchestrate-1.10.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,7 @@
1
1
  import typer
2
2
  from typing import List
3
3
  from typing_extensions import Annotated, Optional
4
- from ibm_watsonx_orchestrate.agent_builder.toolkits.types import ToolkitKind, Language
4
+ from ibm_watsonx_orchestrate.agent_builder.toolkits.types import ToolkitKind, Language, ToolkitTransportKind
5
5
  from ibm_watsonx_orchestrate.cli.commands.toolkit.toolkit_controller import ToolkitController
6
6
  import logging
7
7
  import sys
@@ -45,6 +45,14 @@ def import_toolkit(
45
45
  "The first argument will be used as the executable, the rest as its arguments."
46
46
  ),
47
47
  ] = None,
48
+ url: Annotated[
49
+ Optional[str],
50
+ typer.Option("--url", "-u", help="The URL of the remote MCP server", hidden=True),
51
+ ] = None,
52
+ transport: Annotated[
53
+ ToolkitTransportKind,
54
+ typer.Option("--transport", help="The communication protocol to use for the remote MCP server. Only \"sse\" or \"streamable_http\" supported", hidden=True),
55
+ ] = None,
48
56
  tools: Annotated[
49
57
  Optional[str],
50
58
  typer.Option("--tools", "-t", help="Comma-separated list of tools to import. Or you can use \"*\" to use all tools"),
@@ -64,18 +72,41 @@ def import_toolkit(
64
72
  else:
65
73
  tool_list = None
66
74
 
67
- if not package and not package_root and not command:
68
- logger.error("You must provide either '--package', '--package-root' or '--command'.")
69
- sys.exit(1)
75
+ if not url and not transport:
76
+ if not package and not package_root and not command:
77
+ logger.error("You must provide either '--package', '--package-root' or '--command'.")
78
+ sys.exit(1)
70
79
 
71
- if package_root and not command:
72
- logger.error("Error: '--command' flag must be provided when '--package-root' is specified.")
73
- sys.exit(1)
74
-
75
- if package_root and package:
76
- logger.error("Please choose either '--package-root' or '--package' but not both.")
80
+ if package_root and not command:
81
+ logger.error("Error: '--command' flag must be provided when '--package-root' is specified.")
82
+ sys.exit(1)
83
+
84
+ if package_root and package:
85
+ logger.error("Please choose either '--package-root' or '--package' but not both.")
86
+ sys.exit(1)
87
+
88
+ if (url and not transport) or (transport and not url):
89
+ logger.error("Both '--url' and '--transport' must be provided together for remote MCP.")
77
90
  sys.exit(1)
78
91
 
92
+ if url and transport:
93
+ forbidden_local_opts = []
94
+ if package:
95
+ forbidden_local_opts.append("--package")
96
+ if package_root:
97
+ forbidden_local_opts.append("--package-root")
98
+ if language:
99
+ forbidden_local_opts.append("--language")
100
+ if command:
101
+ forbidden_local_opts.append("--command")
102
+
103
+ if forbidden_local_opts:
104
+ logger.error(
105
+ f"When using '--url' and '--transport' for a remote MCP, you cannot specify: "
106
+ f"{', '.join(forbidden_local_opts)}"
107
+ )
108
+ sys.exit(1)
109
+
79
110
  if package and not package_root:
80
111
  if not command:
81
112
  if language == Language.NODE:
@@ -97,6 +128,8 @@ def import_toolkit(
97
128
  package_root=package_root,
98
129
  language=language,
99
130
  command=command,
131
+ url=url,
132
+ transport=transport
100
133
  )
101
134
  toolkit_controller.import_toolkit(tools=tool_list, app_id=app_id)
102
135
 
@@ -10,7 +10,7 @@ import requests
10
10
  from ibm_watsonx_orchestrate.client.toolkit.toolkit_client import ToolKitClient
11
11
  from ibm_watsonx_orchestrate.client.tools.tool_client import ToolClient
12
12
  from ibm_watsonx_orchestrate.agent_builder.toolkits.base_toolkit import BaseToolkit, ToolkitSpec
13
- from ibm_watsonx_orchestrate.agent_builder.toolkits.types import ToolkitKind, Language, ToolkitSource
13
+ from ibm_watsonx_orchestrate.agent_builder.toolkits.types import ToolkitKind, Language, ToolkitSource, ToolkitTransportKind
14
14
  from ibm_watsonx_orchestrate.client.utils import instantiate_client
15
15
  from ibm_watsonx_orchestrate.utils.utils import sanatize_app_id
16
16
  from ibm_watsonx_orchestrate.client.connections import get_connections_client
@@ -26,15 +26,16 @@ import json
26
26
 
27
27
  logger = logging.getLogger(__name__)
28
28
 
29
- def get_connection_id(app_id: str) -> str:
29
+ def get_connection_id(app_id: str, is_local_mcp: bool) -> str:
30
30
  connections_client = get_connections_client()
31
31
  existing_draft_configuration = connections_client.get_config(app_id=app_id, env='draft')
32
32
  existing_live_configuration = connections_client.get_config(app_id=app_id, env='live')
33
33
 
34
34
  for config in [existing_draft_configuration, existing_live_configuration]:
35
- if config and config.security_scheme != 'key_value_creds':
36
- logger.error("Only key_value credentials are currently supported")
37
- exit(1)
35
+ if is_local_mcp is True:
36
+ if config and config.security_scheme != 'key_value_creds':
37
+ logger.error("Only key_value credentials are currently supported for local MCP")
38
+ exit(1)
38
39
  connection_id = None
39
40
  if app_id is not None:
40
41
  connection = connections_client.get(app_id=app_id)
@@ -59,6 +60,8 @@ class ToolkitController:
59
60
  package_root: str = None,
60
61
  language: Language = None,
61
62
  command: str = None,
63
+ url: str = None,
64
+ transport: ToolkitTransportKind = None
62
65
  ):
63
66
  self.kind = kind
64
67
  self.name = name
@@ -68,6 +71,8 @@ class ToolkitController:
68
71
  self.language = language
69
72
  self.command = command
70
73
  self.client = None
74
+ self.url = url
75
+ self.transport = transport
71
76
 
72
77
  self.source: ToolkitSource = (
73
78
  ToolkitSource.FILES if package_root else ToolkitSource.PUBLIC_REGISTRY
@@ -95,15 +100,23 @@ class ToolkitController:
95
100
  logger.error(f"Existing toolkit found with name '{self.name}'. Failed to create toolkit.")
96
101
  sys.exit(1)
97
102
 
98
- try:
99
- command_parts = json.loads(self.command)
100
- if not isinstance(command_parts, list):
101
- raise ValueError("JSON command must be a list of strings")
102
- except (json.JSONDecodeError, ValueError):
103
- command_parts = self.command.split()
103
+ if not self.command:
104
+ command_parts = []
105
+ else:
106
+ try:
107
+ command_parts = json.loads(self.command)
108
+ if not isinstance(command_parts, list):
109
+ raise ValueError("JSON command must be a list of strings")
110
+ except (json.JSONDecodeError, ValueError):
111
+ command_parts = self.command.split()
112
+
113
+ if command_parts:
114
+ command = command_parts[0]
115
+ args = command_parts[1:]
116
+ else:
117
+ command = None
118
+ args = []
104
119
 
105
- command = command_parts[0]
106
- args = command_parts[1:]
107
120
 
108
121
  if self.package_root:
109
122
  is_folder = os.path.isdir(self.package_root)
@@ -150,18 +163,31 @@ class ToolkitController:
150
163
  console.print(f" • {tool}")
151
164
 
152
165
  # Create toolkit metadata
153
- payload = {
154
- "name": self.name,
155
- "description": self.description,
156
- "mcp": {
157
- "source": self.source.value,
158
- "command": command,
159
- "args": args,
160
- "tools": tools,
161
- "connections": remapped_connections,
166
+ payload = {}
167
+
168
+ if self.transport is not None and self.url is not None:
169
+ payload = {
170
+ "name": self.name,
171
+ "description": self.description,
172
+ "mcp": {
173
+ "server_url": self.url,
174
+ "transport": self.transport.value,
175
+ "tools": tools,
176
+ "connections": remapped_connections,
177
+ }
178
+ }
179
+ else:
180
+ payload = {
181
+ "name": self.name,
182
+ "description": self.description,
183
+ "mcp": {
184
+ "source": self.source.value,
185
+ "command": command,
186
+ "args": args,
187
+ "tools": tools,
188
+ "connections": remapped_connections,
189
+ }
162
190
  }
163
- }
164
-
165
191
 
166
192
  with Progress(
167
193
  SpinnerColumn(spinner_name="dots"),
@@ -215,7 +241,8 @@ class ToolkitController:
215
241
  raise typer.BadParameter(f"The provided --app-id '{app_id}' is not valid. --app-id cannot be empty or whitespace")
216
242
 
217
243
  runtime_id = sanatize_app_id(runtime_id)
218
- app_id_dict[runtime_id] = get_connection_id(local_id)
244
+ is_local_mcp = self.package is not None or self.package_root is not None
245
+ app_id_dict[runtime_id] = get_connection_id(local_id, is_local_mcp)
219
246
 
220
247
  return app_id_dict
221
248
 
@@ -19,7 +19,7 @@ class FetchConfigAuthTypes(str, Enum):
19
19
  API_KEY_AUTH = ConnectionType.API_KEY_AUTH.value
20
20
  OAUTH2_AUTH_CODE = ConnectionType.OAUTH2_AUTH_CODE.value
21
21
  OAUTH2_IMPLICIT = 'oauth2_implicit'
22
- OAUTH2_PASSWORD = 'oauth2_password'
22
+ OAUTH2_PASSWORD = ConnectionType.OAUTH2_PASSWORD.value
23
23
  OAUTH2_CLIENT_CREDS = ConnectionType.OAUTH2_CLIENT_CREDS.value
24
24
  OAUTH_ON_BEHALF_OF_FLOW = ConnectionType.OAUTH_ON_BEHALF_OF_FLOW.value
25
25
  KEY_VALUE = ConnectionType.KEY_VALUE.value
@@ -50,7 +50,7 @@ class GetConfigResponse(BaseModel):
50
50
  class GetConnectionResponse(BaseModel):
51
51
  connection_id: str = None
52
52
  app_id: str = None
53
- tenant_id: str = None
53
+ tenant_id: Optional[str] = None
54
54
 
55
55
 
56
56
 
@@ -141,7 +141,8 @@ class ConnectionsClient(BaseAPIClient):
141
141
  else:
142
142
  return self._get(f"/connections/applications/runtime_credentials?app_id={app_id}&env={env}")
143
143
  except ClientAPIException as e:
144
- if e.response.status_code == 404:
144
+ # Returns 400 when app creds exist but runtime cred don't yet exist
145
+ if e.response.status_code == 404 or e.response.status_code == 400:
145
146
  return None
146
147
  raise e
147
148
 
@@ -15,10 +15,10 @@ class KnowledgeBaseClient(BaseAPIClient):
15
15
  self.base_endpoint = "/orchestrate/knowledge-bases" if is_local_dev(self.base_url) else "/knowledge-bases"
16
16
 
17
17
  def create(self, payload: dict) -> dict:
18
- return self._post_form_data(f"{self.base_endpoint}/documents", data={ "knowledge_base" : json.dumps(payload) })
18
+ return self._post_form_data(f"{self.base_endpoint}/documents", data=payload)
19
19
 
20
20
  def create_built_in(self, payload: dict, files: list) -> dict:
21
- return self._post_form_data(f"{self.base_endpoint}/documents", data={ "knowledge_base" : json.dumps(payload) }, files=files)
21
+ return self._post_form_data(f"{self.base_endpoint}/documents", data=payload, files=files)
22
22
 
23
23
  def get(self) -> dict:
24
24
  return self._get(self.base_endpoint)
@@ -38,10 +38,10 @@ class KnowledgeBaseClient(BaseAPIClient):
38
38
  return self._get(f"{self.base_endpoint}/{knowledge_base_id}/status")
39
39
 
40
40
  def update(self, knowledge_base_id: str, payload: dict) -> dict:
41
- return self._patch_form_data(f"{self.base_endpoint}/{knowledge_base_id}/documents", data={ "knowledge_base" : json.dumps(payload) })
41
+ return self._patch_form_data(f"{self.base_endpoint}/{knowledge_base_id}/documents", data=payload)
42
42
 
43
43
  def update_with_documents(self, knowledge_base_id: str, payload: dict, files: list) -> dict:
44
- return self._patch_form_data(f"{self.base_endpoint}/{knowledge_base_id}/documents", data={ "knowledge_base" : json.dumps(payload) }, files=files)
44
+ return self._patch_form_data(f"{self.base_endpoint}/{knowledge_base_id}/documents", data=payload, files=files)
45
45
 
46
46
  def delete(self, knowledge_base_id: str,) -> dict:
47
47
  return self._delete(f"{self.base_endpoint}/{knowledge_base_id}")
@@ -32,6 +32,7 @@ services:
32
32
  - wxo-applied-migrations:/var/lib/postgresql/applied_migrations
33
33
  command: -c shared_preload_libraries=pgsodium
34
34
 
35
+
35
36
  wxo-server-connection-manager:
36
37
  image: ${CM_REGISTRY:-us.icr.io/watson-orchestrate-private}/wxo-connections:${CM_TAG:-latest}
37
38
  platform: linux/amd64
@@ -61,6 +62,7 @@ services:
61
62
  WATSONX_API_KEY: ${WATSONX_APIKEY}
62
63
  WATSONX_URL: ${WATSONX_URL}
63
64
  WATSONX_SPACE_ID: ${WATSONX_SPACE_ID}
65
+ NODE_TLS_REJECT_UNAUTHORIZED: ${AI_GATEWAY_TLS_REJECT_UNAUTHORIZED}
64
66
 
65
67
  wxo-agent-gateway:
66
68
  image: ${AGENT_GATEWAY_REGISTRY:-us.icr.io/watson-orchestrate-private}/wxo-agent-gateway:${AGENT_GATEWAY_TAG:-latest}
@@ -128,8 +130,11 @@ services:
128
130
  IBM_DPS_CACHE_SERVICE: https://wxo-doc-processing-cache:8080
129
131
  DOCPROC_BASE_URL: http://wxo-doc-processing-infra-standalone:9080
130
132
  BUILDER_ASYNC_CALLBACK_ENDPOINT: http://wxo-builder:4025
133
+ DOCPROC_ENABLED: ${DOCPROC_ENABLED:-false}
131
134
  IS_OBSERVABILITY_FEATURE_ENABLED: "true"
132
135
  ALLOW_INSECURE_TLS: "true"
136
+ ENABLE_EDIT_PROMPTS: "true"
137
+ LANGFLOW_ENABLED: ${LANGFLOW_ENABLED:-false}
133
138
  command: 'npm start'
134
139
  ports:
135
140
  - "4025:4025"
@@ -261,6 +266,7 @@ services:
261
266
  - default
262
267
  - jaeger-network
263
268
  environment:
269
+ DEFAULT_AGENT_ENABLED: "true"
264
270
  RUNTIME_MANAGER_API_KEY: ${RUNTIME_MANAGER_API_KEY:-testapikey}
265
271
  PIP_NO_CACHE_DIR:
266
272
  JWT_SECRET: ${JWT_SECRET}
@@ -322,6 +328,7 @@ services:
322
328
  ENABLE_WEBHOOKS: false
323
329
  DISABLE_JSON_LOG_CELERY: true
324
330
  WXO_DEPLOYMENT_PLATFORM: saas
331
+ CPD_VERIFY: ${CPD_VERIFY}
325
332
  CONNECTION_MANAGER_URL: http://wxo-server-connection-manager:3001
326
333
  CHANNEL_SESSION_REDIS_URL: redis://wxo-server-redis:6379/5
327
334
  WXO_MILVUS_URI: http://wxo-milvus-standalone:19530
@@ -344,6 +351,7 @@ services:
344
351
  AGENTOPS_API_KEY: ${AGENTOPS_API_KEY}
345
352
  ES_HOST: http://elasticsearch:9200
346
353
  ORIGIN_HEADER: "internal"
354
+ LANGFLOW_ENABLED: ${LANGFLOW_ENABLED:-false}
347
355
 
348
356
  wxo-server-worker:
349
357
  image: ${WORKER_REGISTRY:-us.icr.io/watson-orchestrate-private}/wxo-server-conversation_controller:${WORKER_TAG:-latest}
@@ -440,7 +448,9 @@ services:
440
448
  IBM_TELEMETRY_TRACER_ENDPOINT: http://jaeger:4318/v1/traces
441
449
  USE_IBM_TELEMETRY: ${USE_IBM_TELEMETRY:-false}
442
450
  WXO_DEPLOYMENT_PLATFORM: saas
451
+ CPD_VERIFY: ${CPD_VERIFY}
443
452
  CALLBACK_HOST_URL: ${CALLBACK_HOST_URL:-http://wxo-server:4321}
453
+ LANGFLOW_ENABLED: ${LANGFLOW_ENABLED:-false}
444
454
 
445
455
  tools-runtime-manager:
446
456
  image: ${TRM_REGISTRY:-us.icr.io/watson-orchestrate-private}/tools-runtime-manager:${TRM_TAG:-latest}
@@ -482,7 +492,8 @@ services:
482
492
  STORAGE_S3_REGION: us-east-1
483
493
  AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-minioadmin}
484
494
  AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-watsonxorchestrate}
485
- TEMPUS_HOST_NAME: http://wxo-tempus-runtime:9044
495
+ TEMPUS_HOST_NAME: http://wxo-tempus-runtime:9044
496
+ LANGFLOW_ENABLED: ${LANGFLOW_ENABLED:-false}
486
497
  extra_hosts:
487
498
  - "host.docker.internal:host-gateway"
488
499
 
@@ -514,6 +525,7 @@ services:
514
525
  STORAGE_S3_REGION: us-east-1
515
526
  AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-minioadmin}
516
527
  AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-watsonxorchestrate}
528
+ LANGFLOW_ENABLED: ${LANGFLOW_ENABLED:-false}
517
529
 
518
530
  ########################
519
531
  # IBM AGENT-OPS
@@ -644,6 +656,7 @@ services:
644
656
  - WATSONX_URL=${WATSONX_URL}
645
657
  - PROXY_SERVER_URL=http://jaeger-proxy:9201
646
658
  - WXO_DEPLOYMENT_PLATFORM=saas
659
+ - CPD_VERIFY=${CPD_VERIFY}
647
660
  - TENANT_API_KEY=${AGENTOPS_API_KEY}
648
661
  - TENANT_CONFIG_URL=http://wxo-server:4321
649
662
  - TENANT_DEFAULT_USERNAME=${ES_USERNAME}
@@ -792,6 +805,7 @@ services:
792
805
  LOG_LEVEL: info
793
806
  DOCPROC_ENABLED: ${DOCPROC_ENABLED:-false}
794
807
  DOCPROC_BASE_URL: http://wxo-doc-processing-infra-standalone:9080
808
+ DOCPROC_OUTPUT_FILE_SERVER_URL: ${DOCPROC_OUTPUT_FILE_SERVER_URL:-http://wxo-server:4321}
795
809
  WO_API_KEY: ${WO_API_KEY}
796
810
  WO_INSTANCE: ${WO_INSTANCE}
797
811
  AUTHORIZATION_URL: ${AUTHORIZATION_URL}
@@ -872,6 +886,19 @@ services:
872
886
  PREFLIGHT_MAX_SIZE: 10Mb
873
887
  PREFLIGHT_MAX_PAGES: 600
874
888
  RUNTIME_LIBRARY: "watson_doc_understanding"
889
+ WXAI_API_KEY: ${WXAI_API_KEY:-}
890
+ WXAI_IMAGE_DESCRIPTION_MODEL_ID: ${WXAI_IMAGE_DESCRIPTION_MODEL_ID:-mistralai/pixtral-12b}
891
+ WXAI_IMAGE_DESCRIPTION_PROJECT_ID: ${WXAI_IMAGE_DESCRIPTION_PROJECT_ID:-}
892
+ WXAI_KVP_MODEL_ID: ${WXAI_KVP_MODEL_ID:-}
893
+ WXAI_KVP_PROJECT_ID: ${WXAI_KVP_PROJECT_ID:-}
894
+ WXAI_SEMANTIC_KVP_PROJECT_ID: ${WXAI_SEMANTIC_KVP_PROJECT_ID:-}
895
+ WXAI_SEMANTIC_KVP_MODEL_ID: ${WXAI_SEMANTIC_KVP_MODEL_ID:-mistralai/pixtral-12b}
896
+ WXAI_SEMANTIC_KVP_SPACE_ID: ${WXAI_SEMANTIC_KVP_SPACE_ID:-}
897
+ WXAI_URL: ${WXAI_URL:-}
898
+ WXAI_USERNAME: ${WXAI_USERNAME:-}
899
+ WXAI_INSTANCE_ID: ${WXAI_INSTANCE_ID:-}
900
+ WXAI_VERSION: ${WXAI_VERSION:-5.1}
901
+
875
902
  profiles:
876
903
  - docproc
877
904
  ports:
@@ -1000,9 +1027,7 @@ services:
1000
1027
  SERVICE_NAME: wxo-doc-processing-llm-service
1001
1028
  LOG_LEVEL: info
1002
1029
  WATSONX_API_ENDPOINT: ${WATSONX_URL:-https://us-south.ml.cloud.ibm.com}
1003
- WATSONX_API_KEY: ${WATSONX_APIKEY}
1004
- WATSONX_PROJECT_ID: ${WATSONX_PROJECT_ID}
1005
- WATSONX_SPACE_ID: ${WATSONX_SPACE_ID}
1030
+ WXO_SERVER_BASE_URL : http://wxo-server:4321
1006
1031
  IBM_DPS_CACHE_SERVICE: 'wxo-doc-processing-cache:8080'
1007
1032
  profiles:
1008
1033
  - docproc
@@ -1096,15 +1121,28 @@ services:
1096
1121
  "
1097
1122
 
1098
1123
  wxo-server-voice:
1099
- image: ${VOICE_CONTROLLER_REGISTRY:-us.icr.io/watson-orchestrate-private}/wxo-server-voice:${VOICE_CONTROLLER_TAG:-latest}
1100
- profiles: [voice]
1101
- restart: unless-stopped
1102
- ports:
1103
- - 9876:8765
1104
- environment:
1105
- WXO_BASE_DOMAIN_URL: "http://wxo-server:4321"
1106
- AI_GATEWAY_URL: "http://ai-gateway:8787"
1107
- WXO_ORIGIN_HEADER: "internal"
1124
+ image: ${VOICE_CONTROLLER_REGISTRY:-us.icr.io/watson-orchestrate-private}/wxo-server-voice:${VOICE_CONTROLLER_TAG:-latest}
1125
+ profiles: [voice]
1126
+ restart: unless-stopped
1127
+ ports:
1128
+ - 9876:8765
1129
+ environment:
1130
+ WXO_BASE_DOMAIN_URL: "http://wxo-server:4321"
1131
+ AI_GATEWAY_URL: "http://ai-gateway:8787"
1132
+ WXO_ORIGIN_HEADER: "internal"
1133
+
1134
+ langflow:
1135
+ image: ${OPENSOURCE_REGISTRY_PROXY:-docker.io}/langflowai/${LANGFLOW_IMAGE:-langflow}:${LANGFLOW_TAG:-latest}
1136
+ profiles: [langflow]
1137
+ ports:
1138
+ - 7861:7861
1139
+ environment:
1140
+ LANGFLOW_PORT: 7861
1141
+ LANGFLOW_DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@wxo-server-db:5432/langflow
1142
+ LANGFLOW_CONFIG_DIR: app/langflow
1143
+ volumes:
1144
+ - langflow-data:/app/langflow
1145
+
1108
1146
 
1109
1147
  volumes:
1110
1148
  tools:
@@ -1138,6 +1176,7 @@ volumes:
1138
1176
  wdu-models:
1139
1177
  driver: local
1140
1178
  es_data:
1179
+ langflow-data:
1141
1180
 
1142
1181
  networks:
1143
1182
  default:
@@ -57,13 +57,14 @@ EVENT_BROKER_TTL="3600"
57
57
  REGISTRY_URL=
58
58
 
59
59
 
60
- SERVER_TAG=13-08-2025-b01e43e00a7c900f92057d63520be08f965b6b24
60
+
61
+ SERVER_TAG=29-08-2025-59ef405
61
62
  SERVER_REGISTRY=
62
63
 
63
- WORKER_TAG=13-08-2025-b01e43e00a7c900f92057d63520be08f965b6b24
64
+ WORKER_TAG=29-08-2025-cf32b2d
64
65
  WORKER_REGISTRY=
65
66
 
66
- AI_GATEWAY_TAG=01-08-2025-v1
67
+ AI_GATEWAY_TAG=20-08-2025-9ed6d40
67
68
  AI_GATEWAY_REGISTRY=
68
69
 
69
70
  AGENT_GATEWAY_TAG=29-07-2025
@@ -77,21 +78,21 @@ AMDDBTAG=29-07-2025-9f3661b
77
78
  ARM64DBTAG=29-07-2025-9f3661b
78
79
 
79
80
  UI_REGISTRY=
80
- UITAG=31-07-2025
81
+ UITAG=29-08-2025
81
82
 
82
83
  CM_REGISTRY=
83
84
  CM_TAG=24-07-2025
84
85
 
85
- TRM_TAG=12-08-2025-5f816b3d5981afdd65fa55401d70e5aa5f734fc4
86
+ TRM_TAG=19-08-2025-fe105eb0b950ff304f712a1a5b9fa3cba92d09da
86
87
  TRM_REGISTRY=
87
88
 
88
- TR_TAG=14-08-2025-7b2f9c9
89
+ TR_TAG=25-08-2025-58ae475
89
90
  TR_REGISTRY=
90
91
 
91
- BUILDER_TAG=12-08-2025-8f00997
92
+ BUILDER_TAG=27-08-2025-7432aca
92
93
  BUILDER_REGISTRY=
93
94
 
94
- FLOW_RUNTIME_TAG=11-08-2025
95
+ FLOW_RUNTIME_TAG=26-08-2025-3b7f19e
95
96
  FLOW_RUMTIME_REGISTRY=
96
97
 
97
98
 
@@ -104,24 +105,29 @@ JAEGER_PROXY_REGISTRY=
104
105
  SOCKET_HANDLER_TAG=29-05-2025
105
106
  SOCKET_HANDLER_REGISTRY=
106
107
 
107
- CPE_TAG=06-08-2025-b0a20ad
108
+ CPE_TAG=18-08-2025-ae1308e
108
109
  CPE_REGISTRY=
109
110
 
110
111
  VOICE_CONTROLLER_TAG=12-08-2025
111
112
  VOICE_CONTROLLER_REGISTRY=
112
113
 
114
+ LANGFLOW_TAG=
115
+ LANGFLOW_IMAGE=
116
+
113
117
  # IBM Document Processing
114
- WDU_TAG=2.5.0
118
+ WDU_TAG=2.6.1
115
119
  WDU_REGISTRY=
116
120
 
117
- DOCPROC_DPS_TAG=20250721-164412-250-503756a
118
- DOCPROC_LLMSERVICE_TAG=20250725-100249-111-51d3e51
119
- DOCPROC_CACHE_TAG=20250723-100852-70-9edc1ab
120
- DOCPROC_DPI_TAG=20250731-155328-257-06879e86
121
+ DOCPROC_DPS_TAG=20250815-010747-277-173db2a
122
+ DOCPROC_LLMSERVICE_TAG=20250820-153924-128-55cf4d5
123
+ DOCPROC_CACHE_TAG=20250814-master-82-cf33f87
124
+ DOCPROC_DPI_TAG=20250815-004755-273-e65f26b4
121
125
  DOCPROC_REGISTRY=
122
126
 
123
127
  # END -- IMAGE REGISTRIES AND TAGS
124
128
 
129
+ CPD_VERIFY=true
130
+ AI_GATEWAY_TLS_REJECT_UNAUTHORIZED=1
125
131
  TAVILY_API_KEY=dummy_tavily_api_key
126
132
  PREFERRED_MODELS=meta-llama/llama-3-2-90b-vision-instruct,meta-llama/llama-3-405b-instruct
127
133
  INCOMPATIBLE_MODELS=flan,embedding,cross-encoder,tinytimemixers
@@ -152,6 +158,7 @@ TOOLS_RUNTIME_MANAGER_BASE_URL="http://tools-runtime-manager:8080"
152
158
  CONNECTION_SERVICE_BASE_URL="http://wxo-server-connection-manager:3001"
153
159
  AI_GATEWAY_BASE_URL="http://ai-gateway:8787/v1"
154
160
  AI_GATEWAY_ENABLED=True
161
+ DEFAULT_AGENT_ENABLED=True
155
162
  AGENT_GATEWAY_URI="http://wxo-agent-gateway:8989"
156
163
  DEFAULT_TENANT_ID=10000000-0000-0000-0000-000000000000
157
164
  ES_USERNAME=elastic
@@ -12,7 +12,10 @@ class DataMap(BaseModel):
12
12
  def to_json(self) -> dict[str, Any]:
13
13
  model_spec = {}
14
14
  if self.maps and len(self.maps) > 0:
15
- model_spec["maps"] = [assignment.model_dump() for assignment in self.maps]
15
+ model_spec["maps"] = []
16
+ for assignment in self.maps:
17
+ model_spec["maps"].append(assignment.model_dump())
18
+ return model_spec
16
19
 
17
20
  def add(self, line: Assignment) -> Self:
18
21
  self.maps.append(line)
@@ -19,6 +19,8 @@ __all__ = [
19
19
  "DocProcInput",
20
20
 
21
21
  "DocProcNode",
22
+ "DocExtNode",
23
+ "DocClassifierNode"
22
24
  "UserNode",
23
25
  "AgentNode",
24
26
  "StartNode",