Files
YiemAgent/docs/loadtools.md
T
2026-08-08 08:51:07 +07:00

3.0 KiB

Dynamic Tool Loading

Tools can be loaded dynamically from .jl files in the src/tools/ directory without hardcoding filenames in the main module.

How It Works

  1. src/tools/registry.jl defines a loadTools(dir::String) function that scans a directory for .jl files
  2. Each tool file must define a single function: getTool()::agentTool
  3. loadTools() sorts files alphabetically, includes each one, calls getTool(), and registers the result
  4. Loaded tools are returned as Vector{agentTool} for use when constructing a yiemAgent

Directory Structure

src/
├── tools/
│   ├── registry.jl      # Tool loader (do not edit)
│   ├── getWeather.jl   # Your tool
│   └── query_db.jl      # Another tool
├── type.jl
├── utils.jl
├── agentCore.jl
├── api.jl
└── YiemAgent.jl

Creating a Tool

Each .jl file in src/tools/ must define getTool() returning an agentTool:

# src/tools/getWeather.jl
function getTool()::agentTool
    return agentTool(
        name = "getWeather",
        label = "Weather Lookup",
        description = "Fetch current weather and forecast for a given city.",
        inputSchema = Dict{String,Any}(
            "type" => "object",
            "properties" => Dict(
                "city" => Dict("type" => "string", "description" => "City and country"),
                "units" => Dict("type" => "string", "enum" => ["celsius", "fahrenheit"], "default" => "celsius")
            ),
            "required" => ["city"]
        ),
        execute = (toolCallId, args, signal, onPartialResult) -> begin
            city = args["city"]
            return agentToolResult(
                [textContent("Weather in $(city): Sunny, 22C")],
                Dict{Any,Any}(), nothing, false
            )
        end,
        prepareArguments = nothing,
        parallelToolExecute = false
    )
end

No module wrapper needed — the registry includes each file in the current module scope so all types (agentTool, textContent, agentToolResult, etc.) resolve correctly.

Loading Tools

using .YiemAgent
using .YiemAgent: toolRegistry

# Load all tool files from src/tools/
tools = YiemAgent.loadTools(joinpath(@__DIR__, "src", "tools"))

# Create agent with loaded tools
agent = yiemAgent(
    systemPrompt = "You are a helpful assistant.",
    model = my_model,
    tools = tools,
    llmCall = my_llm_call,
    agentEventSink = my_event_sink
)

Available Functions

Function Description
loadTools(dir::String) Scan directory and load all .jl tool files
registerTool(tool::agentTool) Register a single tool into the global registry
getTools() Get deep copy of all registered tools
listTools() List all registered tools as (name, label) pairs
clearTools() Clear the global registry

File Loading Order

Files are sorted alphabetically before loading, so 01_database.jl loads before 02_weather.jl. This ensures deterministic registration order.