AutoGPT icon indicating copy to clipboard operation
AutoGPT copied to clipboard

write_to_file should be able to edit files - configurable?

Open nalbion opened this issue 1 year ago • 12 comments

Duplicates

  • [X] I have searched the existing issues

Summary 💡

As mentioned in #2060 write_to_file always errors with "Error: File has already been updated" if the file is listed in file_logger.txt.

A more desirable approach would be:

  • If the file exists, the system should check to see if the existing file is already in the desired state.
  • If file exists display in the PLAN a diff that would be applied.
  • The above might be achieved by a new patch_file command
  • As per #2302 it would be good if the patch_file command could show the arguments on multiple lines

Examples 🌈

No response

Motivation 🔦

write_to_file frequently fails to make all of the changes that are required to a single file.

nalbion avatar Apr 24 '23 01:04 nalbion

I would suggest calling it rewrite_file if it gets implemented. Writing and reading files is an issue right now, especially for gpt3.5. So, naming it something closer to what a normal person would say like, "I need to rewrite this", could make it easier for Autogpt to get the command right.

mikehnta00 avatar Apr 24 '23 01:04 mikehnta00

there is actually an append_file command that can be used, not sure why it doesnt get used

philliplastcall avatar Apr 24 '23 01:04 philliplastcall

Having a command which can insert into files at various byte offsets may be useful, but I'm not sure if the current LLM would use it rather than just reading the file and writing the new file with changes?

rocks6 avatar Apr 24 '23 02:04 rocks6

@philliplastcall I have seen append_file being used, but only when I tell it to ingest or read the existing file, usually it just tries to write something completely different.

@mikehnta00 I'm not familiar with how AutoGPT figures out which command to use, but it does go for write_to_file very frequently from my experience.

@rocks6 I think, generally, reading and replacing the file is exactly what it's currently trying to do, but it often fails because of this code which could handle the situation better:

    if check_duplicate_operation("write", filename):
        return "Error: File has already been updated."

https://github.com/Significant-Gravitas/Auto-GPT/blob/master/autogpt/commands/file_operations.py#L141

nalbion avatar Apr 24 '23 02:04 nalbion

@nalbion ticket #1891 image after comment this line in write_to_file method , problem solved

pencilvania avatar Apr 24 '23 08:04 pencilvania

@nalbion @pencilvania I have a PR out to remove that check, it doesn't seem to be very helpful and causes more issues than it solves.

rocks6 avatar Apr 24 '23 13:04 rocks6

@rocks6 are you sure ? what are the issues that remove this condition can be appear ? can you give an example it seams a simple check to see this operation exist in log file or not

pencilvania avatar Apr 24 '23 13:04 pencilvania

The check is not very robust by design, appending the same content to the same file multiple times is a perfectly reasonable operation. So is writing to the same file multiple times. This should not throw an exception since it's a valid operation.

rocks6 avatar Apr 24 '23 14:04 rocks6

While it would be trivial to add a command that can edit a file at a byte offset, I don't see this working in practice. GPT is not aware of what files it's already written, but for what's evident in the context sent with the prompt. The text of the file written is there for a few calls but there would be no way for GPT to compute a byte offset.

Asking Auto-GPT to execute sed or awk might work, but I've not had any luck accomplishing this.

fluxism avatar Apr 26 '23 04:04 fluxism

I'm not saying that write_to_file should insert a new snippet at an offset (but I think that would be useful as another command). I'm saying that it should not fail because it's already modified that file.

file_logger.txt is the file that Auto-GPT uses to track which files it has modified, so while the LLM may not be aware, the Python code is - I'm not sure why.

Ideally, it would display a diff before replacing the file entirely with what it has.

nalbion avatar Apr 26 '23 06:04 nalbion

If the LLM is responding "Sure, here's a snippet for a getFoo() ..." then there could be a new insert_snippet command which parsed the file to an AST to locate the appropriate region to replace - but I'd create another feature request for that if it was required.

nalbion avatar Apr 26 '23 06:04 nalbion

I'm not saying that write_to_file should insert a new snippet at an offset (but I think that would be useful as another command). I'm saying that it should not fail because it's already modified that file.

file_logger.txt is the file that Auto-GPT uses to track which files it has modified, so while the LLM may not be aware, the Python code is - I'm not sure why.

Ideally, it would display a diff before replacing the file entirely with what it has.

I have a PR out removing the buggy check_duplicate_operation calls from the codebase so this should not be an issue soon

rocks6 avatar Apr 26 '23 12:04 rocks6

I'm going to close this as a duplicate of #1891. There are a load of issues out there relating to writing/updating files, please upvote those that deserve our attention.

Pwuts avatar Apr 26 '23 21:04 Pwuts