Voice agent that picks a tool, runs it, and reads the result back.
The agent reads a registered tool catalogue, the LLM picks the tool, the tool-executor calls it through your STRONGLY_SERVICES, the result comes back as voice. No raw URLs in node configs.
No black box. Each step is a typed-frame node you can edit, monitor, and replace.
User speaks the request. STT transcribes.
The LLM is given the tool catalogue (datasource queries, REST endpoints, internal APIs). It returns a tool call with arguments.
streaming-tool-router validates the call against the catalogue. streaming-tool-executor runs it through STRONGLY_SERVICES - never against a raw URL.
The result feeds streaming-tool-result-formatter. The formatter shapes it into prose. TTS reads it back.
Streaming graph contract, observability, and cost discipline come standard. The agent ships with a full test suite that runs in CI on every node version bump.
The tool-router only invokes tools the LLM is allowed to call. The catalogue lives in node config - versioned, reviewable, auditable. No prompt-injected tool names execute.
Every tool call resolves through STRONGLY_SERVICES. The agent never holds a database URL, an API key, or a service hostname directly. Rotation, RBAC, and audit happen at the platform layer.
The raw tool response (JSON, rows, blobs) goes through streaming-tool-result-formatter. The formatter renders human-readable prose for TTS - and a structured side-channel for downstream nodes.
STT, LLM, tool-router, tool-executor, formatter, and TTS all run behind the typed-frame contract. The user hears 'looking that up…' before the tool returns.
The current pattern is single-shot: one tool call per turn. Multi-step loops await runtime cycle support - same graph contract, just unblocked when ADR-S16 cycles ship.
Tool name, argument shape, latency, and result size land on every span. Find slow tools, broken endpoints, or arg drift in the canvas overlay.
Every dependency is a registered Strongly service or a model you control. Swap any one of them in the install wizard. The graph stays intact.
The marketplace template is the graph. Every customisation below is a config change or a single-node addition - never a rewrite.
Drop a new datasource into the workflow's STRONGLY_SERVICES, register it in the tool catalogue, redeploy. The LLM picks it up on the next session.
Per-org or per-role allow-lists in the tool-router config. The same workflow can serve admins (full catalogue) and end-users (read-only subset).
Edit the tool-result-formatter template per tool. Tabular results → 'top three ranked by X'. Single-row results → narrative. Errors → graceful apology.
Insert streaming-tool-cache between the router and the executor. Repeated calls within the TTL skip the network hop entirely.
Add streaming-conversation-store tagged with tool name and result hash. Compliance teams replay every tool invocation.
We don't leave until it runs. Talk to a forward-deployed engineer about deploying Agent With Tool Loop into your environment with your STT, your LLM, your TTS, your data.
Schedule a Demo