agentscope-ai / agentscope-ai/agentscope

[Feature]: Add string replacement tool for file editing

Aberta
#1,323 1 comentário 0 reações 0 responsáveis Ver no GitHub
stale-issue
Linguagem predominante
Python
Estrelas
31.6k
Forks
3.5k
Merge médio
1d 16h
PRs com merge (30d)
103

Descrição

**Is your feature request related to a problem? Please describe.**

Currently, AgentScope's `_text_file` module provides three file editing tools:
- `view_text_file` - View file content
- `insert_text_file` - Insert content at a specified line number
- `write_text_file` - Write content to file (supports line range replacement)

However, there is no tool for **string-based replacement** in files. This makes it difficult for coding agents to perform precise code modifications. The current workflow requires:
1. Read the entire file with `view_text_file`
2. Calculate exact line numbers for the target content
3. Use `write_text_file` with `ranges` parameter

This approach has several limitations:
- Requires precise line number calculation, which is error-prone
- Cannot handle cases where the same content appears multiple times
- Not intuitive for LLM-based agents that think in terms of code patterns

**Describe the solution you'd like**

Add a new `replace_text_file` tool (or `edit_text_file`) that supports string-based replacement:

```python
async def replace_text_file(
file_path: str,
old_string: str,
new_string: str,
replace_all: bool = False,
) -> ToolResponse:
"""Replace text in a file using string matching.

Args:
file_path: The target file path.
old_string: The text to be replaced.
new_string: The new text to replace with.
replace_all: If True, replace all occurrences. Default is False.

Returns:
ToolResponse with the result of the operation.
"""
```
Key Features:
1. Exact string matching - Find and replace exact text
2. Multiple occurrence handling - Support replace_all parameter for global replacement
3. Error handling - Return error if old_string not found or found multiple times (without replace_all)
4. Line ending normalization - Handle different line endings gracefully

Describe alternatives you've considered

Alternative 1: Use execute_python_code to run Python string operations
- Not ideal as it's indirect and less safe

Alternative 2: Use execute_shell_command with sed
- Platform-dependent and harder for LLMs to use correctly

Additional context

This feature is commonly found in coding agent frameworks:

1. SWE-Agent uses str_replace_editor for precise code modifications
2. Cursor/Cline also implement similar string replacement tools

Proposed Implementation

A minimal implementation could be added to src/agentscope/tool/_text_file/_replace_text_file.py:
```py
async def replace_text_file(
file_path: str,
old_string: str,
new_string: str,
replace_all: bool = False,
) -> ToolResponse:
file_path = os.path.expanduser(file_path)

if not os.path.exists(file_path):
return ToolResponse(
content=[TextBlock(type="text", text=f"Error: File {file_path} does not exist.")],
)

with open(file_path, "r", encoding="utf-8") as f:
content = f.read()

if old_string not in content:
return ToolResponse(
content=[TextBlock(type="text", text=f"Error: old_string not found in file.")],
)

if not replace_all:
count = content.count(old_string)
if count > 1:
return ToolResponse(
content=[TextBlock(
type="text",
text=f"Error: Found {count} occurrences. Use replace_all=True or provide more context.",
)],
)

new_content = content.replace(old_string, new_string) if replace_all else content.replace(old_string, new_string, 1)

with open(file_path, "w", encoding="utf-8") as f:
f.write(new_content)

return ToolResponse(
content=[TextBlock(type="text", text=f"Successfully replaced text in {file_path}.")],
)
```
Would you be willing to submit a PR for this feature?

Yes, I can submit a PR with tests and documentation if this feature is approved.

Guia de contribuição

Abrir o guia de contribuição

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.