Merge pull request #275 from kavinkumar807/highlight-tool-errors-in-red-text

feat: highlight tool errors in red text
This commit is contained in:
Cliff Hall
2025-04-09 13:30:19 -04:00
committed by GitHub
2 changed files with 32 additions and 7 deletions

View File

@@ -12,6 +12,7 @@ interface JsonViewProps {
initialExpandDepth?: number; initialExpandDepth?: number;
className?: string; className?: string;
withCopyButton?: boolean; withCopyButton?: boolean;
isError?: boolean;
} }
const JsonView = memo( const JsonView = memo(
@@ -21,6 +22,7 @@ const JsonView = memo(
initialExpandDepth = 3, initialExpandDepth = 3,
className, className,
withCopyButton = true, withCopyButton = true,
isError = false,
}: JsonViewProps) => { }: JsonViewProps) => {
const { toast } = useToast(); const { toast } = useToast();
const [copied, setCopied] = useState(false); const [copied, setCopied] = useState(false);
@@ -86,6 +88,7 @@ const JsonView = memo(
name={name} name={name}
depth={0} depth={0}
initialExpandDepth={initialExpandDepth} initialExpandDepth={initialExpandDepth}
isError={isError}
/> />
</div> </div>
</div> </div>
@@ -100,17 +103,25 @@ interface JsonNodeProps {
name?: string; name?: string;
depth: number; depth: number;
initialExpandDepth: number; initialExpandDepth: number;
isError?: boolean;
} }
const JsonNode = memo( const JsonNode = memo(
({ data, name, depth = 0, initialExpandDepth }: JsonNodeProps) => { ({
data,
name,
depth = 0,
initialExpandDepth,
isError = false,
}: JsonNodeProps) => {
const [isExpanded, setIsExpanded] = useState(depth < initialExpandDepth); const [isExpanded, setIsExpanded] = useState(depth < initialExpandDepth);
const [typeStyleMap] = useState<Record<string, string>>({ const [typeStyleMap] = useState<Record<string, string>>({
number: "text-blue-600", number: "text-blue-600",
boolean: "text-amber-600", boolean: "text-amber-600",
null: "text-purple-600", null: "text-purple-600",
undefined: "text-gray-600", undefined: "text-gray-600",
string: "text-green-600 break-all whitespace-pre-wrap", string: "text-green-600 group-hover:text-green-500",
error: "text-red-600 group-hover:text-red-500",
default: "text-gray-700", default: "text-gray-700",
}); });
const dataType = getDataType(data); const dataType = getDataType(data);
@@ -214,7 +225,14 @@ const JsonNode = memo(
{name}: {name}:
</span> </span>
)} )}
<pre className={typeStyleMap.string}>"{value}"</pre> <pre
className={clsx(
typeStyleMap.string,
"break-all whitespace-pre-wrap",
)}
>
"{value}"
</pre>
</div> </div>
); );
} }
@@ -228,8 +246,8 @@ const JsonNode = memo(
)} )}
<pre <pre
className={clsx( className={clsx(
typeStyleMap.string, isError ? typeStyleMap.error : typeStyleMap.string,
"cursor-pointer group-hover:text-green-500", "cursor-pointer break-all whitespace-pre-wrap",
)} )}
onClick={() => setIsExpanded(!isExpanded)} onClick={() => setIsExpanded(!isExpanded)}
title={isExpanded ? "Click to collapse" : "Click to expand"} title={isExpanded ? "Click to collapse" : "Click to expand"}

View File

@@ -69,11 +69,18 @@ const ToolsTab = ({
return ( return (
<> <>
<h4 className="font-semibold mb-2"> <h4 className="font-semibold mb-2">
Tool Result: {isError ? "Error" : "Success"} Tool Result:{" "}
{isError ? (
<span className="text-red-600 font-semibold">Error</span>
) : (
<span className="text-green-600 font-semibold">Success</span>
)}
</h4> </h4>
{structuredResult.content.map((item, index) => ( {structuredResult.content.map((item, index) => (
<div key={index} className="mb-2"> <div key={index} className="mb-2">
{item.type === "text" && <JsonView data={item.text} />} {item.type === "text" && (
<JsonView data={item.text} isError={isError} />
)}
{item.type === "image" && ( {item.type === "image" && (
<img <img
src={`data:${item.mimeType};base64,${item.data}`} src={`data:${item.mimeType};base64,${item.data}`}