HAVOC is an advanced Android application designed to transform the Temi robot into an autonomous healthcare assistant. The project leverages Large Language Models (LLMs), real-time communication, and environmental sensor integration to create a robot capable of navigating complex environments, interacting naturally with people, and performing environmental monitoring tasks.
A typical "day in the life" of a Temi robot controlled by HAVOC unfolds as follows:
Initialization: The robot begins in the HomeBase state, resting on its charging dock.
Shift Start: At 8:00 AM on a weekday, a scheduled timer (checkAndMoveTemi) fires. The robot transitions to the MovingToEntrance state and navigates to its designated work_location.
On Duty: Upon arrival, it enters the Detecting state, actively waiting for user interaction or other events.
LLM-Powered Task Execution:
LlmControl. The robot initiates dialogue: "Hello! How can I help you?" using a ConversationAction to manage the interaction.Talker LLM, operating within the ConversationAction, interprets this as a command requiring actions. It concludes its immediate conversation by saying, "Sure, I’ll go ask Sam what time the meeting is," and signals the Planner to create a plan.Planner generates its first action plan. The robot then begins executing it.
[
{"type": "move", "destination": "Sam"},
{"type": "speak", "message": "Hello Sam, what time is the meeting?", "wait_for_response": true}
]
The
speakaction’swait_for_response: trueflag is critical here; it ensures the system uses aConversationActionto capture the response, rather than just making an announcement.
Talker LLM, which again concludes the conversation ("Okay, I’ll go ask Cody.") and triggers the Planner. The Planner discards the old plan and generates a new one based on the entire history of actions and conversations.[
{"type": "move", "destination": "Cody"},
{"type": "speak", "message": "Hello Cody, what time is the meeting?", "wait_for_response": true}
]
Talker LLM understands the core question has been answered, ends the conversation with an acknowledgement, and triggers a final replan to complete the original user’s request.Planner generates the last plan to report back.
[
{"type": "move", "destination": "Evan"},
{"type": "speak", "message": "Sam didn't know about the meeting, so I asked Cody. The meeting is at 3pm.", "wait_for_response": false}
]
Task Completion: After delivering the message to Evan, the action queue is empty. The robot transitions back to MovingToEntrance and re-enters the Detecting state, ready for the next interaction.
Scheduled Patrol: At the top of every hour, a recurring trigger moves the robot into the Patrolling state. It completes its predefined route and then returns to the Detecting state at the entrance.
End of Day: At 5:00 PM, the checkAndMoveTemi logic sends the robot home. It transitions to MovingToHome, navigates to its charging dock, and enters the HomeBase state for the night.
HAVOC-Server.This project uses a properties file to manage all environment-specific variables and API keys.
Clone the Repository
git clone https://github.com/innovationcore/HAVOC-TemiApp.git
Create the Configuration File
app/src/main/res/raw/.example_config.properties file and rename the copy to config.properties.Edit config.properties
config.properties file and fill in the values for your specific environment.home_location / work_location: These must exactly match the names of saved locations in your Temi robot’s memory.patrol_locations: A comma-separated list of saved locations for the robot to patrol.webrtc_server_url: The full URL to your WebRTC signaling server (HAVOC-Server).llm_api_key: Your private API key for the LLM service.planner_url / talker_url: The API endpoints for your Planner and Talker LLMs.The robot’s basic operational logic is governed by a state machine defined in umple/HavocCore.txt.
work_location.work_location and actively monitors for people to interact with. From this state, it can transition to LlmControl if a person is detected, Patrolling if it’s time for a scheduled patrol, or MovingToHome if the battery is low or the work shift is over.Detecting state.The HAVOC codebase is organized into several packages, each handling specific functionality.
edu.uky.ai.havocconfig.properties and also loads the raw text for system prompts from files within the res/raw directory.edu.uky.ai.havoc.statemachineHavocCore to add Temi-specific functionality and UI updates, such as changing the robot’s face image based on its state and managing WebRTC streaming during patrols. It overrides key transition methods to include additional behavior, like initiating patrols or updating the UI.edu.uky.ai.havoc.streamingusb-serial-for-android library. It initializes the USB connection, reads sensor data, and formats it for streaming via WebRTC.SmellSensorUtils.edu.uky.ai.havoc.llmparse_plan, conversation_over) for structured outputs and supports different tool usage modes.TemiAction objects.edu.uky.ai.havoc.actionsTemiAction objects in a sequential manner using a single-threaded executor.TemiAction for navigating the robot to a specified location, handling completion or failure.TemiAction for making the robot speak a message without waiting for a user response.TemiAction for handling interactive conversations with users. It uses an LLM (LLaMa 3 by default) to generate responses, supports multi-turn dialogues, and ends conversations gracefully using a tool call whenever a direct command is received or the conversation naturally ends.Imported from gh:Kentucky-Open-Science/HAVOC-TemiApp. Source last updated 2025-12-08. Synced 2026-07-27.
Source code on GitHub.
HAVOC is an advanced Android application designed to transform the Temi robot into an autonomous healthcare assistant. The project leverages Large Language Models (LLMs), real-time communication, and environmental sensor integration to create a robot capable of navigating complex environments, interacting naturally with people, and performing environmental monitoring tasks.
---
A typical "day in the life" of a Temi robot controlled by HAVOC unfolds as follows:
HomeBase state, resting on its charging dock.checkAndMoveTemi) fires. The robot transitions to the MovingToEntrance state and navigates to its designated work_location.Detecting state, actively waiting for user inte...