Tools4AI is a Java framework for creating AI-powered agents and actions using annotations. It enables seamless integration of AI processing into Java applications through simple annotations and automatic prompt mapping.
Create an agent class with @Agent and @Action annotations:
@Agent(groupName = "SimpleAction", groupDescription = "This is a simple action which can be used to test the action processor")
public class SimpleAction {
@Action(description = "Provide persons name and then find out what does that person like")
public String whatFoodDoesThisPersonLike(String name) {
if("vishal".equalsIgnoreCase(name))
return "Paneer Butter Masala";
else if ("vinod".equalsIgnoreCase(name)) {
return "aloo kofta";
}else
return "something yummy";
}
}Process actions using AIProcessor:
public class SimpleActionExample {
public static void main(String[] args) {
System.setProperty("tools4ai.properties.path", "io/github/vishalmysore/simple/tools4ai.properties");
AIProcessor processor = PredictionLoader.getInstance().createOrGetAIProcessor();
try {
String result = (String) processor.processSingleAction("what does Vishal like to eat");
System.out.println(result); // Output: Paneer Butter Masala
} catch (AIProcessingException e) {
e.printStackTrace();
}
}
}Class-level annotation to mark a class as an AI agent. All methods with @Action are added to the prediction list.
@Agent(groupName = "personal", groupDescription = "all personal actions are here")
public class MyAgent {
// ...
}Method-level annotation to define executable actions.
@Action(description = "Handles travel preferences")
public String preferTravel(String name, String preference) {
// implementation
}Field-level annotation for special processing:
public class Customer {
@Prompt(describe = "convert this to Hindi")
private String reasonForCalling;
@Prompt(ignore = true)
private String location;
@Prompt(dateFormat = "yyyy-MM-dd", describe = "if you dont find date provide todays date")
private Date dateJoined;
}@Action
public String[] myTaskList(String[] myTaskList) {
return myTaskList;
}
@Action
public Map<Integer, String> addSports(@MapKeyType(Integer.class) @MapValueType(String.class) Map<Integer, String> mapOfSportsName) {
return mapOfSportsName;
}@Agent
public class TaskListAction {
@Action
public String[] myTaskList(String[] myTaskList) {
return myTaskList;
}
}
// Usage
String[] taskList = (String[]) processor.processSingleAction("Vishal would like to go to gym, then play football and finally watch a cricket match.");@Agent
public class SportsDirectory {
@Action(description = "add new Sports into the map")
public Map<Integer, String> addSports(@MapKeyType(Integer.class) @MapValueType(String.class) Map<Integer, String> mapOfSportsName) {
return mapOfSportsName;
}
}
// Usage
Map<Integer, String> sportsMap = (Map<Integer, String>) processor.processSingleAction("Vishal like cricket its number one, then comes soccer which is number 3, since in between he likes chess as well");@Agent
public class CustomerWithQueryAction {
@Action(description = "Customer has problem create ticket for him")
public String customerComplaintWithNameandFullInfo(Customer customer, @Prompt(dateFormat = "yyyy-MM-dd") Date dateOfComp, @Prompt(describe = "this is customer complaint") String query) {
return customer.toString();
}
}// Process multiple actions in sequence
String result1 = (String) processor.processSingleAction("vishal wants to travel and wants adventure");
String result2 = (String) processor.processSingleAction("vishals computer is broken he needs to fix it");ScriptProcessor script = new ScriptProcessor(processor);
String commands = "Vishal wants to eat food first find his food preference\n then find his favorite restaurants and book a table for dinner tonight at 7 PM";
ScriptResult result = script.process(commands);For complex multi-step workflows:
ScriptProcessor script = new ScriptProcessor(processor);
String complexScript = "can you reserve the flight for Vishal from Toronto to Bangalore for 3 Days on 7th december " +
"If flight booking is successful, can you reserve the car for Vishal from Bangalore to Toronto for 10 Days on 17th december " +
"if car booking is successful and flight cost are less than $1000 then book the sight seeing attraction called 5 star palace " +
"if car booking is successful and flight cost are more than $1000 then book the sight seeing attraction called peanut palace";
ScriptResult result = script.process(complexScript);
String summary = script.summarize(result);PromptTransformer transformer = PredictionLoader.getInstance().createOrGetPromptTransformer();
// Transform to POJO
Organization org = (Organization) transformer.transformIntoPojo(promptText, Organization.class.getName(), "", "");
// Transform to JSON
String jsonString = transformer.transformIntoJson(jsonTemplate, promptText, "Customer", "get Customer details");@Agent
public class CustomExample {
@Action
public Organization addOrganization(Organization organization) {
return organization;
}
}Configure REST APIs as actions via swagger_actions.json:
{
"endpoints": [
{
"swaggerurl": "https://fakerestapi.azurewebsites.net/swagger/v1/swagger.json",
"group": "Books Author Activity",
"description": "This is for all the actions related books, Authors, photos and users",
"baseurl": "https://fakerestapi.azurewebsites.net/",
"id": "fakerestapi"
}
]
}Configure shell scripts via shell_actions.yml:
groups:
- name: Employee Actions
description: This is actions for all the new employees
scripts:
- scriptName: "test_script.cmd"
actionName: saveEmployeeInformation
parameters: employeeName, employeeLocation
description: This is a command which will save employee informationDefine HTTP endpoints manually in http_actions.json:
{
"endpoints": [
{
"actionName": "getUserDetails",
"description": "this will fetch User details from the user inventory corporate application",
"url": "https://api.example.com/users/",
"type": "GET",
"input_object": [
{
"name": "userId",
"type": "path_parameter",
"description": "User ID"
}
],
"output_object": {
"type": "json",
"description": "User object"
},
"auth_interface": {
"type": "Bearer Token",
"description": "Authentication token required"
}
}
]
}@Agent(actionName = "restartTheECOMServer", description = "will be used to restart the server", riskLevel = ActionRisk.HIGH, groupName = "customer support", groupDescription = "actions related to customer support")
public class ServerRestartAction implements JavaMethodAction {
public String restartTheECOMServer(String reasonForRestart, String requestedBy) {
return "Server has been restarted by " + requestedBy + " due to following reason " + reasonForRestart;
}
}GeminiImageActionProcessor processor = new GeminiImageActionProcessor();
String imageDescription = processor.imageToText(imageBytes);
Object result = actionProcessor.processSingleAction(imageDescription);SeleniumProcessor processor = new SeleniumProcessor(driver);
processor.processWebAction("go to website https://the-internet.herokuapp.com");
boolean buttonPresent = processor.trueFalseQuery("do you see Add/Remove Elements?");SpringOpenAIProcessor springProcessor = new SpringOpenAIProcessor(applicationContext);@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class Organization {
private String name;
@ListType(Employee.class)
private List<Employee> em;
@ListType(String.class)
private List<String> locations;
}@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class Customer {
private String firstName;
private String lastName;
@Prompt(describe = "convert this to Hindi")
private String reasonForCalling;
@Prompt(ignore = true)
private String location;
@Prompt(dateFormat = "yyyy-MM-dd", describe = "if you dont find date provide todays date")
private Date dateJoined;
}Set the properties file path:
System.setProperty("tools4ai.properties.path", "path/to/tools4ai.properties");Example tools4ai.properties:
action.packages.to.scan=io.github.vishalmysore.simple