UNPKG

@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.

118 lines (103 loc) 4.03 kB
import { StructuredTool } from '@langchain/core/tools'; import { z } from 'zod'; import { IPlugin /*, PluginContext */ } from '../PluginInterface'; import axios from 'axios'; // Use axios instead of node-fetch const HEDERA_MIRROR_NODE_API = 'https://mainnet.mirrornode.hedera.com/api/v1'; /** * Defines the schema for the HBAR price API response. */ const ExchangeRateResponseSchema = z.object({ current_rate: z.object({ cent_equivalent: z.number(), hbar_equivalent: z.number(), expiration_time: z.number(), }), next_rate: z.object({ cent_equivalent: z.number(), hbar_equivalent: z.number(), expiration_time: z.number(), }), timestamp: z.string(), }); /** * A Langchain tool to get the current HBAR price in USD. */ // Export the class for testing purposes export class GetHbarPriceTool extends StructuredTool { name = 'getHbarPrice'; description = 'Retrieves the current price of HBAR in USD from the Hedera Mirror Node.'; schema = z.object({}); // No input required for this tool /** * DISCLAIMER: THIS TOOL USES THE EXCHANGE RATE ENDPOINT FROM THE MIRROR NODE, AND IT IS NOT GUARANTEED TO BE ACCURATE. * USE AN ORACLE OR OTHER SOURCES FOR PRODUCTION USE WHERE PRICE IS IMPORTANT. * Retrieves the current price of HBAR in USD from the Hedera Mirror Node. * @returns A promise that resolves to a string containing the current HBAR price in USD. */ protected async _call(): Promise<string> { try { // Use axios.get instead of fetch const response = await axios.get(`${HEDERA_MIRROR_NODE_API}/network/exchangerate`); // Axios puts data directly in response.data const data: unknown = response.data; // Validate the response structure const parsedData = ExchangeRateResponseSchema.safeParse(data); if (!parsedData.success) { console.error("Failed to parse exchange rate response:", parsedData.error); throw new Error('Invalid API response format'); } const { current_rate } = parsedData.data; const priceUsd = current_rate.cent_equivalent / current_rate.hbar_equivalent / 100; return `The current price of HBAR is $${priceUsd.toFixed(6)} USD.`; } catch (error) { console.error('Error fetching HBAR price:', error); // Handle axios errors specifically if needed, otherwise generic handling let errorMessage = 'An unknown error occurred'; if (axios.isAxiosError(error)) { errorMessage = error.message; if (error.response) { errorMessage += ` (Status: ${error.response.status})`; } } else if (error instanceof Error) { errorMessage = error.message; } return `Failed to retrieve HBAR price: ${errorMessage}`; } } } /** * DISCLAIMER: THIS PLUGIN USES THE EXCHANGE RATE ENDPOINT FROM THE MIRROR NODE, AND IT IS NOT GUARANTEED TO BE ACCURATE. * USE AN ORACLE OR OTHER SOURCES FOR PRODUCTION USE WHERE PRICE IS IMPORTANT. * Plugin to provide tools related to Hedera network information, like HBAR price. */ export class HbarPricePlugin implements IPlugin { id = 'hedera-hbar-price'; name = 'Hedera HBAR Price Plugin'; description = 'Provides tools to interact with Hedera network data, specifically HBAR price.'; version = '1.0.0'; author = 'Hedera Agent'; // Replace with actual author/team name if desired private tools: StructuredTool[]; constructor() { this.tools = [new GetHbarPriceTool()]; } /** * Initializes the plugin. Currently no specific initialization needed. */ async initialize(): Promise<void> { // No specific initialization required for this plugin yet return Promise.resolve(); } /** * Returns the tools provided by this plugin. * @returns An array containing the GetHbarPriceTool. */ getTools(): StructuredTool[] { return this.tools; } /** * Cleans up resources. Currently no cleanup needed. */ async cleanup(): Promise<void> { // No cleanup necessary return Promise.resolve(); } }