AI: How can we stream the edit_file tool when it generating like create_file ? Also the edit_file tool show this

"""Invalid File Edit

Could not extract the file changes from the tool result."""

Check the state of code base and make to sure implement fully
This commit is contained in:
LE Quoc Dat 2025-07-28 21:42:25 +02:00
parent deb442cbf7
commit a2eac10d87
2 changed files with 13 additions and 6 deletions

View File

@ -97,7 +97,7 @@ const SplitDiffView: React.FC<{ oldCode: string; newCode: string }> = ({ oldCode
/> />
); );
const ErrorState: React.FC = () => ( const ErrorState: React.FC<{ message?: string }> = ({ message }) => (
<div className="flex flex-col items-center justify-center h-full py-12 px-6 bg-gradient-to-b from-white to-zinc-50 dark:from-zinc-950 dark:to-zinc-900"> <div className="flex flex-col items-center justify-center h-full py-12 px-6 bg-gradient-to-b from-white to-zinc-50 dark:from-zinc-950 dark:to-zinc-900">
<div className="text-center w-full max-w-xs"> <div className="text-center w-full max-w-xs">
<AlertTriangle className="h-16 w-16 mx-auto mb-6 text-amber-500" /> <AlertTriangle className="h-16 w-16 mx-auto mb-6 text-amber-500" />
@ -105,7 +105,7 @@ const ErrorState: React.FC = () => (
Invalid File Edit Invalid File Edit
</h3> </h3>
<p className="text-sm text-zinc-500 dark:text-zinc-400"> <p className="text-sm text-zinc-500 dark:text-zinc-400">
Could not extract the file changes from the tool result. {message || "Could not extract the file changes from the tool result."}
</p> </p>
</div> </div>
</div> </div>
@ -128,6 +128,7 @@ export function FileEditToolView({
updatedContent, updatedContent,
actualIsSuccess, actualIsSuccess,
actualToolTimestamp, actualToolTimestamp,
errorMessage,
} = extractFileEditData( } = extractFileEditData(
assistantContent, assistantContent,
toolContent, toolContent,
@ -188,7 +189,7 @@ export function FileEditToolView({
subtitle="Please wait while the file is being modified" subtitle="Please wait while the file is being modified"
/> />
) : shouldShowError ? ( ) : shouldShowError ? (
<ErrorState /> <ErrorState message={errorMessage} />
) : ( ) : (
<div className="h-full flex flex-col"> <div className="h-full flex flex-col">
<div className="p-3 border-b border-zinc-200 dark:border-zinc-800 bg-accent flex items-center justify-between"> <div className="p-3 border-b border-zinc-200 dark:border-zinc-800 bg-accent flex items-center justify-between">

View File

@ -198,6 +198,7 @@ export interface ExtractedEditData {
updatedContent: string | null; updatedContent: string | null;
success?: boolean; success?: boolean;
timestamp?: string; timestamp?: string;
errorMessage?: string;
} }
export const extractFileEditData = ( export const extractFileEditData = (
@ -213,6 +214,7 @@ export const extractFileEditData = (
actualIsSuccess: boolean; actualIsSuccess: boolean;
actualToolTimestamp?: string; actualToolTimestamp?: string;
actualAssistantTimestamp?: string; actualAssistantTimestamp?: string;
errorMessage?: string;
} => { } => {
let filePath: string | null = null; let filePath: string | null = null;
let originalContent: string | null = null; let originalContent: string | null = null;
@ -220,13 +222,14 @@ export const extractFileEditData = (
let actualIsSuccess = isSuccess; let actualIsSuccess = isSuccess;
let actualToolTimestamp = toolTimestamp; let actualToolTimestamp = toolTimestamp;
let actualAssistantTimestamp = assistantTimestamp; let actualAssistantTimestamp = assistantTimestamp;
let errorMessage: string | undefined;
const parseOutput = (output: any) => { const parseOutput = (output: any) => {
if (typeof output === 'string') { if (typeof output === 'string') {
try { try {
return JSON.parse(output); return JSON.parse(output);
} catch { } catch {
return null; return output; // Return as string if not JSON
} }
} }
return output; return output;
@ -237,12 +240,14 @@ export const extractFileEditData = (
if (parsed?.tool_execution) { if (parsed?.tool_execution) {
const args = parsed.tool_execution.arguments || {}; const args = parsed.tool_execution.arguments || {};
const output = parseOutput(parsed.tool_execution.result?.output); const output = parseOutput(parsed.tool_execution.result?.output);
const success = parsed.tool_execution.result?.success;
return { return {
filePath: args.target_file || output?.file_path || null, filePath: args.target_file || output?.file_path || null,
originalContent: output?.original_content || null, originalContent: output?.original_content || null,
updatedContent: output?.updated_content || null, updatedContent: output?.updated_content || null,
success: parsed.tool_execution.result?.success, success: success,
timestamp: parsed.tool_execution.execution_details?.timestamp, timestamp: parsed.tool_execution.execution_details?.timestamp,
errorMessage: success === false ? (typeof output === 'string' ? output : JSON.stringify(output)) : undefined,
}; };
} }
return {}; return {};
@ -254,6 +259,7 @@ export const extractFileEditData = (
filePath = toolData.filePath || assistantData.filePath; filePath = toolData.filePath || assistantData.filePath;
originalContent = toolData.originalContent || assistantData.originalContent; originalContent = toolData.originalContent || assistantData.originalContent;
updatedContent = toolData.updatedContent || assistantData.updatedContent; updatedContent = toolData.updatedContent || assistantData.updatedContent;
errorMessage = toolData.errorMessage || assistantData.errorMessage;
if (toolData.success !== undefined) { if (toolData.success !== undefined) {
actualIsSuccess = toolData.success; actualIsSuccess = toolData.success;
@ -263,7 +269,7 @@ export const extractFileEditData = (
actualAssistantTimestamp = assistantData.timestamp || assistantTimestamp; actualAssistantTimestamp = assistantData.timestamp || assistantTimestamp;
} }
return { filePath, originalContent, updatedContent, actualIsSuccess, actualToolTimestamp, actualAssistantTimestamp }; return { filePath, originalContent, updatedContent, actualIsSuccess, actualToolTimestamp, actualAssistantTimestamp, errorMessage };
}; };
const parseContent = (content: any): any => { const parseContent = (content: any): any => {