90 lines
2.8 KiB
Julia
90 lines
2.8 KiB
Julia
"""
|
|
Validate required arguments for the getTime tool.
|
|
|
|
Demonstrates custom validation beyond simple required-field checking:
|
|
- Ensures at least one time source (timezone or city) is provided
|
|
- Validates timezone is in IANA format if specified
|
|
- Validates city name is not empty if specified
|
|
|
|
# Arguments
|
|
- `args::Dict{String,Any}`: Arguments from the LLM
|
|
|
|
# Returns
|
|
- `nothing` if validation passes
|
|
- `String` error message if validation fails
|
|
"""
|
|
function validateRequiredArgs(args::Dict{String,Any})::Union{Nothing,String}
|
|
tz = get(args, "timezone", nothing)
|
|
city = get(args, "city", "")
|
|
|
|
hasTz = tz !== nothing && !isempty(tz)
|
|
hasCity = !isempty(city)
|
|
|
|
# At least one of timezone or city is required
|
|
if !hasTz && !hasCity
|
|
return "Missing required argument: provide at least one of 'timezone' or 'city'"
|
|
end
|
|
|
|
# Validate timezone format (IANA tz database: "Continent/City" or "Continent/City/SubCity")
|
|
if hasTz
|
|
tz_str = string(tz)
|
|
if !occursin(r"^[A-Za-z]+\/[A-Za-z]+(/[A-Za-z]+)*$", tz_str)
|
|
return "Invalid timezone format: '$tz_str'. Use IANA format, e.g. 'America/New_York' or 'Asia/Tokyo'"
|
|
end
|
|
end
|
|
|
|
return nothing
|
|
end
|
|
|
|
"""
|
|
Execute the getTime tool.
|
|
|
|
# Arguments
|
|
- `toolCallId::String`: Unique identifier for this tool call
|
|
- `args::Dict{String,Any}`: Parsed arguments from the LLM
|
|
- `signal::Union{Nothing,abortSignal}`: Optional abort signal
|
|
- `onPartialResult::Function`: Callback for streaming partial results
|
|
|
|
# Returns
|
|
- `agentToolResult`: Result content with current time data
|
|
"""
|
|
function executeTool(toolCallId::String, args::Dict{String,Any}, signal::Union{Nothing,abortSignal}, onPartialResult::Function)::agentToolResult
|
|
tz = get(args, "timezone", nothing)
|
|
city = get(args, "city", "")
|
|
|
|
# Simulate time lookup — replace with actual timezone API call
|
|
if tz !== nothing
|
|
result = "Current time in $(tz): $(now())"
|
|
else
|
|
result = "Current time in $(city): $(now())"
|
|
end
|
|
|
|
return agentToolResult(
|
|
[textContent(result)],
|
|
Dict{Any,Any}(), nothing, false
|
|
)
|
|
end
|
|
|
|
"""
|
|
Define and return the getTime agentTool.
|
|
"""
|
|
function getTool()::agentTool
|
|
return agentTool(
|
|
name = "getTime",
|
|
label = "Time Lookup",
|
|
description = "Get current local time for a timezone or city.",
|
|
inputSchema = Dict{String,Any}(
|
|
"type" => "object",
|
|
"properties" => Dict(
|
|
"timezone" => Dict("type" => "string", "description", "IANA timezone, e.g. 'America/New_York'"),
|
|
"city" => Dict("type" => "string", "description", "City name as fallback")
|
|
),
|
|
"required" => []
|
|
),
|
|
execute = executeTool,
|
|
prepareArguments = nothing,
|
|
validateRequiredArgs = validateRequiredArgs,
|
|
parallelToolExecute = false
|
|
)
|
|
end
|