当前位置: 首页 > news >正文

Dify中的Agent策略插件开发例子:以Function Calling为例

本文使用Dify v1.0.0-beta.1版本。Agent 策略插件能够帮助 LLM 执行推理或决策逻辑,包括工具选择、调用和结果处理,以更加自动化的方式处理问题。Dify官方实现的Agent策略插件包括Function CallingReason+ReAct(Reason+Act)。本文重点介绍Function Calling具体实现。

一.初始化插件模板

1.初始化Agent插件模板

运行以下命令,初始化 Agent 插件开发模板。如下所示:

2.填写或选择配置信息

按照页面提示,填写或选择对应信息。如下所示:

3.Agent插件模板代码结构

初始化插件模板后将生成一个代码文件夹,包含插件开发过程中所需的完整资源。熟悉 Agent 策略插件的整体代码结构有助于插件的开发过程。插件的功能代码集中在 strategies/ 目录内。

二.开发插件功能

Agent 策略插件的开发主要围绕以下两个文件展开:

  • 插件声明文件:strategies/function_calling.yaml

  • 插件功能代码:strategies/function_calling.py

1.定义参数

要创建一个Agent插件,首先需要在 strategies/function_calling.yaml 文件中定义插件所需的参数。这些参数决定了插件的核心功能,比如调用 LLM 模型和使用工具的能力。

官方建议优先配置以下五个基础参数:

  • model:指定要调用的大语言模型(LLM),如 GPT-4o、DeepSeek-V3 等。
  • tools:定义插件可以使用的工具列表,增强插件功能。
  • instruction:提供初始的系统提示消息内容,帮助模型理解和执行任务。
  • query:设置与模型交互的提示词或输入内容。
  • maximum_iterations:限制插件执行的最大迭代次数,避免过度计算。

完成参数配置后,插件将在自动生成相应的设置的使用页面,方便进行直观、便捷的调整和使用。

2.获取参数并执行

接下来需要先在 strategies/function_calling.py 文件内定义 Agent 参数类供后续使用。校验传入参数,如下所示:

from dify_plugin.entities.agent import AgentInvokeMessage
from dify_plugin.interfaces.agent import AgentModelConfig, AgentStrategy, ToolEntity
from pydantic import BaseModelclass FunctionCallingParams(BaseModel):query: strinstruction: str | Nonemodel: AgentModelConfigtools: list[ToolEntity] | Nonemaximum_iterations: int = 3

获取参数后,执行具体的业务逻辑,如下所示:

class FunctionCallingAgentStrategy(AgentStrategy):def __init__(self, session):super().__init__(session)self.query = ""def _invoke(self, parameters: dict[str, Any]) -> Generator[AgentInvokeMessage]:"""Run FunctionCall agent application"""fc_params = FunctionCallingParams(**parameters)......

3.调用模型

Agent 策略插件中,调用模型是核心执行逻辑之一。可以通过 SDK 提供的 session.model.llm.invoke() 方法高效地调用 LLM 模型,实现文本生成、对话处理等功能。

def invoke(self,model_config: LLMModelConfig | dict,prompt_messages: list[PromptMessage],tools: list[PromptMessageTool] | None = None,stop: list[str] | None = None,stream: bool = True,
) -> Generator[LLMResultChunk, None, None] | LLMResult: ...

如果希望模型具备调用工具的能力,首先需要确保模型能够输出符合工具调用格式的输入参数。即模型需要根据用户指令生成符合工具接口要求的参数。构造参数如下所示:

  • model_config:模型配置信息
  • prompt_messages:提示词
  • tools:工具信息(Function Calling 相关)
  • stop:停止符
  • stream:是否支持流式输出

这样就实现了以下功能:用户输入指令后,Agent 策略插件会自动调用 LLM,根据生成结果构建并传递工具调用所需的参数,使模型能够灵活调度已接入的工具,高效完成复杂任务。

4.调用工具

填写工具参数后,需赋予 Agent 策略插件实际调用工具的能力。可以通过 SDK 中的session.tool.invoke() 函数进行工具调用。构造参数如下所示:

  • provider_type:提供商类型
  • provider:提供商
  • tool_name:工具名称
  • parameters:输入参数
def invoke(self,provider_type: ToolProviderType,provider: str,tool_name: str,parameters: dict[str, Any],
) -> Generator[ToolInvokeMessage, None, None]:"""Invoke tool"""return self._backwards_invoke(InvokeType.Tool,ToolInvokeMessage,{"tool_type": provider_type.value,"provider": provider,"tool": tool_name,"tool_parameters": parameters,},)

若希望通过 LLM 直接生成参数完成工具调用,可参考以下工具调用的示例代码:

tool_instances = ({tool.identity.name: tool for tool in params.tools} if params.tools else {}
)
for tool_call_id, tool_call_name, tool_call_args in tool_calls:tool_instance = tool_instances[tool_call_name]self.session.tool.invoke(provider_type=ToolProviderType.BUILT_IN,provider=tool_instance.identity.provider,tool_name=tool_instance.identity.name,parameters={**tool_instance.runtime_parameters, **tool_call_args},)

实现这部分功能代码后,Agent策略插件将具备自动Function Calling的能力,比如自动获取当前时间。如下所示:

5.日志创建

Agent 策略插件中,通常需要执行多轮操作才能完成复杂任务。记录每轮操作的执行结果对于开发者来说非常重要,有助于追踪 Agent 的执行过程、分析每一步的决策依据,从而更好地评估和优化策略效果。

为了实现这一功能,可以利用 SDK 中的 create_log_messagefinish_log_message 方法记录日志。这种方式不仅可以在模型调用前后实时记录操作状态,还能帮助开发者快速定位问题。

日志创建具体使用场景示例,如下所示:

  • 在模型调用之前,记录一条"开始调用模型"的日志,帮助开发者明确任务执行进度。
  • 在模型调用成功后,记录一条"调用成功"的日志,方便追踪模型响应的完整性。
model_log = self.create_log_message(label=f"{params.model.model} Thought",data={},metadata={"start_at": model_started_at, "provider": params.model.provider},status=ToolInvokeMessage.LogMessage.LogStatus.START,)
yield model_log
self.session.model.llm.invoke(...)
yield self.finish_log_message(log=model_log,data={"output": response,"tool_name": tool_call_names,"tool_input": tool_call_inputs,},metadata={"started_at": model_started_at,"finished_at": time.perf_counter(),"elapsed_time": time.perf_counter() - model_started_at,"provider": params.model.provider,},
)

设置完成后,工作流日志将输出执行结果,如下所示:

三.调试、打包和发布插件

1.调试插件

首先将插件运行起来,如下所示:

然后就可以看到带有DEBUGGING PLUGIN标识的function_calling插件,如下所示:

2.打包和发布插件

具体操作不再赘述,详细参考文献[4]。

四.FunctionCallingAgentStrategy类的方法

1.类的方法总结

方法名称方法功能解析输入参数及解释输出参数及解释
__init__初始化FunctionCallingAgentStrategysession: 会话对象
_invoke运行 FunctionCall 代理应用程序parameters: 参数字典Generator[AgentInvokeMessage]: 代理调用消息生成器
check_tool_calls检查 LLM 结果块中是否有工具调用llm_result_chunk: LLM 结果块bool: 是否有工具调用
check_blocking_tool_calls检查 LLM 结果中是否有阻塞工具调用llm_result: LLM 结果bool: 是否有阻塞工具调用
extract_tool_calls从 LLM 结果块中提取工具调用llm_result_chunk: LLM 结果块list[tuple[str, str, dict[str, Any]]]: 工具调用列表
extract_blocking_tool_calls从 LLM 结果中提取阻塞工具调用llm_result: LLM 结果list[tuple[str, str, dict[str, Any]]]: 阻塞工具调用列表
_init_system_message初始化系统消息prompt_template: 提示模板prompt_messages: 提示消息列表list[PromptMessage]: 提示消息列表
_organize_user_query组织用户查询query: 查询字符串prompt_messages: 提示消息列表list[PromptMessage]: 提示消息列表
_clear_user_prompt_image_messages清除用户提示中的图像消息prompt_messages: 提示消息列表list[PromptMessage]: 提示消息列表
_organize_prompt_messages组织提示消息current_thoughts: 当前思路列表history_prompt_messages: 历史提示消息列表list[PromptMessage]: 提示消息列表

2._invoke()执行过程

FunctionCallingAgentStrategy类中的_invoke方法是一个核心方法,用于实现基于大语言模型(LLM)的多轮工具调用代理策略。以下是该方法的详细执行过程分析:

2.1 参数解析与初始化
  • 输入参数:接收字典参数并转换为FunctionCallingParams对象,包含:

    • query: 用户原始查询

    • instruction: 系统级指令(可选)

    • model: 模型配置(如模型名称、供应商、参数等)

    • tools: 可用工具列表(每个工具包含名称、参数、供应商等信息)

    • maximum_iterations: 最大迭代轮次(默认3次)

  • 初始化

    • 构建初始系统提示消息(SystemPromptMessage)。

    • 将工具列表转换为字典格式,便于后续通过工具名称快速查找。

    • 转换工具信息为模型需要的格式(prompt_messages_tools),用于告知LLM可用工具。

    • 初始化关键变量:

      • 初始化迭代步数iteration_step和最大迭代步数max_iteration_steps

      • current_thoughts: 存储每轮的模型响应和工具调用结果。

      • function_call_state: 标记是否仍需工具调用。

      • 初始化LLM使用量llm_usage和最终答案final_answer

2.2 多轮迭代处理

通过while循环进行多轮处理,直到无工具调用或达到最大轮次。

(1)单轮初始化
  • 生成本轮开始的日志消息(round_log)。

  • 若为最后一轮,清空工具列表,强制模型生成最终回答。

  • 组织当前提示消息(prompt_messages):

    • 合并历史消息、用户查询和当前思考。

    • 首次迭代后,清理用户消息中的图片内容(仅保留文本占位符)。

(2)调用LLM模型
  • 调整模型的max_tokens参数,确保不超过模型限制。

  • 流式处理stream=True):

    • 逐块处理响应(LLMResultChunk),实时检测工具调用。

    • 收集响应内容(response)和工具调用信息(tool_calls)。

  • 非流式处理

    • 直接处理完整响应(LLMResult),提取工具调用和内容。
  • 记录资源使用情况(llm_usage)。

(3)工具调用处理
  • 提取工具调用

    • 解析LLM响应中的工具调用信息(tool_call_id, tool_call_name, tool_call_args)。

    • 若存在工具调用,设置function_call_state=True,触发后续处理。

  • 执行工具调用

    • 遍历每个工具调用,生成工具调用日志。

    • 通过session.tool.invoke实际调用工具,处理可能的多种返回类型(文本、链接、图片等)。

    • 收集工具结果,构建ToolPromptMessage并添加到current_thoughts,供下轮使用。

(4)本轮收尾
  • 更新提示消息中的工具信息(如参数变化)。

  • 生成本轮结束日志,包含响应内容、工具结果、耗时和资源消耗。

2.3 最终结果与资源统计
  • 当所有迭代完成,生成包含总资源消耗的JSON消息:

    • total_price: 累计费用。

    • currency: 费用单位。

    • total_tokens: 总令牌数。

3.关键辅助方法

  • check_tool_calls/check_blocking_tool_calls: 检测响应中是否存在工具调用。

  • extract_tool_calls/extract_blocking_tool_calls: 从响应中提取工具调用细节。

  • _init_system_message: 确保系统消息存在于提示中。

  • _organize_user_query: 将用户查询添加到提示消息。

  • _clear_user_prompt_image_messages: 清理用户消息中的图片内容(避免多轮迭代中的冗余)。

4.异常与边界处理

  • 工具不存在:返回错误信息,避免流程中断。

  • JSON解析错误:使用ensure_ascii=False处理非ASCII字符。

  • 资源统计:累计每轮的令牌数和费用,确保最终结果准确。

5.流程示意图

通过这种多轮迭代策略,FunctionCallingAgentStrategy能够动态结合LLM的推理能力和外部工具的执行,逐步解决复杂任务,同时记录详细的执行日志和资源消耗,适合需要多步交互的应用场景。

五.可能遇到的问题

1.Failed to transform agent message

因为dify-plugin-daemon源码跑在WSL2中,前端和后端源码跑在宿主机中,导致无法访问宿主机的5001端口。具体报错,如下所示:

解决方案是在WSL Settings中,设置网络模式为Mirrored,打开主机地址环回,如下所示:

六.Chatflow中的Agent执行过程

1.event流

data: {"event": "workflow_started", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "workflow_id": "98838bd9-e2a3-4c73-abf8-1d1f1327e9dd", "sequence_number": 77, "inputs": {"sys.query": "\u73b0\u5728\u51e0\u70b9\u4e86", "sys.files": [], "sys.conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "sys.user_id": "b3d39b0d-f73f-40fe-b406-e3035c755d11", "sys.dialogue_count": 0, "sys.app_id": "bd18d1d5-8b35-4126-810a-a35748e8ef77", "sys.workflow_id": "98838bd9-e2a3-4c73-abf8-1d1f1327e9dd", "sys.workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a"}, "created_at": 1738740364}}data: {"event": "node_started", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "0ac54d2e-437a-4517-9405-12cf701d3078", "node_id": "1738648646598", "node_type": "start", "title": "\u5f00\u59cb", "index": 1, "predecessor_node_id": null, "inputs": null, "created_at": 1738740364, "extras": {}, "parallel_id": null, "parallel_start_node_id": null, "parent_parallel_id": null, "parent_parallel_start_node_id": null, "iteration_id": null, "parallel_run_id": null}}data: {"event": "node_finished", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "0ac54d2e-437a-4517-9405-12cf701d3078", "node_id": "1738648646598", "node_type": "start", "title": "\u5f00\u59cb", "index": 1, "predecessor_node_id": null, "inputs": {"sys.query": "\u73b0\u5728\u51e0\u70b9\u4e86", "sys.files": [], "sys.conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "sys.user_id": "b3d39b0d-f73f-40fe-b406-e3035c755d11", "sys.dialogue_count": 0, "sys.app_id": "bd18d1d5-8b35-4126-810a-a35748e8ef77", "sys.workflow_id": "98838bd9-e2a3-4c73-abf8-1d1f1327e9dd", "sys.workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a"}, "process_data": null, "outputs": {"sys.query": "\u73b0\u5728\u51e0\u70b9\u4e86", "sys.files": [], "sys.conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "sys.user_id": "b3d39b0d-f73f-40fe-b406-e3035c755d11", "sys.dialogue_count": 0, "sys.app_id": "bd18d1d5-8b35-4126-810a-a35748e8ef77", "sys.workflow_id": "98838bd9-e2a3-4c73-abf8-1d1f1327e9dd", "sys.workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a"}, "status": "succeeded", "error": null, "elapsed_time": 0.034015, "execution_metadata": null, "created_at": 1738740364, "finished_at": 1738740364, "files": [], "parallel_id": null, "parallel_start_node_id": null, "parent_parallel_id": null, "parent_parallel_start_node_id": null, "iteration_id": null}}data: {"event": "node_started", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "5b98263f-55d0-495a-a712-e11d815b6507", "node_id": "1738648773789", "node_type": "agent", "title": "Agent", "index": 2, "predecessor_node_id": "1738648646598", "inputs": null, "created_at": 1738740364, "extras": {}, "parallel_id": null, "parallel_start_node_id": null, "parent_parallel_id": null, "parent_parallel_start_node_id": null, "iteration_id": null, "parallel_run_id": null}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "label": "ROUND 1", "parent_id": null, "error": null, "status": "start", "data": {}, "metadata": {"started_at": 50773.5850235}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "ade7e662-7116-42a0-b16a-7f79d11177e9", "label": "gpt-4o Thought", "parent_id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "error": null, "status": "start", "data": {}, "metadata": {"provider": "langgenius/openai/openai", "start_at": 50773.5855136, "icon": "1bd032bb73218a5d141b80cab71112cc555b607783553a90933015b7a69a5c24.svg"}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "ade7e662-7116-42a0-b16a-7f79d11177e9", "label": "gpt-4o Thought", "parent_id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "error": null, "status": "success", "data": {"output": "", "tool_input": "{\"current_time\": {}}", "tool_name": "current_time"}, "metadata": {"currency": "USD", "elapsed_time": 2.4041311999972095, "finished_at": 50775.9896446, "provider": "langgenius/openai/openai", "started_at": 50773.5855136, "total_price": "0.00038", "total_tokens": 56, "icon": "1bd032bb73218a5d141b80cab71112cc555b607783553a90933015b7a69a5c24.svg"}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "8b0ba084-8cf4-4726-b02e-c21b1dd973a4", "label": "CALL current_time", "parent_id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "error": null, "status": "start", "data": {}, "metadata": {"provider": "time", "started_at": 50775.9900423, "icon": "http://127.0.0.1:5001/console/api/workspaces/current/tool-provider/builtin/time/icon"}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "8b0ba084-8cf4-4726-b02e-c21b1dd973a4", "label": "CALL current_time", "parent_id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "error": null, "status": "success", "data": {"output": {"meta": {"error": "", "time_cost": 0, "tool_config": {}}, "tool_call_id": "current_time", "tool_call_name": "current_time", "tool_response": "2025-02-05 23:26:06"}}, "metadata": {"elapsed_time": 0.036891399999149144, "finished_at": 50776.0269327, "provider": "time", "started_at": 50775.9900415, "icon": "http://127.0.0.1:5001/console/api/workspaces/current/tool-provider/builtin/time/icon"}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "label": "ROUND 1", "parent_id": null, "error": null, "status": "success", "data": {"output": {"llm_response": {"message": {"text": "2025-02-05 23:26:06"}, "meta": null, "type": "text"}, "tool_responses": [{"meta": {"error": "", "time_cost": 0, "tool_config": {}}, "tool_call_id": "current_time", "tool_call_name": "current_time", "tool_response": "2025-02-05 23:26:06"}]}}, "metadata": {"currency": "USD", "elapsed_time": 2.4422672999935457, "finished_at": 50776.0272907, "started_at": 50773.5850235, "total_price": "0.00038", "total_tokens": 56}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "9f74dd7e-a936-4366-876f-323e8fd229cf", "label": "ROUND 2", "parent_id": null, "error": null, "status": "start", "data": {}, "metadata": {"started_at": 50776.0274993}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "293b1f6a-afd7-4a1a-8253-815a5e9bcef0", "label": "gpt-4o Thought", "parent_id": "9f74dd7e-a936-4366-876f-323e8fd229cf", "error": null, "status": "start", "data": {}, "metadata": {"provider": "langgenius/openai/openai", "start_at": 50776.0280168, "icon": "1bd032bb73218a5d141b80cab71112cc555b607783553a90933015b7a69a5c24.svg"}}}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\u5f53\u524d", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\u65f6\u95f4", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\u662f", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "202", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "5", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\u5e74", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "2", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\u6708", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "5", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\u65e5", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\uff0c", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "23", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": ":", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "26", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "message", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "answer": "\u3002", "from_variable_selector": ["1738648773789", "text"]}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "293b1f6a-afd7-4a1a-8253-815a5e9bcef0", "label": "gpt-4o Thought", "parent_id": "9f74dd7e-a936-4366-876f-323e8fd229cf", "error": null, "status": "success", "data": {"output": "\u5f53\u524d\u65f6\u95f4\u662f2025\u5e742\u67085\u65e5\uff0c23:26\u3002", "tool_input": "", "tool_name": ""}, "metadata": {"currency": "USD", "elapsed_time": 2.759766099996341, "finished_at": 50778.7877826, "provider": "langgenius/openai/openai", "started_at": 50776.0280168, "total_price": "0.000575", "total_tokens": 83, "icon": "1bd032bb73218a5d141b80cab71112cc555b607783553a90933015b7a69a5c24.svg"}}}data: {"event": "agent_log", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "data": {"node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "id": "9f74dd7e-a936-4366-876f-323e8fd229cf", "label": "ROUND 2", "parent_id": null, "error": null, "status": "success", "data": {"output": {"llm_response": "\u5f53\u524d\u65f6\u95f4\u662f2025\u5e742\u67085\u65e5\uff0c23:26\u3002", "tool_responses": []}}, "metadata": {"currency": "USD", "elapsed_time": 2.7609248000007938, "finished_at": 50778.7884238, "started_at": 50776.0274993, "total_price": "0.000575", "total_tokens": 83}}}data: {"event": "node_finished", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "5b98263f-55d0-495a-a712-e11d815b6507", "node_id": "1738648773789", "node_type": "agent", "title": "Agent", "index": 2, "predecessor_node_id": "1738648646598", "inputs": {"model": {"provider": "langgenius/openai/openai", "model": "gpt-4o", "model_type": "llm", "mode": "chat", "type": "model-selector", "completion_params": {"temperature": 0.2, "top_p": 0.75, "presence_penalty": 0.5, "frequency_penalty": 0.5}}, "tools": [{"provider_name": "time", "tool_name": "current_time", "parameters": {"format": "%Y-%m-%d %H:%M:%S", "timezone": "Asia/Shanghai"}, "enabled": true, "extra": {"description": "\u83b7\u53d6\u5f53\u524d\u65f6\u95f4"}}], "instruction": "\u83b7\u53d6\u5f53\u524d\u65f6\u95f4", "query": "\u73b0\u5728\u51e0\u70b9\u4e86", "maximum_iterations": "3"}, "process_data": null, "outputs": {"text": "\u5f53\u524d\u65f6\u95f4\u662f2025\u5e742\u67085\u65e5\uff0c23:26\u3002", "files": [], "json": [{}]}, "status": "succeeded", "error": null, "elapsed_time": 5.74197, "execution_metadata": {"currency": "USD", "total_price": "0.000955", "total_tokens": 139, "tool_info": {"icon": "bf12203a5037a1b84c2d8c60a0627e50bedea89cf3f7722b794384aa497d10dc.svg", "agent_strategy": "function_calling"}, "agent_log": [{"id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "label": "ROUND 1", "node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "parent_id": null, "error": null, "status": "success", "data": {"output": {"llm_response": {"message": {"text": "2025-02-05 23:26:06"}, "meta": null, "type": "text"}, "tool_responses": [{"meta": {"error": "", "time_cost": 0, "tool_config": {}}, "tool_call_id": "current_time", "tool_call_name": "current_time", "tool_response": "2025-02-05 23:26:06"}]}}, "metadata": {"currency": "USD", "elapsed_time": 2.4422672999935457, "finished_at": 50776.0272907, "started_at": 50773.5850235, "total_price": "0.00038", "total_tokens": 56}}, {"id": "ade7e662-7116-42a0-b16a-7f79d11177e9", "label": "gpt-4o Thought", "node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "parent_id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "error": null, "status": "success", "data": {"output": "", "tool_input": "{\"current_time\": {}}", "tool_name": "current_time"}, "metadata": {"currency": "USD", "elapsed_time": 2.4041311999972095, "finished_at": 50775.9896446, "provider": "langgenius/openai/openai", "started_at": 50773.5855136, "total_price": "0.00038", "total_tokens": 56, "icon": "1bd032bb73218a5d141b80cab71112cc555b607783553a90933015b7a69a5c24.svg"}}, {"id": "8b0ba084-8cf4-4726-b02e-c21b1dd973a4", "label": "CALL current_time", "node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "parent_id": "7f40692f-d6cb-404d-aee7-9cdbd75c7b60", "error": null, "status": "success", "data": {"output": {"meta": {"error": "", "time_cost": 0, "tool_config": {}}, "tool_call_id": "current_time", "tool_call_name": "current_time", "tool_response": "2025-02-05 23:26:06"}}, "metadata": {"elapsed_time": 0.036891399999149144, "finished_at": 50776.0269327, "provider": "time", "started_at": 50775.9900415, "icon": "http://127.0.0.1:5001/console/api/workspaces/current/tool-provider/builtin/time/icon"}}, {"id": "9f74dd7e-a936-4366-876f-323e8fd229cf", "label": "ROUND 2", "node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "parent_id": null, "error": null, "status": "success", "data": {"output": {"llm_response": "\u5f53\u524d\u65f6\u95f4\u662f2025\u5e742\u67085\u65e5\uff0c23:26\u3002", "tool_responses": []}}, "metadata": {"currency": "USD", "elapsed_time": 2.7609248000007938, "finished_at": 50778.7884238, "started_at": 50776.0274993, "total_price": "0.000575", "total_tokens": 83}}, {"id": "293b1f6a-afd7-4a1a-8253-815a5e9bcef0", "label": "gpt-4o Thought", "node_execution_id": "ecb47f2e-7256-4189-af30-b81157d72845", "parent_id": "9f74dd7e-a936-4366-876f-323e8fd229cf", "error": null, "status": "success", "data": {"output": "\u5f53\u524d\u65f6\u95f4\u662f2025\u5e742\u67085\u65e5\uff0c23:26\u3002", "tool_input": "", "tool_name": ""}, "metadata": {"currency": "USD", "elapsed_time": 2.759766099996341, "finished_at": 50778.7877826, "provider": "langgenius/openai/openai", "started_at": 50776.0280168, "total_price": "0.000575", "total_tokens": 83, "icon": "1bd032bb73218a5d141b80cab71112cc555b607783553a90933015b7a69a5c24.svg"}}]}, "created_at": 1738740364, "finished_at": 1738740370, "files": [], "parallel_id": null, "parallel_start_node_id": null, "parent_parallel_id": null, "parent_parallel_start_node_id": null, "iteration_id": null}}data: {"event": "node_started", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "341a0507-45b3-4348-9174-606e7a82a162", "node_id": "answer", "node_type": "answer", "title": "\u76f4\u63a5\u56de\u590d", "index": 3, "predecessor_node_id": "1738648773789", "inputs": null, "created_at": 1738740370, "extras": {}, "parallel_id": null, "parallel_start_node_id": null, "parent_parallel_id": null, "parent_parallel_start_node_id": null, "iteration_id": null, "parallel_run_id": null}}data: {"event": "node_finished", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "341a0507-45b3-4348-9174-606e7a82a162", "node_id": "answer", "node_type": "answer", "title": "\u76f4\u63a5\u56de\u590d", "index": 3, "predecessor_node_id": "1738648773789", "inputs": null, "process_data": null, "outputs": {"answer": "\u5f53\u524d\u65f6\u95f4\u662f2025\u5e742\u67085\u65e5\uff0c23:26\u3002", "files": []}, "status": "succeeded", "error": null, "elapsed_time": 0.026624, "execution_metadata": null, "created_at": 1738740370, "finished_at": 1738740370, "files": [], "parallel_id": null, "parallel_start_node_id": null, "parent_parallel_id": null, "parent_parallel_start_node_id": null, "iteration_id": null}}data: {"event": "workflow_finished", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "workflow_run_id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "data": {"id": "ef93b6c1-4219-40e1-9253-e247ad188a3a", "workflow_id": "98838bd9-e2a3-4c73-abf8-1d1f1327e9dd", "sequence_number": 77, "status": "succeeded", "outputs": {"answer": "\u5f53\u524d\u65f6\u95f4\u662f2025\u5e742\u67085\u65e5\uff0c23:26\u3002"}, "error": null, "elapsed_time": 5.7938042000023415, "total_tokens": 139, "total_steps": 3, "created_by": {"id": "b3d39b0d-f73f-40fe-b406-e3035c755d11", "name": "ai408", "email": "913292836@qq.com"}, "created_at": 1738740364, "finished_at": 1738740370, "exceptions_count": 0, "files": []}}data: {"event": "message_end", "conversation_id": "c64faf26-0f38-4267-ba63-1392997e3319", "message_id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "created_at": 1738740364, "task_id": "1934b64d-e761-4a14-961b-a0f25bc9eb24", "id": "c9a6f7ac-6814-49ce-bce1-7aaea3230603", "metadata": {"usage": {"prompt_tokens": 0, "prompt_unit_price": "0.0", "prompt_price_unit": "0.0", "prompt_price": "0.0", "completion_tokens": 0, "completion_unit_price": "0.0", "completion_price_unit": "0.0", "completion_price": "0.0", "total_tokens": 0, "total_price": "0.0", "currency": "USD", "latency": 0.0}}, "files": []}

2.Agent节点输入和输出

Agent节点输入,如下所示:

{"model": {"provider": "langgenius/openai/openai","model": "gpt-4o","model_type": "llm","mode": "chat","type": "model-selector","completion_params": {"temperature": 0.2,"top_p": 0.75,"presence_penalty": 0.5,"frequency_penalty": 0.5}},"tools": [{"provider_name": "time","tool_name": "current_time","parameters": {"format": "%Y-%m-%d %H:%M:%S","timezone": "Asia/Shanghai"},"enabled": true,"extra": {"description": "获取当前时间"}}],"instruction": "获取当前时间","query": "现在几点了","maximum_iterations": "3"
}

Agent节点输出,如下所示:

{"text": "当前时间是2025年2月5日,23:26。","files": [],"json": [{}]
}

3.Agent策略function_calling的Round1

Agent策略function_callingRound1-GPT-4o Thought

{"output": "","tool_input": "{\"current_time\": {}}","tool_name": "current_time"
}

Agent策略function_callingRound1-CALL current_time

{"output": {"meta": {"error": "","time_cost": 0,"tool_config": {}},"tool_call_id": "current_time","tool_call_name": "current_time","tool_response": "2025-02-05 23:26:06"}
}

Agent策略function_callingRound1输出:

{"output": {"llm_response": {"message": {"text": "2025-02-05 23:26:06"},"meta": null,"type": "text"},"tool_responses": [{"meta": {"error": "","time_cost": 0,"tool_config": {}},"tool_call_id": "current_time","tool_call_name": "current_time","tool_response": "2025-02-05 23:26:06"}]}
}

4.Agent策略function_calling的Round2

Agent策略function_callingRound2-GPT-4o Thought

{"output": "当前时间是2025年2月5日,23:26。","tool_input": "","tool_name": ""
}

Agent策略function_callingRound2输出:

{"output": {"llm_response": "当前时间是2025年2月5日,23:26。","tool_responses": []}
}

参考文献

[1] Agent策略插件:https://docs.dify.ai/zh-hans/plugins/quick-start/develop-plugins/agent-strategy

[2] https://github.com/langgenius/dify-official-plugins/tree/main/agent-strategies/cot_agent/strategies

[3] Dify Agent策略:https://marketplace.dify.ai/plugins/langgenius/agent

[4] Dify中的GoogleSearch工具插件开发例子:https://z0yrmerhgi8.feishu.cn/wiki/Ib15wh1rSi8mWckvWROckoT2n6g

[5] Dify中的Agent策略插件开发例子:以Function Calling为例:https://z0yrmerhgi8.feishu.cn/wiki/SjUuwiRk6imo4Dkn4BBcZoCOn1f

http://www.xdnf.cn/news/661555.html

相关文章:

  • 重磅升级!Docusign IAM 2025 V1 版本上线,重塑智能协议新体验
  • Windows逆向工程提升之IMAGE_RUNTIME_FUNCTION_ENTRY
  • 按键状态机
  • FFmpeg 4.3 H265 二十二.3,avformat_open_input 支持打开的协议
  • 07-多线程案例-任务调度
  • NoteGen 如何使用 AI 进行记录
  • set和map简单模拟实现
  • TCP 三次握手过程详解
  • 【Java学习笔记】抽象类
  • 时间的基本概念及相关技术
  • 通用寄存器 专用寄存器
  • 大模型训练中的GPU作用解析
  • 项目三 - 任务8:实现词频统计功能
  • 基于Geotools的Worldpop世界人口tif解析-以中国2020年数据为例
  • 北京大学肖臻老师《区块链技术与应用》公开课:02-BTC-密码学原理
  • Excel快捷键大全
  • 深入理解Java装饰器模式:动态扩展对象功能的优雅之道
  • USB设备状态
  • pyhton基础【5】循环
  • uniapp 小说成品源码
  • Python爬虫实战:研究Selenium框架相关技术
  • NAT、代理服务、内网穿透
  • Python训练营打卡Day37
  • 经典文献阅读之--RT-Grasp(通过MLLM进行推理调优的机器人抓取)
  • 如何设计ES的冷热数据分离架构?Elasticsearch 集群如何实现高可用?如何避免脑裂问题?如果出现脑裂如何恢复?
  • 6.1 Q1|广州医科大学GBD发文 | 良性前列腺增生与合并症之间的相关性
  • mysql ACID 原理
  • OpenCV CUDA模块图像过滤------创建一个 Sobel 滤波器函数createSobelFilter()
  • 高并发下使用防重表做防重案例
  • Linux 常用操作步骤