Sagents.Persistence.Hooks behaviour (Sagents v0.8.0-rc.6)
Copy MarkdownOptional behavior for hooking into agent state persistence events.
Implement this behavior to automatically save state at key points in the agent lifecycle without explicit calls.
Usage
Define a module implementing this behavior:
defmodule MyApp.Conversations.Hooks do
@behaviour Sagents.Persistence.Hooks
@impl true
def after_message_received(conversation_id, message) do
MyApp.Conversations.append_display_message(conversation_id, message)
end
@impl true
def after_agent_response(conversation_id, agent_state) do
MyApp.Conversations.save_agent_state(conversation_id, agent_state)
end
@impl true
def after_status_change(conversation_id, status, data) do
# Optional: track status changes
:ok
end
endThen configure it in your application:
# config/config.exs
config :sagents, :persistence,
adapter: MyApp.Conversations,
hooks: MyApp.Conversations.Hooks,
auto_save: trueHook Callbacks
All callbacks are optional. If a callback is not defined, the hook will be skipped silently.
Error Handling
Hook callbacks should return :ok or {:ok, term()} on success.
Errors will be logged but won't interrupt the agent execution.
Summary
Callbacks
Called after the agent produces a response.
Called after a user message is received.
Called when the agent status changes.
Functions
Check if hooks are enabled.
Get the configured hooks module.
Invoke a hook callback if hooks are configured.
Callbacks
@callback after_agent_response(conversation_id :: binary(), agent_state :: map()) :: :ok | {:ok, term()} | {:error, term()}
Called after the agent produces a response.
This is typically used to:
- Save the agent's response message to display messages
- Save the updated agent state
Parameters
conversation_id- The conversation identifieragent_state- The complete agent state (map with string keys from export_state/1)
Returns
:ok or {:ok, term()} on success. Errors are logged but don't interrupt execution.
@callback after_message_received(conversation_id :: binary(), message :: term()) :: :ok | {:ok, term()} | {:error, term()}
Called after a user message is received.
This is typically used to save the user's message to the display messages table.
Parameters
conversation_id- The conversation identifiermessage- The message struct
Returns
:ok or {:ok, term()} on success. Errors are logged but don't interrupt execution.
@callback after_status_change( conversation_id :: binary(), status :: atom(), data :: term() ) :: :ok | {:ok, term()} | {:error, term()}
Called when the agent status changes.
This can be used to track agent lifecycle events like:
:idle- Ready for work:running- Executing:interrupted- Awaiting human decision:completed- Execution finished:error- Execution failed
Parameters
conversation_id- The conversation identifierstatus- The new status (:idle,:running,:interrupted,:completed,:error)data- Additional data (interrupt_data for:interrupted, error for:error, state for:completed)
Returns
:ok or {:ok, term()} on success. Errors are logged but don't interrupt execution.
Functions
Check if hooks are enabled.
Returns true if a hooks module is configured, false otherwise.
Get the configured hooks module.
Returns the module or nil if not configured.
Invoke a hook callback if hooks are configured.
This is a convenience function for the framework to call hooks without requiring the hooks module to be defined.
Examples
# In AgentServer
Sagents.Persistence.Hooks.invoke(:after_message_received, [conversation_id, message])