Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor from_defaults to Use tool_metadata_from_defaults for Cleaner and More Efficient Metadata Handling #17852

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 44 additions & 14 deletions llama-index-core/llama_index/core/tools/function_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,41 @@ def from_defaults(
async_callback: Optional[AsyncCallable] = None,
) -> "FunctionTool":
if tool_metadata is None:
fn_to_parse = fn or async_fn
assert fn_to_parse is not None, "fn must be provided"
tool_metadata = cls.tool_metadata_from_defaults(
fn=fn or async_fn,
name=name,
description=description,
return_direct=return_direct,
fn_schema=fn_schema
)
assert (fn or async_fn) is not None, "fn must be provided"
return cls(
fn=fn,
metadata=tool_metadata,
async_fn=async_fn,
callback=callback,
async_callback=async_callback,
)

@classmethod
def tool_metadata_from_defaults(
cls,
fn: Optional[Union[Callable[..., Any], AsyncCallable]] = None,
name: Optional[str] = None,
description: Optional[str] = None,
return_direct: bool = False,
fn_schema: Optional[Type[BaseModel]] = None
) -> ToolMetadata:
"""Creates tool metadata from default values and returns it.
Args:
fn: Function to parse. Optional if name, description, and fn_schema are provided.
name: Name of the tool. Optional if fn is provided.
description: Description of the tool. Optional if fn is provided.
return_direct: Return tool output directly, ending agent loop.
fn_schema: Schema of the function. Optional if fn is provided.
"""
fn_to_parse = fn
if fn_to_parse:
name = name or fn_to_parse.__name__
docstring = fn_to_parse.__doc__

Expand Down Expand Up @@ -173,18 +206,15 @@ def from_defaults(
if ctx_param_name is not None
else None,
)
tool_metadata = ToolMetadata(
name=name,
description=description,
fn_schema=fn_schema,
return_direct=return_direct,
)
return cls(
fn=fn,
metadata=tool_metadata,
async_fn=async_fn,
callback=callback,
async_callback=async_callback,
else:
assert name is not None, "name or fn must be provided"
assert description is not None, "description or fn must be provided"
assert fn_schema is not None, "fn_schema or fn must be provided"
return ToolMetadata(
name=name,
description=description,
fn_schema=fn_schema,
return_direct=return_direct,
)

@property
Expand Down
Loading