Skip to content
4 min read · 823 words

Class: Tool<A>

A tool definition that serves as the single source of truth for a callable tool: its name, description, input schema, execution handler, and the @nhtio/adk!SpooledArtifact subclass that wraps its serialised output.

Remarks

The inputSchema is a @nhtio/validation schema. It is used at runtime to validate incoming arguments before the handler is called, and its .describe() output provides all the metadata needed to build a provider-specific LLM tool definition — annotate the schema with .description(), .note(), .example() etc. once, and that information is available in both contexts without duplication.

The handler is private — invoke it only through executor(ctx) which validates args, fires observability events (with a stable callId derived from the tool name and arguments), and wraps handler errors in @nhtio/adk!E_TOOL_DOWNSTREAM_ERROR. The handler returns serialised bytes (string | Uint8Array); persistence is the consumer's responsibility.

artifactConstructor is the @nhtio/adk!SpooledArtifact subclass the consumer should use when wrapping the handler's output into a ToolCall.results field. The author declares it once on the tool instance; the consumer reads it when assembling persisted records.

Extended by

Type Parameters

Type ParameterDefault typeDescription
A extends SpooledArtifactSpooledArtifactThe @nhtio/adk!SpooledArtifact subtype this tool's results should be wrapped in. Defaults to @nhtio/adk!SpooledArtifact.

Constructors

Constructor

ts
new Tool<A>(raw: RawTool<A>): Tool<A>;

Parameters

ParameterTypeDescription
rawRawTool<A>The raw tool input validated against rawToolSchema.

Returns

Tool<A>

Throws

@nhtio/adk!E_INVALID_INITIAL_TOOL_VALUE when raw does not satisfy the schema.

Properties

PropertyModifierTypeDefault valueDescription
artifactConstructorreadonlyArtifactConstructorResolver<A> | undefinedundefined-
descriptionreadonlystringundefined-
ephemeralreadonlybooleanundefined-
inputSchemareadonlySchemaundefined-
metareadonlyRegistryundefined-
namereadonlystringundefined-
onCollisionreadonly"keep" | "replace" | "throw"undefined-
trustedreadonlybooleanundefined-
schemastaticObjectSchema<RawTool<SpooledArtifact>>rawToolSchemaValidator schema that accepts a RawTool object. Remarks Reusable fragment for any schema that needs to validate or nest a tool entry (e.g. TurnRunnerConfig.tools).

Methods

describe()

ts
describe(): {
  description: string;
  inputSchema: Description;
  name: string;
};

Returns a fully serialisable snapshot of this tool's definition.

Returns

ts
{
  description: string;
  inputSchema: Description;
  name: string;
}

{ name, description, inputSchema } where inputSchema is the schema description.

NameType
descriptionstring
inputSchemaDescription
namestring

Remarks

The inputSchema property is the result of calling .describe() on the raw schema — a plain object carrying all the annotation metadata (descriptions, notes, examples, types) without any validator functions. Use this to build provider-specific LLM tool definitions.


executor()

ts
executor(ctx: DispatchContext): (args: unknown) => Promise<
  | string
  | Uint8Array<ArrayBufferLike>
  | Media
| Media[]>;

Returns a bound executor function for this tool against the given turn context.

Parameters

ParameterTypeDescription
ctxDispatchContextThe active turn context. Provides emit functions and turn ID.

Returns

An async function (args) => Promise<string | Uint8Array>.

(args: unknown) => Promise< | string | Uint8Array<ArrayBufferLike> | Media | Media[]>

Remarks

The executor: (1) computes a stable callId as sha256(canonicalStringify({tool, args})) over the raw, pre-validation args, (2) validates args via Tool.validate, (3) emits toolExecutionStart on the context (with the computed callId), (4) calls the handler, (5) emits toolExecutionEnd (with the same callId), (6) wraps any handler error in @nhtio/adk!E_TOOL_DOWNSTREAM_ERROR before re-throwing.

The handler returns serialised bytes (string | Uint8Array) — persistence is the consumer's concern. Use Tool.artifactConstructor when wrapping the bytes into a ToolCall.results field.

Pattern mirrors Middleware.runner() — call once per turn, reuse the returned function.


validate()

ts
validate(args: unknown): Promise<unknown>;

Validates args against the tool's input schema asynchronously.

Parameters

ParameterTypeDescription
argsunknownThe arguments to validate.

Returns

Promise<unknown>

The validated (and coerced) arguments.

Remarks

Async to support schemas with external validators (e.g. database lookups, API calls). A validation failure throws @nhtio/adk!E_INVALID_TOOL_ARGS — this indicates a programming error in the tool call loop, not a downstream failure.

Throws

@nhtio/adk!E_INVALID_TOOL_ARGS when args does not satisfy the input schema.


isTool()

ts
static isTool(value: unknown): value is Tool<SpooledArtifact>;

Returns true if value is a Tool instance.

Parameters

ParameterTypeDescription
valueunknownThe value to test.

Returns

value is Tool<SpooledArtifact>

true when value is a Tool instance.