🚧 Add get_tool_info
This commit is contained in:
+322
@@ -543,6 +543,328 @@ class Tools:
|
||||
await emitter.success_update(success)
|
||||
return result
|
||||
|
||||
|
||||
# =========================================================================
|
||||
# Tool documentation
|
||||
# =========================================================================
|
||||
|
||||
def get_tool_info(
|
||||
self,
|
||||
__user__: dict,
|
||||
) -> str:
|
||||
"""
|
||||
Return the SMB tool operating guide, safety rules and current capabilities.
|
||||
|
||||
This function is intended to help Open WebUI instruct the model how to use
|
||||
the tool safely and correctly.
|
||||
|
||||
No passwords, usernames, server names, share names, domains, credentials,
|
||||
file contents, or other secret values are returned.
|
||||
"""
|
||||
|
||||
try:
|
||||
uv = self._user_valves(__user__)
|
||||
|
||||
create_allowed = bool(
|
||||
self.valves.enabled
|
||||
and self.valves.allow_create_files
|
||||
and uv.allow_write_new_files
|
||||
)
|
||||
modify_allowed = bool(
|
||||
self.valves.enabled
|
||||
and self.valves.allow_modify_files
|
||||
and uv.allow_modify_existing_files
|
||||
)
|
||||
delete_allowed = bool(
|
||||
self.valves.enabled
|
||||
and self.valves.allow_delete_paths
|
||||
and uv.allow_delete_existing_paths
|
||||
)
|
||||
directory_ops_allowed = bool(
|
||||
self.valves.enabled
|
||||
and self.valves.allow_directory_operations
|
||||
and uv.allow_directory_operations
|
||||
)
|
||||
move_copy_allowed = bool(
|
||||
self.valves.enabled
|
||||
and self.valves.allow_move_copy
|
||||
and uv.allow_move_copy_operations
|
||||
)
|
||||
recursive_delete_allowed = bool(
|
||||
delete_allowed
|
||||
and directory_ops_allowed
|
||||
and self.valves.allow_recursive_delete
|
||||
)
|
||||
|
||||
info = {
|
||||
"tool": "SMB File Operations Tool",
|
||||
"version": "0.1.0",
|
||||
"purpose": (
|
||||
"Provide controlled SMB2/SMB3 file operations inside the "
|
||||
"current user's configured SMB share and optional root_path."
|
||||
),
|
||||
"path_model": {
|
||||
"paths_are_relative": True,
|
||||
"logical_root": (
|
||||
"All tool paths are relative to the configured SMB share "
|
||||
"and optional UserValves.root_path."
|
||||
),
|
||||
"absolute_paths_allowed": False,
|
||||
"unc_paths_allowed": False,
|
||||
"parent_traversal_allowed": False,
|
||||
"alternate_data_streams_allowed_by_admin": (
|
||||
self.valves.allow_alternate_data_streams
|
||||
),
|
||||
},
|
||||
"current_user_capabilities": {
|
||||
"tool_enabled_by_admin": self.valves.enabled,
|
||||
"smb_connection_configured": bool(
|
||||
uv.server.strip() and uv.share.strip()
|
||||
),
|
||||
"authentication_identity_configured": bool(
|
||||
uv.username.strip() or uv.password
|
||||
),
|
||||
"root_path_configured": bool(uv.root_path.strip()),
|
||||
"smb_encryption_requested": uv.encrypt,
|
||||
"create_new_files_allowed": create_allowed,
|
||||
"modify_existing_files_allowed": modify_allowed,
|
||||
"delete_existing_paths_allowed": delete_allowed,
|
||||
"directory_operations_allowed": directory_ops_allowed,
|
||||
"move_copy_operations_allowed": move_copy_allowed,
|
||||
"recursive_delete_allowed": recursive_delete_allowed,
|
||||
},
|
||||
"administrator_limits": {
|
||||
"max_read_bytes": self.valves.max_read_bytes,
|
||||
"max_write_bytes": self.valves.max_write_bytes,
|
||||
"max_list_entries": self.valves.max_list_entries,
|
||||
"max_search_results": self.valves.max_search_results,
|
||||
"max_search_depth": self.valves.max_search_depth,
|
||||
},
|
||||
"safety_rules": [
|
||||
(
|
||||
"Use get_tool_info when capabilities or safe operating "
|
||||
"rules are unclear."
|
||||
),
|
||||
(
|
||||
"Never invent a path when the target is uncertain. "
|
||||
"Use list_directory, search_files or stat_path first."
|
||||
),
|
||||
(
|
||||
"Treat all paths as relative to the configured SMB "
|
||||
"share/root_path. Do not construct UNC, drive-letter or "
|
||||
"absolute paths."
|
||||
),
|
||||
(
|
||||
"Do not attempt '..' path traversal. The tool rejects "
|
||||
"parent-directory traversal."
|
||||
),
|
||||
(
|
||||
"Read a file before modifying it when the existing "
|
||||
"contents or exact target text matter."
|
||||
),
|
||||
(
|
||||
"Prefer update_file for small exact text changes instead "
|
||||
"of rewriting an entire existing text file."
|
||||
),
|
||||
(
|
||||
"When using update_file for a sensitive or targeted "
|
||||
"change, set expected_replacements when the expected "
|
||||
"number of matches is known."
|
||||
),
|
||||
(
|
||||
"Do not set overwrite=true unless replacing an existing "
|
||||
"destination is explicitly intended."
|
||||
),
|
||||
(
|
||||
"Do not use create_if_missing=true with append_file "
|
||||
"unless creating a missing file is explicitly intended."
|
||||
),
|
||||
(
|
||||
"Use create_parents=true only when missing destination "
|
||||
"directories should intentionally be created."
|
||||
),
|
||||
(
|
||||
"Deletion requires both administrator permission and "
|
||||
"current-user permission."
|
||||
),
|
||||
(
|
||||
"Recursive directory deletion additionally requires the "
|
||||
"administrator recursive-delete master switch."
|
||||
),
|
||||
(
|
||||
"Before moving, copying, overwriting or deleting an "
|
||||
"important path, use stat_path or list_directory when "
|
||||
"necessary to verify the target."
|
||||
),
|
||||
(
|
||||
"Large reads should be performed in chunks with offset "
|
||||
"and max_bytes. Administrator limits always take precedence."
|
||||
),
|
||||
(
|
||||
"Use as_base64=true for binary reads and "
|
||||
"content_is_base64=true for binary writes."
|
||||
),
|
||||
(
|
||||
"Credentials, usernames, passwords, domains, SMB server "
|
||||
"names and share names are not returned by get_tool_info."
|
||||
),
|
||||
],
|
||||
"recommended_workflow": [
|
||||
(
|
||||
"Call test_connection when SMB connectivity or the current "
|
||||
"configuration needs to be verified."
|
||||
),
|
||||
(
|
||||
"Use list_directory to inspect a known directory."
|
||||
),
|
||||
(
|
||||
"Use search_files when the location of a file is unknown."
|
||||
),
|
||||
(
|
||||
"Use stat_path to verify file/directory type, size and "
|
||||
"timestamps before an operation when relevant."
|
||||
),
|
||||
(
|
||||
"Use read_file before editing when current contents matter."
|
||||
),
|
||||
(
|
||||
"Use write_file for new files; leave overwrite=false unless "
|
||||
"replacement is intended."
|
||||
),
|
||||
(
|
||||
"Use update_file for exact text replacement in existing "
|
||||
"text files."
|
||||
),
|
||||
(
|
||||
"Use append_file only when adding data to the end of a "
|
||||
"file is semantically correct."
|
||||
),
|
||||
(
|
||||
"Use make_directory for intentional directory creation."
|
||||
),
|
||||
(
|
||||
"Use copy_file or move_path only when move/copy capability "
|
||||
"is enabled for the current user."
|
||||
),
|
||||
(
|
||||
"Use delete_path only when deletion is explicitly required "
|
||||
"and permitted."
|
||||
),
|
||||
],
|
||||
"functions": {
|
||||
"get_tool_info": (
|
||||
"Return operating instructions, safety rules, limits and "
|
||||
"effective current-user capabilities."
|
||||
),
|
||||
"test_connection": (
|
||||
"Test SMB connectivity, authentication and access to the "
|
||||
"configured logical root."
|
||||
),
|
||||
"list_directory": (
|
||||
"List files and directories in a relative SMB directory, "
|
||||
"optionally using an SMB wildcard pattern."
|
||||
),
|
||||
"stat_path": (
|
||||
"Return metadata for a relative file or directory."
|
||||
),
|
||||
"read_file": (
|
||||
"Read text or binary/base64 file data, with offset and "
|
||||
"chunk-size support."
|
||||
),
|
||||
"search_files": (
|
||||
"Recursively search for file/directory names using "
|
||||
"wildcard patterns within administrator limits."
|
||||
),
|
||||
"write_file": (
|
||||
"Create a new file or explicitly overwrite an existing "
|
||||
"file when permissions allow."
|
||||
),
|
||||
"append_file": (
|
||||
"Append text or binary data to an existing file, or "
|
||||
"optionally create it when permitted."
|
||||
),
|
||||
"update_file": (
|
||||
"Perform controlled exact-text replacement in an existing "
|
||||
"text file."
|
||||
),
|
||||
"make_directory": (
|
||||
"Create a directory and optionally missing parent "
|
||||
"directories when permitted."
|
||||
),
|
||||
"copy_file": (
|
||||
"Copy a file inside the configured SMB logical root."
|
||||
),
|
||||
"move_path": (
|
||||
"Rename or move a file/directory inside the configured "
|
||||
"SMB logical root."
|
||||
),
|
||||
"delete_path": (
|
||||
"Delete a file or directory when user/admin permissions "
|
||||
"allow; recursive deletion has an additional admin gate."
|
||||
),
|
||||
},
|
||||
"examples": [
|
||||
{
|
||||
"goal": "Find a report when its location is unknown",
|
||||
"workflow": [
|
||||
"search_files(pattern='report*')",
|
||||
"stat_path(path='<returned path>')",
|
||||
"read_file(path='<returned path>')",
|
||||
],
|
||||
},
|
||||
{
|
||||
"goal": "Safely change one configuration value",
|
||||
"workflow": [
|
||||
"read_file(path='config/app.conf')",
|
||||
(
|
||||
"update_file(path='config/app.conf', "
|
||||
"old_text='<exact old text>', "
|
||||
"new_text='<replacement>', "
|
||||
"expected_replacements=1)"
|
||||
),
|
||||
],
|
||||
},
|
||||
{
|
||||
"goal": "Create a new text document",
|
||||
"workflow": [
|
||||
(
|
||||
"write_file(path='notes/new-note.txt', "
|
||||
"content='<text>', overwrite=False)"
|
||||
)
|
||||
],
|
||||
},
|
||||
{
|
||||
"goal": "Read a large file in chunks",
|
||||
"workflow": [
|
||||
(
|
||||
"read_file(path='<file>', offset=0, "
|
||||
"max_bytes=<allowed chunk size>)"
|
||||
),
|
||||
(
|
||||
"Continue with offset increased by the returned "
|
||||
"bytes_returned while truncated=true."
|
||||
),
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
return self._json(info)
|
||||
|
||||
except Exception as exc:
|
||||
return self._json(
|
||||
{
|
||||
"tool": "SMB File Operations Tool",
|
||||
"version": "0.1.0",
|
||||
"available": False,
|
||||
"error": self._error_text(exc),
|
||||
"note": (
|
||||
"No credentials or secret configuration values are "
|
||||
"included in this response."
|
||||
),
|
||||
}
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# Read-only operations
|
||||
# ---------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user