Skip to content

Commit c550188

Browse files
committed
AP-25000: Introduce two separate aspects of 'view data' for python nodes
* backend view data: received from/provided to the python side; to be able to properly restore the Agent Chat Widget data service state and output data on re-execution * frontend view data: received from/provided to the frontend to be able to properly restore the chat on initialization AP-25000 (Agent Chat View to output conversation - base version)
1 parent b216bd1 commit c550188

File tree

10 files changed

+326
-86
lines changed

10 files changed

+326
-86
lines changed

org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/CloseablePythonNodeProxy.java

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
import org.knime.python3.arrow.PythonArrowDataUtils;
100100
import org.knime.python3.arrow.PythonArrowTableConverter;
101101
import org.knime.python3.nodes.CloseablePythonNodeProxyFactory.CloseableGatewayWithAttachments;
102+
import org.knime.python3.nodes.DelegatingNodeModel.ViewData.BackendViewData;
102103
import org.knime.python3.nodes.callback.AuthCallbackUtils;
103104
import org.knime.python3.nodes.extension.ExtensionNode;
104105
import org.knime.python3.nodes.ports.PythonPortObjects.PurePythonTablePortObject;
@@ -117,6 +118,7 @@
117118
import org.knime.python3.nodes.proxy.PythonNodeModelProxy.ExpiryDate;
118119
import org.knime.python3.nodes.proxy.PythonNodeModelProxy.FileStoreBasedFile;
119120
import org.knime.python3.nodes.proxy.PythonNodeProxy;
121+
import org.knime.python3.nodes.proxy.PythonNodeViewProxy.PythonDataServiceProxy.PythonViewData;
120122
import org.knime.python3.nodes.proxy.model.NodeConfigurationProxy;
121123
import org.knime.python3.nodes.proxy.model.NodeExecutionProxy;
122124
import org.knime.python3.nodes.settings.JsonNodeSettings;
@@ -368,7 +370,7 @@ private void initTableManager() {
368370
public ExecutionResult execute(final PortObject[] inData, final PortType[] outputPortTypes,
369371
final ExecutionContext exec, final FlowVariablesProxy flowVariablesProxy,
370372
final CredentialsProviderProxy credentialsProviderProxy, final WorkflowPropertiesProxy workflowPropertiesProxy,
371-
final WarningConsumer warningConsumer) throws Exception {
373+
final WarningConsumer warningConsumer, final BackendViewData viewData) throws Exception {
372374
initTableManager();
373375
Map<String, FileStore> fileStoresByKey = new HashMap<>();
374376
final var executionResult = new PythonExecutionResult();
@@ -551,8 +553,8 @@ public PythonToolResult execute_tool(final PurePythonTablePortObject toolTable,
551553
}
552554

553555
@Override
554-
public String get_internal_view_data() {
555-
return ((DelegatingNodeModel)getNode().getNodeModel()).getInternalViewData();
556+
public PythonViewData get_view_data() {
557+
return toPythonViewData(viewData, fileStoresByKey, exec);
556558
}
557559

558560
};
@@ -924,7 +926,7 @@ private void throwIfFailure() throws InvalidSettingsException {
924926

925927
@Override
926928
public DataServiceProxy getDataServiceProxy(final JsonNodeSettings settings, final PortObject[] portObjects,
927-
final String internalViewData, final PortMapProvider portMapProvider,
929+
final BackendViewData viewData, final PortMapProvider portMapProvider,
928930
final CredentialsProviderProxy credentialsProvider) {
929931

930932
loadValidatedSettings(settings);
@@ -938,9 +940,11 @@ public DataServiceProxy getDataServiceProxy(final JsonNodeSettings settings, fin
938940
var fileStoreSwitcher = FileStoreSwitcher.create(nnc);
939941
var exec = fileStoreSwitcher.createExecutionContext();
940942
var toolExecutor = new ToolExecutor(exec, nnc, m_tableManager);
941-
var context = new DefaultViewContext(toolExecutor, portMapProvider, credentialsProvider, internalViewData);
942943

943944
var fileStoresByKey = new HashMap<String, FileStore>();
945+
var context = new DefaultViewContext(toolExecutor, portMapProvider, credentialsProvider,
946+
toPythonViewData(viewData, fileStoresByKey, exec));
947+
944948
final var knimeToPythonConversionContext =
945949
new PortObjectConversionContext(fileStoresByKey, m_tableManager, exec);
946950
var pythonPortObjects =
@@ -954,6 +958,17 @@ public String handleJsonRpcRequest(final String request) {
954958
return pythonDataService.handleJsonRpcRequest(request);
955959
}
956960

961+
@Override
962+
public BackendViewData getViewData() {
963+
var viewData = pythonDataService.getViewData();
964+
var conversionContext = new PortObjectConversionContext(fileStoresByKey, m_tableManager, exec);
965+
var ports = viewData.ports();
966+
var portObjects = viewData.ports().stream() //
967+
.map(po -> PythonPortTypeRegistry.convertPortObjectFromPython(po, conversionContext))//
968+
.toArray(PortObject[]::new);
969+
return new BackendViewData(viewData.data(), portObjects);
970+
}
971+
957972
@Override
958973
public void close() throws Exception {
959974
toolExecutor.close();
@@ -991,4 +1006,31 @@ public void close() {
9911006
}
9921007
}
9931008

1009+
private PythonViewData toPythonViewData(final BackendViewData viewData,
1010+
final Map<String, FileStore> fileStoresByKey, final ExecutionContext exec) {
1011+
if (viewData == null) {
1012+
return null;
1013+
}
1014+
var data = viewData.data();
1015+
var ports = viewData.ports();
1016+
var conversionContext = new PortObjectConversionContext(fileStoresByKey, m_tableManager, exec);
1017+
var pyPorts = Stream.of(ports)//
1018+
.map(po -> PythonPortTypeRegistry.convertPortObjectToPython(po, conversionContext))//
1019+
.toList();
1020+
1021+
return new PythonViewData() {
1022+
1023+
@Override
1024+
public String data() {
1025+
return data;
1026+
}
1027+
1028+
@Override
1029+
public List<PythonPortObject> ports() {
1030+
return pyPorts;
1031+
}
1032+
1033+
};
1034+
}
1035+
9941036
}

org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/DefaultViewContext.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@
5252
import java.util.Map;
5353

5454
import org.knime.core.node.workflow.ICredentials;
55+
import org.knime.python3.nodes.DelegatingNodeModel.ViewData.BackendViewData;
5556
import org.knime.python3.nodes.ports.PythonPortObjects.PurePythonTablePortObject;
5657
import org.knime.python3.nodes.ports.PythonPortObjects.PythonPortObject;
5758
import org.knime.python3.nodes.proxy.PythonNodeViewProxy;
59+
import org.knime.python3.nodes.proxy.PythonNodeViewProxy.PythonDataServiceProxy.PythonViewData;
5860
import org.knime.python3.nodes.proxy.model.NodeModelProxy.CredentialsProviderProxy;
5961
import org.knime.python3.nodes.proxy.model.NodeModelProxy.PortMapProvider;
6062

@@ -73,14 +75,14 @@ final class DefaultViewContext implements PythonNodeViewProxy.PythonViewContext
7375

7476
private final CredentialsProviderProxy m_credentialsProvider;
7577

76-
private final String m_internalViewData;
78+
private final PythonViewData m_viewData;
7779

7880
DefaultViewContext(final ToolExecutor toolExecutor, final PortMapProvider portMapProvider,
79-
final CredentialsProviderProxy credentialsProvider, final String internalViewData) {
81+
final CredentialsProviderProxy credentialsProvider, final PythonViewData viewData) {
8082
m_toolExecutor = toolExecutor;
8183
m_portMapProvider = portMapProvider;
8284
m_credentialsProvider = credentialsProvider;
83-
m_internalViewData = internalViewData;
85+
m_viewData = viewData;
8486
}
8587

8688
@Override
@@ -112,7 +114,7 @@ public PythonToolResult execute_tool(final PurePythonTablePortObject toolTable,
112114
}
113115

114116
@Override
115-
public String get_internal_view_data() {
116-
return m_internalViewData;
117+
public PythonViewData get_view_data() {
118+
return m_viewData;
117119
}
118120
}

0 commit comments

Comments
 (0)