diff --git a/packages/client/hmi-client/src/components/drilldown/tera-notebook-output.vue b/packages/client/hmi-client/src/components/drilldown/tera-notebook-output.vue
new file mode 100644
index 0000000000..8e31d36166
--- /dev/null
+++ b/packages/client/hmi-client/src/components/drilldown/tera-notebook-output.vue
@@ -0,0 +1,55 @@
+
+
+
+ {{ name }}
+
+
+ {{ props.traceback }}
+
+
+
+ {{ name }}
+
+
+
+
+
+
+
+
diff --git a/packages/client/hmi-client/src/components/widgets/tera-resizable-panel.vue b/packages/client/hmi-client/src/components/widgets/tera-resizable-panel.vue
index 5979b72f61..ab606c39a2 100644
--- a/packages/client/hmi-client/src/components/widgets/tera-resizable-panel.vue
+++ b/packages/client/hmi-client/src/components/widgets/tera-resizable-panel.vue
@@ -3,7 +3,8 @@
-
+
+
@@ -19,7 +20,11 @@ const containerHeight = ref(320);
const draggedY = ref(0);
const resize = (event: MouseEvent) => {
- containerHeight.value += event.clientY - draggedY.value;
+ if (props?.resizeFromTop) {
+ containerHeight.value += -event.clientY + draggedY.value;
+ } else {
+ containerHeight.value += event.clientY - draggedY.value;
+ }
draggedY.value = event.clientY;
};
@@ -35,6 +40,7 @@ const startResize = (event: MouseEvent) => {
};
const props = defineProps<{
startHeight?: number;
+ resizeFromTop?: boolean;
}>();
onMounted(() => {
@@ -71,7 +77,7 @@ main {
height: 100%;
}
-.resize-handle {
+.resize-handle-bottom {
position: absolute;
bottom: 0;
left: 0;
@@ -84,6 +90,19 @@ main {
mix-blend-mode: darken;
}
+.resize-handle-top {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 6px;
+ cursor: ns-resize;
+ background: var(--surface-border-light);
+ z-index: 1;
+ border-radius: 0 0 var(--border-radius-big) var(--border-radius-big);
+ mix-blend-mode: darken;
+}
+
.resize-handle:hover {
background: var(--primary-color-light);
}
diff --git a/packages/client/hmi-client/src/components/workflow/ops/model-edit/tera-model-edit-drilldown.vue b/packages/client/hmi-client/src/components/workflow/ops/model-edit/tera-model-edit-drilldown.vue
index 248a75cbd7..c6136572c4 100644
--- a/packages/client/hmi-client/src/components/workflow/ops/model-edit/tera-model-edit-drilldown.vue
+++ b/packages/client/hmi-client/src/components/workflow/ops/model-edit/tera-model-edit-drilldown.vue
@@ -41,6 +41,7 @@
class="ace-editor"
:options="{ showPrintMargin: false }"
/>
+
@@ -88,6 +89,7 @@ import TeraDrilldownPreview from '@/components/drilldown/tera-drilldown-preview.
import TeraDrilldownSection from '@/components/drilldown/tera-drilldown-section.vue';
import TeraModel from '@/components/model/tera-model.vue';
import TeraNotebookError from '@/components/drilldown/tera-notebook-error.vue';
+import TeraNotebookOutput from '@/components/drilldown/tera-notebook-output.vue';
import TeraNotebookJupyterInput from '@/components/llm/tera-notebook-jupyter-input.vue';
import TeraProgressSpinner from '@/components/widgets/tera-progress-spinner.vue';
import { nodeOutputLabel } from '@/components/workflow/util';
@@ -147,13 +149,15 @@ const llmThoughts = ref([]);
const isDraft = ref(false);
-const executeResponse = ref({
+const executeErrorResponse = ref({
status: OperatorStatus.DEFAULT,
name: '',
value: '',
traceback: ''
});
+const executeResponseTraceback = ref('');
+
const updateLlmQuery = (query: string) => {
llmThoughts.value = [];
llmQuery.value = query;
@@ -205,7 +209,9 @@ const runCode = () => {
executedCode = data.content.code;
})
.register('stream', (data) => {
- console.log('stream', data);
+ if (data?.content?.name === 'stderr' || data?.content?.name === 'stdout') {
+ executeResponseTraceback.value = `${executeResponseTraceback.value} ${data.content.text}`;
+ }
})
.register('model_preview', (data) => {
if (!data.content) return;
@@ -219,7 +225,7 @@ const runCode = () => {
let status = OperatorStatus.DEFAULT;
if (data.msg.content.status === 'ok') status = OperatorStatus.SUCCESS;
if (data.msg.content.status === 'error') status = OperatorStatus.ERROR;
- executeResponse.value = {
+ executeErrorResponse.value = {
status,
name: data.msg.content.ename ? data.msg.content.ename : '',
value: data.msg.content.evalue ? data.msg.content.evalue : '',