Skip to content

Commit 94e0ea9

Browse files
committed
Add useMemo and useCallback hooks to improve performance and render agent step output
1 parent 506b697 commit 94e0ea9

File tree

1 file changed

+58
-4
lines changed

1 file changed

+58
-4
lines changed

llmstack/client/src/components/store/SessionRenderer.jsx

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,42 @@
1-
import { useEffect } from "react";
1+
import { useEffect, useMemo } from "react";
22
import { Button } from "@mui/material";
33
import Grid from "@mui/material/Unstable_Grid2";
44
import { useSetRecoilState } from "recoil";
5+
import { Liquid } from "liquidjs";
56
import {
67
AgentMessage,
78
AppMessage,
9+
AgentStepMessage,
810
UserMessage,
911
} from "../apps/renderer/Messages";
1012
import { appRunDataState } from "../../data/atoms";
1113
import StoreAppHeader from "./StoreAppHeader";
1214
import LayoutRenderer from "../apps/renderer/LayoutRenderer";
15+
import { useCallback } from "react";
1316

1417
const SessionRenderer = ({ sessionData }) => {
1518
const storeApp = sessionData?.store_app;
1619
const appTypeSlug = storeApp?.data?.type_slug || "agent";
1720
const setAppRunData = useSetRecoilState(appRunDataState);
21+
const templateEngine = useMemo(() => new Liquid(), []);
22+
23+
const renderAgentStepOutput = useCallback(
24+
(output, processorId) => {
25+
const template = storeApp?.data?.processors?.find(
26+
(processor) => processor.id === processorId,
27+
)?.output_template;
28+
29+
if (!template) {
30+
return JSON.stringify(output);
31+
}
32+
33+
return templateEngine.renderSync(
34+
templateEngine.parse(template.markdown),
35+
output,
36+
);
37+
},
38+
[storeApp?.data?.processors, templateEngine],
39+
);
1840

1941
useEffect(() => {
2042
let messages = [];
@@ -29,6 +51,28 @@ const SessionRenderer = ({ sessionData }) => {
2951
}
3052

3153
messages.push(new UserMessage(null, runEntry.request_uuid, input));
54+
55+
if (appTypeSlug === "agent") {
56+
for (const processorRun of runEntry.processor_runs) {
57+
messages.push(
58+
new AgentStepMessage(
59+
null,
60+
null,
61+
{
62+
name: processorRun.processor_id || "",
63+
arguments: JSON.stringify(processorRun.input),
64+
output: renderAgentStepOutput(
65+
processorRun.output,
66+
processorRun.processor_id,
67+
),
68+
},
69+
null,
70+
false,
71+
),
72+
);
73+
}
74+
}
75+
3276
messages.push(
3377
appTypeSlug === "agent"
3478
? new AgentMessage(
@@ -44,15 +88,27 @@ const SessionRenderer = ({ sessionData }) => {
4488
messages,
4589
assistantImage: storeApp.data?.config?.assistant_image || "",
4690
inputFields: storeApp.data?.input_fields || [],
91+
processors: storeApp.data?.processors || [],
4792
});
4893
}, [
4994
sessionData,
5095
appTypeSlug,
5196
setAppRunData,
97+
renderAgentStepOutput,
5298
storeApp.data?.config?.assistant_image,
5399
storeApp.data?.input_fields,
100+
storeApp.data?.processors,
54101
]);
55102

103+
const memoizedLayoutRenderer = useMemo(
104+
() => (
105+
<LayoutRenderer noInput>
106+
{storeApp?.data?.config?.layout || ""}
107+
</LayoutRenderer>
108+
),
109+
[storeApp],
110+
);
111+
56112
return (
57113
<Grid container spacing={1} direction={"column"} sx={{ height: "100%" }}>
58114
<Grid>
@@ -76,9 +132,7 @@ const SessionRenderer = ({ sessionData }) => {
76132
overflow: "auto",
77133
}}
78134
>
79-
<LayoutRenderer noInput>
80-
{storeApp?.data?.config?.layout || ""}
81-
</LayoutRenderer>
135+
{memoizedLayoutRenderer}
82136
</Grid>
83137
<Button
84138
variant="contained"

0 commit comments

Comments
 (0)