Create Client Tool

作者 cognitedata7758093d8656無授權條款6 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫2 天前更新

Scaffolds an AtlasTool for an already-approved in-app useAtlasChat UI. For EOS sidebar tools, use integrate-fusion-agent (createAgentAction) instead. Triggers: AtlasTool, useAtlasChat tool, in-app atlas client tool.

AI 產生的概覽

為已核准的應用內 useAtlasChat 整合建置 AtlasTool 用戶端工具,包含 TypeBox 結構描述與接線。

功能
引導代理為已具備核准應用內 useAtlasChat 整合的應用建立瀏覽器端 AtlasTool。內容涵蓋閱讀程式碼庫、以 TypeBox 參數結構描述與回傳 output 和 details 的 execute 函式定義工具、將工具註冊到 useAtlasChat 的 tools 陣列,以及選擇性地從 message.toolCalls 渲染結構化工具結果。它產出的是說明與程式碼片段,本身不執行任何內容。
適用情境
適用於在已有核准 useAtlasChat 整合的應用中新增可供 Atlas Agent 呼叫的用戶端工具。對於 EOS 側邊欄工具,文件建議改用 integrate-fusion-agent 的 createAgentAction。
執行需求
需要來自 integrate-atlas-chat 的 vendored src/atlas-agent/ 目錄與 @sinclair/typebox 套件,以及具備核准應用內 useAtlasChat 整合的應用。不附帶指令碼,僅使用 Read、Glob、Grep、Edit 和 Write。

Create a Client Tool

Scaffold an AtlasTool named $ARGUMENTS. If the app has no approved in-app useAtlasChat, implement a Fusion action via integrate-fusion-agent instead.

Prerequisite: vendored src/atlas-agent/ and @sinclair/typebox from integrate-atlas-chat.

Background

Client tools let the Atlas Agent invoke browser-side logic — charts, local state, UI panels, navigation. The agent decides when to call; the app executes and returns a result.

  1. Agent responds with a clientTool action
  2. TypeBox validates the arguments
  3. execute() runs in the browser and returns { output, details }
  4. output (string) is sent back to the agent
  5. details is available on message.toolCalls for the UI to render

Step 1 — Understand the codebase

Before writing anything, read:

  • The file where useAtlasChat is called (often src/App.tsx or a chat hook) to find where tools is passed — imports are typically from ./atlas-agent/react after integrate-atlas-chat
  • Any existing tool definitions to match the file/naming conventions

Step 2 — Define the tool

Use Type from @sinclair/typebox for the parameters schema (compile-time types + runtime validation).

ts
import { Type } from "@sinclair/typebox";import type { AtlasTool } from "./atlas-agent/types";
export const myTool: AtlasTool = {  name: "my_tool",            // snake_case — this is what the agent uses to invoke it  description:    "One sentence describing what this tool does and when the agent should call it.",  parameters: Type.Object({    exampleParam: Type.String({ description: "What this param is for" }),    optionalNum: Type.Optional(Type.Number({ description: "..." })),  }),  execute: async (args) => {    return {      output: "Plain text summary sent back to the agent",      details: {        // Any structured data you want available in the UI via message.toolCalls      },    };  },};

Adjust the ./atlas-agent/... path if the tool file is not directly under src/ next to the atlas-agent folder (for example ../atlas-agent/types from src/tools/).

TypeBox quick reference

SchemaUsage
Type.String()string
Type.Number()number
Type.Boolean()boolean
Type.Literal("foo")exact value
Type.Union([Type.Literal("a"), Type.Literal("b")])enum
Type.Array(Type.String())string[]
Type.Object({ ... })object
Type.Optional(...)mark any field optional

Always add a description on the tool and on each parameter — the agent uses those strings.


Step 3 — Wire into useAtlasChat

Find the useAtlasChat call and add the tool to the tools array:

ts
const { messages, send, ... } = useAtlasChat({  client: isLoading ? null : sdk,  agentExternalId: AGENT_EXTERNAL_ID,  tools: [myTool],   // add here});

Step 4 — Render tool results (if needed)

If the tool returns structured details, render them in the message list. message.toolCalls is a ToolCall[] — one entry per tool call (client-side and server-side) in call order.

tsx
{msg.toolCalls?.map((tc, i) => (  // tc.name    — tool name  // tc.output  — the string sent back to the agent  // tc.details — your structured data (cast to your known shape)  <MyToolOutput key={i} data={tc.details as MyToolDetails} />))}

來源與署名

來源:cognitedata/builder-skills位於skills/create-client-tool提交7758093

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架