Merge branch 'brace/open-code' of https://github.com/langchain-ai/agent-ui-demo into brace/open-code

This commit is contained in:
bracesproul
2025-03-07 12:43:27 -08:00
3 changed files with 15 additions and 14 deletions

View File

@@ -101,15 +101,16 @@ export async function executor(
], ],
}; };
ui.write("proposed-change", { const msg = ui.create("proposed-change", {
toolCallId, toolCallId,
change: updateFileContents, change: updateFileContents,
planItem: nextPlanItem, planItem: nextPlanItem,
}); });
msg.additional_kwargs["message_id"] = aiMessage.id;
return { return {
messages: [aiMessage], messages: [aiMessage],
ui: ui.collect as OpenCodeUpdate["ui"], ui: [msg],
timestamp: Date.now(), timestamp: Date.now(),
}; };
} }

View File

@@ -70,11 +70,12 @@ export async function planner(
], ],
}; };
ui.write("code-plan", { const msg = ui.create("code-plan", {
toolCallId, toolCallId,
executedPlans, executedPlans,
remainingPlans, remainingPlans,
}); });
msg.additional_kwargs["message_id"] = aiMessage.id;
const toolMessage: ToolMessage = { const toolMessage: ToolMessage = {
type: "tool", type: "tool",
@@ -85,7 +86,7 @@ export async function planner(
return { return {
messages: [aiMessage, toolMessage], messages: [aiMessage, toolMessage],
ui: ui.collect as OpenCodeUpdate["ui"], ui: [msg],
timestamp: Date.now(), timestamp: Date.now(),
}; };
} }

View File

@@ -18,29 +18,28 @@ function CustomComponent({
const [apiUrl] = useQueryParam("apiUrl", StringParam); const [apiUrl] = useQueryParam("apiUrl", StringParam);
const meta = thread.getMessagesMetadata(message); const meta = thread.getMessagesMetadata(message);
const seenState = meta?.firstSeenState; const seenState = meta?.firstSeenState;
const customComponent = seenState?.values.ui const customComponents = seenState?.values.ui
?.slice() ?.slice()
.reverse() .filter(
.find(
({ additional_kwargs }) => ({ additional_kwargs }) =>
additional_kwargs.run_id === seenState.metadata?.run_id, additional_kwargs.run_id === seenState.metadata?.run_id &&
(!additional_kwargs.message_id ||
additional_kwargs.message_id === message.id),
); );
if (!customComponent) { if (!customComponents?.length) return null;
return null;
}
return ( return (
<div key={message.id}> <div key={message.id}>
{customComponent && ( {customComponents.map((customComponent) => (
<LoadExternalComponent <LoadExternalComponent
key={customComponent.id}
apiUrl={apiUrl ?? undefined} apiUrl={apiUrl ?? undefined}
assistantId="agent" assistantId="agent"
stream={thread} stream={thread}
message={customComponent} message={customComponent}
meta={{ ui: customComponent }} meta={{ ui: customComponent }}
/> />
)} ))}
</div> </div>
); );
} }