lionagi 0.0.312__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lionagi/__init__.py +61 -3
- lionagi/core/__init__.py +0 -14
- lionagi/core/_setting/_setting.py +59 -0
- lionagi/core/action/__init__.py +14 -0
- lionagi/core/action/function_calling.py +136 -0
- lionagi/core/action/manual.py +1 -0
- lionagi/core/action/node.py +109 -0
- lionagi/core/action/tool.py +114 -0
- lionagi/core/action/tool_manager.py +356 -0
- lionagi/core/agent/__init__.py +0 -3
- lionagi/core/agent/base_agent.py +45 -36
- lionagi/core/agent/eval/evaluator.py +1 -0
- lionagi/core/agent/eval/vote.py +40 -0
- lionagi/core/agent/learn/learner.py +59 -0
- lionagi/core/agent/plan/unit_template.py +1 -0
- lionagi/core/collections/__init__.py +17 -0
- lionagi/core/collections/_logger.py +319 -0
- lionagi/core/collections/abc/__init__.py +53 -0
- lionagi/core/collections/abc/component.py +615 -0
- lionagi/core/collections/abc/concepts.py +297 -0
- lionagi/core/collections/abc/exceptions.py +150 -0
- lionagi/core/collections/abc/util.py +45 -0
- lionagi/core/collections/exchange.py +161 -0
- lionagi/core/collections/flow.py +426 -0
- lionagi/core/collections/model.py +419 -0
- lionagi/core/collections/pile.py +913 -0
- lionagi/core/collections/progression.py +236 -0
- lionagi/core/collections/util.py +64 -0
- lionagi/core/director/direct.py +314 -0
- lionagi/core/director/director.py +2 -0
- lionagi/core/engine/branch_engine.py +333 -0
- lionagi/core/engine/instruction_map_engine.py +204 -0
- lionagi/core/engine/sandbox_.py +14 -0
- lionagi/core/engine/script_engine.py +99 -0
- lionagi/core/executor/base_executor.py +90 -0
- lionagi/core/executor/graph_executor.py +330 -0
- lionagi/core/executor/neo4j_executor.py +384 -0
- lionagi/core/generic/__init__.py +7 -0
- lionagi/core/generic/edge.py +112 -0
- lionagi/core/generic/edge_condition.py +16 -0
- lionagi/core/generic/graph.py +236 -0
- lionagi/core/generic/hyperedge.py +1 -0
- lionagi/core/generic/node.py +220 -0
- lionagi/core/generic/tree.py +48 -0
- lionagi/core/generic/tree_node.py +79 -0
- lionagi/core/mail/__init__.py +7 -3
- lionagi/core/mail/mail.py +25 -0
- lionagi/core/mail/mail_manager.py +142 -58
- lionagi/core/mail/package.py +45 -0
- lionagi/core/mail/start_mail.py +36 -0
- lionagi/core/message/__init__.py +19 -0
- lionagi/core/message/action_request.py +133 -0
- lionagi/core/message/action_response.py +135 -0
- lionagi/core/message/assistant_response.py +95 -0
- lionagi/core/message/instruction.py +234 -0
- lionagi/core/message/message.py +101 -0
- lionagi/core/message/system.py +86 -0
- lionagi/core/message/util.py +283 -0
- lionagi/core/report/__init__.py +4 -0
- lionagi/core/report/base.py +217 -0
- lionagi/core/report/form.py +231 -0
- lionagi/core/report/report.py +166 -0
- lionagi/core/report/util.py +28 -0
- lionagi/core/rule/__init__.py +0 -0
- lionagi/core/rule/_default.py +16 -0
- lionagi/core/rule/action.py +99 -0
- lionagi/core/rule/base.py +238 -0
- lionagi/core/rule/boolean.py +56 -0
- lionagi/core/rule/choice.py +47 -0
- lionagi/core/rule/mapping.py +96 -0
- lionagi/core/rule/number.py +71 -0
- lionagi/core/rule/rulebook.py +109 -0
- lionagi/core/rule/string.py +52 -0
- lionagi/core/rule/util.py +35 -0
- lionagi/core/session/__init__.py +0 -3
- lionagi/core/session/branch.py +431 -0
- lionagi/core/session/directive_mixin.py +287 -0
- lionagi/core/session/session.py +230 -902
- lionagi/core/structure/__init__.py +1 -0
- lionagi/core/structure/chain.py +1 -0
- lionagi/core/structure/forest.py +1 -0
- lionagi/core/structure/graph.py +1 -0
- lionagi/core/structure/tree.py +1 -0
- lionagi/core/unit/__init__.py +5 -0
- lionagi/core/unit/parallel_unit.py +245 -0
- lionagi/core/unit/template/__init__.py +0 -0
- lionagi/core/unit/template/action.py +81 -0
- lionagi/core/unit/template/base.py +51 -0
- lionagi/core/unit/template/plan.py +84 -0
- lionagi/core/unit/template/predict.py +109 -0
- lionagi/core/unit/template/score.py +124 -0
- lionagi/core/unit/template/select.py +104 -0
- lionagi/core/unit/unit.py +362 -0
- lionagi/core/unit/unit_form.py +305 -0
- lionagi/core/unit/unit_mixin.py +1168 -0
- lionagi/core/unit/util.py +71 -0
- lionagi/core/validator/__init__.py +0 -0
- lionagi/core/validator/validator.py +364 -0
- lionagi/core/work/__init__.py +0 -0
- lionagi/core/work/work.py +76 -0
- lionagi/core/work/work_function.py +101 -0
- lionagi/core/work/work_queue.py +103 -0
- lionagi/core/work/worker.py +258 -0
- lionagi/core/work/worklog.py +120 -0
- lionagi/experimental/__init__.py +0 -0
- lionagi/experimental/compressor/__init__.py +0 -0
- lionagi/experimental/compressor/base.py +46 -0
- lionagi/experimental/compressor/llm_compressor.py +247 -0
- lionagi/experimental/compressor/llm_summarizer.py +61 -0
- lionagi/experimental/compressor/util.py +70 -0
- lionagi/experimental/directive/__init__.py +19 -0
- lionagi/experimental/directive/parser/__init__.py +0 -0
- lionagi/experimental/directive/parser/base_parser.py +282 -0
- lionagi/experimental/directive/template/__init__.py +0 -0
- lionagi/experimental/directive/template/base_template.py +79 -0
- lionagi/experimental/directive/template/schema.py +36 -0
- lionagi/experimental/directive/tokenizer.py +73 -0
- lionagi/experimental/evaluator/__init__.py +0 -0
- lionagi/experimental/evaluator/ast_evaluator.py +131 -0
- lionagi/experimental/evaluator/base_evaluator.py +218 -0
- lionagi/experimental/knowledge/__init__.py +0 -0
- lionagi/experimental/knowledge/base.py +10 -0
- lionagi/experimental/knowledge/graph.py +0 -0
- lionagi/experimental/memory/__init__.py +0 -0
- lionagi/experimental/strategies/__init__.py +0 -0
- lionagi/experimental/strategies/base.py +1 -0
- lionagi/integrations/bridge/autogen_/__init__.py +0 -0
- lionagi/integrations/bridge/autogen_/autogen_.py +124 -0
- lionagi/integrations/bridge/langchain_/documents.py +4 -0
- lionagi/integrations/bridge/llamaindex_/index.py +30 -0
- lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +6 -0
- lionagi/integrations/bridge/llamaindex_/llama_pack.py +227 -0
- lionagi/integrations/bridge/llamaindex_/node_parser.py +6 -9
- lionagi/integrations/bridge/pydantic_/pydantic_bridge.py +1 -0
- lionagi/integrations/bridge/transformers_/__init__.py +0 -0
- lionagi/integrations/bridge/transformers_/install_.py +36 -0
- lionagi/integrations/chunker/__init__.py +0 -0
- lionagi/integrations/chunker/chunk.py +312 -0
- lionagi/integrations/config/oai_configs.py +38 -7
- lionagi/integrations/config/ollama_configs.py +1 -1
- lionagi/integrations/config/openrouter_configs.py +14 -2
- lionagi/integrations/loader/__init__.py +0 -0
- lionagi/integrations/loader/load.py +253 -0
- lionagi/integrations/loader/load_util.py +195 -0
- lionagi/integrations/provider/_mapping.py +46 -0
- lionagi/integrations/provider/litellm.py +2 -1
- lionagi/integrations/provider/mlx_service.py +16 -9
- lionagi/integrations/provider/oai.py +91 -4
- lionagi/integrations/provider/ollama.py +7 -6
- lionagi/integrations/provider/openrouter.py +115 -8
- lionagi/integrations/provider/services.py +2 -2
- lionagi/integrations/provider/transformers.py +18 -22
- lionagi/integrations/storage/__init__.py +3 -0
- lionagi/integrations/storage/neo4j.py +665 -0
- lionagi/integrations/storage/storage_util.py +287 -0
- lionagi/integrations/storage/structure_excel.py +285 -0
- lionagi/integrations/storage/to_csv.py +63 -0
- lionagi/integrations/storage/to_excel.py +83 -0
- lionagi/libs/__init__.py +26 -1
- lionagi/libs/ln_api.py +78 -23
- lionagi/libs/ln_context.py +37 -0
- lionagi/libs/ln_convert.py +21 -9
- lionagi/libs/ln_func_call.py +69 -28
- lionagi/libs/ln_image.py +107 -0
- lionagi/libs/ln_knowledge_graph.py +405 -0
- lionagi/libs/ln_nested.py +26 -11
- lionagi/libs/ln_parse.py +110 -14
- lionagi/libs/ln_queue.py +117 -0
- lionagi/libs/ln_tokenize.py +164 -0
- lionagi/{core/prompt/field_validator.py → libs/ln_validate.py} +79 -14
- lionagi/libs/special_tokens.py +172 -0
- lionagi/libs/sys_util.py +107 -2
- lionagi/lions/__init__.py +0 -0
- lionagi/lions/coder/__init__.py +0 -0
- lionagi/lions/coder/add_feature.py +20 -0
- lionagi/lions/coder/base_prompts.py +22 -0
- lionagi/lions/coder/code_form.py +13 -0
- lionagi/lions/coder/coder.py +168 -0
- lionagi/lions/coder/util.py +96 -0
- lionagi/lions/researcher/__init__.py +0 -0
- lionagi/lions/researcher/data_source/__init__.py +0 -0
- lionagi/lions/researcher/data_source/finhub_.py +191 -0
- lionagi/lions/researcher/data_source/google_.py +199 -0
- lionagi/lions/researcher/data_source/wiki_.py +96 -0
- lionagi/lions/researcher/data_source/yfinance_.py +21 -0
- lionagi/tests/integrations/__init__.py +0 -0
- lionagi/tests/libs/__init__.py +0 -0
- lionagi/tests/libs/test_field_validators.py +353 -0
- lionagi/tests/{test_libs → libs}/test_func_call.py +23 -21
- lionagi/tests/{test_libs → libs}/test_nested.py +36 -21
- lionagi/tests/{test_libs → libs}/test_parse.py +1 -1
- lionagi/tests/libs/test_queue.py +67 -0
- lionagi/tests/test_core/collections/__init__.py +0 -0
- lionagi/tests/test_core/collections/test_component.py +206 -0
- lionagi/tests/test_core/collections/test_exchange.py +138 -0
- lionagi/tests/test_core/collections/test_flow.py +145 -0
- lionagi/tests/test_core/collections/test_pile.py +171 -0
- lionagi/tests/test_core/collections/test_progression.py +129 -0
- lionagi/tests/test_core/generic/__init__.py +0 -0
- lionagi/tests/test_core/generic/test_edge.py +67 -0
- lionagi/tests/test_core/generic/test_graph.py +96 -0
- lionagi/tests/test_core/generic/test_node.py +106 -0
- lionagi/tests/test_core/generic/test_tree_node.py +73 -0
- lionagi/tests/test_core/test_branch.py +115 -292
- lionagi/tests/test_core/test_form.py +46 -0
- lionagi/tests/test_core/test_report.py +105 -0
- lionagi/tests/test_core/test_validator.py +111 -0
- lionagi/version.py +1 -1
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/LICENSE +12 -11
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/METADATA +19 -118
- lionagi-0.2.1.dist-info/RECORD +240 -0
- lionagi/core/branch/__init__.py +0 -4
- lionagi/core/branch/base_branch.py +0 -654
- lionagi/core/branch/branch.py +0 -471
- lionagi/core/branch/branch_flow_mixin.py +0 -96
- lionagi/core/branch/executable_branch.py +0 -347
- lionagi/core/branch/util.py +0 -323
- lionagi/core/direct/__init__.py +0 -6
- lionagi/core/direct/predict.py +0 -161
- lionagi/core/direct/score.py +0 -278
- lionagi/core/direct/select.py +0 -169
- lionagi/core/direct/utils.py +0 -87
- lionagi/core/direct/vote.py +0 -64
- lionagi/core/flow/base/baseflow.py +0 -23
- lionagi/core/flow/monoflow/ReAct.py +0 -238
- lionagi/core/flow/monoflow/__init__.py +0 -9
- lionagi/core/flow/monoflow/chat.py +0 -95
- lionagi/core/flow/monoflow/chat_mixin.py +0 -263
- lionagi/core/flow/monoflow/followup.py +0 -214
- lionagi/core/flow/polyflow/__init__.py +0 -1
- lionagi/core/flow/polyflow/chat.py +0 -248
- lionagi/core/mail/schema.py +0 -56
- lionagi/core/messages/__init__.py +0 -3
- lionagi/core/messages/schema.py +0 -533
- lionagi/core/prompt/prompt_template.py +0 -316
- lionagi/core/schema/__init__.py +0 -22
- lionagi/core/schema/action_node.py +0 -29
- lionagi/core/schema/base_mixin.py +0 -296
- lionagi/core/schema/base_node.py +0 -199
- lionagi/core/schema/condition.py +0 -24
- lionagi/core/schema/data_logger.py +0 -354
- lionagi/core/schema/data_node.py +0 -93
- lionagi/core/schema/prompt_template.py +0 -67
- lionagi/core/schema/structure.py +0 -910
- lionagi/core/tool/__init__.py +0 -3
- lionagi/core/tool/tool_manager.py +0 -280
- lionagi/integrations/bridge/pydantic_/base_model.py +0 -7
- lionagi/tests/test_core/test_base_branch.py +0 -427
- lionagi/tests/test_core/test_chat_flow.py +0 -63
- lionagi/tests/test_core/test_mail_manager.py +0 -75
- lionagi/tests/test_core/test_prompts.py +0 -51
- lionagi/tests/test_core/test_session.py +0 -254
- lionagi/tests/test_core/test_session_base_util.py +0 -312
- lionagi/tests/test_core/test_tool_manager.py +0 -95
- lionagi-0.0.312.dist-info/RECORD +0 -111
- /lionagi/core/{branch/base → _setting}/__init__.py +0 -0
- /lionagi/core/{flow → agent/eval}/__init__.py +0 -0
- /lionagi/core/{flow/base → agent/learn}/__init__.py +0 -0
- /lionagi/core/{prompt → agent/plan}/__init__.py +0 -0
- /lionagi/core/{tool/manual.py → agent/plan/plan.py} +0 -0
- /lionagi/{tests/test_integrations → core/director}/__init__.py +0 -0
- /lionagi/{tests/test_libs → core/engine}/__init__.py +0 -0
- /lionagi/{tests/test_libs/test_async.py → core/executor/__init__.py} +0 -0
- /lionagi/tests/{test_libs → libs}/test_api.py +0 -0
- /lionagi/tests/{test_libs → libs}/test_convert.py +0 -0
- /lionagi/tests/{test_libs → libs}/test_sys_util.py +0 -0
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/WHEEL +0 -0
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/top_level.txt +0 -0
lionagi/core/tool/__init__.py
DELETED
@@ -1,280 +0,0 @@
|
|
1
|
-
from typing import Tuple, Any, TypeVar, Callable
|
2
|
-
|
3
|
-
import asyncio
|
4
|
-
|
5
|
-
from lionagi.libs import func_call, convert, ParseUtil
|
6
|
-
from lionagi.core.schema import Tool, TOOL_TYPE
|
7
|
-
|
8
|
-
T = TypeVar("T", bound=Tool)
|
9
|
-
|
10
|
-
|
11
|
-
class ToolManager:
|
12
|
-
"""
|
13
|
-
A manager class for handling the registration and invocation of tools that are subclasses of Tool.
|
14
|
-
|
15
|
-
This class maintains a registry of tool instances, allowing for dynamic invocation based on
|
16
|
-
tool name and provided arguments. It supports both synchronous and asynchronous tool function
|
17
|
-
calls.
|
18
|
-
|
19
|
-
Attributes:
|
20
|
-
registry (dict[str, Tool]): A dictionary to hold registered tools, keyed by their names.
|
21
|
-
"""
|
22
|
-
|
23
|
-
registry: dict = {}
|
24
|
-
|
25
|
-
def name_existed(self, name: str) -> bool:
|
26
|
-
"""
|
27
|
-
Checks if a tool name already exists in the registry.
|
28
|
-
|
29
|
-
Args:
|
30
|
-
name (str): The name of the tool to check.
|
31
|
-
|
32
|
-
Returns:
|
33
|
-
bool: True if the name exists, False otherwise.
|
34
|
-
"""
|
35
|
-
return name in self.registry
|
36
|
-
|
37
|
-
@property
|
38
|
-
def has_tools(self):
|
39
|
-
return self.registry != {}
|
40
|
-
|
41
|
-
def _register_tool(self, tool: Tool) -> None:
|
42
|
-
"""
|
43
|
-
Registers a tool in the registry. Raises a TypeError if the object is not an instance of Tool.
|
44
|
-
|
45
|
-
Args:
|
46
|
-
tool (Tool): The tool instance to register.
|
47
|
-
|
48
|
-
Raises:
|
49
|
-
TypeError: If the provided object is not an instance of Tool.
|
50
|
-
"""
|
51
|
-
if not isinstance(tool, Tool):
|
52
|
-
raise TypeError("Please register a Tool object.")
|
53
|
-
name = tool.schema_["function"]["name"]
|
54
|
-
self.registry.update({name: tool})
|
55
|
-
|
56
|
-
async def invoke(self, func_calls: Tuple[str, dict[str, Any]]) -> Any:
|
57
|
-
"""
|
58
|
-
Invokes a registered tool's function with the given arguments. Supports both coroutine and regular functions.
|
59
|
-
|
60
|
-
Args:
|
61
|
-
func_call (Tuple[str, Dict[str, Any]]): A tuple containing the function name and a dictionary of keyword arguments.
|
62
|
-
|
63
|
-
Returns:
|
64
|
-
Any: The result of the function call.
|
65
|
-
|
66
|
-
Raises:
|
67
|
-
ValueError: If the function name is not registered or if there's an error during function invocation.
|
68
|
-
"""
|
69
|
-
name, kwargs = func_calls
|
70
|
-
if not self.name_existed(name):
|
71
|
-
raise ValueError(f"Function {name} is not registered.")
|
72
|
-
tool = self.registry[name]
|
73
|
-
func = tool.func
|
74
|
-
parser = tool.parser
|
75
|
-
try:
|
76
|
-
if func_call.is_coroutine_func(func):
|
77
|
-
tasks = [func_call.call_handler(func, **kwargs)]
|
78
|
-
out = await asyncio.gather(*tasks)
|
79
|
-
return parser(out[0]) if parser else out[0]
|
80
|
-
else:
|
81
|
-
out = func(**kwargs)
|
82
|
-
return parser(out) if parser else out
|
83
|
-
except Exception as e:
|
84
|
-
raise ValueError(
|
85
|
-
f"Error when invoking function {name} with arguments {kwargs} with error message {e}"
|
86
|
-
) from e
|
87
|
-
|
88
|
-
@staticmethod
|
89
|
-
def get_function_call(response: dict) -> Tuple[str, dict]:
|
90
|
-
"""
|
91
|
-
Extracts a function call and arguments from a response dictionary.
|
92
|
-
|
93
|
-
Args:
|
94
|
-
response (dict): The response dictionary containing the function call information.
|
95
|
-
|
96
|
-
Returns:
|
97
|
-
Tuple[str, dict]: A tuple containing the function name and a dictionary of arguments.
|
98
|
-
|
99
|
-
Raises:
|
100
|
-
ValueError: If the response does not contain valid function call information.
|
101
|
-
"""
|
102
|
-
try:
|
103
|
-
func = response["action"][7:]
|
104
|
-
args = convert.to_dict(response["arguments"])
|
105
|
-
return func, args
|
106
|
-
except Exception:
|
107
|
-
try:
|
108
|
-
func = response["recipient_name"].split(".")[-1]
|
109
|
-
args = response["parameters"]
|
110
|
-
return func, args
|
111
|
-
except:
|
112
|
-
raise ValueError("response is not a valid function call")
|
113
|
-
|
114
|
-
def register_tools(self, tools: list[Tool]) -> None:
|
115
|
-
"""
|
116
|
-
Registers multiple tools in the registry.
|
117
|
-
|
118
|
-
Args:
|
119
|
-
tools (list[Tool]): A list of tool instances to register.
|
120
|
-
"""
|
121
|
-
func_call.lcall(tools, self._register_tool)
|
122
|
-
|
123
|
-
def to_tool_schema_list(self) -> list[dict[str, Any]]:
|
124
|
-
"""
|
125
|
-
Generates a list of schemas for all registered tools.
|
126
|
-
|
127
|
-
Returns:
|
128
|
-
list[dict[str, Any]]: A list of tool schemas.
|
129
|
-
|
130
|
-
"""
|
131
|
-
return [tool.schema_ for tool in self.registry.values()]
|
132
|
-
|
133
|
-
def parse_tool(self, tools: TOOL_TYPE, **kwargs) -> dict:
|
134
|
-
"""
|
135
|
-
Parses tool information and generates a dictionary for tool invocation.
|
136
|
-
|
137
|
-
Args:
|
138
|
-
tools: Tool information which can be a single Tool instance, a list of Tool instances, a tool name, or a list of tool names.
|
139
|
-
**kwargs: Additional keyword arguments.
|
140
|
-
|
141
|
-
Returns:
|
142
|
-
dict: A dictionary containing tool schema information and any additional keyword arguments.
|
143
|
-
|
144
|
-
Raises:
|
145
|
-
ValueError: If a tool name is provided that is not registered.
|
146
|
-
"""
|
147
|
-
|
148
|
-
def tool_check(tool):
|
149
|
-
if isinstance(tool, dict):
|
150
|
-
return tool
|
151
|
-
elif isinstance(tool, Tool):
|
152
|
-
return tool.schema_
|
153
|
-
elif isinstance(tool, str):
|
154
|
-
if self.name_existed(tool):
|
155
|
-
tool = self.registry[tool]
|
156
|
-
return tool.schema_
|
157
|
-
else:
|
158
|
-
raise ValueError(f"Function {tool} is not registered.")
|
159
|
-
|
160
|
-
if isinstance(tools, bool):
|
161
|
-
tool_kwarg = {"tools": self.to_tool_schema_list()}
|
162
|
-
kwargs = tool_kwarg | kwargs
|
163
|
-
|
164
|
-
else:
|
165
|
-
if not isinstance(tools, list):
|
166
|
-
tools = [tools]
|
167
|
-
tool_kwarg = {"tools": func_call.lcall(tools, tool_check)}
|
168
|
-
kwargs = tool_kwarg | kwargs
|
169
|
-
|
170
|
-
return kwargs
|
171
|
-
|
172
|
-
|
173
|
-
def func_to_tool(
|
174
|
-
func_: Callable | list[Callable], parser=None, docstring_style="google"
|
175
|
-
):
|
176
|
-
"""
|
177
|
-
Transforms a given function into a Tool object, equipped with a schema derived
|
178
|
-
from its docstring. This process involves parsing the function's docstring based
|
179
|
-
on a specified style ('google' or 'reST') to extract relevant metadata and
|
180
|
-
parameters, which are then used to construct a comprehensive schema for the Tool.
|
181
|
-
This schema facilitates the integration of the function with systems or
|
182
|
-
frameworks that rely on structured metadata for automation, documentation, or
|
183
|
-
interface generation purposes.
|
184
|
-
|
185
|
-
The function to be transformed can be any Callable that adheres to the
|
186
|
-
specified docstring conventions. The resulting Tool object encapsulates the
|
187
|
-
original function, allowing it to be utilized within environments that require
|
188
|
-
objects with structured metadata.
|
189
|
-
|
190
|
-
Args:
|
191
|
-
func_ (Callable): The function to be transformed into a Tool object. This
|
192
|
-
function should have a docstring that follows the
|
193
|
-
specified docstring style for accurate schema generation.
|
194
|
-
parser (Optional[Any]): An optional parser object associated with the Tool.
|
195
|
-
This parameter is currently not utilized in the
|
196
|
-
transformation process but is included for future
|
197
|
-
compatibility and extension purposes.
|
198
|
-
docstring_style (str): The format of the docstring to be parsed, indicating
|
199
|
-
the convention used in the function's docstring.
|
200
|
-
Supports 'google' for Google-style docstrings and
|
201
|
-
'reST' for reStructuredText-style docstrings. The
|
202
|
-
chosen style affects how the docstring is parsed and
|
203
|
-
how the schema is generated.
|
204
|
-
|
205
|
-
Returns:
|
206
|
-
Tool: An object representing the original function wrapped as a Tool, along
|
207
|
-
with its generated schema. This Tool object can be used in systems that
|
208
|
-
require detailed metadata about functions, facilitating tasks such as
|
209
|
-
automatic documentation generation, user interface creation, or
|
210
|
-
integration with other software tools.
|
211
|
-
|
212
|
-
Examples:
|
213
|
-
>>> def example_function_google(param1: int, param2: str) -> bool:
|
214
|
-
... '''
|
215
|
-
... An example function using Google style docstrings.
|
216
|
-
...
|
217
|
-
... Args:
|
218
|
-
... param1 (int): The first parameter, demonstrating an integer input_.
|
219
|
-
... param2 (str): The second parameter, demonstrating a string input_.
|
220
|
-
...
|
221
|
-
... Returns:
|
222
|
-
... bool: A boolean value, illustrating the return type.
|
223
|
-
... '''
|
224
|
-
... return True
|
225
|
-
...
|
226
|
-
>>> tool_google = func_to_tool(example_function_google, docstring_style='google')
|
227
|
-
>>> print(isinstance(tool_google, Tool))
|
228
|
-
True
|
229
|
-
|
230
|
-
>>> def example_function_reST(param1: int, param2: str) -> bool:
|
231
|
-
... '''
|
232
|
-
... An example function using reStructuredText (reST) style docstrings.
|
233
|
-
...
|
234
|
-
... :param param1: The first parameter, demonstrating an integer input_.
|
235
|
-
... :type param1: int
|
236
|
-
... :param param2: The second parameter, demonstrating a string input_.
|
237
|
-
... :type param2: str
|
238
|
-
... :returns: A boolean value, illustrating the return type.
|
239
|
-
... :rtype: bool
|
240
|
-
... '''
|
241
|
-
... return True
|
242
|
-
...
|
243
|
-
>>> tool_reST = func_to_tool(example_function_reST, docstring_style='reST')
|
244
|
-
>>> print(isinstance(tool_reST, Tool))
|
245
|
-
True
|
246
|
-
|
247
|
-
Note:
|
248
|
-
The transformation process relies heavily on the accuracy and completeness of
|
249
|
-
the function's docstring. Functions with incomplete or incorrectly formatted
|
250
|
-
docstrings may result in incomplete or inaccurate Tool schemas.
|
251
|
-
"""
|
252
|
-
|
253
|
-
fs = []
|
254
|
-
funcs = convert.to_list(func_, flatten=True, dropna=True)
|
255
|
-
parsers = convert.to_list(parser, flatten=True, dropna=True)
|
256
|
-
|
257
|
-
if parser:
|
258
|
-
if len(funcs) != len(parsers) != 1:
|
259
|
-
raise ValueError(
|
260
|
-
"Length of parser must match length of func. Except if you only pass one"
|
261
|
-
)
|
262
|
-
|
263
|
-
for idx in range(len(funcs)):
|
264
|
-
f_ = lambda _f: Tool(
|
265
|
-
func=_f,
|
266
|
-
schema_=ParseUtil._func_to_schema(_f, style=docstring_style),
|
267
|
-
parser=parsers[idx] if len(parsers) > 1 else parsers[0],
|
268
|
-
)
|
269
|
-
|
270
|
-
fs.append(f_)
|
271
|
-
|
272
|
-
else:
|
273
|
-
fs = func_call.lcall(
|
274
|
-
funcs,
|
275
|
-
lambda _f: Tool(
|
276
|
-
func=_f, schema_=ParseUtil._func_to_schema(_f, style=docstring_style)
|
277
|
-
),
|
278
|
-
)
|
279
|
-
|
280
|
-
return fs
|