Skip to content

Agent events

Watch an agent run through a pull-based event stream and decide whether a tool may run.

The example defines a runtime JSON schema with rawTool, asks for approval before deleteFile runs, and denies that request. Text, errors, and approval events are handled while the run continues in the background.

import std/[asyncdispatch, json, os]
import nimgent
import nimgent/agent
import nimgent/providers/openai
let model = openAI(getEnv("OPENAI_API_KEY")).model("gpt-4o-mini")
let deleteTool = rawTool("deleteFile", "Delete a file", %*{
"type": "object", "properties": {"path": {"type": "string"}},
"required": ["path"]},
proc (_: ToolContext, input: JsonNode): ToolResult =
ToolResult(output: "deleted " & input["path"].getStr))
let researcher = newAgent(model,
instructions = "Use tools when useful.",
tools = @[deleteTool],
approvalPolicy = proc (_: int, call: ContentBlock,
_: Tool): ToolApproval =
if call.name == "deleteFile":
ToolApproval(mode: tamAsk, reason: "This deletes a file.")
else:
ToolApproval(mode: tamAllow))
let events = researcher.events("Clean up the workspace.")
while true:
let item = waitFor events.read()
if not item[0]: break
let event = item[1]
case event.kind
of aeTextDelta:
stdout.write event.text
of aeToolApprovalRequired:
echo "\nApprove ", event.approval.toolName, "?"
event.approval.deny()
of aeError:
echo "\nagent error: ", event.error.msg
else:
discard
discard waitFor events.result
echo ""

Run it from the repository root:

Terminal window
OPENAI_API_KEY=... nim c -r examples/agent_events.nim

View the source example