Skip to main content

Generation Callbacks

Agents support before_generation and after_generation callbacks, letting you hook into the lifecycle of a single run without overriding it yourself.

Before Generation​

Runs before any provider call is made — useful for setting up instance variables that your prompt template needs.

class ResearchAgent < OmniAgent::Agent
use_model "gpt-4o-mini"

before_generation :set_current_user

def set_current_user
@user = "Test User"
end
end

Any instance variable you set here is automatically available inside prompt.md.erb via ERB interpolation.

After Generation​

Runs once the agent has a final response (no more tool calls to make, or a tool explicitly stopped generation).

class ResearchAgent < OmniAgent::Agent
after_generation :log_response

def log_response(payload)
Rails.logger.info("Response: #{payload[:response].content}")
end
end

Callback methods can take zero arguments or one. If they accept an argument, they receive a payload hash:

KeyBefore generationAfter generation
input✓✓
context✓✓
messages✓✓
generated_messages✓
response✓

Multiple Callbacks​

Both directives accept multiple method names and are additive across calls — calling before_generation again appends rather than replacing:

before_generation :set_current_user, :load_preferences

Context Binding​

Instance variables you set inside a callback (or anywhere in the agent) are synced back into the run's context hash after each callback finishes, so later callbacks and the prompt template see the latest values.