mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 13:52:43 +08:00
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: openhands <openhands@all-hands.dev> Co-authored-by: Graham Neubig <neubig@gmail.com> Co-authored-by: llamantino <213239228+llamantino@users.noreply.github.com> Co-authored-by: mamoodi <mamoodiha@gmail.com> Co-authored-by: Tim O'Farrell <tofarr@gmail.com> Co-authored-by: Hiep Le <69354317+hieptl@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ryan H. Tran <descience.thh10@gmail.com> Co-authored-by: Neeraj Panwar <49247372+npneeraj@users.noreply.github.com> Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com> Co-authored-by: Insop <1240382+insop@users.noreply.github.com> Co-authored-by: test <test@test.com> Co-authored-by: Engel Nyst <enyst@users.noreply.github.com> Co-authored-by: Zhonghao Jiang <zhonghao.J@outlook.com> Co-authored-by: Ray Myers <ray.myers@gmail.com>
117 lines
6.5 KiB
Python
117 lines
6.5 KiB
Python
from litellm import ChatCompletionToolParam, ChatCompletionToolParamFunctionChunk
|
|
|
|
from openhands.agenthub.codeact_agent.tools.security_utils import (
|
|
RISK_LEVELS,
|
|
SECURITY_RISK_DESC,
|
|
)
|
|
from openhands.llm.tool_names import STR_REPLACE_EDITOR_TOOL_NAME
|
|
|
|
_DETAILED_STR_REPLACE_EDITOR_DESCRIPTION = """Custom editing tool for viewing, creating and editing files in plain-text format
|
|
* State is persistent across command calls and discussions with the user
|
|
* If `path` is a text file, `view` displays the result of applying `cat -n`. If `path` is a directory, `view` lists non-hidden files and directories up to 2 levels deep
|
|
* The following binary file extensions can be viewed in Markdown format: [".xlsx", ".pptx", ".wav", ".mp3", ".m4a", ".flac", ".pdf", ".docx"]. IT DOES NOT HANDLE IMAGES.
|
|
* The `create` command cannot be used if the specified `path` already exists as a file
|
|
* If a `command` generates a long output, it will be truncated and marked with `<response clipped>`
|
|
* The `undo_edit` command will revert the last edit made to the file at `path`
|
|
* This tool can be used for creating and editing files in plain-text format.
|
|
|
|
|
|
Before using this tool:
|
|
1. Use the view tool to understand the file's contents and context
|
|
2. Verify the directory path is correct (only applicable when creating new files):
|
|
- Use the view tool to verify the parent directory exists and is the correct location
|
|
|
|
When making edits:
|
|
- Ensure the edit results in idiomatic, correct code
|
|
- Do not leave the code in a broken state
|
|
- Always use absolute file paths (starting with /)
|
|
|
|
CRITICAL REQUIREMENTS FOR USING THIS TOOL:
|
|
|
|
1. EXACT MATCHING: The `old_str` parameter must match EXACTLY one or more consecutive lines from the file, including all whitespace and indentation. The tool will fail if `old_str` matches multiple locations or doesn't match exactly with the file content.
|
|
|
|
2. UNIQUENESS: The `old_str` must uniquely identify a single instance in the file:
|
|
- Include sufficient context before and after the change point (3-5 lines recommended)
|
|
- If not unique, the replacement will not be performed
|
|
|
|
3. REPLACEMENT: The `new_str` parameter should contain the edited lines that replace the `old_str`. Both strings must be different.
|
|
|
|
Remember: when making multiple file edits in a row to the same file, you should prefer to send all edits in a single message with multiple calls to this tool, rather than multiple messages with a single call each.
|
|
"""
|
|
|
|
_SHORT_STR_REPLACE_EDITOR_DESCRIPTION = """Custom editing tool for viewing, creating and editing files in plain-text format
|
|
* State is persistent across command calls and discussions with the user
|
|
* If `path` is a file, `view` displays the result of applying `cat -n`. If `path` is a directory, `view` lists non-hidden files and directories up to 2 levels deep
|
|
* The `create` command cannot be used if the specified `path` already exists as a file
|
|
* If a `command` generates a long output, it will be truncated and marked with `<response clipped>`
|
|
* The `undo_edit` command will revert the last edit made to the file at `path`
|
|
Notes for using the `str_replace` command:
|
|
* The `old_str` parameter should match EXACTLY one or more consecutive lines from the original file. Be mindful of whitespaces!
|
|
* If the `old_str` parameter is not unique in the file, the replacement will not be performed. Make sure to include enough context in `old_str` to make it unique
|
|
* The `new_str` parameter should contain the edited lines that should replace the `old_str`
|
|
"""
|
|
|
|
|
|
def create_str_replace_editor_tool(
|
|
use_short_description: bool = False,
|
|
) -> ChatCompletionToolParam:
|
|
description = (
|
|
_SHORT_STR_REPLACE_EDITOR_DESCRIPTION
|
|
if use_short_description
|
|
else _DETAILED_STR_REPLACE_EDITOR_DESCRIPTION
|
|
)
|
|
return ChatCompletionToolParam(
|
|
type='function',
|
|
function=ChatCompletionToolParamFunctionChunk(
|
|
name=STR_REPLACE_EDITOR_TOOL_NAME,
|
|
description=description,
|
|
parameters={
|
|
'type': 'object',
|
|
'properties': {
|
|
'command': {
|
|
'description': 'The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`.',
|
|
'enum': [
|
|
'view',
|
|
'create',
|
|
'str_replace',
|
|
'insert',
|
|
'undo_edit',
|
|
],
|
|
'type': 'string',
|
|
},
|
|
'path': {
|
|
'description': 'Absolute path to file or directory, e.g. `/workspace/file.py` or `/workspace`.',
|
|
'type': 'string',
|
|
},
|
|
'file_text': {
|
|
'description': 'Required parameter of `create` command, with the content of the file to be created.',
|
|
'type': 'string',
|
|
},
|
|
'old_str': {
|
|
'description': 'Required parameter of `str_replace` command containing the string in `path` to replace.',
|
|
'type': 'string',
|
|
},
|
|
'new_str': {
|
|
'description': 'Optional parameter of `str_replace` command containing the new string (if not given, no string will be added). Required parameter of `insert` command containing the string to insert.',
|
|
'type': 'string',
|
|
},
|
|
'insert_line': {
|
|
'description': 'Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`.',
|
|
'type': 'integer',
|
|
},
|
|
'view_range': {
|
|
'description': 'Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file.',
|
|
'items': {'type': 'integer'},
|
|
'type': 'array',
|
|
},
|
|
'security_risk': {
|
|
'type': 'string',
|
|
'description': SECURITY_RISK_DESC,
|
|
'enum': RISK_LEVELS,
|
|
},
|
|
},
|
|
'required': ['command', 'path', 'security_risk'],
|
|
},
|
|
),
|
|
)
|