How to add your own tool
Enhancing the Sui Agent Kit with custom tools enables you to incorporate specialized functionalities designed to meet your specific requirements. This guide provides step-by-step instructions for creating and integrating a new tool into the existing framework.
Overview
-
Create a new tool file
-
Export the new tool
-
Add supporting functions in SuiAgentKit
-
Implement the Langchain tool class
-
Export the Langchain tool
-
Export your protocol’s langchain tools (if not already exported)
-
Define Action class for given tool
-
Export Action
-
Use the custom tool
Step-by-Step
Create a new TypeScript file in the src/tools/your_protocol
directory for your tool (e.g., custom_tool.ts
). If the src/tools/your_protocol
directory does not exist, create it.
src/tools/index.ts
export * from "./token";
export * from "./defi";
export * from "./your_protocol"; // Add your protocol here if it's not already in the list
3. Add Supporting Functions to SuiAgentKit
src/agent/index.ts
export class SuiAgentKit {
// ... existing code ...
async customFunction(input: string): Promise<string> {
// Implement your custom functionality
return `Processed input: ${input}`;
}
}
src/langchain/your_protocol/custom_tool.ts
import { Tool } from "langchain/tools";
import { SuiAgentKit } from "../../agent";
export class CustomTool extends Tool {
name = "custom_tool";
description = "Description of what the custom tool does.";
constructor(private SuiKit: SuiAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const result = await this.customFunction(input);
return JSON.stringify({
status: "success",
message: "Custom tool executed successfully",
data: result,
});
} catch (error: any) {
return JSON.stringify({
status: "error",
message: error.message,
code: error.code || "UNKNOWN_ERROR",
});
}
}
}
src/langchain/your_protocol/index.ts
export * from "./custom_tool";
src/langchain/index.ts
export * from "./tiplink";
export * from "./your_protocol"; // Add your protocol here if it's not already in the list
src/actions/your_protocol/custom_action.ts
import { Action } from "../../types/action";
import { SuiAgentKit } from "../../agent";
import { z } from "zod";
import { custom_tool } from "../../tools";
const customAction: Action = {
name: "CUSTOM_ACTION",
similes: ["custom tool"],
description: "Description of what the custom tool does.",
examples: [
{
input: {},
output: {
status: "success",
message: "Custom tool executed successfully",
data: result,
},
explanation: "Custom tool executed successfully",
},
],
schema: z.object({
input: z.string(),
}),
handler: async (agent: SuiAgentKit, input: Record<string, any>) => {
const result = await agent.customFunction(input);
return result;
},
};
8. Export Action
src/actions/index.ts
import customAction from "./your_protocol/custom_action";
export const ACTIONS = {
// ... existing actions ...
CUSTOM_ACTION: customAction,
}
9. Usage Example
Add a code example in the README.md file.
import { SuiAgentKit, createSuiTools } from "sui-agent-kit";
// Initialize with private key and optional RPC URL
const agent = new SuiAgentKit(
"your_sui_private_key",
"https://fullnode.mainnet.sui.io:443",
"your-openai-api-key"
);
const tools = createSuiTools(agent);
const customTool = tools.find(tool => tool.name === "custom_tool");
if (customTool) {
const result = await customTool._call("your-input");
console.log(result);
}
// or alternatively
const result = await agent.customFunction("your-input"); // assuming you have implemented `customFunction` method in SuiAgentKit
console.log(result);
Best Practices
- Implement robust error handling
- Add security checks for sensitive operations
- Document your tool’s purpose and usage
- Write tests for reliability
- Keep tools focused on single responsibilities
Need Help?
If you face any challenges while implementing your custom tool, you can:
- Open an issue in the repository.
- Reach out to the maintainer for assistance.
- Review existing tools for implementation examples.