Add html elements tree in prompt (#731)

This commit is contained in:
Kerem Yilmaz
2024-08-26 12:39:46 +03:00
committed by GitHub
parent db25c6a261
commit 0a9691a485
3 changed files with 72 additions and 5 deletions

View File

@@ -6,6 +6,7 @@ export const ArtifactType = {
LLMResponseParsed: "llm_response_parsed", LLMResponseParsed: "llm_response_parsed",
VisibleElementsTree: "visible_elements_tree", VisibleElementsTree: "visible_elements_tree",
VisibleElementsTreeTrimmed: "visible_elements_tree_trimmed", VisibleElementsTreeTrimmed: "visible_elements_tree_trimmed",
VisibleElementsTreeInPrompt: "visible_elements_tree_in_prompt",
LLMPrompt: "llm_prompt", LLMPrompt: "llm_prompt",
LLMRequest: "llm_request", LLMRequest: "llm_request",
HTMLScrape: "html_scrape", HTMLScrape: "html_scrape",

View File

@@ -0,0 +1,66 @@
import { artifactApiClient } from "@/api/AxiosClient";
import { ArtifactApiResponse } from "@/api/types";
import { Skeleton } from "@/components/ui/skeleton";
import { Textarea } from "@/components/ui/textarea";
import { useQuery } from "@tanstack/react-query";
import axios from "axios";
// https://stackoverflow.com/a/60338028
function format(html: string) {
const tab = "\t";
let result = "";
let indent = "";
html.split(/>\s*</).forEach(function (element) {
if (element.match(/^\/\w/)) {
indent = indent.substring(tab.length);
}
result += indent + "<" + element + ">\r\n";
if (element.match(/^<?\w[^>]*[^/]$/) && !element.startsWith("input")) {
indent += tab;
}
});
return result.substring(1, result.length - 3);
}
type Props = {
artifact: ArtifactApiResponse;
};
function HTMLArtifact({ artifact }: Props) {
const { data, isFetching, isError, error } = useQuery<string>({
queryKey: ["artifact", artifact.artifact_id],
queryFn: async () => {
if (artifact.uri.startsWith("file://")) {
return artifactApiClient
.get(`/artifact/text`, {
params: {
path: artifact.uri.slice(7),
},
})
.then((response) => response.data);
}
if (artifact.uri.startsWith("s3://") && artifact.signed_url) {
return axios.get(artifact.signed_url).then((response) => response.data);
}
},
});
if (isFetching) {
return <Skeleton className="h-48 w-full" />;
}
return (
<Textarea
className="w-full"
rows={15}
value={isError ? JSON.stringify(error) : format(data ?? "")}
readOnly
/>
);
}
export { HTMLArtifact };

View File

@@ -17,7 +17,7 @@ import { getImageURL } from "./artifactUtils";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { basicTimeFormat } from "@/util/timeFormat"; import { basicTimeFormat } from "@/util/timeFormat";
import { useCredentialGetter } from "@/hooks/useCredentialGetter"; import { useCredentialGetter } from "@/hooks/useCredentialGetter";
import { HTMLArtifact } from "./HTMLArtifact";
type Props = { type Props = {
id: string; id: string;
stepProps: StepApiResponse; stepProps: StepApiResponse;
@@ -61,9 +61,9 @@ function StepArtifacts({ id, stepProps }: Props) {
(artifact) => artifact.artifact_type === ArtifactType.LLMRequest, (artifact) => artifact.artifact_type === ArtifactType.LLMRequest,
); );
const visibleElementsTreeTrimmed = artifacts?.filter( const visibleElementsTreeInPrompt = artifacts?.find(
(artifact) => (artifact) =>
artifact.artifact_type === ArtifactType.VisibleElementsTreeTrimmed, artifact.artifact_type === ArtifactType.VisibleElementsTreeInPrompt,
); );
const llmPrompt = artifacts?.find( const llmPrompt = artifacts?.find(
@@ -164,8 +164,8 @@ function StepArtifacts({ id, stepProps }: Props) {
)} )}
</TabsContent> </TabsContent>
<TabsContent value="element_tree_trimmed"> <TabsContent value="element_tree_trimmed">
{visibleElementsTreeTrimmed ? ( {visibleElementsTreeInPrompt ? (
<JSONArtifact artifacts={visibleElementsTreeTrimmed} /> <HTMLArtifact artifact={visibleElementsTreeInPrompt} />
) : null} ) : null}
</TabsContent> </TabsContent>
<TabsContent value="html_element_tree"> <TabsContent value="html_element_tree">