mirror of
https://github.com/langgenius/dify.git
synced 2026-03-07 00:26:36 +08:00
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Sequence
|
|
from typing import Any
|
|
|
|
from core.app.entities.app_invoke_entities import InvokeFrom
|
|
from core.tools.__base.tool import Tool
|
|
from core.tools.entities.tool_entities import ToolInvokeFrom, ToolParameter, ToolProviderType
|
|
from core.tools.tool_manager import ToolManager
|
|
|
|
OUTPUT_TOOL_PROVIDER = "agent_output"
|
|
|
|
OUTPUT_TEXT_TOOL = "output_text"
|
|
FINAL_OUTPUT_TOOL = "final_output_answer"
|
|
FINAL_STRUCTURED_OUTPUT_TOOL = "final_structured_output"
|
|
ILLEGAL_OUTPUT_TOOL = "illegal_output"
|
|
|
|
OUTPUT_TOOL_NAMES: Sequence[str] = (
|
|
OUTPUT_TEXT_TOOL,
|
|
FINAL_OUTPUT_TOOL,
|
|
FINAL_STRUCTURED_OUTPUT_TOOL,
|
|
ILLEGAL_OUTPUT_TOOL,
|
|
)
|
|
|
|
OUTPUT_TOOL_NAME_SET = set(OUTPUT_TOOL_NAMES)
|
|
|
|
|
|
def build_agent_output_tools(
|
|
*,
|
|
tenant_id: str,
|
|
invoke_from: InvokeFrom,
|
|
tool_invoke_from: ToolInvokeFrom,
|
|
structured_output_schema: dict[str, Any] | None = None,
|
|
) -> list[Tool]:
|
|
tools: list[Tool] = []
|
|
for tool_name in OUTPUT_TOOL_NAMES:
|
|
tool = ToolManager.get_tool_runtime(
|
|
provider_type=ToolProviderType.BUILT_IN,
|
|
provider_id=OUTPUT_TOOL_PROVIDER,
|
|
tool_name=tool_name,
|
|
tenant_id=tenant_id,
|
|
invoke_from=invoke_from,
|
|
tool_invoke_from=tool_invoke_from,
|
|
)
|
|
|
|
if tool_name == FINAL_STRUCTURED_OUTPUT_TOOL and structured_output_schema:
|
|
tool.entity = tool.entity.model_copy(deep=True)
|
|
for parameter in tool.entity.parameters:
|
|
if parameter.name != "data":
|
|
continue
|
|
parameter.type = ToolParameter.ToolParameterType.OBJECT
|
|
parameter.form = ToolParameter.ToolParameterForm.LLM
|
|
parameter.required = True
|
|
parameter.input_schema = structured_output_schema
|
|
tools.append(tool)
|
|
|
|
return tools
|