@hashgraphonline/standards-agent-kit
Version:
A modular SDK for building on-chain autonomous agents using Hashgraph Online Standards, including HCS-10 for agent discovery and communication.
115 lines (103 loc) • 3.73 kB
text/typescript
import { StructuredTool, ToolParams } from '@langchain/core/tools';
import { z } from 'zod';
import { HCS10Client } from '../hcs10/HCS10Client';
import {
AIAgentCapability,
Logger,
RegistrationSearchOptions,
} from '@hashgraphonline/standards-sdk';
export interface FindRegistrationsToolParams extends ToolParams {
hcsClient: HCS10Client;
}
/**
* A tool to search for registered HCS-10 agents using the configured registry.
*/
export class FindRegistrationsTool extends StructuredTool {
name = 'find_registrations';
description =
'Searches the configured agent registry for HCS-10 agents. You can filter by account ID or tags. Returns basic registration info.';
schema = z.object({
accountId: z
.string()
.optional()
.describe(
'Optional: Filter registrations by a specific Hedera account ID (e.g., 0.0.12345).'
),
tags: z
.array(z.nativeEnum(AIAgentCapability))
.optional()
.describe(
'Optional: Filter registrations by a list of tags (API filter only).'
),
});
private hcsClient: HCS10Client;
private logger: Logger;
constructor({ hcsClient, ...rest }: FindRegistrationsToolParams) {
super(rest);
this.hcsClient = hcsClient;
this.logger = Logger.getInstance({ module: 'FindRegistrationsTool' });
}
protected async _call({
accountId,
tags,
}: z.infer<this['schema']>): Promise<string> {
this.logger.info(
'Searching registrations with filters - Account ID',
JSON.stringify({
accountId,
tags,
})
);
const options: RegistrationSearchOptions = {};
if (accountId) {
options.accountId = accountId;
}
if (tags && tags.length > 0) {
options.tags = tags;
}
options.network = this.hcsClient.getNetwork();
try {
if (!this.hcsClient.standardClient) {
throw new Error(
'Standard SDK client instance is not available in HCS10Client wrapper.'
);
}
const result = await this.hcsClient.standardClient.findRegistrations(
options
);
if (!result.success || result.error) {
return `Error finding registrations: ${
result.error || 'Unknown error'
}`;
}
if (!result.registrations || result.registrations.length === 0) {
return 'No registrations found matching the criteria.';
}
// Format the results based on available data from RegistrationSearchResult
let output = `Found ${result.registrations.length} registration(s):\n`;
result.registrations.forEach((reg, index: number) => {
const metadata = reg.metadata;
output += `${index + 1}. Name: ${metadata.alias || 'N/A'}\n`;
output += `Description: ${metadata.bio || 'N/A'}\n`;
output += ` Account ID: ${reg.accountId}\n`;
output += ` Status: ${reg.status}\n`;
output += ` Model: ${metadata.properties?.model || 'N/A'}\n`;
if (metadata.properties?.capabilities && metadata.properties.capabilities.length > 0) {
output += ` Capabilities: ${metadata.properties.capabilities.join(', ')}\n`;
}
if (metadata.properties) {
output += ` Properties: ${JSON.stringify(metadata.properties)}\n`;
}
output += ` Inbound Topic: ${reg.inboundTopicId}\n`;
output += ` Outbound Topic: ${reg.outboundTopicId}\n`;
output += ` Created At: ${reg.createdAt}\n`;
});
return output.trim();
} catch (error) {
this.logger.error(`Failed to execute findRegistrations: ${error}`);
return `Error searching registrations: ${
error instanceof Error ? error.message : String(error)
}`;
}
}
}