Agent Lifecycle
Understanding the agent's lifecycle is essential for proper initialization, usage, and cleanup.
Lifecycle States
The agent progresses through these states during its lifetime:
None → Initializing → LoadingChat → Ready → Processing → Ready → Terminating
↓ ↓
InitializationFailed WaitingForToolOutputAgentStatus Enum
None
Uninitialized state before setup
Initializing
Performing one-time initialization
InitializationFailed
Initialization error occurred
LoadingChat
Loading conversation history
RetrievingAccessTokens
Fetching OAuth/API tokens
Ready
Idle and ready for input
Processing
Actively processing request
WaitingForToolOutput
Waiting for manual tool output
Cancelling
Cancellation in progress
Terminating
Shutting down
Initialization
Automatic Initialization (AgentBehaviour)
public class MyScript : MonoBehaviour
{
[SerializeField] private AgentBehaviour agent;
void Start()
{
// Agent auto-initializes if AutoInit = true
agent.onStatusChanged.AddListener(OnStatusChanged);
}
void OnStatusChanged(AgentStatus status)
{
if (status == AgentStatus.Ready)
{
Debug.Log("Agent ready!");
}
}
}Manual Initialization (Agent)
Agent agent = new Agent(settings, behaviour, hooks);
try
{
await agent.InitializeAsync();
Debug.Log($"Agent initialized. Status: {agent.Status}");
}
catch (Exception ex)
{
Debug.LogError($"Initialization failed: {ex.Message}");
}Initialization Steps
Validate Configuration - Check settings and dependencies
Initialize Services - Set up chat, audio, and tool services
Load Conversation - Restore conversation history (if any)
Retrieve Tokens - Fetch API/OAuth tokens if needed
Transition to Ready - Agent is ready to accept input
Status Monitoring
// Subscribe to status changes
agent.onStatusChanged.AddListener(status =>
{
switch (status)
{
case AgentStatus.Ready:
EnableUI();
break;
case AgentStatus.Processing:
ShowLoadingIndicator();
break;
case AgentStatus.InitializationFailed:
ShowError("Agent initialization failed");
break;
}
});Disposal
Automatic Disposal (AgentBehaviour)
// Happens automatically in OnDestroy
void OnDestroy()
{
// AgentBehaviour handles cleanup
}Manual Disposal (Agent)
void OnApplicationQuit()
{
agent?.Dispose();
}Cleanup Process
Cancel any active requests
Save conversation (if applicable)
Dispose services and controllers
Release resources
Transition to Terminating
Reinitialization
// Reset after error
if (agent.Status == AgentStatus.InitializationFailed)
{
agent.Dispose();
agent = new Agent(settings, behaviour, hooks);
await agent.InitializeAsync();
}Best Practices
Check Status Before Operations
public async void SendMessage(string text)
{
if (agent.Status != AgentStatus.Ready)
{
Debug.LogWarning("Agent not ready");
return;
}
await agent.SendAsync(text);
}Handle Initialization Errors
try
{
await agent.InitializeAsync();
}
catch (ArgumentException ex)
{
Debug.LogError($"Configuration error: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Debug.LogError($"Authentication error: {ex.Message}");
}
catch (Exception ex)
{
Debug.LogError($"Unexpected error: {ex.Message}");
}Graceful Shutdown
async void OnApplicationQuit()
{
if (agent != null && agent.Status == AgentStatus.Processing)
{
await agent.CancelAsync();
}
agent?.Dispose();
}Next Steps
Initialization - Detailed initialization guide
Agent Status - All status states explained
Disposal - Proper cleanup procedures
Last updated