tools
💡 Summary
This skill facilitates the registration and UI rendering of tools for LLMs in assistant-ui.
🎯 Target Audience
🤖 AI Roast: “Powerful, but the setup might scare off the impatient.”
Risk: Medium. Review: outbound network access (SSRF, data egress); filesystem read/write scope and path traversal. Run with least privilege and audit before enabling in production.
name: tools description: Guide for tool registration and tool UI in assistant-ui. Use when implementing LLM tools, tool call rendering, or human-in-the-loop patterns. version: 0.0.1 license: MIT
assistant-ui Tools
Always consult assistant-ui.com/llms.txt for latest API.
Tools let LLMs trigger actions with custom UI rendering.
References
- ./references/make-tool.md -- makeAssistantTool/useAssistantTool
- ./references/tool-ui.md -- makeAssistantToolUI rendering
- ./references/human-in-loop.md -- Confirmation patterns
Tool Types
Where does the tool execute?
├─ Backend (LLM calls API) → AI SDK tool()
│ └─ Want custom UI? → makeAssistantToolUI
└─ Frontend (browser-only) → makeAssistantTool
└─ Want custom UI? → makeAssistantToolUI
Backend Tool with UI
// Backend (app/api/chat/route.ts) import { tool, stepCountIs } from "ai"; import { z } from "zod"; const tools = { get_weather: tool({ description: "Get weather for a city", inputSchema: z.object({ city: z.string() }), execute: async ({ city }) => ({ temp: 22, city }), }), }; const result = streamText({ model: openai("gpt-4o"), messages, tools, stopWhen: stepCountIs(5), });
// Frontend import { makeAssistantToolUI } from "@assistant-ui/react"; const WeatherToolUI = makeAssistantToolUI({ toolName: "get_weather", render: ({ args, result, status }) => { if (status === "running") return <div>Loading weather...</div>; return <div>{result?.city}: {result?.temp}°C</div>; }, }); // Register in app <AssistantRuntimeProvider runtime={runtime}> <WeatherToolUI /> <Thread /> </AssistantRuntimeProvider>
Frontend-Only Tool
import { makeAssistantTool } from "@assistant-ui/react"; import { z } from "zod"; const CopyTool = makeAssistantTool({ toolName: "copy_to_clipboard", parameters: z.object({ text: z.string() }), execute: async ({ text }) => { await navigator.clipboard.writeText(text); return { success: true }; }, }); <AssistantRuntimeProvider runtime={runtime}> <CopyTool /> <Thread /> </AssistantRuntimeProvider>
API Reference
// makeAssistantToolUI props interface ToolUIProps { toolCallId: string; toolName: string; args: Record<string, unknown>; argsText: string; result?: unknown; status: "running" | "complete" | "incomplete" | "requires-action"; submitResult: (result: unknown) => void; // For interactive tools }
Human-in-the-Loop
const DeleteToolUI = makeAssistantToolUI({ toolName: "delete_file", render: ({ args, status, submitResult }) => { if (status === "requires-action") { return ( <div> <p>Delete {args.path}?</p> <button onClick={() => submitResult({ confirmed: true })}>Confirm</button> <button onClick={() => submitResult({ confirmed: false })}>Cancel</button> </div> ); } return <div>File deleted</div>; }, });
Common Gotchas
Tool UI not rendering
toolNamemust match exactly (case-sensitive)- Register UI inside
AssistantRuntimeProvider
Tool not being called
- Check tool description is clear
- Use
stopWhen: stepCountIs(n)to allow multi-step
Result not showing
- Tool must return a value
- Check
status === "complete"before accessing result
Pros
- Clear structure for tool registration
- Supports both backend and frontend tools
- Provides human-in-the-loop patterns
Cons
- Lacks detailed examples for all tool types
- May require additional setup for complex tools
- Limited information on error handling
Related Skills
pytorch
S“It's the Swiss Army knife of deep learning, but good luck figuring out which of the 47 installation methods is the one that won't break your system.”
agno
S“It promises to be the Kubernetes for agents, but let's see if developers have the patience to learn yet another orchestration layer.”
nuxt-skills
S“It's essentially a well-organized cheat sheet that turns your AI assistant into a Nuxt framework parrot.”
Disclaimer: This content is sourced from GitHub open source projects for display and rating purposes only.
Copyright belongs to the original author assistant-ui.
