|
@@ -1277,7 +1277,7 @@ print(f"数学专用Agent结果: {math_result}")
|
|
|
|
|
|
|
|
### 7.4.5 FunctionCallAgent
|
|
### 7.4.5 FunctionCallAgent
|
|
|
|
|
|
|
|
-FunctionCallAgent是hello-agents在0.1.16之后引入的Agent,它基于OpenAI原生函数调用机制的Agent,展示了如何使用OpenAI的函数调用机制来构建Agent。
|
|
|
|
|
|
|
+FunctionCallAgent是hello-agents在0.2.8之后引入的Agent,它基于OpenAI原生函数调用机制的Agent,展示了如何使用OpenAI的函数调用机制来构建Agent。
|
|
|
它支持以下功能:
|
|
它支持以下功能:
|
|
|
_build_tool_schemas:通过工具的description构建OpenAI的function calling schema
|
|
_build_tool_schemas:通过工具的description构建OpenAI的function calling schema
|
|
|
_extract_message_content:从OpenAI的响应中提取文本
|
|
_extract_message_content:从OpenAI的响应中提取文本
|
|
@@ -1304,7 +1304,9 @@ def _invoke_with_tools(self, messages: list[dict[str, Any]], tools: list[dict[st
|
|
|
tool_choice=tool_choice,
|
|
tool_choice=tool_choice,
|
|
|
**client_kwargs,
|
|
**client_kwargs,
|
|
|
)
|
|
)
|
|
|
|
|
+
|
|
|
#内部逻辑是对Openai 原生的functioncall作再封装
|
|
#内部逻辑是对Openai 原生的functioncall作再封装
|
|
|
|
|
+#OpenAI 原生functioncall示例
|
|
|
from openai import OpenAI
|
|
from openai import OpenAI
|
|
|
client = OpenAI()
|
|
client = OpenAI()
|
|
|
|
|
|
|
@@ -1455,6 +1457,57 @@ def get_tools_description(self) -> str:
|
|
|
````
|
|
````
|
|
|
这个方法生成的描述字符串可以直接用于构建Agent的提示词,让Agent了解可用的工具。
|
|
这个方法生成的描述字符串可以直接用于构建Agent的提示词,让Agent了解可用的工具。
|
|
|
|
|
|
|
|
|
|
+````python
|
|
|
|
|
+def to_openai_schema(self) -> Dict[str, Any]:
|
|
|
|
|
+ """转换为 OpenAI function calling schema 格式
|
|
|
|
|
+
|
|
|
|
|
+ 用于 FunctionCallAgent,使工具能够被 OpenAI 原生 function calling 使用
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ 符合 OpenAI function calling 标准的 schema
|
|
|
|
|
+ """
|
|
|
|
|
+ parameters = self.get_parameters()
|
|
|
|
|
+
|
|
|
|
|
+ # 构建 properties
|
|
|
|
|
+ properties = {}
|
|
|
|
|
+ required = []
|
|
|
|
|
+
|
|
|
|
|
+ for param in parameters:
|
|
|
|
|
+ # 基础属性定义
|
|
|
|
|
+ prop = {
|
|
|
|
|
+ "type": param.type,
|
|
|
|
|
+ "description": param.description
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ # 如果有默认值,添加到描述中(OpenAI schema 不支持 default 字段)
|
|
|
|
|
+ if param.default is not None:
|
|
|
|
|
+ prop["description"] = f"{param.description} (默认: {param.default})"
|
|
|
|
|
+
|
|
|
|
|
+ # 如果是数组类型,添加 items 定义
|
|
|
|
|
+ if param.type == "array":
|
|
|
|
|
+ prop["items"] = {"type": "string"} # 默认字符串数组
|
|
|
|
|
+
|
|
|
|
|
+ properties[param.name] = prop
|
|
|
|
|
+
|
|
|
|
|
+ # 收集必需参数
|
|
|
|
|
+ if param.required:
|
|
|
|
|
+ required.append(param.name)
|
|
|
|
|
+
|
|
|
|
|
+ return {
|
|
|
|
|
+ "type": "function",
|
|
|
|
|
+ "function": {
|
|
|
|
|
+ "name": self.name,
|
|
|
|
|
+ "description": self.description,
|
|
|
|
|
+ "parameters": {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": properties,
|
|
|
|
|
+ "required": required
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+````
|
|
|
|
|
+这个方法生成的schema可以直接用于原生的OpenAI SDK的工具调用。
|
|
|
|
|
+
|
|
|
### 7.5.2 自定义工具开发
|
|
### 7.5.2 自定义工具开发
|
|
|
|
|
|
|
|
有了基础设施后,我们来看看如何开发一个完整的自定义工具。数学计算工具是一个很好的例子,因为它简单直观,最直接的方式是使用ToolRegistry的函数注册功能。
|
|
有了基础设施后,我们来看看如何开发一个完整的自定义工具。数学计算工具是一个很好的例子,因为它简单直观,最直接的方式是使用ToolRegistry的函数注册功能。
|