Format observer outputs (#1560)
This commit is contained in:
@@ -252,4 +252,6 @@ export type ObserverCruise = {
|
|||||||
url: string | null;
|
url: string | null;
|
||||||
created_at: string;
|
created_at: string;
|
||||||
modified_at: string;
|
modified_at: string;
|
||||||
|
output: Record<string, unknown> | null;
|
||||||
|
summary: string | null;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,6 +13,29 @@ import { Status } from "@/api/types";
|
|||||||
import { AutoResizingTextarea } from "@/components/AutoResizingTextarea/AutoResizingTextarea";
|
import { AutoResizingTextarea } from "@/components/AutoResizingTextarea/AutoResizingTextarea";
|
||||||
import { isTaskVariantBlock } from "../types/workflowTypes";
|
import { isTaskVariantBlock } from "../types/workflowTypes";
|
||||||
|
|
||||||
|
function getAggregatedExtractedInformation(outputs: Record<string, unknown>) {
|
||||||
|
const extractedInformation: Record<string, unknown> = {};
|
||||||
|
Object.entries(outputs).forEach(([id, output]) => {
|
||||||
|
if (
|
||||||
|
typeof output === "object" &&
|
||||||
|
output !== null &&
|
||||||
|
"extracted_information" in output
|
||||||
|
) {
|
||||||
|
extractedInformation[id] = output.extracted_information;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return extractedInformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatExtractedInformation(outputs: Record<string, unknown>) {
|
||||||
|
const aggregateExtractedInformation =
|
||||||
|
getAggregatedExtractedInformation(outputs);
|
||||||
|
return {
|
||||||
|
extracted_information: aggregateExtractedInformation,
|
||||||
|
...outputs,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function WorkflowRunOutput() {
|
function WorkflowRunOutput() {
|
||||||
const { data: workflowRunTimeline, isLoading: workflowRunTimelineIsLoading } =
|
const { data: workflowRunTimeline, isLoading: workflowRunTimelineIsLoading } =
|
||||||
useWorkflowRunTimelineQuery();
|
useWorkflowRunTimelineQuery();
|
||||||
@@ -50,7 +73,11 @@ function WorkflowRunOutput() {
|
|||||||
activeBlock.status === Status.Completed;
|
activeBlock.status === Status.Completed;
|
||||||
|
|
||||||
const outputs = workflowRun?.outputs;
|
const outputs = workflowRun?.outputs;
|
||||||
|
const formattedOutputs = outputs
|
||||||
|
? formatExtractedInformation(outputs)
|
||||||
|
: outputs;
|
||||||
const fileUrls = workflowRun?.downloaded_file_urls ?? [];
|
const fileUrls = workflowRun?.downloaded_file_urls ?? [];
|
||||||
|
const observerOutput = workflowRun?.observer_cruise?.output;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-5">
|
<div className="space-y-5">
|
||||||
@@ -107,15 +134,27 @@ function WorkflowRunOutput() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
|
{observerOutput ? (
|
||||||
|
<div className="rounded bg-slate-elevation2 p-6">
|
||||||
|
<div className="space-y-4">
|
||||||
|
<h1 className="text-lg font-bold">Observer Output</h1>
|
||||||
|
<CodeEditor
|
||||||
|
language="json"
|
||||||
|
value={JSON.stringify(observerOutput, null, 2)}
|
||||||
|
readOnly
|
||||||
|
minHeight="96px"
|
||||||
|
maxHeight="200px"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
<div className="rounded bg-slate-elevation2 p-6">
|
<div className="rounded bg-slate-elevation2 p-6">
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<h1 className="text-lg font-bold">Workflow Run Outputs</h1>
|
<h1 className="text-lg font-bold">Workflow Run Outputs</h1>
|
||||||
<CodeEditor
|
<CodeEditor
|
||||||
language="json"
|
language="json"
|
||||||
value={
|
value={
|
||||||
outputs
|
formattedOutputs ? JSON.stringify(formattedOutputs, null, 2) : ""
|
||||||
? JSON.stringify(outputs, null, 2)
|
|
||||||
: "Waiting for outputs.."
|
|
||||||
}
|
}
|
||||||
readOnly
|
readOnly
|
||||||
minHeight="96px"
|
minHeight="96px"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import {
|
|||||||
WorkflowRunOverviewActiveElement,
|
WorkflowRunOverviewActiveElement,
|
||||||
} from "./WorkflowRunOverview";
|
} from "./WorkflowRunOverview";
|
||||||
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
||||||
import { statusIsNotFinalized } from "@/routes/tasks/types";
|
import { statusIsFinalized, statusIsNotFinalized } from "@/routes/tasks/types";
|
||||||
import { cn } from "@/util/utils";
|
import { cn } from "@/util/utils";
|
||||||
import { ThoughtCard } from "./ThoughtCard";
|
import { ThoughtCard } from "./ThoughtCard";
|
||||||
import { WorkflowRunTimelineBlockItem } from "./WorkflowRunTimelineBlockItem";
|
import { WorkflowRunTimelineBlockItem } from "./WorkflowRunTimelineBlockItem";
|
||||||
@@ -54,7 +54,9 @@ function WorkflowRunTimeline({
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// bit redundant but better read
|
||||||
const workflowRunIsNotFinalized = statusIsNotFinalized(workflowRun);
|
const workflowRunIsNotFinalized = statusIsNotFinalized(workflowRun);
|
||||||
|
const workflowRunIsFinalized = statusIsFinalized(workflowRun);
|
||||||
|
|
||||||
const numberOfActions = workflowRunTimeline.reduce((total, current) => {
|
const numberOfActions = workflowRunTimeline.reduce((total, current) => {
|
||||||
if (isTaskVariantBlockItem(current)) {
|
if (isTaskVariantBlockItem(current)) {
|
||||||
@@ -96,7 +98,7 @@ function WorkflowRunTimeline({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{workflowRunTimeline.length === 0 && (
|
{workflowRunIsFinalized && workflowRunTimeline.length === 0 && (
|
||||||
<div>Workflow timeline is empty</div>
|
<div>Workflow timeline is empty</div>
|
||||||
)}
|
)}
|
||||||
{workflowRunTimeline?.map((timelineItem) => {
|
{workflowRunTimeline?.map((timelineItem) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user