# 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`: ```julia # 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 ```julia 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.